diff options
| -rw-r--r-- | classic/ext_entity_pos.go | 22 | ||||
| -rw-r--r-- | classic/packets.go | 16 | ||||
| -rw-r--r-- | server/player.go | 44 |
3 files changed, 63 insertions, 19 deletions
diff --git a/classic/ext_entity_pos.go b/classic/ext_entity_pos.go new file mode 100644 index 0000000..cfc7bb9 --- /dev/null +++ b/classic/ext_entity_pos.go @@ -0,0 +1,22 @@ +package classic + +type Fixed int32 + +type SpawnPlayerExt struct { + PlayerId int8 + Username String + X, Y, Z Fixed + Yaw, Pitch byte +} +func (p *SpawnPlayerExt) PacketId() byte { + return 0x07 +} + +type SetPosFacingExt struct { + PlayerId int8 + X, Y, Z Fixed + Yaw, Pitch byte +} +func (p *SetPosFacingExt) PacketId() byte { + return 0x08 +} diff --git a/classic/packets.go b/classic/packets.go index 48ea80d..e361399 100644 --- a/classic/packets.go +++ b/classic/packets.go @@ -179,8 +179,18 @@ func createPacketType(packetId byte, client bool, ext map[string]bool) Packet { case 0x04: return &LevelFinalize {} case 0x05: return &ClientSetBlock {} case 0x06: return &SetBlock {} - case 0x07: return &SpawnPlayer {} - case 0x08: return &SetPosFacing {} + case 0x07: + if !ext["ExtEntityPositions"] { + return &SpawnPlayer {} + } else { + return &SpawnPlayerExt {} + } + case 0x08: + if !ext["ExtEntityPositions"] { + return &SetPosFacing {} + } else { + return &SetPosFacingExt {} + } case 0x09: return &UpdatePosFacing {} case 0x0a: return &UpdatePos {} case 0x0b: return &UpdateFacing {} @@ -188,6 +198,8 @@ func createPacketType(packetId byte, client bool, ext map[string]bool) Packet { case 0x0d: return &Message {} case 0x0e: return &DisconnectPlayer {} case 0x0f: return &UpdateUserType {} + case 0x10: return &ExtInfo {} + case 0x11: return &ExtEntry {} default: return nil } } diff --git a/server/player.go b/server/player.go index 66dcc88..63dad37 100644 --- a/server/player.go +++ b/server/player.go @@ -85,12 +85,22 @@ func (p *player) kick(reason string) { } } +func (p *player) sendAuthInfo() { + var userType byte + if p.state.Auth >= cheatAuth { + userType = classic.OpUser + } + p.client.SendPacket(p, &classic.UpdateUserType { + Type: userType, + }) +} + func (p *player) handlePacket(packet classic.Packet) { if p.level == nil || !p.levelLoaded { return } switch pck := packet.(type) { - case *classic.SetPosFacing: + case *classic.SetPosFacingExt: p.state.Pos = entityPos { entityCoord(pck.X), entityCoord(pck.Y), entityCoord(pck.Z), } @@ -173,11 +183,11 @@ func (p *player) MovePlayer( p.Act(from, func() { p.state.Pos = pos p.state.Facing = facing - p.client.SendPacket(p, &classic.SpawnPlayer { + p.client.SendPacket(p, &classic.SpawnPlayerExt { PlayerId: -1, - X: classic.FShort(pos.X), - Y: classic.FShort(pos.Y), - Z: classic.FShort(pos.Z), + X: classic.Fixed(pos.X), + Y: classic.Fixed(pos.Y), + Z: classic.Fixed(pos.Z), Yaw: facing.Yaw, Pitch: facing.Pitch, }) @@ -241,12 +251,12 @@ func (p *player) OnLevelData(from *level, info levelInfo, data io.ReadCloser) { Height: int16(info.Size.Y), Length: int16(info.Size.Z), }) - p.client.SendPacket(p, &classic.SpawnPlayer { + p.client.SendPacket(p, &classic.SpawnPlayerExt { PlayerId: -1, Username: classic.PadString(p.name), - X: classic.FShort(p.state.Pos.X), - Y: classic.FShort(p.state.Pos.Y), - Z: classic.FShort(p.state.Pos.Z), + X: classic.Fixed(p.state.Pos.X), + Y: classic.Fixed(p.state.Pos.Y), + Z: classic.Fixed(p.state.Pos.Z), Yaw: p.state.Facing.Yaw, Pitch: p.state.Facing.Pitch, }) @@ -268,12 +278,12 @@ func (p *player) OnLevelError(from *level, message string, info levelInfo) { func (p *player) OnPlayer( from *level, id levelPlayerId, name string, pos entityPos) { p.Act(from, func() { - p.client.SendPacket(p, &classic.SpawnPlayer { + p.client.SendPacket(p, &classic.SpawnPlayerExt { PlayerId: int8(id), Username: classic.PadString(name), - X: classic.FShort(pos.X), - Y: classic.FShort(pos.Y), - Z: classic.FShort(pos.Z), + X: classic.Fixed(pos.X), + Y: classic.Fixed(pos.Y), + Z: classic.Fixed(pos.Z), }) }) } @@ -287,11 +297,11 @@ func (p *player) OnRemovePlayer(from *level, id levelPlayerId) { func (p *player) OnMovePlayer( from *level, id levelPlayerId, pos entityPos, facing entityFacing) { p.Act(from, func() { - p.client.SendPacket(p, &classic.SetPosFacing { + p.client.SendPacket(p, &classic.SetPosFacingExt { PlayerId: int8(id), - X: classic.FShort(pos.X), - Y: classic.FShort(pos.Y), - Z: classic.FShort(pos.Z), + X: classic.Fixed(pos.X), + Y: classic.Fixed(pos.Y), + Z: classic.Fixed(pos.Z), Yaw: facing.Yaw, Pitch: facing.Pitch, }) }) |
