mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-04 15:27:30 +07:00
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:
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
Reference in New Issue
Block a user