Skip to content

Commit fade406

Browse files
committed
Updated examples
1 parent 4080117 commit fade406

File tree

8 files changed

+257
-16
lines changed

8 files changed

+257
-16
lines changed

examples/common.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package examples
2+
3+
import (
4+
"flag"
5+
"log"
6+
"os"
7+
)
8+
9+
// DemoPathFromArgs returns the value of the -demo command line flag.
10+
func DemoPathFromArgs() string {
11+
fl := new(flag.FlagSet)
12+
13+
demPathPtr := fl.String("demo", "", "Demo file `path`")
14+
15+
err := fl.Parse(os.Args[1:])
16+
if err != nil {
17+
log.Fatal(err)
18+
}
19+
20+
demPath := *demPathPtr
21+
22+
return demPath
23+
}

examples/heatmap/heatmap.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,20 @@ import (
1111

1212
dem "github.com/markus-wa/demoinfocs-golang"
1313
events "github.com/markus-wa/demoinfocs-golang/events"
14+
ex "github.com/markus-wa/demoinfocs-golang/examples"
1415
)
1516

16-
const defaultDemPath = "../../test/cs-demos/default.dem"
17-
18-
// Run like this: go run heatmap.go > out.png
17+
// Run like this: go run heatmap.go -demo /path/to/demo.dem > out.png
1918
func main() {
20-
f, err := os.Open(defaultDemPath)
21-
checkErr(err)
19+
f, err := os.Open(ex.DemoPathFromArgs())
20+
checkError(err)
2221
defer f.Close()
2322

2423
p := dem.NewParser(f)
2524

2625
// Parse header (contains map-name etc.)
2726
_, err = p.ParseHeader()
28-
checkErr(err)
27+
checkError(err)
2928

3029
// Register handler for WeaponFiredEvent, triggered every time a shot is fired
3130
points := []heatmap.DataPoint{}
@@ -36,14 +35,14 @@ func main() {
3635

3736
// Parse to end
3837
err = p.ParseToEnd()
39-
checkErr(err)
38+
checkError(err)
4039

4140
// Generate heatmap and write to standard output
4241
img := heatmap.Heatmap(image.Rect(0, 0, 1024, 1024), points, 15, 128, schemes.AlphaFire)
4342
png.Encode(os.Stdout, img)
4443
}
4544

46-
func checkErr(err error) {
45+
func checkError(err error) {
4746
if err != nil {
4847
log.Fatal(err)
4948
}

examples/heatmap/heatmap_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import (
77

88
// Just make sure the example runs
99
func TestHeatmap(t *testing.T) {
10+
os.Args = []string{"cmd", "-demo", "../../test/cs-demos/default.dem"}
11+
12+
// Redirect stdout, the resulting image is written to this
1013
old := os.Stdout
1114
_, w, _ := os.Pipe()
1215
os.Stdout = w

examples/net-messages/README.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# Parsing & handling custom net-messages
2+
3+
## Finding interesting messages
4+
5+
You can use the build tag `debugdemoinfocs` to find interesting net-messages.
6+
7+
Example: `go run myprogram.go -tags debugdemoinfocs | grep "UnhandledMessage" | sort | uniq -c`
8+
9+
<details>
10+
<summary>Sample output</summary>
11+
12+
```
13+
1 UnhandledMessage: id=10 name=svc_ClassInfo
14+
1 UnhandledMessage: id=14 name=svc_VoiceInit
15+
9651 UnhandledMessage: id=17 name=svc_Sounds
16+
1 UnhandledMessage: id=18 name=svc_SetView
17+
227 UnhandledMessage: id=21 name=svc_BSPDecal
18+
12705 UnhandledMessage: id=27 name=svc_TempEntities
19+
514 UnhandledMessage: id=28 name=svc_Prefetch
20+
85308 UnhandledMessage: id=4 name=net_Tick
21+
2 UnhandledMessage: id=5 name=net_StringCmd
22+
3 UnhandledMessage: id=6 name=net_SetConVar
23+
3 UnhandledMessage: id=7 name=net_SignonState
24+
1 UnhandledMessage: id=8 name=svc_ServerInfo
25+
```
26+
</details>
27+
28+
## Configuring a `NetMessageCreator`
29+
30+
NetMessageCreators are needed for creating instances of net-messages that aren't parsed by default.
31+
32+
You need to add them to the `ParserConfig.AdditionalNetMessageCreators` map where the key is the message-ID as seen in the debug output.
33+
34+
Example: `ConVar` messages
35+
36+
```go
37+
import (
38+
dem "github.com/markus-wa/demoinfocs-golang"
39+
msg "github.com/markus-wa/demoinfocs-golang/msg"
40+
)
41+
42+
cfg := dem.DefaultParserConfig
43+
cfg.AdditionalNetMessageCreators = map[int]dem.NetMessageCreator{
44+
6: func() proto.Message {
45+
return new(msg.CNETMsg_SetConVar)
46+
},
47+
}
48+
```
49+
50+
## Registering net-message handlers
51+
52+
To register a handler for net-messages `Parser.RegisterNetMessageHandler()` can be used.
53+
54+
When using `Parser.ParseToEnd()` net-messages and events are dispatched asynchronously. To get around this you can use `Parser.ParseNextFrame()` instead.
55+
56+
Example:
57+
58+
```go
59+
p.RegisterNetMessageHandler(func(m *msg.CNETMsg_SetConVar) {
60+
for _, cvar := range m.Convars.Cvars {
61+
fmt.Println(fmt.Sprintf("cvar %s=%s", cvar.Name, cvar.Value))
62+
}
63+
})
64+
```
65+
66+
<details>
67+
<summary>Sample output</summary>
68+
69+
```
70+
cvar mp_spec_swapplayersides=1
71+
cvar cash_team_rescued_hostage=750
72+
cvar bot_autodifficulty_threshold_high=0
73+
cvar cash_team_win_by_defusing_bomb=3500
74+
cvar game_mode=1
75+
cvar sv_damage_print_enable=0
76+
cvar mp_force_pick_time=160
77+
cvar mp_ggtr_bomb_pts_for_upgrade=2
78+
cvar bot_quota=0
79+
cvar ff_damage_reduction_bullets=0.33
80+
cvar sv_gameinstructor_disable=1
81+
cvar =0
82+
cvar bot_quota_mode=fill
83+
cvar mp_join_grace_time=30
84+
cvar mp_maxrounds=30
85+
cvar ammo_grenade_limit_total=4
86+
cvar mp_spectators_max=10
87+
cvar mp_round_restart_delay=5
88+
cvar mp_win_panel_display_time=15
89+
cvar mp_respawn_immunitytime=0
90+
cvar mp_roundtime_defuse=1.92
91+
cvar mp_ggprogressive_round_restart_delay=15
92+
cvar mp_match_end_restart=1
93+
cvar mp_timelimit=0
94+
cvar mp_warmuptime=5
95+
cvar mp_randomspawn_los=0
96+
cvar sv_competitive_official_5v5=1
97+
cvar sv_mincmdrate=30
98+
cvar mp_halftime_duration=15
99+
cvar mp_weapons_allow_map_placed=1
100+
cvar mp_autokick=0
101+
cvar sv_grenade_trajectory_time_spectator=1
102+
cvar sv_minrate=20000
103+
cvar sv_holiday_mode=0
104+
cvar sv_kick_players_with_cooldown=0
105+
cvar mp_ggtr_bomb_defuse_bonus=1
106+
cvar spec_freeze_time=5
107+
cvar mp_buytime=15
108+
cvar bot_difficulty=2
109+
cvar mp_playerid_delay=0.5
110+
cvar mp_roundtime_hostage=1.92
111+
cvar mp_freezetime=15
112+
cvar sv_maxcmdrate=128
113+
cvar bot_defer_to_human_goals=1
114+
cvar sv_skyname=sky_cs15_daylight01_hdr
115+
cvar mp_friendlyfire=1
116+
cvar cash_team_hostage_interaction=150
117+
cvar spec_freeze_panel_extended_time=0
118+
cvar ff_damage_reduction_other=0.4
119+
cvar sv_allow_wait_command=0
120+
cvar mp_molotovusedelay=0
121+
cvar mp_playerid_hold=0.25
122+
cvar mp_limitteams=0
123+
cvar cash_team_elimination_hostage_map_t=3000
124+
cvar sv_friction=4.8
125+
cvar mp_ggtr_bomb_detonation_bonus=1
126+
cvar ammo_grenade_limit_flashbang=2
127+
cvar sv_coaching_enabled=1
128+
cvar steamworks_sessionid_server=1169494819006
129+
cvar mp_overtime_enable=1
130+
cvar tv_snapshotrate=24
131+
cvar mp_roundtime=1.92
132+
cvar sv_kick_ban_duration=0
133+
cvar mp_halftime=1
134+
cvar sv_spawn_afk_bomb_drop_time=30
135+
cvar mp_ggtr_bomb_respawn_delay=0
136+
cvar mp_overtime_startmoney=16000
137+
cvar think_limit=0
138+
cvar sv_accelerate=5.6
139+
cvar ff_damage_reduction_grenade=0.85
140+
cvar cash_team_elimination_hostage_map_ct=3000
141+
cvar sv_maxupdaterate=128
142+
cvar cash_team_hostage_alive=150
143+
cvar tv_transmitall=1
144+
cvar steamworks_sessionid_server=0
145+
cvar steamworks_sessionid_server=1169497558498
146+
```
147+
</details>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
8+
proto "github.com/gogo/protobuf/proto"
9+
10+
dem "github.com/markus-wa/demoinfocs-golang"
11+
ex "github.com/markus-wa/demoinfocs-golang/examples"
12+
msg "github.com/markus-wa/demoinfocs-golang/msg"
13+
)
14+
15+
// Run like this: go run netmessages.go -demo /path/to/demo.dem > out.png
16+
func main() {
17+
f, err := os.Open(ex.DemoPathFromArgs())
18+
checkError(err)
19+
defer f.Close()
20+
21+
// Configure parsing of ConVar net-message (id=6)
22+
cfg := dem.DefaultParserConfig
23+
cfg.AdditionalNetMessageCreators = map[int]dem.NetMessageCreator{
24+
6: func() proto.Message {
25+
return new(msg.CNETMsg_SetConVar)
26+
},
27+
}
28+
29+
p := dem.NewParserWithConfig(f, cfg)
30+
31+
// Parse header (contains map-name etc.)
32+
_, err = p.ParseHeader()
33+
checkError(err)
34+
35+
// Register handler for ConVar updates
36+
p.RegisterNetMessageHandler(func(m *msg.CNETMsg_SetConVar) {
37+
for _, cvar := range m.Convars.Cvars {
38+
fmt.Println(fmt.Sprintf("cvar %s=%s", cvar.Name, cvar.Value))
39+
}
40+
})
41+
42+
// Parse to end
43+
err = p.ParseToEnd()
44+
checkError(err)
45+
}
46+
47+
func checkError(err error) {
48+
if err != nil {
49+
log.Fatal(err)
50+
}
51+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package main
2+
3+
import (
4+
"os"
5+
"testing"
6+
)
7+
8+
// Just make sure the example runs
9+
func TestNetMessages(t *testing.T) {
10+
os.Args = []string{"cmd", "-demo", "../../test/cs-demos/default.dem"}
11+
12+
main()
13+
}

examples/scores/scores.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@ import (
88
dem "github.com/markus-wa/demoinfocs-golang"
99
common "github.com/markus-wa/demoinfocs-golang/common"
1010
events "github.com/markus-wa/demoinfocs-golang/events"
11+
ex "github.com/markus-wa/demoinfocs-golang/examples"
1112
)
1213

13-
const defaultDemPath = "../../test/cs-demos/default.dem"
14-
14+
// Run like this: go run scores.go -demo /path/to/demo.dem > out.png
1515
func main() {
16-
f, err := os.Open(defaultDemPath)
16+
f, err := os.Open(ex.DemoPathFromArgs())
1717
defer f.Close()
18-
checkErr(err)
18+
checkError(err)
1919

2020
p := dem.NewParser(f)
2121

2222
// Parse header
2323
h, err := p.ParseHeader()
24-
checkErr(err)
24+
checkError(err)
2525
fmt.Println("Map:", h.MapName)
2626

2727
// Register handler on round end to figure out who won
@@ -41,10 +41,10 @@ func main() {
4141

4242
// Parse to end
4343
err = p.ParseToEnd()
44-
checkErr(err)
44+
checkError(err)
4545
}
4646

47-
func checkErr(err error) {
47+
func checkError(err error) {
4848
if err != nil {
4949
log.Fatal(err)
5050
}

examples/scores/scores_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package main
22

3-
import "testing"
3+
import (
4+
"os"
5+
"testing"
6+
)
47

58
// Just make sure the example runs
69
func TestScores(t *testing.T) {
10+
os.Args = []string{"cmd", "-demo", "../../test/cs-demos/default.dem"}
11+
712
main()
813
}

0 commit comments

Comments
 (0)