go-susapp/gamerpcprocessor.go

102 lines
3.7 KiB
Go
Raw Normal View History

2021-09-12 00:25:10 +01:00
package main
import (
"encoding/hex"
"fmt"
"codehub.onpointcoding.net/sean/go-susapp/gamedata"
"codehub.onpointcoding.net/sean/go-susapp/protocol"
)
type GameRPCProcessor struct {
sus *SusApp
rpcCallMap map[byte]func(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc)
}
func NewGameRPCProcessor(sus *SusApp) *GameRPCProcessor {
proc := &GameRPCProcessor{sus: sus}
proc.rpcCallMap = map[byte]func(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc){
0x00: proc.captureRpcPlayAnimation,
0x02: proc.captureRpcSyncSettings,
0x03: proc.captureRpcSetInfected,
0x04: proc.captureRpcExiled,
0x06: proc.captureRpcSetName,
0x08: proc.captureRpcSetColor,
0x09: proc.captureRpcSetHat,
0x0a: proc.captureRpcSetSkin,
0x11: proc.captureRpcSetPet,
0x12: proc.captureRpcSetStartCounter,
}
return proc
}
func (proc *GameRPCProcessor) receiveGameRpcCall(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
v, ok := proc.rpcCallMap[rpc.RPCCallID]
if ok {
v(net, GameID, rpc)
} else {
fmt.Printf("Unable to parse gamedata rpc call with id of %x\n", rpc.RPCCallID)
fmt.Printf("Packet: %v\n", hex.EncodeToString(rpc.UnderlyingHazel.GetUnderlyingPacket().Dump()))
}
}
func (proc *GameRPCProcessor) captureRpcPlayAnimation(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
}
func (proc *GameRPCProcessor) captureRpcSyncSettings(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSyncSettings{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
if a.Options.IsDefaults {
proc.sus.state.CurrentGame.GameOptions = protocol.NewDefaultGameOptionsData()
} else {
proc.sus.state.CurrentGame.GameOptions = a.Options
}
}
func (proc *GameRPCProcessor) captureRpcSetInfected(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
}
func (proc *GameRPCProcessor) captureRpcExiled(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
}
func (proc *GameRPCProcessor) captureRpcSetName(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSetName{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
proc.sus.state.CurrentGame.PlayerNetObjects.ByPlayerNetID[rpc.SenderNetID].PlayerName = a.Name
}
func (proc *GameRPCProcessor) captureRpcSetColor(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSetColor{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
proc.sus.state.CurrentGame.PlayerNetObjects.ByPlayerNetID[rpc.SenderNetID].PlayerColor = a.Color
}
func (proc *GameRPCProcessor) captureRpcSetHat(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSetHat{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
proc.sus.state.CurrentGame.PlayerNetObjects.ByPlayerNetID[rpc.SenderNetID].PlayerHat = a.HatID
}
func (proc *GameRPCProcessor) captureRpcSetSkin(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSetSkin{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
proc.sus.state.CurrentGame.PlayerNetObjects.ByPlayerNetID[rpc.SenderNetID].PlayerSkin = a.SkinID
}
func (proc *GameRPCProcessor) captureRpcSetPet(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSetPet{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
proc.sus.state.CurrentGame.PlayerNetObjects.ByPlayerNetID[rpc.SenderNetID].PlayerPet = a.PetID
}
func (proc *GameRPCProcessor) captureRpcSetStartCounter(net *protocol.PacketHandler, GameID int32, rpc *gamedata.Rpc) {
a := &gamedata.RpcSetStartCounter{}
a.ReadFromPacket(rpc.UnderlyingHazel.GetUnderlyingPacket())
if proc.sus.state.CurrentGame != nil {
proc.sus.state.CurrentGame.StartGameTimer = a.TimeRemaining
}
}