Added support for serializing and synchronizing dropped items

Added support for serializing and synchronizing dropped items
Picking up items not supported yet -- requires API change
Added packet types for DropItem and PickupItem
Added ItemP component table and ItemSerializer
Added EntityFactory#createItem(Item,float,float)
Removed CharStats.BlockFactor from Stat.toblock item property -- should be applied on view stats and base character properties list
This commit is contained in:
Collin Smith
2019-12-31 02:46:34 -08:00
parent f5179bbaaa
commit ff7a27d334
19 changed files with 303 additions and 18 deletions

View File

@ -45,6 +45,9 @@ import com.riiablo.engine.server.ServerNetworkIdManager;
import com.riiablo.engine.server.VelocityAdder;
import com.riiablo.engine.server.WarpInteractor;
import com.riiablo.engine.server.component.Networked;
import com.riiablo.engine.server.component.Player;
import com.riiablo.engine.server.component.Position;
import com.riiablo.item.Item;
import com.riiablo.map.Act1MapBuilder;
import com.riiablo.map.DS1;
import com.riiablo.map.DS1Loader;
@ -56,6 +59,7 @@ import com.riiablo.mpq.MPQFileHandleResolver;
import com.riiablo.net.packet.d2gs.Connection;
import com.riiablo.net.packet.d2gs.D2GSData;
import com.riiablo.net.packet.d2gs.Disconnect;
import com.riiablo.net.packet.d2gs.DropItem;
import com.riiablo.util.DebugUtils;
import net.mostlyoriginal.api.event.common.EventSystem;
@ -369,6 +373,12 @@ public class D2GS extends ApplicationAdapter {
case D2GSData.EntitySync:
Synchronize(packet);
break;
case D2GSData.DropItem:
DropItem(packet);
break;
case D2GSData.PickupItem:
PickupItem(packet);
break;
default:
Gdx.app.error(TAG, "Unknown packet type: " + packet.data.dataType());
}
@ -394,9 +404,9 @@ public class D2GS extends ApplicationAdapter {
Gdx.app.log(TAG, " " + DebugUtils.toByteArray(cofTransforms));
ByteBuffer d2sData = connection.d2sAsByteBuffer();
D2S d2s = D2S.loadFromBuffer(d2sData);
D2S d2s = D2S.loadFromBuffer(d2sData, true);
CharData charData = new CharData().setD2S(d2s);
Gdx.app.log(TAG, " " + d2s);
Gdx.app.log(TAG, " " + d2s.header);
Vector2 origin = map.find(Map.ID.TOWN_ENTRY_1);
if (origin == null) origin = map.find(Map.ID.TOWN_ENTRY_2);
@ -480,6 +490,33 @@ public class D2GS extends ApplicationAdapter {
sync.sync(entityId, packet.data);
}
private void DropItem(Packet packet) {
int entityId = player.get(packet.id, Engine.INVALID_ENTITY);
assert entityId != Engine.INVALID_ENTITY;
DropItem dropItem = (DropItem) packet.data.data(new DropItem());
int itemId = dropItem.itemId();
Item item = null;
Player player = world.getMapper(Player.class).get(entityId);
CharData charData = player.data;
D2S d2s = charData.getD2S();
for (Item i : d2s.items.items) {
if ((int) i.id == itemId) {
item = i;
break;
}
}
assert item != null;
Vector2 position = world.getMapper(Position.class).get(entityId).position;
factory.createItem(item, position);
}
private void PickupItem(Packet packet) {
}
static String generateClientName() {
return String.format("Client-%08X", MathUtils.random(1, Integer.MAX_VALUE - 1));
}