message

package
v1.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 22, 2024 License: Apache-2.0 Imports: 9 Imported by: 2

Documentation

Index

Constants

View Source
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

View Source
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

View Source
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

View Source
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

View Source
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

View Source
const (
	RFFrameLerp = 64
	RFBeam      = 128
)
View Source
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
)
View Source
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 ChallengeResponse struct {
	Number    int
	Protocols []int // protocols support by server (34=orig, 35=r1q2, 36=q2pro)
}

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

type ConfigString struct {
	Index  uint16
	String string
}

func (ConfigString) Marshal

func (cs ConfigString) Marshal() *MessageBuffer

type ConnectionlessPacket

type ConnectionlessPacket struct {
	Sequence int32 // always -1
	Data     string
}

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 FrameMsg

type FrameMsg struct {
	Number     int32
	Delta      int32
	Suppressed int8
	AreaBytes  int8
	AreaBits   []byte
}

func (FrameMsg) Marshal

func (fr FrameMsg) Marshal() *MessageBuffer

type Layout

type Layout struct {
	Data string
}

func (Layout) RenderSVG

func (lo Layout) RenderSVG()

generate an SVG image from a layout message

type MessageBuffer

type MessageBuffer struct {
	Buffer []byte
	Index  int
	Length int // maybe not needed
}

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) ReadByte

func (msg *MessageBuffer) ReadByte() byte

for consistency

func (*MessageBuffer) ReadChar

func (msg *MessageBuffer) ReadChar() int8

1 byte signed

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) ReadLong

func (msg *MessageBuffer) ReadLong() int32

4 bytes signed

func (*MessageBuffer) ReadPosition

func (msg *MessageBuffer) ReadPosition() [3]uint16

func (*MessageBuffer) ReadShort

func (msg *MessageBuffer) ReadShort() uint16

2 bytes unsigned

func (*MessageBuffer) ReadString

func (msg *MessageBuffer) ReadString() string

Keep building a string until we hit a null

func (*MessageBuffer) ReadULong

func (msg *MessageBuffer) ReadULong() uint32

4 bytes unsigned

func (*MessageBuffer) ReadWord

func (msg *MessageBuffer) ReadWord() int16

2 bytes signed

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 MuzzleFlash struct {
	Entity uint16
	Weapon uint8
}

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 PackedSound struct {
	Flags       uint8
	Index       uint8
	Volume      uint8
	Attenuation uint8
	TimeOffset  uint8
	Channel     uint16
	Entity      uint16
	Position    [3]uint16
}

type PlayerMoveState

type PlayerMoveState struct {
	Type        uint8
	Origin      [3]int16
	Velocity    [3]int16
	Flags       byte
	Time        byte
	Gravity     int16
	DeltaAngles [3]int16
}

type Print

type Print struct {
	Level  uint8
	String string
}

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.

type StuffText

type StuffText struct {
	String string
}

func (StuffText) Marshal

func (st StuffText) Marshal() *MessageBuffer

type TemporaryEntity

type TemporaryEntity struct {
	Type      uint8
	Position1 [3]uint16
	Position2 [3]uint16
	Offset    [3]uint16
	Direction uint8
	Count     uint8
	Color     uint8
	Entity1   int16
	Entity2   int16
	Time      int32
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL