From edb6de8df990a89d4ea3449261239ddebb1e1038 Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Tue, 2 Jun 2020 15:30:18 -0700 Subject: [PATCH] Added support to D2GS for a majority of ItemManager functions Added support to D2GS for a majority of ItemManager functions GroundToCursor remains unimplemented in this commit due to entity creation --- .../engine/client/ClientItemManager.java | 2 - .../engine/client/ClientNetworkReceiver.java | 105 +++++++++++++++++- .../client/NetworkedClientItemManager.java | 8 +- .../src/com/riiablo/server/d2gs/D2GS.java | 81 +++++++++++++- 4 files changed, 187 insertions(+), 9 deletions(-) diff --git a/core/src/com/riiablo/engine/client/ClientItemManager.java b/core/src/com/riiablo/engine/client/ClientItemManager.java index d6c20170..d5fc9862 100644 --- a/core/src/com/riiablo/engine/client/ClientItemManager.java +++ b/core/src/com/riiablo/engine/client/ClientItemManager.java @@ -8,8 +8,6 @@ import com.riiablo.save.ItemController; import net.mostlyoriginal.api.system.core.PassiveSystem; -// sends item events -// receives item events and applies changes public class ClientItemManager extends PassiveSystem implements ItemController { private static final String TAG = "ClientItemManager"; diff --git a/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java b/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java index 2c84198a..aeda47dd 100644 --- a/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java +++ b/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java @@ -11,15 +11,14 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.net.Socket; import com.badlogic.gdx.physics.box2d.Body; -import com.riiablo.save.CharData; import com.riiablo.Riiablo; -import com.riiablo.save.D2S; import com.riiablo.codec.excel.MonStats; import com.riiablo.codec.util.BitStream; import com.riiablo.engine.Dirty; import com.riiablo.engine.Engine; import com.riiablo.engine.EntityFactory; import com.riiablo.engine.server.CofManager; +import com.riiablo.engine.server.ItemManager; import com.riiablo.engine.server.component.Angle; import com.riiablo.engine.server.component.Box2DBody; import com.riiablo.engine.server.component.Class; @@ -34,23 +33,36 @@ import com.riiablo.engine.server.component.Velocity; import com.riiablo.item.Item; import com.riiablo.map.Map; import com.riiablo.net.packet.d2gs.AngleP; +import com.riiablo.net.packet.d2gs.BeltToCursor; +import com.riiablo.net.packet.d2gs.BodyToCursor; import com.riiablo.net.packet.d2gs.ClassP; import com.riiablo.net.packet.d2gs.CofAlphasP; import com.riiablo.net.packet.d2gs.CofComponentsP; import com.riiablo.net.packet.d2gs.CofTransformsP; import com.riiablo.net.packet.d2gs.ComponentP; import com.riiablo.net.packet.d2gs.Connection; +import com.riiablo.net.packet.d2gs.CursorToBelt; +import com.riiablo.net.packet.d2gs.CursorToBody; +import com.riiablo.net.packet.d2gs.CursorToGround; +import com.riiablo.net.packet.d2gs.CursorToStore; import com.riiablo.net.packet.d2gs.D2GS; import com.riiablo.net.packet.d2gs.D2GSData; import com.riiablo.net.packet.d2gs.DS1ObjectWrapperP; import com.riiablo.net.packet.d2gs.Disconnect; import com.riiablo.net.packet.d2gs.EntitySync; +import com.riiablo.net.packet.d2gs.GroundToCursor; import com.riiablo.net.packet.d2gs.ItemP; import com.riiablo.net.packet.d2gs.MonsterP; import com.riiablo.net.packet.d2gs.PlayerP; import com.riiablo.net.packet.d2gs.PositionP; +import com.riiablo.net.packet.d2gs.StoreToCursor; +import com.riiablo.net.packet.d2gs.SwapBeltItem; +import com.riiablo.net.packet.d2gs.SwapBodyItem; +import com.riiablo.net.packet.d2gs.SwapStoreItem; import com.riiablo.net.packet.d2gs.VelocityP; import com.riiablo.net.packet.d2gs.WarpP; +import com.riiablo.save.CharData; +import com.riiablo.save.D2S; import com.riiablo.util.ArrayUtils; import com.riiablo.util.BufferUtils; import com.riiablo.util.DebugUtils; @@ -84,6 +96,7 @@ public class ClientNetworkReceiver extends IntervalSystem { protected CofManager cofs; protected NetworkIdManager syncIds; + protected ItemManager items; @Wire(name="client.socket") protected Socket socket; @@ -140,6 +153,39 @@ public class ClientNetworkReceiver extends IntervalSystem { case D2GSData.EntitySync: Synchronize(packet); break; + case D2GSData.GroundToCursor: + GroundToCursor(packet); + break; + case D2GSData.CursorToGround: + CursorToGround(packet); + break; + case D2GSData.StoreToCursor: + StoreToCursor(packet); + break; + case D2GSData.CursorToStore: + CursorToStore(packet); + break; + case D2GSData.SwapStoreItem: + SwapStoreItem(packet); + break; + case D2GSData.BodyToCursor: + BodyToCursor(packet); + break; + case D2GSData.CursorToBody: + CursorToBody(packet); + break; + case D2GSData.SwapBodyItem: + SwapBodyItem(packet); + break; + case D2GSData.BeltToCursor: + BeltToCursor(packet); + break; + case D2GSData.CursorToBelt: + CursorToBelt(packet); + break; + case D2GSData.SwapBeltItem: + SwapBeltItem(packet); + break; default: Gdx.app.error(TAG, "Unknown packet type: " + packet.dataType()); } @@ -364,4 +410,59 @@ public class ClientNetworkReceiver extends IntervalSystem { cofs.updateTransform(entityId, tFlags); cofs.updateAlpha(entityId, aFlags); } + + private void GroundToCursor(D2GS packet) { + GroundToCursor groundToCursor = (GroundToCursor) packet.data(new GroundToCursor()); + items.groundToCursor(Riiablo.game.player, groundToCursor.itemId()); + } + + private void CursorToGround(D2GS packet) { + CursorToGround cursorToGround = (CursorToGround) packet.data(new CursorToGround()); + items.cursorToGround(Riiablo.game.player); + } + + private void StoreToCursor(D2GS packet) { + StoreToCursor storeToCursor = (StoreToCursor) packet.data(new StoreToCursor()); + items.storeToCursor(Riiablo.game.player, storeToCursor.itemId()); + } + + private void CursorToStore(D2GS packet) { + CursorToStore cursorToStore = (CursorToStore) packet.data(new CursorToStore()); + items.cursorToStore(Riiablo.game.player, cursorToStore.storeLoc(), cursorToStore.x(), cursorToStore.y()); + } + + private void SwapStoreItem(D2GS packet) { + SwapStoreItem swapStoreItem = (SwapStoreItem) packet.data(new SwapStoreItem()); + items.swapStoreItem(Riiablo.game.player, swapStoreItem.itemId(), swapStoreItem.storeLoc(), swapStoreItem.x(), swapStoreItem.y()); + } + + private void BodyToCursor(D2GS packet) { + BodyToCursor bodyToCursor = (BodyToCursor) packet.data(new BodyToCursor()); + items.bodyToCursor(Riiablo.game.player, bodyToCursor.bodyLoc(), bodyToCursor.merc()); + } + + private void CursorToBody(D2GS packet) { + CursorToBody cursorToBody = (CursorToBody) packet.data(new CursorToBody()); + items.cursorToBody(Riiablo.game.player, cursorToBody.bodyLoc(), cursorToBody.merc()); + } + + private void SwapBodyItem(D2GS packet) { + SwapBodyItem swapBodyItem = (SwapBodyItem) packet.data(new SwapBodyItem()); + items.swapBodyItem(Riiablo.game.player, swapBodyItem.bodyLoc(), swapBodyItem.merc()); + } + + private void BeltToCursor(D2GS packet) { + BeltToCursor beltToCursor = (BeltToCursor) packet.data(new BeltToCursor()); + items.beltToCursor(Riiablo.game.player, beltToCursor.itemId()); + } + + private void CursorToBelt(D2GS packet) { + CursorToBelt cursorToBelt = (CursorToBelt) packet.data(new CursorToBelt()); + items.cursorToBelt(Riiablo.game.player, cursorToBelt.x(), cursorToBelt.y()); + } + + private void SwapBeltItem(D2GS packet) { + SwapBeltItem swapBeltItem = (SwapBeltItem) packet.data(new SwapBeltItem()); + items.swapBeltItem(Riiablo.game.player, swapBeltItem.itemId()); + } } diff --git a/core/src/com/riiablo/engine/client/NetworkedClientItemManager.java b/core/src/com/riiablo/engine/client/NetworkedClientItemManager.java index cda2ac59..3c6c34c8 100644 --- a/core/src/com/riiablo/engine/client/NetworkedClientItemManager.java +++ b/core/src/com/riiablo/engine/client/NetworkedClientItemManager.java @@ -16,7 +16,6 @@ import com.riiablo.net.packet.d2gs.CursorToGround; import com.riiablo.net.packet.d2gs.CursorToStore; import com.riiablo.net.packet.d2gs.D2GS; import com.riiablo.net.packet.d2gs.D2GSData; -import com.riiablo.net.packet.d2gs.GroundToCursor; import com.riiablo.net.packet.d2gs.StoreToCursor; import com.riiablo.net.packet.d2gs.SwapBeltItem; import com.riiablo.net.packet.d2gs.SwapBodyItem; @@ -51,9 +50,10 @@ public class NetworkedClientItemManager extends ClientItemManager { @Override public void groundToCursor(Item item) { - FlatBufferBuilder builder = obtainBuilder(); - int dataOffset = GroundToCursor.createGroundToCursor(builder, 0); - wrapAndSend(builder, D2GSData.GroundToCursor, dataOffset); +// TODO: implement +// FlatBufferBuilder builder = obtainBuilder(); +// int dataOffset = GroundToCursor.createGroundToCursor(builder, 0); +// wrapAndSend(builder, D2GSData.GroundToCursor, dataOffset); } @Override diff --git a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java index 11333d32..c0608281 100644 --- a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java +++ b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java @@ -55,10 +55,20 @@ import com.riiablo.map.DT1Loader; import com.riiablo.map.Map; import com.riiablo.map.MapManager; import com.riiablo.mpq.MPQFileHandleResolver; +import com.riiablo.net.packet.d2gs.BeltToCursor; +import com.riiablo.net.packet.d2gs.BodyToCursor; import com.riiablo.net.packet.d2gs.Connection; +import com.riiablo.net.packet.d2gs.CursorToBelt; +import com.riiablo.net.packet.d2gs.CursorToBody; +import com.riiablo.net.packet.d2gs.CursorToGround; +import com.riiablo.net.packet.d2gs.CursorToStore; import com.riiablo.net.packet.d2gs.D2GSData; import com.riiablo.net.packet.d2gs.Disconnect; import com.riiablo.net.packet.d2gs.DropItem; +import com.riiablo.net.packet.d2gs.StoreToCursor; +import com.riiablo.net.packet.d2gs.SwapBeltItem; +import com.riiablo.net.packet.d2gs.SwapBodyItem; +import com.riiablo.net.packet.d2gs.SwapStoreItem; import com.riiablo.save.CharData; import com.riiablo.util.DebugUtils; @@ -168,6 +178,7 @@ public class D2GS extends ApplicationAdapter { Map map; EntityFactory factory; + ItemManager itemManager; MapManager mapManager; NetworkSynchronizer sync; @@ -232,6 +243,7 @@ public class D2GS extends ApplicationAdapter { map.finishLoading(); factory = new ServerEntityFactory(); + itemManager = new ItemManager(); mapManager = new MapManager(); sync = new NetworkSynchronizer(); WorldConfigurationBuilder builder = new WorldConfigurationBuilder() @@ -239,7 +251,7 @@ public class D2GS extends ApplicationAdapter { .with(new ServerNetworkIdManager()) .with(new SerializationManager()) .with(mapManager) - .with(new ItemManager()) + .with(itemManager) .with(new CofManager()) .with(new ObjectInitializer()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) @@ -543,37 +555,104 @@ public class D2GS extends ApplicationAdapter { } + private int getPlayerEntityId(Packet packet) { + int entityId = player.get(packet.id, Engine.INVALID_ENTITY); + assert entityId != Engine.INVALID_ENTITY; + return entityId; + } + private void GroundToCursor(Packet packet) { +// TODO: implement } private void CursorToGround(Packet packet) { + int entityId = getPlayerEntityId(packet); + CursorToGround cursorToGround = (CursorToGround) packet.data.data(new CursorToGround()); + itemManager.cursorToGround(entityId); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void StoreToCursor(Packet packet) { + int entityId = getPlayerEntityId(packet); + StoreToCursor storeToCursor = (StoreToCursor) packet.data.data(new StoreToCursor()); + itemManager.storeToCursor(entityId, storeToCursor.itemId()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void CursorToStore(Packet packet) { + int entityId = getPlayerEntityId(packet); + CursorToStore cursorToStore = (CursorToStore) packet.data.data(new CursorToStore()); + itemManager.cursorToStore(entityId, cursorToStore.storeLoc(), cursorToStore.x(), cursorToStore.y()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void SwapStoreItem(Packet packet) { + int entityId = getPlayerEntityId(packet); + SwapStoreItem swapStoreItem = (SwapStoreItem) packet.data.data(new SwapStoreItem()); + itemManager.swapStoreItem(entityId, swapStoreItem.itemId(), swapStoreItem.storeLoc(), swapStoreItem.x(), swapStoreItem.y()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void BodyToCursor(Packet packet) { + int entityId = getPlayerEntityId(packet); + BodyToCursor bodyToCursor = (BodyToCursor) packet.data.data(new BodyToCursor()); + itemManager.bodyToCursor(entityId, bodyToCursor.bodyLoc(), bodyToCursor.merc()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void CursorToBody(Packet packet) { + int entityId = getPlayerEntityId(packet); + CursorToBody cursorToBody = (CursorToBody) packet.data.data(new CursorToBody()); + itemManager.cursorToBody(entityId, cursorToBody.bodyLoc(), cursorToBody.merc()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void SwapBodyItem(Packet packet) { + int entityId = getPlayerEntityId(packet); + SwapBodyItem swapBodyItem = (SwapBodyItem) packet.data.data(new SwapBodyItem()); + itemManager.swapBodyItem(entityId, swapBodyItem.bodyLoc(), swapBodyItem.merc()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void BeltToCursor(Packet packet) { + int entityId = getPlayerEntityId(packet); + BeltToCursor beltToCursor = (BeltToCursor) packet.data.data(new BeltToCursor()); + itemManager.beltToCursor(entityId, beltToCursor.itemId()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void CursorToBelt(Packet packet) { + int entityId = getPlayerEntityId(packet); + CursorToBelt cursorToBelt = (CursorToBelt) packet.data.data(new CursorToBelt()); + itemManager.cursorToBelt(entityId, cursorToBelt.x(), cursorToBelt.y()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } private void SwapBeltItem(Packet packet) { + int entityId = getPlayerEntityId(packet); + SwapBeltItem swapBeltItem = (SwapBeltItem) packet.data.data(new SwapBeltItem()); + itemManager.swapBeltItem(entityId, swapBeltItem.itemId()); + + packet.id = (1 << packet.id); + outPackets.offer(packet); } static String generateClientName() {