Skip to content

Commit 5dc8727

Browse files
committed
WIP: s2 entities part 2
1 parent d3c8779 commit 5dc8727

File tree

17 files changed

+359
-78
lines changed

17 files changed

+359
-78
lines changed

pkg/demoinfocs/datatables.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
)
1515

1616
func (p *parser) mapEquipment() {
17-
for _, sc := range p.stParser.ServerClasses() {
17+
for _, sc := range p.stParser.ServerClasses().All() {
1818
switch sc.Name() {
1919
case "CC4":
2020
p.equipmentMapping[sc] = common.EqBomb
@@ -107,8 +107,15 @@ func (p *parser) bindBomb() {
107107
}
108108

109109
func (p *parser) bindTeamStates() {
110+
fmt.Println(p.stParser.ServerClasses().FindByName("CCSTeam"))
110111
p.stParser.ServerClasses().FindByName("CCSTeam").OnEntityCreated(func(entity st.Entity) {
111-
team := entity.PropertyValueMust("m_szTeamname").StringVal
112+
teamVal := entity.PropertyValueMust("m_szTeamname")
113+
team := teamVal.StringVal
114+
115+
// FIXME: S2 fix
116+
if team == "" {
117+
team = teamVal.Any.(string)
118+
}
112119

113120
var s *common.TeamState
114121

@@ -131,13 +138,21 @@ func (p *parser) bindTeamStates() {
131138

132139
// Register updates
133140
var score int
134-
entity.Property("m_scoreTotal").OnUpdate(func(val st.PropertyValue) {
141+
142+
scoreProp := entity.Property("m_scoreTotal")
143+
144+
// FIXME: S2 fix
145+
if scoreProp == nil {
146+
scoreProp = entity.Property("m_iScore")
147+
}
148+
149+
scoreProp.OnUpdate(func(val st.PropertyValue) {
135150
oldScore := score
136-
score = val.IntVal
151+
score = val.IntVal // FIXME: fix for S2
137152

138153
p.eventDispatcher.Dispatch(events.ScoreUpdated{
139154
OldScore: oldScore,
140-
NewScore: val.IntVal,
155+
NewScore: val.IntVal, // FIXME: fix for S2
141156
TeamState: s,
142157
})
143158
})
@@ -161,7 +176,8 @@ func (p *parser) bindBombSites() {
161176
}
162177

163178
func (p *parser) bindPlayers() {
164-
p.stParser.ServerClasses().FindByName("CCSPlayer").OnEntityCreated(func(player st.Entity) {
179+
fmt.Println(p.stParser.ServerClasses().FindByName("CCSPlayerPawn"))
180+
p.stParser.ServerClasses().FindByName("CCSPlayerPawn").OnEntityCreated(func(player st.Entity) {
165181
p.bindNewPlayer(player)
166182
})
167183

@@ -340,7 +356,7 @@ func (p *parser) bindPlayerWeapons(playerEntity st.Entity, pl *common.Player) {
340356
}
341357

342358
func (p *parser) bindWeapons() {
343-
for _, sc := range p.stParser.ServerClasses() {
359+
for _, sc := range p.stParser.ServerClasses().All() {
344360
for _, bc := range sc.BaseClasses() {
345361
switch bc.Name() {
346362
case "CWeaponCSBase":

pkg/demoinfocs/demoinfocs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func TestS2(t *testing.T) {
218218
assertions.NoError(err, "error returned by Parser.ParseHeader()")
219219

220220
p.RegisterEventHandler(func(event events.GenericGameEvent) {
221-
fmt.Println(event.Name, event)
221+
//fmt.Println(event.Name, event)
222222
})
223223

224224
t.Log("Parsing to end")

pkg/demoinfocs/parser.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ type parser struct {
9191

9292
bombsiteA bombsite
9393
bombsiteB bombsite
94-
equipmentMapping map[*st.ServerClass]common.EquipmentType // Maps server classes to equipment-types
94+
equipmentMapping map[st.ServerClass]common.EquipmentType // Maps server classes to equipment-types
9595
rawPlayers map[int]*common.PlayerInfo // Maps entity IDs to 'raw' player info
9696
modelPreCache []string // Used to find out whether a weapon is a p250 or cz for example (same id)
9797
triggers map[int]*boundingBoxInformation // Maps entity IDs to triggers (used for bombsites)
@@ -360,7 +360,7 @@ func NewParserWithConfig(demostream io.Reader, config ParserConfig) Parser {
360360

361361
// Init parser
362362
p.bitReader = bit.NewLargeBitReader(demostream)
363-
p.equipmentMapping = make(map[*st.ServerClass]common.EquipmentType)
363+
p.equipmentMapping = make(map[st.ServerClass]common.EquipmentType)
364364
p.rawPlayers = make(map[int]*common.PlayerInfo)
365365
p.triggers = make(map[int]*boundingBoxInformation)
366366
p.demoInfoProvider = demoInfoProvider{parser: &p}

pkg/demoinfocs/parsing.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ func (p *parser) ParseHeader() (common.DemoHeader, error) {
7272
p.stParser = sendtables2.NewParser()
7373

7474
p.RegisterNetMessageHandler(p.stParser.OnServerInfo)
75-
p.RegisterNetMessageHandler(p.stParser.OnDemoClassInfo)
7675
p.RegisterNetMessageHandler(p.stParser.OnPacketEntities)
7776

7877
default:

pkg/demoinfocs/s2_commands.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ func (p *parser) handleSendTables(msg *msgs2.CDemoSendTables) {
2525
}
2626

2727
func (p *parser) handleClassInfo(msg *msgs2.CDemoClassInfo) {
28+
p.msgDispatcher.SyncAllQueues()
29+
30+
err := p.stParser.OnDemoClassInfo(msg)
31+
if err != nil {
32+
panic(err)
33+
}
34+
35+
p.mapEquipment()
36+
p.bindEntities()
2837
}
2938

3039
var netMsgCreators = map[msgs2.NET_Messages]NetMessageCreator{

pkg/demoinfocs/sendtables/entity.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
// entity stores a entity in the game (e.g. players etc.) with its properties.
1515
type entity struct {
16-
serverClass *ServerClass
16+
serverClass *serverClass
1717
id int
1818
serialNum int
1919
props []property
@@ -26,7 +26,7 @@ type entity struct {
2626
}
2727

2828
// ServerClass returns the entity's server-class.
29-
func (e *entity) ServerClass() *ServerClass {
29+
func (e *entity) ServerClass() ServerClass {
3030
return e.serverClass
3131
}
3232

pkg/demoinfocs/sendtables/entity_interface.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ package sendtables
44

55
import (
66
"github.com/golang/geo/r3"
7+
78
bit "github.com/markus-wa/demoinfocs-golang/v3/internal/bitread"
89
)
910

1011
// Entity is an auto-generated interface for entity, intended to be used when mockability is needed.
1112
// entity stores a entity in the game (e.g. players etc.) with its properties.
1213
type Entity interface {
1314
// ServerClass returns the entity's server-class.
14-
ServerClass() *ServerClass
15+
ServerClass() ServerClass
1516
// ID returns the entity's ID.
1617
ID() int
1718
// SerialNum returns the entity's serial number.

pkg/demoinfocs/sendtables/entity_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var testData = struct {
1616
{value: PropertyValue{IntVal: 30}},
1717
},
1818
serialNum: 1337,
19-
serverClass: &ServerClass{propNameToIndex: map[string]int{
19+
serverClass: &serverClass{propNameToIndex: map[string]int{
2020
"myProp": 0,
2121
"test": 1,
2222
"anotherOne": 2,

pkg/demoinfocs/sendtables/fake/entity.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ type Entity struct {
3030
}
3131

3232
// ServerClass is a mock-implementation of Entity.ServerClass().
33-
func (e *Entity) ServerClass() *st.ServerClass {
34-
return e.Called().Get(0).(*st.ServerClass)
33+
func (e *Entity) ServerClass() st.ServerClass {
34+
return e.Called().Get(0).(st.ServerClass)
3535
}
3636

3737
// ID is a mock-implementation of Entity.ID().

pkg/demoinfocs/sendtables/propdecoder.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const (
3535
PropTypeArray
3636
PropTypeDataTable
3737
PropTypeInt64
38+
PropTypeAny
3839
)
3940

4041
const (
@@ -95,6 +96,7 @@ type PropertyValue struct {
9596
ArrayVal []PropertyValue
9697
StringVal string
9798
FloatVal float32
99+
Any any
98100
}
99101

100102
// BoolVal returns true if IntVal > 0.

0 commit comments

Comments
 (0)