Documentation ¶
Overview ¶
Package demoinfocs provides a demo parser for the game Counter-Strike: Global Offensive. It is based on the official demoinfogo tool by Valve as well as Stats Helix's demoinfo.
A good entry point to using the library is the Parser type.
Demo events are documented in the events package.
Index ¶
- Variables
- type EventEmitter
- type GameState
- func (gs GameState) Bomb() *common.Bomb
- func (gs GameState) Entities() map[int]*st.Entity
- func (gs GameState) GrenadeProjectiles() map[int]*common.GrenadeProjectile
- func (gs GameState) Infernos() map[int]*common.Inferno
- func (gs GameState) IngameTick() int
- func (gs GameState) Participants() Participants
- func (gs *GameState) TeamCounterTerrorists() *TeamState
- func (gs *GameState) TeamTerrorists() *TeamState
- type NetMessageCreator
- type Parser
- func (p *Parser) Cancel()
- func (p *Parser) CurrentFrame() int
- func (p *Parser) CurrentTime() time.Duration
- func (p *Parser) GameState() *GameState
- func (p *Parser) Header() common.DemoHeader
- func (p *Parser) ParseHeader() (common.DemoHeader, error)
- func (p *Parser) ParseNextFrame() (b bool, err error)
- func (p *Parser) ParseToEnd() (err error)
- func (p *Parser) Progress() float32
- func (p *Parser) RegisterEventHandler(handler interface{}) dp.HandlerIdentifier
- func (p *Parser) RegisterNetMessageHandler(handler interface{}) dp.HandlerIdentifier
- func (p *Parser) ServerClasses() st.ServerClasses
- func (p *Parser) UnregisterEventHandler(identifier dp.HandlerIdentifier)
- func (p *Parser) UnregisterNetMessageHandler(identifier dp.HandlerIdentifier)
- type ParserConfig
- type Participants
- func (ptcp Participants) All() []*common.Player
- func (ptcp Participants) ByEntityID() map[int]*common.Player
- func (ptcp Participants) ByUserID() map[int]*common.Player
- func (ptcp Participants) FindByHandle(handle int) *common.Player
- func (ptcp Participants) Playing() []*common.Player
- func (ptcp Participants) TeamMembers(team common.Team) []*common.Player
- type TeamState
Constants ¶
This section is empty.
Variables ¶
var ( // ErrCancelled signals that parsing was cancelled via Parser.Cancel() ErrCancelled = errors.New("Parsing was cancelled before it finished (ErrCancelled)") // ErrUnexpectedEndOfDemo signals that the demo is incomplete / corrupt - // these demos may still be useful, check how far the parser got. ErrUnexpectedEndOfDemo = errors.New("Demo stream ended unexpectedly (ErrUnexpectedEndOfDemo)") // ErrInvalidFileType signals that the input isn't a valid CS:GO demo. ErrInvalidFileType = errors.New("Invalid File-Type; expecting HL2DEMO in the first 8 bytes") // ErrHeaderNotParsed signals that the header hasn't been parsed before attempting to parse a tick. ErrHeaderNotParsed = errors.New("Header must be parsed before trying to parse a tick. See Parser.ParseHeader()") )
Parsing errors
var DefaultParserConfig = ParserConfig{
MsgQueueBufferSize: -1,
}
DefaultParserConfig is the default Parser configuration used by NewParser().
Functions ¶
This section is empty.
Types ¶
type EventEmitter ¶ added in v0.5.0
type EventEmitter interface {
Register(parser *Parser, eventDispatcher func(event interface{}))
}
EventEmitter is the interface to define additional event-emitters. The emitters may fire additional events by calling the eventDispatcher function received during registration of the emitter.
See also: package fuzzy for existing emitters with fuzzy-logic that depends on the demo-type.
type GameState ¶ added in v0.4.0
type GameState struct {
// contains filtered or unexported fields
}
GameState contains all game-state relevant information.
func (GameState) Entities ¶
Entities returns all currently existing entities. (Almost?) everything in the game is an entity, such as weapons, players, fire etc.
func (GameState) GrenadeProjectiles ¶ added in v0.5.4
func (gs GameState) GrenadeProjectiles() map[int]*common.GrenadeProjectile
GrenadeProjectiles returns a map from entity-IDs to all live grenade projectiles.
Only constains projectiles currently in-flight or still active (smokes etc.), i.e. have been thrown but have yet to detonate.
func (GameState) Infernos ¶
Infernos returns a map from entity-IDs to all currently burning infernos (fires from incendiaries and Molotovs).
func (GameState) IngameTick ¶ added in v0.4.0
IngameTick returns the latest actual tick number of the server during the game.
Watch out, I've seen this return wonky negative numbers at the start of demos.
func (GameState) Participants ¶ added in v0.4.0
func (gs GameState) Participants() Participants
Participants returns a struct with all currently connected players & spectators and utility functions. The struct contains references to the original maps so it's always up-to-date.
func (*GameState) TeamCounterTerrorists ¶
TeamCounterTerrorists returns the TeamState of the CT team.
Make sure to handle swapping sides properly if you keep the reference.
func (*GameState) TeamTerrorists ¶
TeamTerrorists returns the TeamState of the T team.
Make sure to handle swapping sides properly if you keep the reference.
type NetMessageCreator ¶ added in v0.5.0
NetMessageCreator creates additional net-messages to be dispatched to net-message handlers.
See also: ParserConfig.AdditionalNetMessageCreators & Parser.RegisterNetMessageHandler()
type Parser ¶
type Parser struct {
// contains filtered or unexported fields
}
Parser can parse a CS:GO demo. Creating a Parser is done via NewParser().
To start off use Parser.ParseHeader() to parse the demo header. After parsing the header Parser.ParseNextFrame() and Parser.ParseToEnd() can be used to parse the demo.
Use Parser.RegisterEventHandler() to receive notifications about events.
Example (without error handling):
f, _ := os.Open("/path/to/demo.dem") p := dem.NewParser(f) header := p.ParseHeader() fmt.Println("Map:", header.MapName) p.RegisterEventHandler(func(e events.BombExplode) { fmt.Printf(e.Site, "went BOOM!") }) p.ParseToEnd()
Prints out '{A/B} site went BOOM!' when a bomb explodes.
func NewParser ¶
NewParser creates a new Parser with the default configuration. The demostream io.Reader (e.g. os.File or bytes.Reader) must provide demo data in the '.DEM' format.
See also: NewCustomParser() & DefaultParserConfig
func NewParserWithConfig ¶ added in v0.5.0
func NewParserWithConfig(demostream io.Reader, config ParserConfig) *Parser
NewParserWithConfig returns a new Parser with a custom configuration.
See also: NewParser() & ParserConfig
func (*Parser) Cancel ¶
func (p *Parser) Cancel()
Cancel aborts ParseToEnd(). All information that was already read up to this point may still be used (and new events may still be sent out).
func (*Parser) CurrentFrame ¶
CurrentFrame return the number of the current frame, aka. 'demo-tick' (Since demos often have a different tick-rate than the game). Starts with frame 0, should go up to DemoHeader.PlaybackFrames but might not be the case (usually it's just close to it).
func (*Parser) CurrentTime ¶
CurrentTime returns the time elapsed since the start of the demo
func (*Parser) GameState ¶ added in v0.4.0
GameState returns the current game-state. It contains most of the relevant information about the game such as players, teams, scores, grenades etc.
func (*Parser) Header ¶ added in v0.2.0
func (p *Parser) Header() common.DemoHeader
Header returns the DemoHeader which contains the demo's metadata. Only possible after ParserHeader() has been called.
func (*Parser) ParseHeader ¶
func (p *Parser) ParseHeader() (common.DemoHeader, error)
ParseHeader attempts to parse the header of the demo.
Returns ErrInvalidFileType if the filestamp (first 8 bytes) doesn't match HL2DEMO.
func (*Parser) ParseNextFrame ¶
ParseNextFrame attempts to parse the next frame / demo-tick (not ingame tick).
Returns true unless the demo command 'stop' or an error was encountered. Returns an error if the header hasn't been parsed yet - see Parser.ParseHeader().
May return ErrUnexpectedEndOfDemo for incomplete / corrupt demos. May panic if the demo is corrupt in some way.
See also: ParseToEnd() for parsing the complete demo in one go (faster).
func (*Parser) ParseToEnd ¶
ParseToEnd attempts to parse the demo until the end. Aborts and returns ErrCancelled if Cancel() is called before the end.
See also: ParseNextFrame() for other possible errors.
func (*Parser) Progress ¶
Progress returns the parsing progress from 0 to 1. Where 0 means nothing has been parsed yet and 1 means the demo has been parsed to the end.
Might not be 100% correct since it's just based on the reported tick count of the header.
func (*Parser) RegisterEventHandler ¶
func (p *Parser) RegisterEventHandler(handler interface{}) dp.HandlerIdentifier
RegisterEventHandler registers a handler for game events.
The handler must be of type func(<EventType>) where EventType is the kind of event to be handled. To catch all events func(interface{}) can be used.
Example:
parser.RegisterEventHandler(func(e events.WeaponFired) { fmt.Printf("%s fired his %s\n", e.Shooter.Name, e.Weapon.Weapon) })
Parameter handler has to be of type interface{} because lolnogenerics.
Returns a identifier with which the handler can be removed via UnregisterEventHandler().
func (*Parser) RegisterNetMessageHandler ¶ added in v0.5.0
func (p *Parser) RegisterNetMessageHandler(handler interface{}) dp.HandlerIdentifier
RegisterNetMessageHandler registers a handler for net-messages.
The handler must be of type func(*<MessageType>) where MessageType is the kind of net-message to be handled.
Returns a identifier with which the handler can be removed via UnregisterNetMessageHandler().
See also: RegisterEventHandler()
func (*Parser) ServerClasses ¶
func (p *Parser) ServerClasses() st.ServerClasses
ServerClasses returns the server-classes of this demo. These are available after events.DataTablesParsed has been fired.
func (*Parser) UnregisterEventHandler ¶ added in v0.4.0
func (p *Parser) UnregisterEventHandler(identifier dp.HandlerIdentifier)
UnregisterEventHandler removes a game event handler via identifier.
The identifier is returned at registration by RegisterEventHandler().
func (*Parser) UnregisterNetMessageHandler ¶ added in v0.5.0
func (p *Parser) UnregisterNetMessageHandler(identifier dp.HandlerIdentifier)
UnregisterNetMessageHandler removes a net-message handler via identifier.
The identifier is returned at registration by RegisterNetMessageHandler().
type ParserConfig ¶ added in v0.5.0
type ParserConfig struct { // MsgQueueBufferSize defines the size of the internal net-message queue. // For large demos, fast i/o and slow CPUs higher numbers are suggested and vice versa. // The buffer size can easily be in the hundred-thousands to low millions for the best performance. // A negative value will make the Parser automatically decide the buffer size during ParseHeader() // based on the number of ticks in the demo (nubmer of ticks = buffer size); // this is the default behavior for DefaultParserConfig. // Zero enforces sequential parsing. MsgQueueBufferSize int // AdditionalNetMessageCreators maps net-message-IDs to creators (instantiators). // The creators should return a new instance of the correct protobuf-message type (from the msg package). // Interesting net-message-IDs can easily be discovered with the build-tag 'debugdemoinfocs'; when looking for 'UnhandledMessage'. // Check out demopacket.go to see which net-messages are already being parsed by default. // This is a beta feature and may be changed or replaced without notice. AdditionalNetMessageCreators map[int]NetMessageCreator // AdditionalEventEmitters contains additional event emitters - either from the fuzzy package or custom ones. // This is mainly used to add logic specifically for one type of demo (e.g. Matchmaking, FaceIt etc.). // This is a beta feature and may be changed or replaced without notice. // See also: package fuzzy for existing emitters with fuzzy-logic that depends on the demo-type. AdditionalEventEmitters []EventEmitter }
ParserConfig contains the configuration for creating a new Parser.
type Participants ¶
type Participants struct {
// contains filtered or unexported fields
}
Participants provides helper functions on top of the currently connected players. E.g. ByUserID(), ByEntityID(), TeamMembers(), etc.
See GameState.Participants()
func (Participants) All ¶
func (ptcp Participants) All() []*common.Player
All returns all currently connected players & spectators.
func (Participants) ByEntityID ¶
func (ptcp Participants) ByEntityID() map[int]*common.Player
ByEntityID returns all currently connected players in a map where the key is the entity-ID. The map is a snapshot and is not updated (not a reference to the actual, underlying map). Includes spectators.
func (Participants) ByUserID ¶
func (ptcp Participants) ByUserID() map[int]*common.Player
ByUserID returns all currently connected players in a map where the key is the user-ID. The map is a snapshot and is not updated (not a reference to the actual, underlying map). Includes spectators.
func (Participants) FindByHandle ¶
func (ptcp Participants) FindByHandle(handle int) *common.Player
FindByHandle attempts to find a player by his entity-handle. The entity-handle is often used in entity-properties when referencing other entities such as a weapon's owner.
Returns nil if not found or if handle == invalidEntityHandle (used when referencing no entity).
func (Participants) Playing ¶
func (ptcp Participants) Playing() []*common.Player
Playing returns all players that aren't spectating or unassigned.
func (Participants) TeamMembers ¶
func (ptcp Participants) TeamMembers(team common.Team) []*common.Player
TeamMembers returns all players belonging to the requested team at this time.
type TeamState ¶
type TeamState struct {
// contains filtered or unexported fields
}
TeamState contains a team's ID, score, clan name & country flag.
func (TeamState) Flag ¶
Flag returns the team's country flag. E.g. DE, FR, etc.
Watch out, in some demos this is upper-case and in some lower-case.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package bitread provides a wrapper for github.com/markus-wa/gobitread with CS:GO demo parsing specific helpers.
|
Package bitread provides a wrapper for github.com/markus-wa/gobitread with CS:GO demo parsing specific helpers. |
Package common contains common types, constants and functions used over different demoinfocs packages.
|
Package common contains common types, constants and functions used over different demoinfocs packages. |
Package events contains all events that can be sent out from demoinfocs.Parser.
|
Package events contains all events that can be sent out from demoinfocs.Parser. |
Package fuzzy contains fuzzy-logic that is either specific to certain demo-types or where it's reliability can't always be guaranteed.
|
Package fuzzy contains fuzzy-logic that is either specific to certain demo-types or where it's reliability can't always be guaranteed. |
Package msg is a generated protocol buffer package.
|
Package msg is a generated protocol buffer package. |
Package sendtables contains sendtable specific magic and should really be better documented (TODO).
|
Package sendtables contains sendtable specific magic and should really be better documented (TODO). |