Documentation ¶
Index ¶
- Constants
- type CenterPrint
- type ChallengeResponse
- type ClientPacket
- type ConfigString
- type ConnectionlessPacket
- type FrameMsg
- type Layout
- type MessageBuffer
- func (m *MessageBuffer) Append(m2 MessageBuffer)
- func (m *MessageBuffer) ParseCenterPrint() CenterPrint
- func (m *MessageBuffer) ParseChallenge() (ChallengeResponse, error)
- func (m *MessageBuffer) ParseConfigString() ConfigString
- func (m *MessageBuffer) ParseDeltaPlayerstate(ps PackedPlayer) PackedPlayer
- func (m *MessageBuffer) ParseEntity(from PackedEntity, num uint16, bits uint32) PackedEntity
- func (m *MessageBuffer) ParseEntityBitmask() uint32
- func (m *MessageBuffer) ParseEntityNumber(flags uint32) uint16
- func (msg *MessageBuffer) ParseFrame() FrameMsg
- func (m *MessageBuffer) ParseInventory()
- func (m *MessageBuffer) ParseLayout() Layout
- func (m *MessageBuffer) ParseMuzzleFlash() MuzzleFlash
- func (m *MessageBuffer) ParsePacketEntities(from *ServerFrame) []PackedEntity
- func (m *MessageBuffer) ParsePrint() Print
- func (m *MessageBuffer) ParseServerData() ServerData
- func (m *MessageBuffer) ParseSound() PackedSound
- func (m *MessageBuffer) ParseSpawnBaseline() PackedEntity
- func (m *MessageBuffer) ParseStuffText() StuffText
- func (m *MessageBuffer) ParseTempEntity() TemporaryEntity
- func (msg *MessageBuffer) ReadByte() byte
- func (msg *MessageBuffer) ReadChar() int8
- func (msg *MessageBuffer) ReadCoord() uint16
- func (msg *MessageBuffer) ReadData(length int) []byte
- func (msg *MessageBuffer) ReadDirection() uint8
- func (msg *MessageBuffer) ReadLong() int32
- func (msg *MessageBuffer) ReadPosition() [3]uint16
- func (msg *MessageBuffer) ReadShort() uint16
- func (msg *MessageBuffer) ReadString() string
- func (msg *MessageBuffer) ReadULong() uint32
- func (msg *MessageBuffer) ReadWord() int16
- func (m *MessageBuffer) Reset()
- func (m *MessageBuffer) Rewind()
- func (m *MessageBuffer) Seek(offset int)
- func (m *MessageBuffer) Size() int
- func (msg *MessageBuffer) WriteByte(b byte)
- func (msg *MessageBuffer) WriteChar(c uint8)
- func (msg *MessageBuffer) WriteCoord(c uint16)
- func (msg *MessageBuffer) WriteData(data []byte)
- func (m *MessageBuffer) WriteDeltaEntity(from PackedEntity, to PackedEntity)
- func (m *MessageBuffer) WriteDeltaFrame(from *ServerFrame, to *ServerFrame)
- func (msg *MessageBuffer) WriteDeltaPlayerstate(to *PackedPlayer, from *PackedPlayer)
- func (msg *MessageBuffer) WriteLong(data int32)
- func (msg *MessageBuffer) WriteShort(s uint16)
- func (msg *MessageBuffer) WriteString(s string)
- func (msg *MessageBuffer) WriteWord(w int16)
- type MessageCallbacks
- type MuzzleFlash
- type PackedEntity
- type PackedPlayer
- type PackedSound
- type PlayerMoveState
- type Print
- type ServerData
- type ServerFrame
- type StuffText
- type TemporaryEntity
Constants ¶
const ( SVCBad = iota SVCMuzzleFlash SVCMuzzleFlash2 SVCTempEntity SVCLayout SVCInventory SVCNOP SVCDisconnect SVCReconnect SVCSound SVCPrint SVCStuffText SVCServerData SVCConfigString SVCSpawnBaseline SVCCenterPrint SVCDownload SVCPlayerInfo SVCPacketEntities SVCDeltaPacketEntities SVCFrame SVCZPacket // r1q2 SVCZDownload // r1q2 SVCGameState // r1q2/q2pro SVCSetting // r1q2/q2pro SVCNumTypes // r1q2/q2pro )
server to client message types
const ( EntityOrigin1 = 1 << 0 EntityOrigin2 = 1 << 1 EntityAngle2 = 1 << 2 EntityAngle3 = 1 << 3 EntityFrame8 = 1 << 4 EntityEvent = 1 << 5 EntityRemove = 1 << 6 EntityMoreBits1 = 1 << 7 EntityNumber16 = 1 << 8 EntityOrigin3 = 1 << 9 EntityAngle1 = 1 << 10 EntityModel = 1 << 11 EntityRenderFX8 = 1 << 12 EntityAngle16 = 1 << 13 EntityEffects8 = 1 << 14 EntityMoreBits2 = 1 << 15 EntitySkin8 = 1 << 16 EntityFrame16 = 1 << 17 EntityRenderFX16 = 1 << 18 EntityEffects16 = 1 << 19 EntityModel2 = 1 << 20 EntityModel3 = 1 << 21 EntityModel4 = 1 << 22 EntityMoreBits3 = 1 << 23 EntityOldOrigin = 1 << 24 EntitySkin16 = 1 << 25 EntitySound = 1 << 26 EntitySolid = 1 << 27 )
entity state flags
const ( PlayerType = 1 << 0 PlayerOrigin = 1 << 1 PlayerVelocity = 1 << 2 PlayerTime = 1 << 3 PlayerFlags = 1 << 4 PlayerGravity = 1 << 5 PlayerDeltaAngles = 1 << 6 PlayerViewOffset = 1 << 7 PlayerViewAngles = 1 << 8 PlayerKickAngles = 1 << 9 PlayerBlend = 1 << 10 PlayerFOV = 1 << 11 PlayerWeaponIndex = 1 << 12 PlayerWeaponFrame = 1 << 13 PlayerRDFlags = 1 << 14 PlayerReserved = 1 << 15 PlayerBits = 16 PlayerMask = (1 << PlayerBits) - 1 )
playerstate flags
const ( SoundVolume = 1 << 0 // 1 byte SoundAttenuation = 1 << 1 // 1 byte SoundPosition = 1 << 2 // 3 coordinates SoundEntity = 1 << 3 // short 0-2: channel, 3-12: entity SoundOffset = 1 << 4 // 1 byte, msec offset from frame start )
Sound properties
const ( TentGunshot = iota TentBlood TentBlaster TentRailTrail TentShotgun TentExplosion1 TentExplosion2 TentRocketExplosion TentGrenadeExplosion TentSparks TentSplash TentBubbleTrail TentScreenSparks TentShieldSparks TentBulletSparks TentLaserSparks TentParasiteAttack TentRocketExplosionWater TentGrenadeExplosionWater TentMedicCableAttack TentBFGExplosion TentBFGBigExplosion TentBossTeleport TentBFGLaser TentGrappleCable TentWeldingSparks TentGreenBlood TentBlueHyperBlaster TentPlasmaExplosion TentTunnelSparks TentBlaster2 TentRailTrail2 TentFlame TentLightning TentDebugTrail TentPlainExplosion TentFlashlight TentForceWall TentHeatBeam TentMonsterHeatBeam TentSteam TentBubbleTrail2 TentMoreBlood TentHeatBeamSparks TentHeatBeamSteam TentChainFistSmoke TentElectricSparks TentTrackerExplosion TentTeleportEffect TentDBallGoal TentWidowBeamOut TentNukeBlast TentWidowSplash TentExplosion1Big TentExplosion1NP TentFlechette TentNumEntities )
temporary entity types
const ( RFFrameLerp = 64 RFBeam = 128 )
const ( MaxItems = 256 MaxStats = 32 MaxEntities = 1024 MaxConfigStrings = 2080 MaxMessageLength = 1390 CLCMove = 2 CLCUserinfo = 3 CLCStringCommand = 4 PrintLevelLow = 1 PrintLevelObit = 2 PrintLevelHigh = 3 PrintLevelChat = 3 )
const (
CSMapname = 33
)
configstrings
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CenterPrint ¶
type CenterPrint struct {
Data string
}
type ChallengeResponse ¶
type ClientPacket ¶
type ClientPacket struct { Sequence1 int32 Sequence2 int32 QPort uint16 // Reliable1 bool // requires an ack Reliable2 bool MessageType byte // what kind of msg? Data []byte // the actual msg }
func (ClientPacket) Marshal ¶
func (p ClientPacket) Marshal() []byte
type ConfigString ¶
func (ConfigString) Marshal ¶
func (cs ConfigString) Marshal() *MessageBuffer
type ConnectionlessPacket ¶
Out of band message
func (ConnectionlessPacket) Marshal ¶
func (cp ConnectionlessPacket) Marshal() []byte
func (ConnectionlessPacket) Send ¶
func (cp ConnectionlessPacket) Send(srv string, port int) (MessageBuffer, error)
type MessageBuffer ¶
func NewClientCommand ¶
func NewClientCommand(str string) MessageBuffer
func NewConnectionlessPacket ¶
func NewConnectionlessPacket(str string) MessageBuffer
func NewMessageBuffer ¶
func NewMessageBuffer(data []byte) MessageBuffer
func (*MessageBuffer) Append ¶
func (m *MessageBuffer) Append(m2 MessageBuffer)
combine 2 buffers, set index to the end
func (*MessageBuffer) ParseCenterPrint ¶
func (m *MessageBuffer) ParseCenterPrint() CenterPrint
A string that should appear temporarily in the center of the screen
func (*MessageBuffer) ParseChallenge ¶
func (m *MessageBuffer) ParseChallenge() (ChallengeResponse, error)
func (*MessageBuffer) ParseConfigString ¶
func (m *MessageBuffer) ParseConfigString() ConfigString
Configstrings are strings sent to each client and associated with an index. They're referenced by index in various playces such as layouts, etc.
func (*MessageBuffer) ParseDeltaPlayerstate ¶
func (m *MessageBuffer) ParseDeltaPlayerstate(ps PackedPlayer) PackedPlayer
func (*MessageBuffer) ParseEntity ¶
func (m *MessageBuffer) ParseEntity(from PackedEntity, num uint16, bits uint32) PackedEntity
func (*MessageBuffer) ParseEntityBitmask ¶
func (m *MessageBuffer) ParseEntityBitmask() uint32
Read up to the first 4 bytes of an entity, depending on the previous ones. This value tells you what data is in the rest of the entity message.
func (*MessageBuffer) ParseEntityNumber ¶
func (m *MessageBuffer) ParseEntityNumber(flags uint32) uint16
func (*MessageBuffer) ParseFrame ¶
func (msg *MessageBuffer) ParseFrame() FrameMsg
func (*MessageBuffer) ParseInventory ¶
func (m *MessageBuffer) ParseInventory()
2 bytes for every item
func (*MessageBuffer) ParseLayout ¶
func (m *MessageBuffer) ParseLayout() Layout
A layout is a string of code to represent how things need to be arranged on the screen. The intermission screen after a TDM match for example with players, scores, pings, stats, etc is an example
func (*MessageBuffer) ParseMuzzleFlash ¶
func (m *MessageBuffer) ParseMuzzleFlash() MuzzleFlash
A gun fired, nearby clients should see the flash
func (*MessageBuffer) ParsePacketEntities ¶
func (m *MessageBuffer) ParsePacketEntities(from *ServerFrame) []PackedEntity
A S->C msg containing all entities the client should know aobut for a particular frame
func (*MessageBuffer) ParsePrint ¶
func (m *MessageBuffer) ParsePrint() Print
func (*MessageBuffer) ParseServerData ¶
func (m *MessageBuffer) ParseServerData() ServerData
func (*MessageBuffer) ParseSound ¶
func (m *MessageBuffer) ParseSound() PackedSound
func (*MessageBuffer) ParseSpawnBaseline ¶
func (m *MessageBuffer) ParseSpawnBaseline() PackedEntity
A baseline is just a normal entity in its default state, from a client's perspective
func (*MessageBuffer) ParseStuffText ¶
func (m *MessageBuffer) ParseStuffText() StuffText
func (*MessageBuffer) ParseTempEntity ¶
func (m *MessageBuffer) ParseTempEntity() TemporaryEntity
func (*MessageBuffer) ReadCoord ¶
func (msg *MessageBuffer) ReadCoord() uint16
func (*MessageBuffer) ReadData ¶
func (msg *MessageBuffer) ReadData(length int) []byte
just grab a subsection of the buffer
func (*MessageBuffer) ReadDirection ¶
func (msg *MessageBuffer) ReadDirection() uint8
func (*MessageBuffer) ReadPosition ¶
func (msg *MessageBuffer) ReadPosition() [3]uint16
func (*MessageBuffer) ReadString ¶
func (msg *MessageBuffer) ReadString() string
Keep building a string until we hit a null
func (*MessageBuffer) Reset ¶
func (m *MessageBuffer) Reset()
func (*MessageBuffer) Rewind ¶
func (m *MessageBuffer) Rewind()
func (*MessageBuffer) Seek ¶
func (m *MessageBuffer) Seek(offset int)
func (*MessageBuffer) Size ¶
func (m *MessageBuffer) Size() int
func (*MessageBuffer) WriteByte ¶
func (msg *MessageBuffer) WriteByte(b byte)
func (*MessageBuffer) WriteChar ¶
func (msg *MessageBuffer) WriteChar(c uint8)
func (*MessageBuffer) WriteCoord ¶
func (msg *MessageBuffer) WriteCoord(c uint16)
func (*MessageBuffer) WriteData ¶
func (msg *MessageBuffer) WriteData(data []byte)
func (*MessageBuffer) WriteDeltaEntity ¶
func (m *MessageBuffer) WriteDeltaEntity(from PackedEntity, to PackedEntity)
Compare from and to and only write what's different. This is "delta compression"
func (*MessageBuffer) WriteDeltaFrame ¶
func (m *MessageBuffer) WriteDeltaFrame(from *ServerFrame, to *ServerFrame)
func (*MessageBuffer) WriteDeltaPlayerstate ¶
func (msg *MessageBuffer) WriteDeltaPlayerstate(to *PackedPlayer, from *PackedPlayer)
Build a playerstate message, but only the differences between to and from.
func (*MessageBuffer) WriteLong ¶
func (msg *MessageBuffer) WriteLong(data int32)
func (*MessageBuffer) WriteShort ¶
func (msg *MessageBuffer) WriteShort(s uint16)
func (*MessageBuffer) WriteString ¶
func (msg *MessageBuffer) WriteString(s string)
Strings are null terminated, so add a 0x00 at the end.
func (*MessageBuffer) WriteWord ¶
func (msg *MessageBuffer) WriteWord(w int16)
type MessageCallbacks ¶
type MessageCallbacks struct { // message specific callbacks ServerData func(*ServerData) ConfigString func(*ConfigString) Baseline func(*PackedEntity) Frame func(*FrameMsg) PlayerState func(*PackedPlayer) Entity func([]*PackedEntity) Print func(*Print) Stuff func(*StuffText) Layout func(*Layout) CenterPrint func(*CenterPrint) Sound func(*PackedSound) TempEnt func(*TemporaryEntity) Flash1 func(*MuzzleFlash) Flash2 func(*MuzzleFlash) // event specific callbacks OnConnect func() // connection to gameserver made OnEnter func() // you entered the game (begin) PreSend func(*MessageBuffer) // }
function pointers for each message type
type MuzzleFlash ¶
type PackedEntity ¶
type PackedEntity struct { Number uint32 Origin [3]int16 Angles [3]int16 OldOrigin [3]int16 ModelIndex uint8 ModelIndex2 uint8 ModelIndex3 uint8 ModelIndex4 uint8 SkinNum uint32 Effects uint32 RenderFX uint32 Solid uint32 Frame uint16 Sound uint8 Event uint8 }
func (*PackedEntity) DeltaEntityBitmask ¶
func (to *PackedEntity) DeltaEntityBitmask(from *PackedEntity) int
Find the differences between these two Entities
func (PackedEntity) Marshal ¶
func (ent PackedEntity) Marshal() *MessageBuffer
type PackedPlayer ¶
type PackedPlayer struct { PlayerMove PlayerMoveState ViewAngles [3]int16 ViewOffset [3]int8 KickAngles [3]int8 GunAngles [3]int8 GunOffset [3]int8 GunIndex uint8 GunFrame uint8 Blend [4]uint8 FOV uint8 RDFlags uint8 Stats [32]int16 }
func (*PackedPlayer) DeltaPlayerstateBitmask ¶
func (to *PackedPlayer) DeltaPlayerstateBitmask(from *PackedPlayer) uint16
Figure out the difference between two playerstates
func (PackedPlayer) Marshal ¶
func (ps PackedPlayer) Marshal() *MessageBuffer
type PackedSound ¶
type PlayerMoveState ¶
type ServerData ¶
type ServerData struct { Protocol int32 ServerCount int32 Demo int8 GameDir string ClientNumber int16 MapName string }
always the first message received from server
func (ServerData) Marshal ¶
func (sd ServerData) Marshal() *MessageBuffer
type ServerFrame ¶
type ServerFrame struct { Server ServerData Frame FrameMsg Playerstate PackedPlayer Entities [MaxEntities]PackedEntity Baselines [MaxEntities]PackedEntity Strings []ConfigString Prints []Print Stuffs []StuffText Layouts []Layout Centerprinters []CenterPrint Sounds []PackedSound TempEntities []TemporaryEntity Flash1 []MuzzleFlash Flash2 []MuzzleFlash }
func ParseMessageLump ¶
func ParseMessageLump(buf MessageBuffer, intcb MessageCallbacks, extcb MessageCallbacks, delta *ServerFrame) (ServerFrame, error)
Parse through a clod of various messages. In the case of demos, these lumps will be read from disk, for a live client, they'll be received via the network every 0.1 seconds
Internal callbacks are for other parts of the library. For logic differences between demo parsing and live connection parsing.
External callbacks are for logic outside the library, like custom programs that import this library.