Skip to content

Commit 1aa6280

Browse files
committed
Code cleanup & doc
* Fixed some protobuf generation problems * Partially cleaned up tests * General cleanup * Comments Former-commit-id: bc512872a22b0d9d042017726aa795e8744b4ea5
1 parent a885e11 commit 1aa6280

21 files changed

+559
-586
lines changed

.gitattributes

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Set the default behavior, in case people don't have core.autocrlf set.
2+
* text=auto
3+
4+
# Linux shell scripts
5+
*.sh text eol=lf

bin/README.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Protobuf code generation
2+
3+
The scripts in this folder generate the code for the game messages with the help of [gogoprotobuf](https://github.com/gogo/protobuf)
4+
5+
## Requirements
6+
7+
go get github.com/gogo/protobuf/proto
8+
go get github.com/gogo/protobuf/protoc-gen-gogofaster
9+
go get github.com/gogo/protobuf/gogoproto

bin/gen_protobuf.cmd

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
cd %GOPATH%/src
2-
set MSG_PATH=github.com/markus-wa/demoinfocs-golang/msg
3-
protoc -I=%MSG_PATH%/proto --gogofaster_out=Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:%MSG_PATH% %MSG_PATH%/proto/*.proto
1+
@REM Generate protobuf code
2+
cd %GOPATH%/src
3+
set MSG_PATH=github.com/markus-wa/demoinfocs-golang/msg
4+
set PROTOC_ARGS=Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor
5+
protoc -I=%MSG_PATH%/proto --gogofaster_out=%PROTOC_ARGS%:%MSG_PATH% %MSG_PATH%/proto/*.proto
46
cmd.exe

bin/gen_protobuf.sh

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
#!/bin/sh
2-
cd $GOPATH
3-
msg_path=github.com/markus-wa/demoinfocs-golang/msg
4-
protoc_args=Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:
5-
protoc -I=%${msg_path}/proto --gogofaster_out=${protoc_args}${msg_path} ${msg_path}/proto/*.proto
1+
#!/bin/sh
2+
# Generate protobuf code
3+
cd $GOPATH/src
4+
msg_path=github.com/markus-wa/demoinfocs-golang/msg
5+
protoc_args=Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor
6+
protoc -I=${msg_path}/proto --gogofaster_out=${protoc_args}:${msg_path} ${msg_path}/proto/*.proto

bitstream/bitreader.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ func (r *bitReader) ReadVarInt32() uint32 {
217217
var res uint32 = 0
218218
var b uint32 = 0x80
219219

220-
// do while hack
220+
// TODO: This seems strange (Maybe check statshelix implementation)
221221
for count := uint(0); b&0x80 != 0; count++ {
222222
if count == kMaxVarint32Bytes {
223223
return res
@@ -304,7 +304,7 @@ func (r *bitReader) Close() {
304304

305305
var bitReaderPool sync.Pool = sync.Pool{
306306
New: func() interface{} {
307-
return &bitReader{}
307+
return new(bitReader)
308308
},
309309
}
310310

common/common.go

+2
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ func MapEquipment(originalString string) EquipmentElement {
159159
case "revolver":
160160
wep = EE_Revolver
161161

162+
case "sensorgrenade": // Only used in 'Co-op Strike' mode
163+
162164
case "scar17": //These crash the game when given via give wep_[mp5navy|...], and cannot be purchased ingame.
163165
case "sg550": //yet the server-classes are networked, so we need to resolve them.
164166
case "mp5navy":

common/constants.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ const (
5858
)
5959

6060
const (
61-
Team_Spectators Team = iota + 1
61+
Team_Unassigned Team = iota
62+
Team_Spectators
6263
Team_Terrorists
6364
Team_CounterTerrorists
6465
)

common/structs.go

+14
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@ import (
77
"github.com/markus-wa/demoinfocs-golang/st"
88
)
99

10+
type DemoHeader struct {
11+
Filestamp string
12+
Protocol int
13+
NetworkProtocol int
14+
ServerName string
15+
ClientName string
16+
MapName string
17+
GameDirectory string
18+
PlaybackTime float32
19+
PlaybackTicks int
20+
PlaybackFrames int
21+
SignonLength int
22+
}
23+
1024
type PlayerInfo struct {
1125
Version int64
1226
XUID int64

constants.go

+18-18
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@ import (
44
"github.com/markus-wa/demoinfocs-golang/common"
55
)
66

7-
type DemoCommand byte
7+
type demoCommand byte
88

99
const (
1010
maxEntities = (1 << common.MaxEditctBits)
11-
MaxPlayers = 64
12-
MaxWeapons = 64
11+
maxPlayers = 64
12+
maxWeapons = 64
1313
)
1414

1515
const (
16-
DC_Signon DemoCommand = iota + 1
17-
DC_Packet
18-
DC_Synctick
19-
DC_ConsoleCommand
20-
DC_UserCommand
21-
DC_DataTables
22-
DC_Stop
23-
DC_CustomData
24-
DC_StringTables
25-
DC_LastCommand = DC_StringTables
26-
DC_FirstCommand = DC_Signon
16+
dc_Signon demoCommand = iota + 1
17+
dc_Packet
18+
dc_Synctick
19+
dc_ConsoleCommand
20+
dc_UserCommand
21+
dc_DataTables
22+
dc_Stop
23+
dc_CustomData
24+
dc_StringTables
25+
dc_LastCommand = dc_StringTables
26+
dc_FirstCommand = dc_Signon
2727
)
2828

2929
const (
30-
FDEMO_NORMAL = iota + 1
31-
FDEMO_USE_ORIGIN2
32-
FDEMO_USE_ANGLES2
33-
FDEMO_NOINTERP
30+
fdemo_Normal = iota + 1
31+
fdemo_UseOrigin2
32+
fdemo_UseAngles2
33+
fdemo_NoInterp
3434
)

demoinfocs_test.go

+57-64
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,11 @@ import (
66
"github.com/markus-wa/demoinfocs-golang/events"
77
"os"
88
"reflect"
9-
"runtime"
109
"testing"
1110
"time"
1211
)
1312

14-
var cancel bool = false
15-
var tsc *dem.TeamState
16-
var tix int = 0
17-
var oldScore int
18-
19-
func handleTickDone(events.TickDoneEvent) {
20-
tix++
21-
if tix > 100 {
22-
//cancel = true
23-
}
24-
if tsc != nil && oldScore != tsc.Score() {
25-
fmt.Println(tsc.Score())
26-
oldScore = tsc.Score()
27-
}
28-
29-
}
30-
31-
func handle(interface{}) {}
13+
const demPath = "test/demo.dem"
3214

3315
func handleDetails(e interface{}) {
3416
n := reflect.TypeOf(e).Name()
@@ -37,72 +19,83 @@ func handleDetails(e interface{}) {
3719
}
3820
}
3921

40-
var started bool = false
41-
42-
func handleStart(events.MatchStartedEvent) {
43-
started = true
44-
}
45-
func handleKill(events.PlayerKilledEvent) {
46-
if started {
47-
//k := e.(events.PlayerKilledEvent)
48-
//fmt.Println(k.Killer, "&", k.Assister, "killed", k.Victim)
49-
//fmt.Println(*k.Killer, "&", k.Assister, "killed", *k.Victim)
50-
}
51-
}
52-
5322
func TestDemoInfoCs(t *testing.T) {
54-
var demPath string
55-
if runtime.GOOS == "windows" {
56-
demPath = "C:\\Dev\\demo.dem"
57-
} else {
58-
demPath = "/home/markus/Downloads/demo.dem"
59-
}
6023
f, _ := os.Open(demPath)
6124
defer f.Close()
6225

6326
p := dem.NewParser(f)
27+
28+
fmt.Println("Parsing header")
6429
p.ParseHeader()
6530

66-
fmt.Println("go")
67-
if true {
68-
p.EventDispatcher().RegisterHandler(handleTickDone)
69-
p.EventDispatcher().RegisterHandler(handle)
70-
//p.EventDispatcher().RegisterHandler(reflect.TypeOf((*interface{})(nil)).Elem(), handleDetails)
71-
//p.EventDispatcher().RegisterHandler(reflect.TypeOf((*events.BombEventIf)(nil)).Elem(), handleDetails)
72-
//p.EventDispatcher().RegisterHandler(reflect.TypeOf((*events.NadeEventIf)(nil)).Elem(), handleDetails)
73-
//p.EventDispatcher().RegisterHandler(reflect.TypeOf((*events.PlayerJumpEvent)(nil)).Elem(), handleDetails)
74-
//p.EventDispatcher().RegisterHandler(reflect.TypeOf((*events.PlayerDisconnectEvent)(nil)).Elem(), handleDetails)
75-
p.EventDispatcher().RegisterHandler(handleKill)
76-
p.EventDispatcher().RegisterHandler(handleStart)
77-
}
78-
tsc = p.TState()
31+
fmt.Println("Registering handlers")
32+
var tState *dem.TeamState
33+
var oldScore int
34+
p.RegisterEventHandler(func(events.TickDoneEvent) {
35+
if tState != nil && oldScore != tState.Score() {
36+
fmt.Println("T-side score: ", tState.Score())
37+
oldScore = tState.Score()
38+
}
39+
})
40+
tState = p.TState()
41+
7942
ts := time.Now()
43+
cancel := false
44+
go func() {
45+
timer := time.NewTimer(time.Second * 8)
46+
<-timer.C
47+
cancel = true
48+
timer = time.NewTimer(time.Second * 2)
49+
<-timer.C
50+
t.Fatal("Parsing timeout")
51+
}()
52+
53+
fmt.Println("Parsing to end")
8054
p.ParseToEnd(&cancel)
81-
duration := time.Since(ts)
82-
fmt.Println("took", duration.Nanoseconds()/1000/1000, "ms")
55+
56+
fmt.Println("Took", time.Since(ts).Nanoseconds()/1000/1000, "ms")
57+
}
58+
59+
func TestCancelParseToEnd(t *testing.T) {
60+
runTest(func(p *dem.Parser) {
61+
p.ParseHeader()
62+
var tix int = 0
63+
var cancel bool
64+
p.RegisterEventHandler(func(events.TickDoneEvent) {
65+
tix++
66+
if tix == 100 {
67+
cancel = true
68+
} else if tix > 100 {
69+
t.Fatal("Parsing continued after cancellation")
70+
}
71+
})
72+
defer func() { recover() }()
73+
p.ParseToEnd(&cancel)
74+
})
75+
}
76+
77+
func runTest(test func(*dem.Parser)) {
78+
f, _ := os.Open(demPath)
79+
defer f.Close()
80+
81+
test(dem.NewParser(f))
8382
}
8483

8584
func BenchmarkDemoInfoCs(b *testing.B) {
8685
fmt.Println("Parsing sample demo", b.N, "times")
87-
var demPath string
88-
if runtime.GOOS == "windows" {
89-
demPath = "C:\\Dev\\demo.dem"
90-
} else {
91-
demPath = "/home/markus/Downloads/demo.dem"
92-
}
9386
for i := 0; i < b.N; i++ {
94-
runDemoInfoCsBenchmark(demPath)
87+
runDemoInfoCsBenchmark()
9588
}
9689
}
9790

98-
func runDemoInfoCsBenchmark(path string) {
99-
f, _ := os.Open(path)
91+
func runDemoInfoCsBenchmark() {
92+
f, _ := os.Open(demPath)
10093
defer f.Close()
10194

10295
p := dem.NewParser(f)
10396
p.ParseHeader()
97+
10498
ts := time.Now()
10599
p.ParseToEnd(nil)
106-
duration := time.Since(ts)
107-
fmt.Println("took", duration.Nanoseconds()/1000/1000, "ms")
100+
fmt.Println("Took", time.Since(ts).Nanoseconds()/1000/1000, "ms")
108101
}

demopacket.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import (
88

99
var packetEntitiesPool sync.Pool = sync.Pool{
1010
New: func() interface{} {
11-
return &msg.CSVCMsg_PacketEntities{}
11+
return new(msg.CSVCMsg_PacketEntities)
1212
},
1313
}
1414

1515
var gameEventPool sync.Pool = sync.Pool{
1616
New: func() interface{} {
17-
return &msg.CSVCMsg_GameEvent{}
17+
return new(msg.CSVCMsg_GameEvent)
1818
},
1919
}
2020

@@ -41,23 +41,23 @@ func (p *Parser) parsePacket() {
4141
defer packetEntitiesPool.Put(m)
4242

4343
case int(msg.SVC_Messages_svc_GameEventList):
44-
m = &msg.CSVCMsg_GameEventList{}
44+
m = new(msg.CSVCMsg_GameEventList)
4545

4646
case int(msg.SVC_Messages_svc_GameEvent):
4747
m = gameEventPool.Get().(*msg.CSVCMsg_GameEvent)
4848
defer gameEventPool.Put(m)
4949

5050
case int(msg.SVC_Messages_svc_CreateStringTable):
51-
m = &msg.CSVCMsg_CreateStringTable{}
51+
m = new(msg.CSVCMsg_CreateStringTable)
5252

5353
case int(msg.SVC_Messages_svc_UpdateStringTable):
54-
m = &msg.CSVCMsg_UpdateStringTable{}
54+
m = new(msg.CSVCMsg_UpdateStringTable)
5555

5656
case int(msg.NET_Messages_net_Tick):
57-
m = &msg.CNETMsg_Tick{}
57+
m = new(msg.CNETMsg_Tick)
5858

5959
case int(msg.SVC_Messages_svc_UserMessage):
60-
m = &msg.CSVCMsg_UserMessage{}
60+
m = new(msg.CSVCMsg_UserMessage)
6161

6262
default:
6363
// We don't care about anything else for now

events/events.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import (
66
)
77

88
// Header parsed
9-
type HeaderParsedEvent struct{}
9+
type HeaderParsedEvent struct {
10+
Header common.DemoHeader
11+
}
1012

1113
// Tick done
1214
type TickDoneEvent struct{}

0 commit comments

Comments
 (0)