diff --git a/src/main/java/ru/windcorp/progressia/client/comms/DefaultClientCommsListener.java b/src/main/java/ru/windcorp/progressia/client/comms/DefaultClientCommsListener.java index f2eb76a..b64798e 100644 --- a/src/main/java/ru/windcorp/progressia/client/comms/DefaultClientCommsListener.java +++ b/src/main/java/ru/windcorp/progressia/client/comms/DefaultClientCommsListener.java @@ -7,9 +7,9 @@ import ru.windcorp.progressia.client.Client; import ru.windcorp.progressia.client.graphics.world.EntityAnchor; import ru.windcorp.progressia.common.comms.CommsListener; import ru.windcorp.progressia.common.comms.packets.Packet; -import ru.windcorp.progressia.common.comms.packets.PacketSetLocalPlayer; -import ru.windcorp.progressia.common.comms.packets.PacketWorldChange; import ru.windcorp.progressia.common.util.crash.CrashReports; +import ru.windcorp.progressia.common.world.PacketSetLocalPlayer; +import ru.windcorp.progressia.common.world.PacketWorldChange; import ru.windcorp.progressia.common.world.entity.EntityData; // TODO refactor with no mercy @@ -34,14 +34,14 @@ public class DefaultClientCommsListener implements CommsListener { private void setLocalPlayer(PacketSetLocalPlayer packet) { EntityData entity = getClient().getWorld().getData().getEntity( - packet.getLocalPlayerEntityId() + packet.getEntityId() ); if (entity == null) { CrashReports.report( null, "Player entity with ID %s not found", - new String(StringUtil.toFullHex(packet.getLocalPlayerEntityId())) + new String(StringUtil.toFullHex(packet.getEntityId())) ); } diff --git a/src/main/java/ru/windcorp/progressia/common/comms/controls/PacketControl.java b/src/main/java/ru/windcorp/progressia/common/comms/controls/PacketControl.java index e9b37d3..98448be 100644 --- a/src/main/java/ru/windcorp/progressia/common/comms/controls/PacketControl.java +++ b/src/main/java/ru/windcorp/progressia/common/comms/controls/PacketControl.java @@ -1,6 +1,11 @@ package ru.windcorp.progressia.common.comms.controls; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + import ru.windcorp.progressia.common.comms.packets.Packet; +import ru.windcorp.progressia.common.world.DecodingException; public class PacketControl extends Packet { @@ -15,4 +20,14 @@ public class PacketControl extends Packet { return control; } + @Override + public void read(DataInput input) throws IOException, DecodingException { + // TODO implement controls + } + + @Override + public void write(DataOutput output) throws IOException { + // implement controls + } + } diff --git a/src/main/java/ru/windcorp/progressia/common/comms/packets/Packet.java b/src/main/java/ru/windcorp/progressia/common/comms/packets/Packet.java index 425a64b..941b157 100644 --- a/src/main/java/ru/windcorp/progressia/common/comms/packets/Packet.java +++ b/src/main/java/ru/windcorp/progressia/common/comms/packets/Packet.java @@ -1,11 +1,19 @@ package ru.windcorp.progressia.common.comms.packets; -import ru.windcorp.progressia.common.util.namespaces.Namespaced; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; -public class Packet extends Namespaced { +import ru.windcorp.progressia.common.util.namespaces.Namespaced; +import ru.windcorp.progressia.common.world.DecodingException; + +public abstract class Packet extends Namespaced { public Packet(String id) { super(id); } + + public abstract void read(DataInput input) throws IOException, DecodingException; + public abstract void write(DataOutput output) throws IOException; } diff --git a/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketLoadChunk.java b/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketLoadChunk.java deleted file mode 100644 index e44f8da..0000000 --- a/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketLoadChunk.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.windcorp.progressia.common.comms.packets; - -import java.io.IOException; - -import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.io.ChunkIO; -import ru.windcorp.progressia.common.util.DataBuffer; -import ru.windcorp.progressia.common.util.crash.CrashReports; -import ru.windcorp.progressia.common.world.DecodingException; -import ru.windcorp.progressia.common.world.WorldData; - -public class PacketLoadChunk extends PacketWorldChange { - - private final DataBuffer data = new DataBuffer(); - private final Vec3i position = new Vec3i(); - - public PacketLoadChunk(String id) { - super(id); - } - - @Override - public void apply(WorldData world) { - try { - world.addChunk(ChunkIO.load(world, position, data.getInputStream())); - } catch (DecodingException | IOException e) { - CrashReports.report(e, "Could not load chunk"); - } - } - - public Vec3i getPosition() { - return position; - } - - public DataBuffer getData() { - return data; - } - -} diff --git a/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketSetLocalPlayer.java b/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketSetLocalPlayer.java deleted file mode 100644 index c45ef9b..0000000 --- a/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketSetLocalPlayer.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.windcorp.progressia.common.comms.packets; - -public class PacketSetLocalPlayer extends Packet { - - private long localPlayerEntityId; - - public PacketSetLocalPlayer(long entityId) { - this("Core:SetLocalPlayer", entityId); - } - - protected PacketSetLocalPlayer(String id, long entityId) { - super(id); - this.localPlayerEntityId = entityId; - } - - public long getLocalPlayerEntityId() { - return localPlayerEntityId; - } - - public void setLocalPlayerEntityId(long localPlayerEntityId) { - this.localPlayerEntityId = localPlayerEntityId; - } - -} diff --git a/src/main/java/ru/windcorp/progressia/common/world/PacketChunkChange.java b/src/main/java/ru/windcorp/progressia/common/world/PacketChunkChange.java new file mode 100644 index 0000000..2cd1a96 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/PacketChunkChange.java @@ -0,0 +1,13 @@ +package ru.windcorp.progressia.common.world; + +import glm.vec._3.i.Vec3i; + +public abstract class PacketChunkChange extends PacketWorldChange { + + public PacketChunkChange(String id) { + super(id); + } + + public abstract void getAffectedChunk(Vec3i output); + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/PacketLoadChunk.java b/src/main/java/ru/windcorp/progressia/common/world/PacketLoadChunk.java new file mode 100644 index 0000000..74a9e3b --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/PacketLoadChunk.java @@ -0,0 +1,68 @@ +package ru.windcorp.progressia.common.world; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.io.ChunkIO; +import ru.windcorp.progressia.common.util.DataBuffer; +import ru.windcorp.progressia.common.util.crash.CrashReports; + +public class PacketLoadChunk extends PacketChunkChange { + + private final DataBuffer data = new DataBuffer(); + private final Vec3i position = new Vec3i(); + + public PacketLoadChunk(String id) { + super(id); + } + + public void set(ChunkData chunk) { + this.position.set(chunk.getX(), chunk.getY(), chunk.getZ()); + + try { + ChunkIO.save(chunk, this.data.getOutputStream()); + } catch (IOException e) { + // Impossible + } + } + + @Override + public void read(DataInput input) throws IOException { + this.position.set(input.readInt(), input.readInt(), input.readInt()); + this.data.fill(input, input.readInt()); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeInt(this.position.x); + output.writeInt(this.position.y); + output.writeInt(this.position.z); + output.writeInt(this.data.getSize()); + this.data.flush(output); + } + + @Override + public void apply(WorldData world) { + try { + world.addChunk(ChunkIO.load(world, position, data.getInputStream())); + } catch (DecodingException | IOException e) { + CrashReports.report(e, "Could not load chunk"); + } + } + + @Override + public void getAffectedChunk(Vec3i output) { + output.set(getPosition().x, getPosition().y, getPosition().z); + } + + public Vec3i getPosition() { + return position; + } + + public DataBuffer getData() { + return data; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/PacketSetLocalPlayer.java b/src/main/java/ru/windcorp/progressia/common/world/PacketSetLocalPlayer.java new file mode 100644 index 0000000..4eda94f --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/PacketSetLocalPlayer.java @@ -0,0 +1,39 @@ +package ru.windcorp.progressia.common.world; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import ru.windcorp.progressia.common.comms.packets.Packet; + +public class PacketSetLocalPlayer extends Packet { + + private long entityId; + + public PacketSetLocalPlayer() { + this("Core:SetLocalPlayer"); + } + + protected PacketSetLocalPlayer(String id) { + super(id); + } + + public void set(long entityId) { + this.entityId = entityId; + } + + @Override + public void read(DataInput input) throws IOException, DecodingException { + this.entityId = input.readLong(); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeLong(this.entityId); + } + + public long getEntityId() { + return entityId; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketWorldChange.java b/src/main/java/ru/windcorp/progressia/common/world/PacketWorldChange.java similarity index 58% rename from src/main/java/ru/windcorp/progressia/common/comms/packets/PacketWorldChange.java rename to src/main/java/ru/windcorp/progressia/common/world/PacketWorldChange.java index 929902a..350c3f9 100644 --- a/src/main/java/ru/windcorp/progressia/common/comms/packets/PacketWorldChange.java +++ b/src/main/java/ru/windcorp/progressia/common/world/PacketWorldChange.java @@ -1,6 +1,6 @@ -package ru.windcorp.progressia.common.comms.packets; +package ru.windcorp.progressia.common.world; -import ru.windcorp.progressia.common.world.WorldData; +import ru.windcorp.progressia.common.comms.packets.Packet; public abstract class PacketWorldChange extends Packet { diff --git a/src/main/java/ru/windcorp/progressia/common/world/block/PacketSetBlock.java b/src/main/java/ru/windcorp/progressia/common/world/block/PacketSetBlock.java new file mode 100644 index 0000000..0eefa71 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/block/PacketSetBlock.java @@ -0,0 +1,56 @@ +package ru.windcorp.progressia.common.world.block; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.DecodingException; +import ru.windcorp.progressia.common.world.PacketChunkChange; +import ru.windcorp.progressia.common.world.WorldData; + +public class PacketSetBlock extends PacketChunkChange { + + private String id; + private final Vec3i blockInWorld = new Vec3i(); + + public PacketSetBlock() { + this("Core:SetBlock"); + } + + protected PacketSetBlock(String id) { + super(id); + } + + public void set(BlockData block, Vec3i blockInWorld) { + this.id = block.getId(); + this.blockInWorld.set(blockInWorld.x, blockInWorld.y, blockInWorld.z); + } + + @Override + public void read(DataInput input) throws IOException, DecodingException { + this.id = input.readUTF(); + this.blockInWorld.set(input.readInt(), input.readInt(), input.readInt()); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeUTF(this.id); + output.writeInt(this.blockInWorld.x); + output.writeInt(this.blockInWorld.y); + output.writeInt(this.blockInWorld.z); + } + + @Override + public void apply(WorldData world) { + BlockData block = BlockDataRegistry.getInstance().get(id); + world.setBlock(blockInWorld, block, true); + } + + @Override + public void getAffectedChunk(Vec3i output) { + Coordinates.convertInWorldToChunk(this.blockInWorld, output); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/entity/PacketEntityChange.java b/src/main/java/ru/windcorp/progressia/common/world/entity/PacketEntityChange.java index 569db84..bb07297 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/entity/PacketEntityChange.java +++ b/src/main/java/ru/windcorp/progressia/common/world/entity/PacketEntityChange.java @@ -4,10 +4,11 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import ru.windcorp.progressia.common.comms.packets.PacketWorldChange; import ru.windcorp.progressia.common.state.IOContext; import ru.windcorp.progressia.common.util.DataBuffer; import ru.windcorp.progressia.common.util.crash.CrashReports; +import ru.windcorp.progressia.common.world.DecodingException; +import ru.windcorp.progressia.common.world.PacketWorldChange; import ru.windcorp.progressia.common.world.WorldData; public class PacketEntityChange extends PacketWorldChange { @@ -42,6 +43,28 @@ public class PacketEntityChange extends PacketWorldChange { public DataOutput getWriter() { return buffer.getWriter(); } + + public void set(EntityData entity) { + this.entityId = entity.getEntityId(); + try { + entity.write(this.buffer.getWriter(), IOContext.COMMS); + } catch (IOException e) { + CrashReports.report(e, "Entity could not be written"); + } + } + + @Override + public void read(DataInput input) throws IOException, DecodingException { + this.entityId = input.readLong(); + this.buffer.fill(input, input.readInt()); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeLong(this.entityId); + output.writeInt(this.buffer.getSize()); + this.buffer.flush(output); + } @Override public void apply(WorldData world) { diff --git a/src/main/java/ru/windcorp/progressia/common/world/tile/PacketAddTile.java b/src/main/java/ru/windcorp/progressia/common/world/tile/PacketAddTile.java new file mode 100644 index 0000000..5cc12ee --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/tile/PacketAddTile.java @@ -0,0 +1,61 @@ +package ru.windcorp.progressia.common.world.tile; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.DecodingException; +import ru.windcorp.progressia.common.world.PacketChunkChange; +import ru.windcorp.progressia.common.world.WorldData; +import ru.windcorp.progressia.common.world.block.BlockFace; + +public class PacketAddTile extends PacketChunkChange { + + private String id; + private final Vec3i blockInWorld = new Vec3i(); + private BlockFace face; + + public PacketAddTile() { + this("Core:AddTile"); + } + + protected PacketAddTile(String id) { + super(id); + } + + public void set(TileData tile, Vec3i blockInWorld, BlockFace face) { + this.id = tile.getId(); + this.blockInWorld.set(blockInWorld.x, blockInWorld.y, blockInWorld.z); + this.face = face; + } + + @Override + public void read(DataInput input) throws IOException, DecodingException { + this.id = input.readUTF(); + this.blockInWorld.set(input.readInt(), input.readInt(), input.readInt()); + this.face = BlockFace.getFaces().get(input.readByte()); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeUTF(this.id); + output.writeInt(this.blockInWorld.x); + output.writeInt(this.blockInWorld.y); + output.writeInt(this.blockInWorld.z); + output.writeByte(this.face.getId()); + } + + @Override + public void apply(WorldData world) { + TileData tile = TileDataRegistry.getInstance().get(id); + world.getTiles(blockInWorld, face).add(tile); + } + + @Override + public void getAffectedChunk(Vec3i output) { + Coordinates.convertInWorldToChunk(this.blockInWorld, output); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/tile/PacketRemoveTile.java b/src/main/java/ru/windcorp/progressia/common/world/tile/PacketRemoveTile.java new file mode 100644 index 0000000..b7d9e0b --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/tile/PacketRemoveTile.java @@ -0,0 +1,61 @@ +package ru.windcorp.progressia.common.world.tile; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.DecodingException; +import ru.windcorp.progressia.common.world.PacketChunkChange; +import ru.windcorp.progressia.common.world.WorldData; +import ru.windcorp.progressia.common.world.block.BlockFace; + +public class PacketRemoveTile extends PacketChunkChange { + + private final Vec3i blockInWorld = new Vec3i(); + private BlockFace face; + private int tag; + + public PacketRemoveTile() { + this("Core:RemoveTile"); + } + + protected PacketRemoveTile(String id) { + super(id); + } + + public void set(Vec3i blockInWorld, BlockFace face, int tag) { + this.blockInWorld.set(blockInWorld.x, blockInWorld.y, blockInWorld.z); + this.face = face; + this.tag = tag; + } + + @Override + public void read(DataInput input) throws IOException, DecodingException { + this.blockInWorld.set(input.readInt(), input.readInt(), input.readInt()); + this.face = BlockFace.getFaces().get(input.readByte()); + this.tag = input.readInt(); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeInt(this.blockInWorld.x); + output.writeInt(this.blockInWorld.y); + output.writeInt(this.blockInWorld.z); + output.writeByte(this.face.getId()); + output.writeInt(this.tag); + } + + @Override + public void apply(WorldData world) { + TileDataStack stack = world.getTiles(blockInWorld, face); + stack.remove(stack.getIndexByTag(tag)); + } + + @Override + public void getAffectedChunk(Vec3i output) { + Coordinates.convertInWorldToChunk(this.blockInWorld, output); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java b/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java index 1796977..54510ad 100644 --- a/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java +++ b/src/main/java/ru/windcorp/progressia/server/comms/ClientManager.java @@ -11,11 +11,11 @@ import gnu.trove.map.TIntObjectMap; import gnu.trove.map.hash.TIntObjectHashMap; import ru.windcorp.progressia.common.comms.CommsChannel.State; import ru.windcorp.progressia.common.comms.packets.Packet; -import ru.windcorp.progressia.common.comms.packets.PacketLoadChunk; -import ru.windcorp.progressia.common.comms.packets.PacketSetLocalPlayer; import ru.windcorp.progressia.common.io.ChunkIO; import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.world.ChunkData; +import ru.windcorp.progressia.common.world.PacketLoadChunk; +import ru.windcorp.progressia.common.world.PacketSetLocalPlayer; import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.server.Player; import ru.windcorp.progressia.server.Server; @@ -88,7 +88,9 @@ public class ClientManager { client.sendPacket(packet); } - client.sendPacket(new PacketSetLocalPlayer(entity.getEntityId())); + PacketSetLocalPlayer packet = new PacketSetLocalPlayer(); + packet.set(entity.getEntityId()); + client.sendPacket(packet); } public void disconnectClient(Client client) { diff --git a/src/main/java/ru/windcorp/progressia/server/comms/ClientPlayer.java b/src/main/java/ru/windcorp/progressia/server/comms/ClientPlayer.java index d49addd..d8271a9 100644 --- a/src/main/java/ru/windcorp/progressia/server/comms/ClientPlayer.java +++ b/src/main/java/ru/windcorp/progressia/server/comms/ClientPlayer.java @@ -1,7 +1,6 @@ package ru.windcorp.progressia.server.comms; import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.test.TestContent; public abstract class ClientPlayer extends Client { @@ -16,7 +15,7 @@ public abstract class ClientPlayer extends Client { } public boolean canSeeEntity(long entityId) { - return entityId == TestContent.PLAYER_ENTITY_ID; + return true; } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/AddTile.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/AddTile.java index 28d4558..d058ac9 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/AddTile.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/AddTile.java @@ -2,59 +2,12 @@ package ru.windcorp.progressia.server.world.tasks; import java.util.function.Consumer; -import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.world.Coordinates; -import ru.windcorp.progressia.common.world.WorldData; -import ru.windcorp.progressia.common.world.block.BlockFace; -import ru.windcorp.progressia.common.world.tile.TileData; -import ru.windcorp.progressia.common.world.tile.TileDataStack; +import ru.windcorp.progressia.common.world.tile.PacketAddTile; -class AddTile extends CachedWorldChange { - - private final Vec3i blockInWorld = new Vec3i(); - private BlockFace face; - private TileData tile; +class AddTile extends CachedChunkChange { public AddTile(Consumer disposer) { - super(disposer, "Core:AddTile"); - } - - public void initialize( - Vec3i position, BlockFace face, - TileData tile - ) { - if (this.tile != null) - throw new IllegalStateException("Payload is not null. Current: " + this.tile + "; requested: " + tile); - - this.blockInWorld.set(position.x, position.y, position.z); - this.face = face; - this.tile = tile; - } - - @Override - protected void affectCommon(WorldData world) { - TileDataStack tiles = world - .getChunkByBlock(blockInWorld) - .getTiles(Coordinates.convertInWorldToInChunk(blockInWorld, null), face); - - tiles.add(tile); - } - - @Override - public void getRelevantChunk(Vec3i output) { - Coordinates.convertInWorldToChunk(blockInWorld, output); - } - - @Override - protected Vec3i getAffectedChunk(Vec3i output) { - getRelevantChunk(output); - return output; - } - - @Override - public void dispose() { - super.dispose(); - this.tile = null; + super(disposer, new PacketAddTile()); } } \ No newline at end of file diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedChunkChange.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedChunkChange.java new file mode 100644 index 0000000..e12e873 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedChunkChange.java @@ -0,0 +1,19 @@ +package ru.windcorp.progressia.server.world.tasks; + +import java.util.function.Consumer; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.PacketChunkChange; + +public abstract class CachedChunkChange

extends CachedWorldChange

{ + + public CachedChunkChange(Consumer disposer, P packet) { + super(disposer, packet); + } + + @Override + public void getRelevantChunk(Vec3i output) { + getPacket().getAffectedChunk(output); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedWorldChange.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedWorldChange.java index ee965c7..e3929a7 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedWorldChange.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/CachedWorldChange.java @@ -3,30 +3,30 @@ package ru.windcorp.progressia.server.world.tasks; import java.util.function.Consumer; import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.comms.packets.PacketWorldChange; import ru.windcorp.progressia.common.util.Vectors; -import ru.windcorp.progressia.common.world.WorldData; +import ru.windcorp.progressia.common.world.PacketWorldChange; import ru.windcorp.progressia.server.Server; -public abstract class CachedWorldChange extends CachedChange { +public abstract class CachedWorldChange

extends CachedChange { - private final PacketWorldChange packet; + private final P packet; - public CachedWorldChange(Consumer disposer, String packetId) { + public CachedWorldChange(Consumer disposer, P packet) { super(disposer); - - this.packet = new PacketWorldChange(packetId) { - @Override - public void apply(WorldData world) { - affectCommon(world); - } - }; + this.packet = packet; } @Override public void affect(Server server) { - affectCommon(server.getWorld().getData()); - + affectLocal(server); + sendPacket(server); + } + + protected void affectLocal(Server server) { + packet.apply(server.getWorld().getData()); + } + + protected void sendPacket(Server server) { Vec3i v = Vectors.grab3i(); Vec3i chunkPos = getAffectedChunk(v); @@ -38,15 +38,13 @@ public abstract class CachedWorldChange extends CachedChange { Vectors.release(chunkPos); } - + protected Vec3i getAffectedChunk(Vec3i output) { return null; } - /** - * Invoked by both Change and Packet. - * @param world the world to affect - */ - protected abstract void affectCommon(WorldData world); + public P getPacket() { + return packet; + } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/ChangeEntity.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/ChangeEntity.java index 651bc83..a813f15 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/ChangeEntity.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/ChangeEntity.java @@ -1,11 +1,8 @@ package ru.windcorp.progressia.server.world.tasks; -import java.io.IOException; import java.util.function.Consumer; import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.state.IOContext; -import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.common.world.entity.PacketEntityChange; import ru.windcorp.progressia.server.Server; @@ -31,26 +28,15 @@ class ChangeEntity extends CachedChange { this.entity = entity; this.change = change; - packet.setEntityId(entity.getEntityId()); - try { - entity.write(packet.getWriter(), IOContext.COMMS); // TODO wtf is this... (see whole file) - } catch (IOException e) { - CrashReports.report(e, "Could not write entity %s", entity); - } } @SuppressWarnings("unchecked") @Override public void affect(Server server) { ((StateChange) change).change(entity); - - try { - entity.write(packet.getWriter(), IOContext.COMMS); // ...and this doing at the same time? - javapony at 1 AM - } catch (IOException e) { - CrashReports.report(e, "Could not write entity %s", entity); - } + packet.set(entity); - server.getClientManager().broadcastLocal(packet, entity.getChunkCoords(null)); + server.getClientManager().broadcastLocal(packet, entity.getEntityId()); } @Override diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/RemoveTile.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/RemoveTile.java index d33f80f..02c01ba 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/RemoveTile.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/RemoveTile.java @@ -2,49 +2,12 @@ package ru.windcorp.progressia.server.world.tasks; import java.util.function.Consumer; -import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.world.Coordinates; -import ru.windcorp.progressia.common.world.WorldData; -import ru.windcorp.progressia.common.world.block.BlockFace; -import ru.windcorp.progressia.common.world.tile.TileDataStack; +import ru.windcorp.progressia.common.world.tile.PacketRemoveTile; -class RemoveTile extends CachedWorldChange { - - private final Vec3i blockInWorld = new Vec3i(); - private BlockFace face; - private int tag; +class RemoveTile extends CachedChunkChange { public RemoveTile(Consumer disposer) { - super(disposer, "Core:RemoveTile"); - } - - public void initialize( - Vec3i position, BlockFace face, - int tag - ) { - this.blockInWorld.set(position.x, position.y, position.z); - this.face = face; - this.tag = tag; - } - - @Override - protected void affectCommon(WorldData world) { - TileDataStack tiles = world - .getChunkByBlock(blockInWorld) - .getTiles(Coordinates.convertInWorldToInChunk(blockInWorld, null), face); - - tiles.remove(tiles.getIndexByTag(tag)); - } - - @Override - public void getRelevantChunk(Vec3i output) { - Coordinates.convertInWorldToChunk(blockInWorld, output); - } - - @Override - protected Vec3i getAffectedChunk(Vec3i output) { - getRelevantChunk(output); - return output; + super(disposer, new PacketRemoveTile()); } } \ No newline at end of file diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/SetBlock.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/SetBlock.java index 44329ac..e595f2a 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/SetBlock.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/SetBlock.java @@ -2,50 +2,12 @@ package ru.windcorp.progressia.server.world.tasks; import java.util.function.Consumer; -import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.world.Coordinates; -import ru.windcorp.progressia.common.world.WorldData; -import ru.windcorp.progressia.common.world.block.BlockData; +import ru.windcorp.progressia.common.world.block.PacketSetBlock; -class SetBlock extends CachedWorldChange { - - private final Vec3i blockInWorld = new Vec3i(); - private BlockData block; +class SetBlock extends CachedChunkChange { public SetBlock(Consumer disposer) { - super(disposer, "Core:SetBlock"); - } - - public void initialize(Vec3i blockInWorld, BlockData block) { - if (this.block != null) - throw new IllegalStateException("Payload is not null. Current: " + this.block + "; requested: " + block); - - this.blockInWorld.set(blockInWorld.x, blockInWorld.y, blockInWorld.z); - this.block = block; - } - - @Override - protected void affectCommon(WorldData world) { - world - .getChunkByBlock(blockInWorld) - .setBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null), block, true); - } - - @Override - public void getRelevantChunk(Vec3i output) { - Coordinates.convertInWorldToChunk(blockInWorld, output); - } - - @Override - protected Vec3i getAffectedChunk(Vec3i output) { - getRelevantChunk(output); - return output; - } - - @Override - public void dispose() { - super.dispose(); - this.block = null; + super(disposer, new PacketSetBlock()); } } \ No newline at end of file diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/WorldAccessor.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/WorldAccessor.java index ff073fc..85b6fa5 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/WorldAccessor.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/WorldAccessor.java @@ -38,7 +38,7 @@ public class WorldAccessor { public void setBlock(Vec3i blockInWorld, BlockData block) { SetBlock change = cache.grab(SetBlock.class); - change.initialize(blockInWorld, block); + change.getPacket().set(block, blockInWorld); server.requestChange(change); } @@ -48,7 +48,7 @@ public class WorldAccessor { public void addTile(Vec3i blockInWorld, BlockFace face, TileData tile) { AddTile change = cache.grab(AddTile.class); - change.initialize(blockInWorld, face, tile); + change.getPacket().set(tile, blockInWorld, face); server.requestChange(change); } @@ -58,7 +58,7 @@ public class WorldAccessor { public void removeTile(Vec3i blockInWorld, BlockFace face, int tag) { RemoveTile change = cache.grab(RemoveTile.class); - change.initialize(blockInWorld, face, tag); + change.getPacket().set(blockInWorld, face, tag); server.requestChange(change); } diff --git a/src/main/java/ru/windcorp/progressia/test/TestChunkSender.java b/src/main/java/ru/windcorp/progressia/test/TestChunkSender.java index 801c3d8..b267206 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestChunkSender.java +++ b/src/main/java/ru/windcorp/progressia/test/TestChunkSender.java @@ -3,11 +3,11 @@ package ru.windcorp.progressia.test; import java.io.IOException; import glm.Glm; -import ru.windcorp.progressia.common.comms.packets.PacketLoadChunk; -import ru.windcorp.progressia.common.comms.packets.PacketSetLocalPlayer; import ru.windcorp.progressia.common.io.ChunkIO; import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.world.ChunkData; +import ru.windcorp.progressia.common.world.PacketLoadChunk; +import ru.windcorp.progressia.common.world.PacketSetLocalPlayer; import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.common.world.WorldDataListener; import ru.windcorp.progressia.common.world.entity.EntityData; @@ -48,7 +48,10 @@ public class TestChunkSender implements WorldDataListener { if (Glm.equals(e.getChunkCoords(null), chunk.getPosition())) { System.out.printf("TestChunkSender: player found in (%d; %d; %d)\n", e.getChunkCoords(null).x, e.getChunkCoords(null).y, e.getChunkCoords(null).z); - server.getClientManager().broadcastToAllPlayers(new PacketSetLocalPlayer(e.getEntityId())); + + PacketSetLocalPlayer packet = new PacketSetLocalPlayer(); + packet.set(e.getEntityId()); + server.getClientManager().broadcastToAllPlayers(packet); } }