Adding client-side and server-side interactions. Also adds purpur/paper support
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
flat "github.com/yawaflua/GoMinecraftBridge/sdk/internal/fbs/gmb"
|
||||
)
|
||||
|
||||
func decodeTickSnapshot(input []byte) (snapshot ServerSnapshot, err error) {
|
||||
defer func() {
|
||||
if recovered := recover(); recovered != nil {
|
||||
err = fmt.Errorf("sdk: invalid FlatBuffers tick snapshot: %v", recovered)
|
||||
}
|
||||
}()
|
||||
|
||||
if len(input) < 8 || !flat.ServerSnapshotBufferHasIdentifier(input) {
|
||||
return snapshot, fmt.Errorf("sdk: tick snapshot is not a GMBS FlatBuffer")
|
||||
}
|
||||
|
||||
root := flat.GetRootAsServerSnapshot(input, 0)
|
||||
snapshot.Tick = root.Tick()
|
||||
snapshot.TimestampUnixMilli = root.TimestampUnixMilli()
|
||||
|
||||
snapshot.Levels = make([]LevelSnapshot, root.LevelsLength())
|
||||
var level flat.LevelSnapshot
|
||||
for index := range snapshot.Levels {
|
||||
if !root.Levels(&level, index) {
|
||||
return ServerSnapshot{}, fmt.Errorf("sdk: missing level %d", index)
|
||||
}
|
||||
snapshot.Levels[index] = LevelSnapshot{
|
||||
Dimension: string(level.Dimension()),
|
||||
GameTime: level.GameTime(),
|
||||
DayTime: level.DayTime(),
|
||||
Raining: level.Raining(),
|
||||
Thundering: level.Thundering(),
|
||||
}
|
||||
}
|
||||
|
||||
snapshot.Entities = make([]EntitySnapshot, root.EntitiesLength())
|
||||
var entity flat.EntitySnapshot
|
||||
for index := range snapshot.Entities {
|
||||
if !root.Entities(&entity, index) {
|
||||
return ServerSnapshot{}, fmt.Errorf("sdk: missing entity %d", index)
|
||||
}
|
||||
converted := EntitySnapshot{
|
||||
RuntimeID: int(entity.RuntimeId()),
|
||||
UUID: string(entity.Uuid()),
|
||||
Type: string(entity.Type()),
|
||||
Name: string(entity.Name()),
|
||||
Dimension: string(entity.Dimension()),
|
||||
X: entity.X(),
|
||||
Y: entity.Y(),
|
||||
Z: entity.Z(),
|
||||
Yaw: entity.Yaw(),
|
||||
Pitch: entity.Pitch(),
|
||||
VelocityX: entity.VelocityX(),
|
||||
VelocityY: entity.VelocityY(),
|
||||
VelocityZ: entity.VelocityZ(),
|
||||
Alive: entity.Alive(),
|
||||
Player: entity.Player(),
|
||||
}
|
||||
if entity.HasHealth() {
|
||||
health := entity.Health()
|
||||
maxHealth := entity.MaxHealth()
|
||||
converted.Health = &health
|
||||
converted.MaxHealth = &maxHealth
|
||||
}
|
||||
snapshot.Entities[index] = converted
|
||||
}
|
||||
|
||||
snapshot.Blocks = make([]BlockSnapshot, root.BlocksLength())
|
||||
var block flat.BlockSnapshot
|
||||
var property flat.BlockProperty
|
||||
for index := range snapshot.Blocks {
|
||||
if !root.Blocks(&block, index) {
|
||||
return ServerSnapshot{}, fmt.Errorf("sdk: missing block %d", index)
|
||||
}
|
||||
properties := make(map[string]string, block.PropertiesLength())
|
||||
for propertyIndex := 0; propertyIndex < block.PropertiesLength(); propertyIndex++ {
|
||||
if block.Properties(&property, propertyIndex) {
|
||||
properties[string(property.Key())] = string(property.Value())
|
||||
}
|
||||
}
|
||||
snapshot.Blocks[index] = BlockSnapshot{
|
||||
Dimension: string(block.Dimension()),
|
||||
X: int(block.X()),
|
||||
Y: int(block.Y()),
|
||||
Z: int(block.Z()),
|
||||
Block: string(block.Block()),
|
||||
Properties: properties,
|
||||
}
|
||||
}
|
||||
|
||||
return snapshot, nil
|
||||
}
|
||||
Reference in New Issue
Block a user