Improved support for picking up and dropping items

ItemController interface changed to be an engine-operable interface
Removed ItemController interface from CharData
Changed ItemController#groundToCursor(Item) to #groundToCursor(int) to pick up an item wrapper entity
ItemManager now handles item entity creation/deletion (may change)
ClientItemManager changed to operate upon Riiablo.charData and is for clients
CursorMovementSystem now uses ItemController instead of handling item drop and packeting directly
Item wrapper entity deletion remains unhandled in multiplayer until support for networking entity deletion is added
This commit is contained in:
Collin Smith
2020-06-02 20:55:03 -07:00
parent edb6de8df9
commit 907688a1d2
8 changed files with 88 additions and 77 deletions

View File

@ -1,8 +1,13 @@
package com.riiablo.engine.client;
import com.artemis.ComponentMapper;
import com.artemis.annotations.Wire;
import com.badlogic.gdx.math.Vector2;
import com.riiablo.Riiablo;
import com.riiablo.engine.EntityFactory;
import com.riiablo.engine.server.component.Item;
import com.riiablo.engine.server.component.Position;
import com.riiablo.item.BodyLoc;
import com.riiablo.item.Item;
import com.riiablo.item.StoreLoc;
import com.riiablo.save.ItemController;
@ -11,60 +16,71 @@ import net.mostlyoriginal.api.system.core.PassiveSystem;
public class ClientItemManager extends PassiveSystem implements ItemController {
private static final String TAG = "ClientItemManager";
final ItemController delegate = Riiablo.charData;
protected ComponentMapper<Item> mItem;
protected ComponentMapper<Position> mPosition;
@Wire(name = "factory")
protected EntityFactory factory;
@Override
public void groundToCursor(Item item) {
delegate.groundToCursor(item);
public void groundToCursor(int entityId) {
com.riiablo.item.Item item = mItem.get(entityId).item;
Riiablo.charData.groundToCursor(item);
world.delete(entityId);
}
@Override
public void cursorToGround() {
delegate.cursorToGround();
com.riiablo.item.Item item = Riiablo.charData.getItems().getCursor();
Riiablo.charData.cursorToGround();
Vector2 position = mPosition.get(Riiablo.game.player).position;
factory.createItem(item, position);
}
@Override
public void storeToCursor(int i) {
delegate.storeToCursor(i);
Riiablo.charData.storeToCursor(i);
}
@Override
public void cursorToStore(StoreLoc storeLoc, int x, int y) {
delegate.cursorToStore(storeLoc, x, y);
Riiablo.charData.cursorToStore(storeLoc, x, y);
}
@Override
public void swapStoreItem(int i, StoreLoc storeLoc, int x, int y) {
delegate.swapStoreItem(i, storeLoc, x, y);
Riiablo.charData.swapStoreItem(i, storeLoc, x, y);
}
@Override
public void bodyToCursor(BodyLoc bodyLoc, boolean merc) {
delegate.bodyToCursor(bodyLoc, merc);
Riiablo.charData.bodyToCursor(bodyLoc, merc);
}
@Override
public void cursorToBody(BodyLoc bodyLoc, boolean merc) {
delegate.cursorToBody(bodyLoc, merc);
Riiablo.charData.cursorToBody(bodyLoc, merc);
}
@Override
public void swapBodyItem(BodyLoc bodyLoc, boolean merc) {
delegate.swapBodyItem(bodyLoc, merc);
Riiablo.charData.swapBodyItem(bodyLoc, merc);
}
@Override
public void beltToCursor(int i) {
delegate.beltToCursor(i);
Riiablo.charData.beltToCursor(i);
}
@Override
public void cursorToBelt(int x, int y) {
delegate.cursorToBelt(x, y);
Riiablo.charData.cursorToBelt(x, y);
}
@Override
public void swapBeltItem(int i) {
delegate.swapBeltItem(i);
Riiablo.charData.swapBeltItem(i);
}
}

View File

@ -1,7 +1,5 @@
package com.riiablo.engine.client;
import com.google.flatbuffers.FlatBufferBuilder;
import com.artemis.Aspect;
import com.artemis.BaseSystem;
import com.artemis.ComponentMapper;
@ -11,14 +9,12 @@ import com.artemis.utils.IntBag;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.net.Socket;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.utils.UIUtils;
import com.riiablo.Riiablo;
import com.riiablo.camera.IsometricCamera;
import com.riiablo.engine.Engine;
import com.riiablo.engine.EntityFactory;
import com.riiablo.engine.client.component.Hovered;
import com.riiablo.engine.server.Pathfinder;
import com.riiablo.engine.server.component.Interactable;
@ -27,13 +23,7 @@ import com.riiablo.engine.server.component.Target;
import com.riiablo.item.Item;
import com.riiablo.map.Map;
import com.riiablo.map.RenderSystem;
import com.riiablo.net.packet.d2gs.D2GS;
import com.riiablo.net.packet.d2gs.D2GSData;
import com.riiablo.net.packet.d2gs.DropItem;
import java.io.OutputStream;
import java.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;
import com.riiablo.save.ItemController;
public class CursorMovementSystem extends BaseSystem {
private static final String TAG = "CursorMovementSystem";
@ -47,9 +37,6 @@ public class CursorMovementSystem extends BaseSystem {
protected MenuManager menuManager;
protected DialogManager dialogManager;
@Wire(name = "factory")
protected EntityFactory factory;
@Wire(name = "iso")
protected IsometricCamera iso;
@ -62,8 +49,8 @@ public class CursorMovementSystem extends BaseSystem {
@Wire(name = "scaledStage")
protected Stage scaledStage;
@Wire(name = "client.socket", failOnNull = false)
protected Socket socket;
@Wire(name = "itemController")
protected ItemController itemController;
EntitySubscription hoveredSubscriber;
boolean requireRelease;
@ -99,27 +86,7 @@ public class CursorMovementSystem extends BaseSystem {
if (pressed && !requireRelease) {
Item cursor = Riiablo.cursor.getItem();
if (cursor != null) {
Vector2 position = mPosition.get(src).position;
iso.toTile(tmpVec2.set(position));
Riiablo.charData.cursorToGround();
if (socket == null) {
factory.createItem(cursor, tmpVec2);
} else {
FlatBufferBuilder builder = new FlatBufferBuilder(0);
int dataOffset = DropItem.createDropItem(builder, (int) cursor.id);
int root = D2GS.createD2GS(builder, D2GSData.DropItem, dataOffset);
D2GS.finishSizePrefixedD2GSBuffer(builder, root);
try {
OutputStream out = socket.getOutputStream();
WritableByteChannel channelOut = Channels.newChannel(out);
channelOut.write(builder.dataBuffer());
} catch (Throwable t) {
Gdx.app.error(TAG, t.getMessage(), t);
}
}
itemController.cursorToGround();
requireRelease = true;
return;
}

View File

@ -6,7 +6,6 @@ import com.artemis.annotations.Wire;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.net.Socket;
import com.riiablo.item.BodyLoc;
import com.riiablo.item.Item;
import com.riiablo.item.StoreLoc;
import com.riiablo.net.packet.d2gs.BeltToCursor;
import com.riiablo.net.packet.d2gs.BodyToCursor;
@ -16,6 +15,7 @@ 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;
@ -49,11 +49,10 @@ public class NetworkedClientItemManager extends ClientItemManager {
}
@Override
public void groundToCursor(Item item) {
// TODO: implement
// FlatBufferBuilder builder = obtainBuilder();
// int dataOffset = GroundToCursor.createGroundToCursor(builder, 0);
// wrapAndSend(builder, D2GSData.GroundToCursor, dataOffset);
public void groundToCursor(int entityId) {
FlatBufferBuilder builder = obtainBuilder();
int dataOffset = GroundToCursor.createGroundToCursor(builder, entityId);
wrapAndSend(builder, D2GSData.GroundToCursor, dataOffset);
}
@Override

View File

@ -1,6 +1,8 @@
package com.riiablo.engine.server;
import com.artemis.annotations.Wire;
import com.riiablo.engine.server.component.Interactable;
import com.riiablo.save.ItemController;
import net.mostlyoriginal.api.system.core.PassiveSystem;
@ -9,9 +11,13 @@ public class ItemInteractor extends PassiveSystem implements Interactable.Intera
protected ItemManager items;
@Wire(name = "itemController", failOnNull = false)
protected ItemController itemController;
@Override
public void interact(int src, int entity) {
items.groundToCursor(src, entity);
world.delete(entity);
if (itemController != null) {
itemController.groundToCursor(entity);
}
}
}

View File

@ -1,10 +1,15 @@
package com.riiablo.engine.server;
import com.artemis.ComponentMapper;
import com.artemis.annotations.Wire;
import com.badlogic.gdx.math.Vector2;
import com.riiablo.engine.EntityFactory;
import com.riiablo.engine.server.component.Item;
import com.riiablo.engine.server.component.Player;
import com.riiablo.engine.server.component.Position;
import com.riiablo.item.BodyLoc;
import com.riiablo.item.StoreLoc;
import com.riiablo.save.CharData;
import net.mostlyoriginal.api.system.core.PassiveSystem;
@ -13,14 +18,25 @@ public class ItemManager extends PassiveSystem {
protected ComponentMapper<Player> mPlayer;
protected ComponentMapper<Item> mItem;
protected ComponentMapper<Position> mPosition;
@Wire(name = "factory")
protected EntityFactory factory;
public void groundToCursor(int entityId, int dst) {
com.riiablo.item.Item item = mItem.get(dst).item;
mPlayer.get(entityId).data.groundToCursor(item);
world.delete(dst);
}
public void cursorToGround(int entityId) {
mPlayer.get(entityId).data.cursorToGround();
CharData charData = mPlayer.get(entityId).data;
com.riiablo.item.Item item = charData.getItems().getCursor();
charData.cursorToGround();
Vector2 position = mPosition.get(entityId).position;
factory.createItem(item, position);
}
public void storeToCursor(int entityId, int i) {

View File

@ -25,7 +25,7 @@ import java.nio.ByteBuffer;
import java.util.Arrays;
// TODO: support pooling CharData for multiplayer
public class CharData implements ItemController, ItemData.UpdateListener, Pool.Poolable {
public class CharData implements ItemData.UpdateListener, Pool.Poolable {
private static final String TAG = "CharData";
private static final boolean DEBUG = true;
private static final boolean DEBUG_ITEMS = DEBUG && !true;
@ -384,13 +384,13 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
return itemData;
}
@Override
// @Override
public void groundToCursor(Item item) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "groundToCursor " + item);
itemData.pickup(item);
}
@Override
// @Override
public void cursorToGround() {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToGround");
itemData.drop();
@ -401,19 +401,19 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
itemData.pickup(i);
}
@Override
// @Override
public void storeToCursor(int i) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "storeToCursor " + i);
itemToCursor(i);
}
@Override
// @Override
public void cursorToStore(StoreLoc storeLoc, int x, int y) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToStore " + storeLoc + "," + x + "," + y);
itemData.storeCursor(storeLoc, x, y);
}
@Override
// @Override
public void swapStoreItem(int i, StoreLoc storeLoc, int x, int y) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "swapStoreItem " + i + "," + storeLoc + "," + x + "," + y);
cursorToStore(storeLoc, x, y);
@ -432,7 +432,7 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
swapBodyItem(bodyLoc, false);
}
@Override
// @Override
public void bodyToCursor(BodyLoc bodyLoc, boolean merc) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "bodyToCursor " + bodyLoc + "," + (merc ? "merc" : "player"));
assert itemData.cursor == ItemData.INVALID_ITEM;
@ -447,7 +447,7 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
itemData.setLocation(item, Location.CURSOR);
}
@Override
// @Override
public void cursorToBody(BodyLoc bodyLoc, boolean merc) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToBody " + bodyLoc + "," + (merc ? "merc" : "player"));
assert itemData.cursor != ItemData.INVALID_ITEM;
@ -468,7 +468,7 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
* was being called out of order for setting the cursor, causing the cursor to be unset
* within the UI immediately after being changed.
*/
@Override
// @Override
public void swapBodyItem(BodyLoc bodyLoc, boolean merc) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "swapBodyItem " + bodyLoc + "," + (merc ? "merc" : "player"));
@ -497,13 +497,13 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
itemData.setLocation(newCursorItem, Location.CURSOR);
}
@Override
// @Override
public void beltToCursor(int i) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "beltToCursor");
itemToCursor(i);
}
@Override
// @Override
public void cursorToBelt(int x, int y) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToBelt");
assert itemData.cursor != ItemData.INVALID_ITEM;
@ -522,7 +522,7 @@ public class CharData implements ItemController, ItemData.UpdateListener, Pool.P
* was being called out of order for setting the cursor, causing the cursor to be unset
* within the UI immediately after being changed.
*/
@Override
// @Override
public void swapBeltItem(int i) {
if (DEBUG_ITEMS) Gdx.app.log(TAG, "swapBeltItem");

View File

@ -1,11 +1,10 @@
package com.riiablo.save;
import com.riiablo.item.BodyLoc;
import com.riiablo.item.Item;
import com.riiablo.item.StoreLoc;
public interface ItemController {
void groundToCursor(Item item);
void groundToCursor(int entityId);
void cursorToGround();
void storeToCursor(int i);
void cursorToStore(StoreLoc storeLoc, int x, int y);

View File

@ -65,6 +65,7 @@ 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.GroundToCursor;
import com.riiablo.net.packet.d2gs.StoreToCursor;
import com.riiablo.net.packet.d2gs.SwapBeltItem;
import com.riiablo.net.packet.d2gs.SwapBodyItem;
@ -387,10 +388,10 @@ public class D2GS extends ApplicationAdapter {
Synchronize(packet);
break;
case D2GSData.DropItem:
DropItem(packet);
// DropItem(packet);
break;
case D2GSData.PickupItem:
PickupItem(packet);
// PickupItem(packet);
break;
case D2GSData.GroundToCursor:
GroundToCursor(packet);
@ -535,6 +536,7 @@ public class D2GS extends ApplicationAdapter {
sync.sync(entityId, packet.data);
}
@Deprecated
private void DropItem(Packet packet) {
int entityId = player.get(packet.id, Engine.INVALID_ENTITY);
assert entityId != Engine.INVALID_ENTITY;
@ -551,6 +553,7 @@ public class D2GS extends ApplicationAdapter {
factory.createItem(item, position);
}
@Deprecated
private void PickupItem(Packet packet) {
}
@ -562,7 +565,12 @@ public class D2GS extends ApplicationAdapter {
}
private void GroundToCursor(Packet packet) {
// TODO: implement
int entityId = getPlayerEntityId(packet);
GroundToCursor groundToCursor = (GroundToCursor) packet.data.data(new GroundToCursor());
itemManager.groundToCursor(entityId, groundToCursor.itemId());
packet.id = (1 << packet.id);
outPackets.offer(packet);
}
private void CursorToGround(Packet packet) {