forked from zebp/csgo-heatmap-generator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdemoparser.js
84 lines (63 loc) · 2.29 KB
/
demoparser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { DemoFile } from 'demofile'
import { readFileSync } from 'fs'
import { read } from 'jimp'
import { fetchMapData } from './mapreader'
import { applyHeatmapFilter } from './imageprocessor'
import { EventEmitter } from 'events'
class DemoParser extends EventEmitter {
constructor() {
super()
this.demo = new DemoFile()
this.mapData = {}
this.points = []
this.demo.on('start', () => this.start())
this.demo.on('end', () => this.emit('end', this.demo.header.mapName, this.points))
this.demo.gameEvents.on('player_death', (event) => this.playerDeath(event))
}
start() {
this.mapData.name = this.demo.header.mapName
this.mapData = fetchMapData(this.mapData.name)
}
playerDeath(event) {
if (event.attacker === 0)
return
this.pushPoint(this.demo.entities.getByUserId(event.userid), 'victim')
this.pushPoint(this.demo.entities.getByUserId(event.attacker), 'attacker')
}
pushPoint(player, type) {
let pos = player.position
this.points.push({
player: type,
name: player.name,
x: Math.round((pos.x + (0 - this.mapData.x)) / this.mapData.scale),
y: Math.abs(Math.round((pos.y + (0 - this.mapData.y)) / this.mapData.scale))
})
}
read(file) {
let buffer = readFileSync(file)
this.demo.parse(buffer)
}
exportImage(output, points) {
exportImage(output, this.demo.header.mapName, points)
}
}
const exportImage = (output, type, mapName, points) => {
points = points[type]
console.log(`Processing ${mapName}-${type} with ${points.length} points.`)
read(`./overlays/${mapName}_radar.png`)
.then(image => {
applyHeatmapFilter(image, points)
image.write(output)
console.log(`Wrote ${mapName}-${type} heatmap.`)
})
.catch(error => console.error(error))
}
const promisify = (file) => new Promise((resolve, reject) => {
const parser = new DemoParser()
parser.on('end', (mapName, points) => resolve({
mapName: mapName,
points: points
}))
parser.read(file)
})
export { DemoParser, exportImage, promisify }