blob: 334362de551748184aaaaf3d750f523299e570a1 (
plain) (
tree)
|
|
/*
Provides access to TF2 Game Coordinator functionality.
*/
package tf2
import (
"github.com/Philipp15b/go-steam"
. "github.com/Philipp15b/go-steam/protocol/gamecoordinator"
. "github.com/Philipp15b/go-steam/tf2/protocol"
"github.com/Philipp15b/go-steam/tf2/protocol/protobuf"
)
const AppId = 440
// To use any methods of this, you'll need to SetPlaying(true) and wait for
// the GCReadyEvent.
type TF2 struct {
client *steam.Client
}
// Creates a new TF2 instance and registers it as a packet handler
func New(client *steam.Client) *TF2 {
t := &TF2{client}
client.GC.RegisterPacketHandler(t)
return t
}
func (t *TF2) SetPlaying(playing bool) {
if playing {
t.client.GC.SetGamesPlayed(AppId)
} else {
t.client.GC.SetGamesPlayed()
}
}
func (t *TF2) SetItemPosition(itemId, position uint64) {
t.client.GC.Write(NewGCMsg(AppId, uint32(protobuf.EGCItemMsg_k_EMsgGCSetSingleItemPosition), &MsgGCSetItemPosition{
itemId, position,
}))
}
// recipe -2 = wildcard
func (t *TF2) CraftItems(items []uint64, recipe int16) {
t.client.GC.Write(NewGCMsg(AppId, uint32(protobuf.EGCItemMsg_k_EMsgGCCraft), &MsgGCCraft{
Recipe: recipe,
Items: items,
}))
}
func (t *TF2) DeleteItem(itemId uint64) {
t.client.GC.Write(NewGCMsg(AppId, uint32(protobuf.EGCItemMsg_k_EMsgGCDelete), &MsgGCDeleteItem{itemId}))
}
func (t *TF2) NameItem(toolId, target uint64, name string) {
t.client.GC.Write(NewGCMsg(AppId, uint32(protobuf.EGCItemMsg_k_EMsgGCNameItem), &MsgGCNameItem{
toolId, target, name,
}))
}
type GCReadyEvent struct{}
func (t *TF2) HandleGCPacket(packet *GCPacket) {
if packet.AppId != AppId {
return
}
switch protobuf.EGCBaseClientMsg(packet.MsgType) {
case protobuf.EGCBaseClientMsg_k_EMsgGCClientWelcome:
t.handleWelcome(packet)
}
}
func (t *TF2) handleWelcome(packet *GCPacket) {
// the packet's body is pretty useless
t.client.Emit(&GCReadyEvent{})
}
|