package main import ( "bytes" "encoding/binary" ) const ( AdminPacketAdminJoin = iota AdminPacketAdminQuit AdminPacketAdminUpdateFrequency AdminPacketAdminPoll AdminPacketAdminChat AdminPacketAdminRCon AdminPacketAdminGamescript AdminPacketAdminPing AdminPacketServerFull = 100 AdminPacketServerBanned AdminPacketServerError AdminPacketServerProtocol AdminPacketServerWelcome AdminPacketServerNewgame AdminPacketServerShutdown AdminPacketServerDate AdminPacketServerClientJoin AdminPacketServerClientInfo AdminPacketServerClientUpdate AdminPacketServerClientQuit AdminPacketServerClientError AdminPacketServerCompanyNew AdminPacketServerCompanyInfo AdminPacketServerCompanyUpdate AdminPacketServerCompanyRemove AdminPacketServerCompanyEconomy AdminPacketServerCompanyStats AdminPacketServerChat AdminPacketServerRCon AdminPacketServerConsole AdminPacketServerCmdNames AdminPacketServerCmdLogging AdminPacketServerGamescript AdminPacketServerRConEnd AdminPacketServerPong InvalidAdminPacket = 0xFF ) type Packet struct { PLength uint16 PType uint8 } type PacketAdminJoin struct { Packet Password string AppName string AppVersion string } type PacketAdminServerProtocol struct { Packet ProtocolVersion uint8 FurtherData bool UpdatePacketType uint16 FrequenciesAllowed uint16 } type PacketAdminServerWelcome struct { Packet ServerName string OpenTTDVersion string Dedicated bool MapName string MapSeed uint32 MapLandscape uint8 MapStartDate uint32 MapX uint16 MapY uint16 } func (p *PacketAdminJoin) Bytes() []byte { buf := new(bytes.Buffer) p.PLength = uint16(len(p.Password) + len(p.AppName) + len(p.AppVersion) + 6) binary.Write(buf, binary.LittleEndian, p.PLength) binary.Write(buf, binary.LittleEndian, p.PType) buf.WriteString(p.Password) buf.WriteByte(0) buf.WriteString(p.AppName) buf.WriteByte(0) buf.WriteString(p.AppVersion) buf.WriteByte(0) return buf.Bytes() } func (p *PacketAdminServerWelcome) Read(b []byte) { r := bufio.NewReader(bytes.NewReader(b)) p.ServerName, _ = r.ReadString(0) p.OpenTTDVersion, _ = r.ReadString(0) c, _ := r.ReadByte() p.Dedicated = bool(c) p.MapName, _ = r.ReadString(0) bs := make([]byte, 13) _, _ = r.Read(bs) p.MapSeed = binary.LittleEndian.Uint32(bs[0:]) p.MapLandscape = uint8(bs[4:1]) p.MapStartDate = binary.LittleEndian.Uint32(bs[5:]) p.MapX = binary.LittleEndian.Uint16(bs[9:]) p.MapY = binary.LittleEndian.Uint16(bs[11:]) } func handlePacket(p Packet, b []byte) { switch p.PType { case AdminPacketServerProtocol: case AdminPacketServerWelcome: sp := PacketAdminServerWelcome{ Packet: p, } sp.Read(b) logInfoDebug("AdminPacketServerWelcome : %v", sp) default: } }