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
This commit is contained in:
Collin Smith 2020-06-02 15:30:18 -07:00
parent 8f437ab037
commit edb6de8df9
4 changed files with 187 additions and 9 deletions

View File

@ -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";

View File

@ -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());
}
}

View File

@ -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

View File

@ -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() {