summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classic/ext_entity_pos.go22
-rw-r--r--classic/packets.go16
-rw-r--r--server/player.go44
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,
})
})