Skip to content

Commit e3e78aa

Browse files
authored
make PlayerInfo public (#343)
1 parent 95c4dda commit e3e78aa

File tree

14 files changed

+149
-87
lines changed

14 files changed

+149
-87
lines changed

pkg/demoinfocs/common/player.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func (p *Player) IsUnDuckingInProgress() bool {
208208
return p.Flags().Ducking() && !p.Flags().DuckingKeyPressed()
209209
}
210210

211-
// IsStaning returns true if the player is currently fully standing upright.
211+
// IsStanding returns true if the player is currently fully standing upright.
212212
// See also: Flags().Ducking() & Flags().DuckingKeyPressed()
213213
func (p *Player) IsStanding() bool {
214214
return !p.Flags().Ducking() && !p.Flags().DuckingKeyPressed()
@@ -469,3 +469,26 @@ func NewPlayer(demoInfoProvider demoInfoProvider) *Player {
469469
demoInfoProvider: demoInfoProvider,
470470
}
471471
}
472+
473+
// PlayerInfo contains information about a player such as their name and SteamID.
474+
// Primarily intended for internal use.
475+
type PlayerInfo struct {
476+
Version int64
477+
XUID uint64 // SteamID64
478+
Name string
479+
UserID int
480+
GUID string
481+
FriendsID int
482+
FriendsName string
483+
// Custom files stuff (CRC)
484+
CustomFiles0 int
485+
CustomFiles1 int
486+
CustomFiles2 int
487+
CustomFiles3 int
488+
// Amount of downloaded files from the server
489+
FilesDownloaded byte
490+
// Bots
491+
IsFakePlayer bool
492+
// HLTV Proxy
493+
IsHltv bool
494+
}

pkg/demoinfocs/datatables.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,21 +170,21 @@ func (p *parser) bindPlayers() {
170170
})
171171
}
172172

173-
func (p *parser) getOrCreatePlayer(entityID int, rp *playerInfo) (isNew bool, player *common.Player) {
173+
func (p *parser) getOrCreatePlayer(entityID int, rp *common.PlayerInfo) (isNew bool, player *common.Player) {
174174
player = p.gameState.playersByEntityID[entityID]
175175

176176
if player == nil {
177177
if rp != nil {
178-
player = p.gameState.playersByUserID[rp.userID]
178+
player = p.gameState.playersByUserID[rp.UserID]
179179

180180
if player == nil {
181181
isNew = true
182182

183183
player = common.NewPlayer(p.demoInfoProvider)
184-
player.Name = rp.name
185-
player.SteamID64 = rp.xuid
186-
player.IsBot = rp.isFakePlayer || rp.guid == "BOT"
187-
player.UserID = rp.userID
184+
player.Name = rp.Name
185+
player.SteamID64 = rp.XUID
186+
player.IsBot = rp.IsFakePlayer || rp.GUID == "BOT"
187+
player.UserID = rp.UserID
188188

189189
p.gameState.indexPlayerBySteamID(player)
190190
}
@@ -202,7 +202,7 @@ func (p *parser) getOrCreatePlayer(entityID int, rp *playerInfo) (isNew bool, pl
202202
p.gameState.playersByEntityID[entityID] = player
203203

204204
if rp != nil {
205-
p.gameState.playersByUserID[rp.userID] = player
205+
p.gameState.playersByUserID[rp.UserID] = player
206206
}
207207

208208
return isNew, player

pkg/demoinfocs/datatables_test.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ func (DevNullReader) Read(p []byte) (n int, err error) {
2222
func TestParser_BindNewPlayer_Issue98(t *testing.T) {
2323
p := newParser()
2424

25-
p.rawPlayers = map[int]*playerInfo{
25+
p.rawPlayers = map[int]*common.PlayerInfo{
2626
0: {
27-
userID: 1,
28-
name: "Zim",
29-
guid: "BOT",
27+
UserID: 1,
28+
Name: "Zim",
29+
GUID: "BOT",
3030
},
3131
1: {
32-
userID: 2,
33-
name: "The Suspect",
34-
guid: "123",
32+
UserID: 2,
33+
Name: "The Suspect",
34+
GUID: "123",
3535
},
3636
}
3737

@@ -48,12 +48,12 @@ func TestParser_BindNewPlayer_Issue98(t *testing.T) {
4848
func TestParser_BindNewPlayer_Issue98_Reconnect(t *testing.T) {
4949
p := newParser()
5050

51-
p.rawPlayers = map[int]*playerInfo{
51+
p.rawPlayers = map[int]*common.PlayerInfo{
5252
0: {
53-
userID: 2,
54-
name: "The Suspect",
55-
guid: "123",
56-
xuid: 1,
53+
UserID: 2,
54+
Name: "The Suspect",
55+
GUID: "123",
56+
XUID: 1,
5757
},
5858
}
5959

@@ -80,12 +80,12 @@ func TestParser_BindNewPlayer_PlayerSpotted_Over32(t *testing.T) {
8080
func testPlayerSpotted(t *testing.T, propName string) {
8181
p := newParser()
8282

83-
p.rawPlayers = map[int]*playerInfo{
83+
p.rawPlayers = map[int]*common.PlayerInfo{
8484
0: {
85-
userID: 2,
86-
name: "Spotter",
87-
guid: "123",
88-
xuid: 1,
85+
UserID: 2,
86+
Name: "Spotter",
87+
GUID: "123",
88+
XUID: 1,
8989
},
9090
}
9191

pkg/demoinfocs/debug_on.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
//+build debugdemoinfocs
1+
//go:build debugdemoinfocs
2+
// +build debugdemoinfocs
23

34
// Functions to print out debug information if the build tag is enabled
45

pkg/demoinfocs/events/events.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,13 +418,18 @@ type PlayerDisconnected struct {
418418
Player *common.Player
419419
}
420420

421-
// PlayerNameChange signals that a player's name has changed
421+
// PlayerNameChange signals that a player's name has changed.
422422
type PlayerNameChange struct {
423423
Player *common.Player
424424
OldName string
425425
NewName string
426426
}
427427

428+
// StringTablePlayerUpdateApplied signals that a player has been updated via stringtables.
429+
type StringTablePlayerUpdateApplied struct {
430+
Player *common.Player
431+
}
432+
428433
// SayText signals a chat message. It contains the raw
429434
// network message data for admin / console messages.
430435
// EntIdx will probably always be 0
@@ -616,3 +621,9 @@ type ConVarsUpdated struct {
616621
type RoundImpactScoreData struct {
617622
RawMessage *msg.CCSUsrMsg_RoundImpactScoreData
618623
}
624+
625+
// PlayerInfo signals that basic player information was read via stringtables.
626+
type PlayerInfo struct {
627+
Index int
628+
Info common.PlayerInfo
629+
}

pkg/demoinfocs/game_events.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -517,29 +517,29 @@ func (geh gameEventHandler) HostageRescuedAll(map[string]*msg.CSVCMsg_GameEventK
517517
}
518518

519519
func (geh gameEventHandler) playerConnect(data map[string]*msg.CSVCMsg_GameEventKeyT) {
520-
pl := &playerInfo{
521-
userID: int(data["userid"].GetValShort()),
522-
name: data["name"].GetValString(),
523-
guid: data["networkid"].GetValString(),
520+
pl := common.PlayerInfo{
521+
UserID: int(data["userid"].GetValShort()),
522+
Name: data["name"].GetValString(),
523+
GUID: data["networkid"].GetValString(),
524524
}
525525

526-
if pl.guid != "" {
526+
if pl.GUID != "" {
527527
var err error
528-
pl.xuid, err = guidToSteamID64(pl.guid)
528+
pl.XUID, err = guidToSteamID64(pl.GUID)
529529

530530
if err != nil {
531531
geh.parser.setError(fmt.Errorf("failed to parse player XUID: %v", err.Error()))
532532
}
533533
}
534534

535-
geh.parser.rawPlayers[int(data["index"].GetValByte())] = pl
535+
geh.parser.setRawPlayer(int(data["index"].GetValByte()), pl)
536536
}
537537

538538
func (geh gameEventHandler) playerDisconnect(data map[string]*msg.CSVCMsg_GameEventKeyT) {
539539
uid := int(data["userid"].GetValShort())
540540

541541
for k, v := range geh.parser.rawPlayers {
542-
if v.userID == uid {
542+
if v.UserID == uid {
543543
delete(geh.parser.rawPlayers, k)
544544
}
545545
}

pkg/demoinfocs/msg/cstrike15_usermessages.pb.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/demoinfocs/parser.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ type parser struct {
7070
bombsiteA bombsite
7171
bombsiteB bombsite
7272
equipmentMapping map[*st.ServerClass]common.EquipmentType // Maps server classes to equipment-types
73-
rawPlayers map[int]*playerInfo // Maps entity IDs to 'raw' player info
73+
rawPlayers map[int]*common.PlayerInfo // Maps entity IDs to 'raw' player info
7474
modelPreCache []string // Used to find out whether a weapon is a p250 or cz for example (same id)
7575
triggers map[int]*boundingBoxInformation // Maps entity IDs to triggers (used for bombsites)
7676
gameEventDescs map[int32]*msg.CSVCMsg_GameEventListDescriptorT // Maps game-event IDs to descriptors
@@ -338,7 +338,7 @@ func NewParserWithConfig(demostream io.Reader, config ParserConfig) Parser {
338338
p.bitReader = bit.NewLargeBitReader(demostream)
339339
p.stParser = st.NewSendTableParser()
340340
p.equipmentMapping = make(map[*st.ServerClass]common.EquipmentType)
341-
p.rawPlayers = make(map[int]*playerInfo)
341+
p.rawPlayers = make(map[int]*common.PlayerInfo)
342342
p.triggers = make(map[int]*boundingBoxInformation)
343343
p.demoInfoProvider = demoInfoProvider{parser: &p}
344344
p.gameState = newGameState(p.demoInfoProvider)

pkg/demoinfocs/sendtables/entity.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,11 @@ func (pe *property) Type() PropertyType {
324324
return PropertyType(pe.entry.prop.rawType)
325325
}
326326

327+
// ArrayElementType returns the data type of array entries, if Property.Type() is PropTypeArray.
328+
func (pe *property) ArrayElementType() PropertyType {
329+
return PropertyType(pe.entry.arrayElementProp.rawType)
330+
}
331+
327332
// PropertyValueType specifies the type of a PropertyValue
328333
type PropertyValueType int
329334

pkg/demoinfocs/sendtables/fake/property.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,8 @@ func (p *Property) OnUpdate(handler st.PropertyUpdateHandler) {
3737
func (p *Property) Bind(variable interface{}, valueType st.PropertyValueType) {
3838
p.Called(variable, valueType)
3939
}
40+
41+
// ArrayElementType is a mock-implementation of Property.ArrayElementType().
42+
func (p *Property) ArrayElementType() st.PropertyType {
43+
return p.Called().Get(0).(st.PropertyType)
44+
}

0 commit comments

Comments
 (0)