diff --git a/csminify.go b/csminify.go index 661b227..edad2f0 100644 --- a/csminify.go +++ b/csminify.go @@ -86,11 +86,16 @@ func ToReplayWithConfig(r io.Reader, cfg ReplayConfig) (rep.Replay, error) { // Make the parser accessible for the custom event handlers cfg.EventCollector.parser = p - m := newMinifier(p, cfg.EventCollector) + m := newMinifier(p, cfg.EventCollector, cfg.SnapshotFrequency) m.replay.Header.MapName = header.MapName - m.replay.Header.TickRate = header.FrameRate() - m.replay.Header.SnapshotRate = int(math.Round(m.replay.Header.TickRate / cfg.SnapshotFrequency)) + m.tickRate(p.TickRate()) + + p.RegisterEventHandler(func(events.ConVarsUpdated) { + if tickRate := p.TickRate(); tickRate != 0 { + m.tickRate(tickRate) + } + }) // Register event handlers from collector for _, h := range cfg.EventCollector.handlers { @@ -108,18 +113,20 @@ func ToReplayWithConfig(r io.Reader, cfg ReplayConfig) (rep.Replay, error) { } type minifier struct { - parser dem.Parser - replay rep.Replay - eventCollector *EventCollector + parser dem.Parser + replay rep.Replay + eventCollector *EventCollector + snapshotFrequency float64 knownPlayerEntityIDs map[int]struct{} } -func newMinifier(parser dem.Parser, eventCollector *EventCollector) minifier { +func newMinifier(parser dem.Parser, eventCollector *EventCollector, snapshotFrequency float64) minifier { return minifier{ parser: parser, eventCollector: eventCollector, knownPlayerEntityIDs: make(map[int]struct{}), + snapshotFrequency: snapshotFrequency, } } @@ -196,6 +203,11 @@ func (m *minifier) updateKnownPlayers() { } } +func (m *minifier) tickRate(rate float64) { + m.replay.Header.TickRate = rate + m.replay.Header.SnapshotRate = int(math.Round(rate / m.snapshotFrequency)) +} + func r3VectorToPoint(v r3.Vector) rep.Point { return rep.Point{X: int(v.X), Y: int(v.Y), Z: int(v.Z)} } diff --git a/examples/minimal.json b/examples/minimal.json index a4df55d..83f1a1c 100644 --- a/examples/minimal.json +++ b/examples/minimal.json @@ -1,23 +1,23 @@ { "header": { "map": "de_cache", - "tickRate": 25.595680094066637, - "snapshotRate": 51 + "tickRate": 128, + "snapshotRate": 256 }, "entities": [ { - "id": 2, - "name": "xms*ASUS ♥ /F/", + "id": 3, + "name": "to1nou * Seagate", "team": 2 }, { - "id": 4, - "name": "tiziaN", - "team": 3 + "id": 7, + "name": "Ex6TenZ-BALLISTIX", + "team": 2 }, { - "id": 10, - "name": "syrsoNR", + "id": 9, + "name": "crisby", "team": 3 }, { @@ -25,40 +25,29 @@ "name": "Ptikrazy", "team": 1 }, - { - "id": 9, - "name": "crisby", - "team": 3 - }, - { - "id": 11, - "name": "mistou * Cooler Master", - "team": 2 - }, { "id": 13, "name": "keev", "team": 3 }, { - "id": 1, - "name": "ESWC TV - By VeryGames.net", - "team": 0, - "isNpc": true + "id": 14, + "name": "kzy LJ∼", + "team": 3 }, { - "id": 3, - "name": "to1nou * Seagate", + "id": 2, + "name": "xms*ASUS ♥ /F/", "team": 2 }, { - "id": 5, - "name": "ALEX * Intel", - "team": 2 + "id": 4, + "name": "tiziaN", + "team": 3 }, { - "id": 7, - "name": "Ex6TenZ-BALLISTIX", + "id": 5, + "name": "ALEX * Intel", "team": 2 }, { @@ -67,10 +56,21 @@ "team": 1 }, { - "id": 14, - "name": "kzy LJ∼", + "id": 10, + "name": "syrsoNR", "team": 3 }, + { + "id": 11, + "name": "mistou * Cooler Master", + "team": 2 + }, + { + "id": 1, + "name": "ESWC TV - By VeryGames.net", + "team": 0, + "isNpc": true + }, { "id": 6, "name": "eswc.com | Samy", @@ -79,87 +79,86 @@ ], "snapshots": [ { - "tick": 51, + "tick": 256, "entityUpdates": [ { "entityId": 5, "team": 2, "positions": [ { - "x": 418, - "y": 233, - "z": 1613 + "x": 3114, + "y": -160, + "z": 1614 } ], - "angleX": 195, - "angleY": 357, - "hp": 11, - "armor": 86, - "hasHelmet": true, + "angleX": 182, + "hp": 100, "equipment": [ { - "type": 3, - "ammoInMagazine": 13, + "type": 405, + "ammoInMagazine": -1, "ammoReserve": 0 }, { - "type": 405, + "type": 2, + "ammoInMagazine": 20, + "ammoReserve": 120 + }, + { + "type": 404, "ammoInMagazine": -1, "ammoReserve": 0 } ] }, { - "entityId": 11, - "team": 2, + "entityId": 10, + "team": 3, "positions": [ { - "x": 529, - "y": -250, - "z": 1748 + "x": -1563, + "y": 790, + "z": 1614 } ], - "angleX": 195, - "angleY": 6, - "hp": 16, - "armor": 98, - "hasHelmet": true, + "angleX": 270, + "hp": 100, "equipment": [ - { - "type": 4, - "ammoInMagazine": 7, - "ammoReserve": 27 - }, { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 + }, + { + "type": 9, + "ammoInMagazine": 12, + "ammoReserve": 24 } ] }, { - "entityId": 13, - "team": 3, + "entityId": 11, + "team": 2, "positions": [ { - "x": -1572, - "y": 722, - "z": 1614 + "x": 3009, + "y": -168, + "z": 1615 } ], - "angleX": 270, + "angleX": 181, "angleY": 359, "hp": 100, "equipment": [ - { - "type": 9, - "ammoInMagazine": 12, - "ammoReserve": 24 - }, { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 + }, + { + "type": 2, + "ammoInMagazine": 20, + "ammoReserve": 120 } ] }, @@ -168,16 +167,14 @@ "team": 3, "positions": [ { - "x": -825, - "y": 606, - "z": 1636 + "x": -1588, + "y": 856, + "z": 1614 } ], - "angleX": 86, - "angleY": 8, - "hp": 8, - "armor": 86, - "hasHelmet": true, + "angleX": 290, + "angleY": 5, + "hp": 100, "equipment": [ { "type": 405, @@ -188,32 +185,47 @@ "type": 9, "ammoInMagazine": 12, "ammoReserve": 24 - }, + } + ] + }, + { + "entityId": 2, + "team": 2, + "positions": [ { - "type": 309, - "ammoInMagazine": 5, - "ammoReserve": 30 - }, + "x": 3068, + "y": 250, + "z": 1613 + } + ], + "angleX": 182, + "hp": 100, + "equipment": [ { - "type": 505, - "ammoInMagazine": 1, + "type": 405, + "ammoInMagazine": -1, "ammoReserve": 0 + }, + { + "type": 2, + "ammoInMagazine": 20, + "ammoReserve": 120 } ] }, { - "entityId": 4, - "team": 3, + "entityId": 3, + "team": 2, "positions": [ { - "x": -817, - "y": -451, - "z": 1614 + "x": 3190, + "y": -134, + "z": 1613 } ], - "angleX": 92, - "angleY": 12, - "hp": 97, + "angleX": 172, + "angleY": 359, + "hp": 100, "equipment": [ { "type": 405, @@ -221,19 +233,19 @@ "ammoReserve": 0 }, { - "type": 9, - "ammoInMagazine": 12, - "ammoReserve": 18 + "type": 2, + "ammoInMagazine": 20, + "ammoReserve": 120 } ] }, { - "entityId": 10, + "entityId": 13, "team": 3, "positions": [ { - "x": -1382, - "y": 815, + "x": -1400, + "y": 550, "z": 1614 } ], @@ -253,20 +265,17 @@ ] }, { - "entityId": 3, + "entityId": 7, "team": 2, "positions": [ { - "x": 555, - "y": 186, + "x": 3158, + "y": 131, "z": 1613 } ], - "angleX": 187, - "angleY": 357, + "angleX": 182, "hp": 100, - "armor": 100, - "hasHelmet": true, "equipment": [ { "type": 405, @@ -277,25 +286,20 @@ "type": 2, "ammoInMagazine": 20, "ammoReserve": 120 - }, - { - "type": 303, - "ammoInMagazine": 10, - "ammoReserve": 90 } ] }, { - "entityId": 7, - "team": 2, + "entityId": 9, + "team": 3, "positions": [ { - "x": 2973, - "y": 250, - "z": 1613 + "x": -1560, + "y": 536, + "z": 1614 } ], - "angleX": 182, + "angleX": 270, "hp": 100, "equipment": [ { @@ -304,76 +308,63 @@ "ammoReserve": 0 }, { - "type": 2, - "ammoInMagazine": 20, - "ammoReserve": 120 + "type": 9, + "ammoInMagazine": 12, + "ammoReserve": 24 } ] }, { - "entityId": 2, - "team": 2, + "entityId": 4, + "team": 3, "positions": [ { - "x": 513, - "y": -85, - "z": 1744 + "x": -1442, + "y": 868, + "z": 1614 } ], - "angleX": 170, - "angleY": 4, - "hp": 24, - "armor": 83, - "hasHelmet": true, + "angleX": 250, + "angleY": 359, + "hp": 100, "equipment": [ - { - "type": 2, - "ammoInMagazine": 20, - "ammoReserve": 120 - }, - { - "type": 303, - "ammoInMagazine": 15, - "ammoReserve": 90 - }, { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 + }, + { + "type": 9, + "ammoInMagazine": 12, + "ammoReserve": 24 } ] } ] }, { - "tick": 102, + "tick": 512, "entityUpdates": [ { - "entityId": 2, + "entityId": 3, "team": 2, "positions": [ { - "x": 336, - "y": -127, - "z": 1790 + "x": 3190, + "y": -134, + "z": 1613 } ], - "angleX": 163, - "angleY": 8, - "hp": 24, - "armor": 83, - "hasHelmet": true, + "angleX": 166, + "angleY": 358, + "hp": 100, + "armor": 100, "equipment": [ { "type": 2, "ammoInMagazine": 20, "ammoReserve": 120 }, - { - "type": 303, - "ammoInMagazine": 15, - "ammoReserve": 90 - }, { "type": 405, "ammoInMagazine": -1, @@ -386,13 +377,15 @@ "team": 2, "positions": [ { - "x": 2973, - "y": 250, + "x": 3158, + "y": 131, "z": 1613 } ], - "angleX": 182, + "angleX": 209, + "angleY": 7, "hp": 100, + "armor": 100, "equipment": [ { "type": 405, @@ -407,18 +400,18 @@ ] }, { - "entityId": 13, + "entityId": 10, "team": 3, "positions": [ { - "x": -1572, - "y": 722, + "x": -1563, + "y": 790, "z": 1614 } ], "angleX": 270, - "angleY": 359, "hp": 100, + "armor": 100, "equipment": [ { "type": 405, @@ -437,137 +430,140 @@ "team": 2, "positions": [ { - "x": -29, - "y": 368, - "z": 1613 + "x": 3114, + "y": -160, + "z": 1614 } ], - "angleX": 101, - "angleY": 353, - "hp": 11, - "armor": 86, - "hasHelmet": true, + "angleX": 170, + "angleY": 8, + "hp": 100, + "armor": 100, "equipment": [ { - "type": 405, + "type": 2, + "ammoInMagazine": 20, + "ammoReserve": 120 + }, + { + "type": 404, "ammoInMagazine": -1, "ammoReserve": 0 }, { - "type": 3, - "ammoInMagazine": 6, + "type": 405, + "ammoInMagazine": -1, "ammoReserve": 0 } ] }, { - "entityId": 3, - "team": 2, + "entityId": 14, + "team": 3, "positions": [ { - "x": 374, - "y": 167, - "z": 1613 + "x": -1588, + "y": 856, + "z": 1614 } ], - "angleX": 150, + "angleX": 293, + "angleY": 6, "hp": 100, - "armor": 100, - "hasHelmet": true, "equipment": [ - { - "type": 303, - "ammoInMagazine": 5, - "ammoReserve": 90 - }, { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 }, { - "type": 2, - "ammoInMagazine": 20, - "ammoReserve": 120 + "type": 9, + "ammoInMagazine": 12, + "ammoReserve": 24 } ] }, { - "entityId": 14, - "team": 3, + "entityId": 2, + "team": 2, "positions": [ { - "x": -825, - "y": 606, - "z": 1636 + "x": 3068, + "y": 250, + "z": 1613 } ], - "angleX": 86, - "angleY": 8, - "hp": 8, - "armor": 86, - "hasHelmet": true, + "angleX": 189, + "angleY": 12, + "hp": 100, + "armor": 100, "equipment": [ - { - "type": 505, - "ammoInMagazine": 1, - "ammoReserve": 0 - }, { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 }, { - "type": 9, - "ammoInMagazine": 12, - "ammoReserve": 24 + "type": 2, + "ammoInMagazine": 20, + "ammoReserve": 120 }, { - "type": 309, - "ammoInMagazine": 5, - "ammoReserve": 30 + "type": 501, + "ammoInMagazine": 1, + "ammoReserve": 0 } ] }, { - "entityId": 4, - "team": 3, + "entityId": 11, + "team": 2, "positions": [ { - "x": -840, - "y": 37, - "z": 1614 + "x": 3009, + "y": -168, + "z": 1615 } ], - "angleX": 87, - "angleY": 11, - "hp": 97, + "angleX": 190, + "hp": 100, "equipment": [ { - "type": 9, - "ammoInMagazine": 12, - "ammoReserve": 18 + "type": 505, + "ammoInMagazine": 1, + "ammoReserve": 0 + }, + { + "type": 504, + "ammoInMagazine": 1, + "ammoReserve": 0 }, { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 + }, + { + "type": 3, + "ammoInMagazine": 13, + "ammoReserve": 26 } ] }, { - "entityId": 10, + "entityId": 4, "team": 3, "positions": [ { - "x": -1382, - "y": 815, + "x": -1442, + "y": 868, "z": 1614 } ], - "angleX": 270, + "angleX": 275, + "angleY": 4, "hp": 100, + "armor": 100, "equipment": [ { "type": 405, @@ -586,14 +582,15 @@ "team": 3, "positions": [ { - "x": -1394, - "y": 515, + "x": -1560, + "y": 536, "z": 1614 } ], - "angleX": 281, - "angleY": 2, + "angleX": 318, + "angleY": 4, "hp": 100, + "armor": 100, "equipment": [ { "type": 405, @@ -608,30 +605,24 @@ ] }, { - "entityId": 11, - "team": 2, + "entityId": 13, + "team": 3, "positions": [ { - "x": 112, - "y": -366, + "x": -1400, + "y": 550, "z": 1614 } ], - "angleX": 201, - "angleY": 1, - "hp": 16, - "armor": 98, - "hasHelmet": true, + "angleX": 276, + "angleY": 9, + "hp": 100, + "armor": 100, "equipment": [ { "type": 405, "ammoInMagazine": -1, "ammoReserve": 0 - }, - { - "type": 4, - "ammoInMagazine": 7, - "ammoReserve": 27 } ] } diff --git a/examples/minimal.mp b/examples/minimal.mp index 287b5ee..bf8d21a 100644 Binary files a/examples/minimal.mp and b/examples/minimal.mp differ diff --git a/examples/minimal.pb b/examples/minimal.pb index cfa93dd..8dafe42 100644 Binary files a/examples/minimal.pb and b/examples/minimal.pb differ