From 043daea1380d822e739871f84447da3aae9dce36 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 25 Jun 2017 09:27:52 -0500 Subject: [PATCH 01/22] Fixed intent names in ObjectAwareness --- src/services/objects/ObjectAwareness.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 73889f9d1..4753664fa 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -170,26 +170,26 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { } } - private void processGalacticPacketIntent(GalacticPacketIntent i) { - Packet packet = i.getPacket(); + private void processGalacticPacketIntent(GalacticPacketIntent gpi) { + Packet packet = gpi.getPacket(); if (packet instanceof DataTransform) { - handleDataTransform((DataTransform) packet, i.getObjectManager()); + handleDataTransform((DataTransform) packet, gpi.getObjectManager()); } else if (packet instanceof DataTransformWithParent) { - handleDataTransformWithParent((DataTransformWithParent) packet, i.getObjectManager()); + handleDataTransformWithParent((DataTransformWithParent) packet, gpi.getObjectManager()); } else if (packet instanceof CmdSceneReady) { - handleCmdSceneReady(i.getPlayer(), (CmdSceneReady) packet); + handleCmdSceneReady(gpi.getPlayer(), (CmdSceneReady) packet); } } - private void processMoveObjectIntent(MoveObjectIntent i) { - moveObjectWithTransform(i.getObject(), i.getParent(), i.getNewLocation(), i.getSpeed(), i.getUpdateCounter()); + private void processMoveObjectIntent(MoveObjectIntent moi) { + moveObjectWithTransform(moi.getObject(), moi.getParent(), moi.getNewLocation(), moi.getSpeed(), moi.getUpdateCounter()); } - private void processContainerTransferIntent(ContainerTransferIntent i) { - SWGObject obj = i.getObject(); + private void processContainerTransferIntent(ContainerTransferIntent cti) { + SWGObject obj = cti.getObject(); Assert.notNull(obj); Assert.notNull(obj.getTerrain()); - moveObject(obj, i.getContainer(), obj.getLocation()); + moveObject(obj, cti.getContainer(), obj.getLocation()); } private void handleZoneIn(CreatureObject creature, Player player, Location loc, SWGObject parent) { From b97212d1acea14780928ed23c2121cf924a47240 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Tue, 27 Jun 2017 18:22:27 +0200 Subject: [PATCH 02/22] Added Trading --- src/network/PacketType.java | 25 ++++ .../zone/object_controller/SecureTrade.java | 89 ++++++++++++ .../swg/zone/trade/AbortTradeMessage.java | 51 +++++++ .../zone/trade/AcceptTransactionMessage.java | 51 +++++++ .../swg/zone/trade/AddItemFailedMessage.java | 63 ++++++++ .../swg/zone/trade/AddItemMessage.java | 67 +++++++++ .../swg/zone/trade/BeginTradeMessage.java | 63 ++++++++ .../zone/trade/BeginVerificationMessage.java | 51 +++++++ .../swg/zone/trade/DenyTradeMessage.java | 51 +++++++ .../swg/zone/trade/GiveMoneyMessage.java | 64 ++++++++ .../swg/zone/trade/RemoveItemMessage.java | 64 ++++++++ .../swg/zone/trade/TradeCompleteMessage.java | 51 +++++++ .../trade/UnAcceptTransactionMessage.java | 51 +++++++ .../swg/zone/trade/VerifyTradeMessage.java | 51 +++++++ .../objects/creature/CreatureObject.java | 12 +- src/services/galaxy/GalacticManager.java | 6 +- src/services/trade/TradeService.java | 137 ++++++++++++++++++ src/services/trade/TradeSession.java | 63 ++++++++ 18 files changed, 1008 insertions(+), 2 deletions(-) create mode 100644 src/network/packets/swg/zone/object_controller/SecureTrade.java create mode 100644 src/network/packets/swg/zone/trade/AbortTradeMessage.java create mode 100644 src/network/packets/swg/zone/trade/AcceptTransactionMessage.java create mode 100644 src/network/packets/swg/zone/trade/AddItemFailedMessage.java create mode 100644 src/network/packets/swg/zone/trade/AddItemMessage.java create mode 100644 src/network/packets/swg/zone/trade/BeginTradeMessage.java create mode 100644 src/network/packets/swg/zone/trade/BeginVerificationMessage.java create mode 100644 src/network/packets/swg/zone/trade/DenyTradeMessage.java create mode 100644 src/network/packets/swg/zone/trade/GiveMoneyMessage.java create mode 100644 src/network/packets/swg/zone/trade/RemoveItemMessage.java create mode 100644 src/network/packets/swg/zone/trade/TradeCompleteMessage.java create mode 100644 src/network/packets/swg/zone/trade/UnAcceptTransactionMessage.java create mode 100644 src/network/packets/swg/zone/trade/VerifyTradeMessage.java create mode 100644 src/services/trade/TradeService.java create mode 100644 src/services/trade/TradeSession.java diff --git a/src/network/PacketType.java b/src/network/PacketType.java index 324617278..2b45fd1c2 100644 --- a/src/network/PacketType.java +++ b/src/network/PacketType.java @@ -162,6 +162,18 @@ import network.packets.swg.zone.spatial.AttributeListMessage; import network.packets.swg.zone.spatial.GetMapLocationsMessage; import network.packets.swg.zone.spatial.GetMapLocationsResponseMessage; import network.packets.swg.zone.spatial.NewTicketActivityResponseMessage; +import network.packets.swg.zone.trade.AbortTradeMessage; +import network.packets.swg.zone.trade.AcceptTransactionMessage; +import network.packets.swg.zone.trade.AddItemFailedMessage; +import network.packets.swg.zone.trade.AddItemMessage; +import network.packets.swg.zone.trade.BeginTradeMessage; +import network.packets.swg.zone.trade.BeginVerificationMessage; +import network.packets.swg.zone.trade.DenyTradeMessage; +import network.packets.swg.zone.trade.GiveMoneyMessage; +import network.packets.swg.zone.trade.RemoveItemMessage; +import network.packets.swg.zone.trade.TradeCompleteMessage; +import network.packets.swg.zone.trade.UnAcceptTransactionMessage; +import network.packets.swg.zone.trade.VerifyTradeMessage; public enum PacketType { @@ -326,6 +338,19 @@ public enum PacketType { PLANET_TRAVEL_POINT_LIST_REQUEST (PlanetTravelPointListRequest.CRC, PlanetTravelPointListRequest.class), PLANET_TRAVEL_POINT_LIST_RESPONSE (PlanetTravelPointListResponse.CRC, PlanetTravelPointListResponse.class), + //Trade + ABORT_TRADE_MESSAGE (AbortTradeMessage.CRC, AbortTradeMessage.class), + ACCEPT_TRANSACTION_MESSAGE (AcceptTransactionMessage.CRC, AcceptTransactionMessage.class), + ADD_ITEM_FAILED_MESSAGE (AddItemFailedMessage.CRC, AddItemFailedMessage.class), + ADD_ITEM_MESSAGE (AddItemMessage.CRC, AddItemMessage.class), + BEGIN_TRADE_MESSAGE (BeginTradeMessage.CRC, BeginTradeMessage.class), + BEGIN_VERIFICATION_MESSAGE (BeginVerificationMessage.CRC, BeginVerificationMessage.class), + DENY_TRADE_MESSAGE (DenyTradeMessage.CRC, DenyTradeMessage.class), + GIVE_MONEY_MESSAGE (GiveMoneyMessage.CRC, GiveMoneyMessage.class), + REMOVE_ITEM_MESSAGE (RemoveItemMessage.CRC, RemoveItemMessage.class), + TRADE_COMPLETE_MESSAGE (TradeCompleteMessage.CRC, TradeCompleteMessage.class), + UNACCEPT_TRANSACTION_MESSAGE (UnAcceptTransactionMessage.CRC, UnAcceptTransactionMessage.class), + VERIFY_TRADE_MESSAGE (VerifyTradeMessage.CRC, VerifyTradeMessage.class), UNKNOWN (0xFFFFFFFF, SWGPacket.class); diff --git a/src/network/packets/swg/zone/object_controller/SecureTrade.java b/src/network/packets/swg/zone/object_controller/SecureTrade.java new file mode 100644 index 000000000..7a0e0f484 --- /dev/null +++ b/src/network/packets/swg/zone/object_controller/SecureTrade.java @@ -0,0 +1,89 @@ +package network.packets.swg.zone.object_controller; + +import com.projectswg.common.data.EnumLookup; +import com.projectswg.common.network.NetBuffer; + +public class SecureTrade extends ObjectController { + + public static final int CRC = 0x0115; + + private TradeMessageType type; + private long starterId; + private long accepterId; + + public SecureTrade(TradeMessageType type, long starterId, long accepterId) { + super(CRC); + this.type = type; + this.starterId = starterId; + this.accepterId = accepterId; + } + + public SecureTrade(NetBuffer data) { + super(CRC); + decode(data); + } + + @Override + public void decode(NetBuffer data) { + decodeHeader(data); + type = TradeMessageType.getTypeForInt(data.getInt()); + starterId = data.getLong(); + accepterId = data.getLong(); + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(HEADER_LENGTH + 20); + encodeHeader(data); + data.addInt(type.getId()); + data.addLong(starterId); + data.addLong(accepterId); + return data; + } + + public TradeMessageType getType() { + return type; + } + + public void setType(TradeMessageType type) { + this.type = type; + } + + public long getStarterId() { + return starterId; + } + + public long getAccepterId() { + return accepterId; + } + + public static enum TradeMessageType { + UNDEFINED (Integer.MIN_VALUE), + REQUEST_TRADE (0), + TRADE_REQUESTED (1), + ACCEPT_TRADE (2), + DENIED_TRADE (3), + DENIED_PLAYER_BUSY (4), + DENIED_PLAYER_UNREACHABLE (5), + REQUEST_TRADE_REVERSED (6), + LAST_TRADE_MESSAGE (7); + + private static final EnumLookup LOOKUP = new EnumLookup<>(TradeMessageType.class, t -> t.getId()); + + private int id; + + TradeMessageType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static TradeMessageType getTypeForInt(int id) { + return LOOKUP.getEnum(id, UNDEFINED); + } + } + + +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/AbortTradeMessage.java b/src/network/packets/swg/zone/trade/AbortTradeMessage.java new file mode 100644 index 000000000..419cae09b --- /dev/null +++ b/src/network/packets/swg/zone/trade/AbortTradeMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class AbortTradeMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("AbortTradeMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/AcceptTransactionMessage.java b/src/network/packets/swg/zone/trade/AcceptTransactionMessage.java new file mode 100644 index 000000000..b137c9d15 --- /dev/null +++ b/src/network/packets/swg/zone/trade/AcceptTransactionMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class AcceptTransactionMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("AcceptTransactionMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/AddItemFailedMessage.java b/src/network/packets/swg/zone/trade/AddItemFailedMessage.java new file mode 100644 index 000000000..971157192 --- /dev/null +++ b/src/network/packets/swg/zone/trade/AddItemFailedMessage.java @@ -0,0 +1,63 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class AddItemFailedMessage extends SWGPacket{ + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("AddItemFailedMessage"); + + private long objectId; + + public AddItemFailedMessage(long objectId) { + this.objectId = objectId; + } + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + objectId = data.getLong(); + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(14); + data.addShort(2); + data.addInt(CRC); + data.addLong(objectId); + return data; + } + + public long getObjectId() { + return objectId; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/AddItemMessage.java b/src/network/packets/swg/zone/trade/AddItemMessage.java new file mode 100644 index 000000000..1896f7dc9 --- /dev/null +++ b/src/network/packets/swg/zone/trade/AddItemMessage.java @@ -0,0 +1,67 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class AddItemMessage extends SWGPacket{ + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("AddItemMessage"); + + private long objectId; + + public AddItemMessage(long objectId) { + this.objectId = objectId; + } + + public AddItemMessage() { + this.objectId = 0; + } + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + objectId = data.getLong(); + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(14); + data.addShort(2); + data.addInt(CRC); + data.addLong(objectId); + return data; + } + + public long getObjectId() { + return objectId; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/BeginTradeMessage.java b/src/network/packets/swg/zone/trade/BeginTradeMessage.java new file mode 100644 index 000000000..59342c4f6 --- /dev/null +++ b/src/network/packets/swg/zone/trade/BeginTradeMessage.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com + * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. + * Our goal is to create an emulator which will provide a server for players to + * continue playing a game similar to the one they used to play. We are basing + * it on the final publish of the game prior to end-game events. + * + * This file is part of Holocore. + * + * -------------------------------------------------------------------------------- + * + * Holocore is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Holocore is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Holocore. If not, see + ******************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class BeginTradeMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("BeginTradeMessage"); + + private long playerId; + + public BeginTradeMessage(long playerId) { + super(); + this.playerId = playerId; + } + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + playerId = data.getLong(); + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(14); + data.addShort(2); + data.addInt(CRC); + data.addLong(playerId); + return data; + } + + public long getPlayerId() { + return playerId; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/BeginVerificationMessage.java b/src/network/packets/swg/zone/trade/BeginVerificationMessage.java new file mode 100644 index 000000000..5ee9cf849 --- /dev/null +++ b/src/network/packets/swg/zone/trade/BeginVerificationMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class BeginVerificationMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("BeginVerificationMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/DenyTradeMessage.java b/src/network/packets/swg/zone/trade/DenyTradeMessage.java new file mode 100644 index 000000000..3ab8d321c --- /dev/null +++ b/src/network/packets/swg/zone/trade/DenyTradeMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class DenyTradeMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("DenyTradeMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/GiveMoneyMessage.java b/src/network/packets/swg/zone/trade/GiveMoneyMessage.java new file mode 100644 index 000000000..a8ef9702b --- /dev/null +++ b/src/network/packets/swg/zone/trade/GiveMoneyMessage.java @@ -0,0 +1,64 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class GiveMoneyMessage extends SWGPacket{ + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("GiveMoneyMessage"); + + private int moneyAmount; + + public GiveMoneyMessage(int moneyAmount) { + super(); + this.moneyAmount = moneyAmount; + } + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + moneyAmount = data.getInt(); + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(10); + data.addShort(2); + data.addInt(CRC); + data.addInt(moneyAmount); + return data; + } + + public int getMoneyAmount() { + return moneyAmount; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/RemoveItemMessage.java b/src/network/packets/swg/zone/trade/RemoveItemMessage.java new file mode 100644 index 000000000..274070cc0 --- /dev/null +++ b/src/network/packets/swg/zone/trade/RemoveItemMessage.java @@ -0,0 +1,64 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class RemoveItemMessage extends SWGPacket{ + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("RemoveItemMessage"); + + private long objectId; + + public RemoveItemMessage(long objectId) { + super(); + this.objectId = objectId; + } + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + objectId = data.getLong(); + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(14); + data.addShort(2); + data.addInt(CRC); + data.addLong(objectId); + return data; + } + + public long getObjectId() { + return objectId; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/TradeCompleteMessage.java b/src/network/packets/swg/zone/trade/TradeCompleteMessage.java new file mode 100644 index 000000000..c21d69a7e --- /dev/null +++ b/src/network/packets/swg/zone/trade/TradeCompleteMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class TradeCompleteMessage extends SWGPacket{ + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("TradeCompleteMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/UnAcceptTransactionMessage.java b/src/network/packets/swg/zone/trade/UnAcceptTransactionMessage.java new file mode 100644 index 000000000..c61f6cd66 --- /dev/null +++ b/src/network/packets/swg/zone/trade/UnAcceptTransactionMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class UnAcceptTransactionMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("UnAcceptTransactionMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/network/packets/swg/zone/trade/VerifyTradeMessage.java b/src/network/packets/swg/zone/trade/VerifyTradeMessage.java new file mode 100644 index 000000000..4f82a5319 --- /dev/null +++ b/src/network/packets/swg/zone/trade/VerifyTradeMessage.java @@ -0,0 +1,51 @@ +/************************************************************************************ + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * -------------------------------------------------------------------------------- * + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + * * + ***********************************************************************************/ +package network.packets.swg.zone.trade; + +import com.projectswg.common.network.NetBuffer; + +import network.packets.swg.SWGPacket; + +public class VerifyTradeMessage extends SWGPacket { + + public static final int CRC = com.projectswg.common.data.CRC.getCrc("VerifyTradeMessage"); + + @Override + public void decode(NetBuffer data) { + if (!super.checkDecode(data, CRC)) + return; + } + + @Override + public NetBuffer encode() { + NetBuffer data = NetBuffer.allocate(6); + data.addShort(1); + data.addInt(CRC); + return data; + } +} \ No newline at end of file diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 3e41c74e7..8c6278e41 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -61,6 +61,7 @@ import resources.objects.weapon.WeaponObject; import resources.persistable.SWGObjectFactory; import resources.player.Player; import services.group.GroupInviterData; +import services.trade.TradeSession; public class CreatureObject extends TangibleObject { @@ -80,6 +81,7 @@ public class CreatureObject extends TangibleObject { private int battleFatigue = 0; private long statesBitmask = 0; private long lastTransform = 0; + private TradeSession tradeSession = null; private SWGSet skills = new SWGSet(1, 3, StringType.ASCII); @@ -258,8 +260,16 @@ public class CreatureObject extends TangibleObject { public boolean isLoggedOutPlayer() { return getOwner() == null && isPlayer(); - } + } + public TradeSession getTradeSession() { + return tradeSession; + } + + public void setTradeSession(TradeSession tradeSession) { + this.tradeSession = tradeSession; + } + public void setPosture(Posture posture) { this.posture = posture; sendDelta(3, 13, posture.getId()); diff --git a/src/services/galaxy/GalacticManager.java b/src/services/galaxy/GalacticManager.java index 0110f1313..3de254f75 100644 --- a/src/services/galaxy/GalacticManager.java +++ b/src/services/galaxy/GalacticManager.java @@ -46,6 +46,7 @@ import services.galaxy.travel.TravelService; import services.objects.ObjectManager; import services.objects.UniformBoxService; import services.player.PlayerManager; +import services.trade.TradeService; public class GalacticManager extends Manager { @@ -56,6 +57,7 @@ public class GalacticManager extends Manager { private final TravelService travelService; private final DeveloperService developerService; private final UniformBoxService uniformBox; + private final TradeService tradeService; private final Map prevIntentMap; public GalacticManager() { @@ -66,8 +68,9 @@ public class GalacticManager extends Manager { travelService = new TravelService(); developerService = new DeveloperService(); uniformBox = new UniformBoxService(); + tradeService = new TradeService(); prevIntentMap = new SynchronizedMap<>(); - + addChildService(objectManager); addChildService(playerManager); addChildService(gameManager); @@ -75,6 +78,7 @@ public class GalacticManager extends Manager { addChildService(travelService); addChildService(developerService); addChildService(uniformBox); + addChildService(tradeService); registerForIntent(InboundPacketIntent.class, ipi -> handleInboundPacketIntent(ipi)); registerForIntent(ConnectionOpenedIntent.class, coi -> handleConnectionOpenedIntent(coi)); diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java new file mode 100644 index 000000000..b8a052382 --- /dev/null +++ b/src/services/trade/TradeService.java @@ -0,0 +1,137 @@ +package services.trade; + +import com.projectswg.common.control.Service; +import com.projectswg.common.debug.Log; + +import intents.PlayerEventIntent; +import intents.network.GalacticPacketIntent; +import network.packets.Packet; +import network.packets.swg.SWGPacket; +import network.packets.swg.zone.object_controller.SecureTrade; +import network.packets.swg.zone.trade.AbortTradeMessage; +import network.packets.swg.zone.trade.AcceptTransactionMessage; +import network.packets.swg.zone.trade.AddItemMessage; +import network.packets.swg.zone.trade.BeginTradeMessage; +import network.packets.swg.zone.trade.DenyTradeMessage; +import network.packets.swg.zone.trade.UnAcceptTransactionMessage; +import resources.objects.creature.CreatureObject; +import resources.player.Player; +import resources.sui.SuiButtons; +import resources.sui.SuiMessageBox; +import services.objects.ObjectManager; + +public class TradeService extends Service { + + public TradeService() { + registerForIntent(GalacticPacketIntent.class, gpi -> handleGalacticPacketIntent(gpi)); + registerForIntent(PlayerEventIntent.class, pei -> handlePlayerEventIntent(pei)); + } + + private void handlePlayerEventIntent(PlayerEventIntent pei) { + switch (pei.getEvent()) { + case PE_LOGGED_OUT: + break; + case PE_FIRST_ZONE: + default: + break; + } + } + + private void handleGalacticPacketIntent(GalacticPacketIntent gpi) { + Packet packet = gpi.getPacket(); + if (gpi.getPacket() instanceof SWGPacket) + Log.d("RX Packet: %s", ((SWGPacket) gpi.getPacket()).getPacketType()); + + if (packet instanceof SecureTrade) { + handleSecureTrade((SecureTrade) packet,gpi.getPlayer(), gpi.getObjectManager()); + } else if (packet instanceof AbortTradeMessage){ + handleAbortTradeMessage(gpi.getPlayer()); + } else if (packet instanceof DenyTradeMessage){ + handleDenyTradeMessage(gpi.getPlayer()); + } else if (packet instanceof AcceptTransactionMessage){ + handleAcceptTransactionMessage(gpi.getPlayer()); + } else if (packet instanceof UnAcceptTransactionMessage){ + handleUnAcceptTransactionMessage(gpi.getPlayer()); + } else if (packet instanceof AddItemMessage){ + handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer()); + } + } + + private void handleSecureTrade(SecureTrade packet, Player player, ObjectManager objectManager) { + CreatureObject initiator = player.getCreatureObject(); + CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); + TradeSession tradeSession = new TradeSession(initiator, accepter); + initiator.setTradeSession(tradeSession); + initiator.getTradeSession().getTradePartner(accepter); + handleTradeSessionRequest(initiator, accepter, tradeSession); + } + + private void handleAbortTradeMessage(Player player) { + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new AbortTradeMessage()); + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new DenyTradeMessage()); + } else{ + player.getCreatureObject().sendSelf(new AbortTradeMessage()); + player.getCreatureObject().sendSelf(new DenyTradeMessage()); + } + } + + private void handleDenyTradeMessage(Player player) { + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new DenyTradeMessage()); + } else{ + player.getCreatureObject().sendSelf(new DenyTradeMessage()); + } + } + + private void handleAcceptTransactionMessage(Player player) { + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new AcceptTransactionMessage()); + } else{ + player.getCreatureObject().sendSelf(new AcceptTransactionMessage()); + } + } + + private void handleUnAcceptTransactionMessage(Player player) { + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new UnAcceptTransactionMessage()); + } else{ + player.getCreatureObject().sendSelf(new UnAcceptTransactionMessage()); + } + } + + private void handleAddItemMessage(AddItemMessage packet, Player player) { + + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ + player.getCreatureObject().getTradeSession().addToItemList(player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()), packet.getObjectId()); + for (long objectId : player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getTradeSession().getFromAccepterList()) { + player.getCreatureObject().sendSelf(new AddItemMessage(objectId)); + } + } else{ + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getTradeSession().addToItemList(player.getCreatureObject(), packet.getObjectId()); + for (long objectId : player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getTradeSession().getFromInitiatorList()) { + player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new AddItemMessage(objectId)); + } + } + } + + private void handleTradeSessionRequest(CreatureObject initiator, CreatureObject accepter, TradeSession tradeSession) { + SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); + requestBox.display(accepter.getOwner()); + requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { + accepter.getTradeSession().getTradePartner(initiator); + accepter.setTradeSession(tradeSession); + if(initiator.getTradeSession().getTradePartner(accepter) != null && initiator.getTradeSession().getTradePartner(accepter).equals(accepter) && accepter.getTradeSession().getTradePartner(initiator) != null && accepter.getTradeSession().getTradePartner(initiator).equals(initiator)){ + initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); + accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); + } + }); + requestBox.addCancelButtonCallback("handleTradeRequestDeny", (player, actor, event, paramenters)-> { + initiator.sendSelf(new DenyTradeMessage()); + accepter.sendSelf(new DenyTradeMessage()); + initiator.sendSelf(new AbortTradeMessage()); + accepter.sendSelf(new AbortTradeMessage()); + }); + Log.i("Player: %s sent TradeRequest to Player %s", initiator.getOwner().getCharacterName(), accepter.getOwner().getCharacterName()); + } +} \ No newline at end of file diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java new file mode 100644 index 000000000..7059dc03f --- /dev/null +++ b/src/services/trade/TradeSession.java @@ -0,0 +1,63 @@ +package services.trade; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import resources.objects.SWGObject; +import resources.objects.creature.CreatureObject; + +public class TradeSession { + + private final List initiatorTradeItems; + private final List accepterTradeItems; + private final CreatureObject initiator; + private final CreatureObject accepter; + + public TradeSession(CreatureObject initiator, CreatureObject accepter) { + this.initiator = initiator; + this.accepter = accepter; + this.initiatorTradeItems = new ArrayList(); + this.accepterTradeItems = new ArrayList(); + } + + public void addToItemList(CreatureObject requester, long objectId){ + if(requester.equals(this.initiator)){ + this.initiatorTradeItems.add(objectId); + } else { + this.accepterTradeItems.add(objectId); + } + } + + public void removeFromItemList(CreatureObject requester, long objectId){ + if(requester.equals(this.initiator)){ + this.initiatorTradeItems.remove(objectId); + } else { + this.accepterTradeItems.remove(objectId); + } + } + + public List getFromInitiatorList(){ + return Collections.unmodifiableList(initiatorTradeItems); + } + + public List getFromAccepterList(){ + return Collections.unmodifiableList(accepterTradeItems); + } + + public CreatureObject getInitiator() { + return initiator; + } + + public CreatureObject getAccepter() { + return accepter; + } + + public CreatureObject getTradePartner(CreatureObject self) { + if (self.equals(initiator)) { + return accepter; + } else { + return initiator; + } + } +} \ No newline at end of file From d00a55fb6a6fbc92dec4934da0871487a84038ea Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Tue, 27 Jun 2017 20:49:02 +0200 Subject: [PATCH 03/22] Removed unused ObjectController Moved Tradepartner to CreatureObject --- .../MessageQueueSecureTrade.java | 42 ------------- .../object_controller/ObjectController.java | 2 +- .../objects/creature/CreatureObject.java | 9 +++ src/services/trade/TradeService.java | 61 ++++++++++--------- src/services/trade/TradeSession.java | 8 --- 5 files changed, 43 insertions(+), 79 deletions(-) delete mode 100644 src/network/packets/swg/zone/object_controller/MessageQueueSecureTrade.java diff --git a/src/network/packets/swg/zone/object_controller/MessageQueueSecureTrade.java b/src/network/packets/swg/zone/object_controller/MessageQueueSecureTrade.java deleted file mode 100644 index 393bedac4..000000000 --- a/src/network/packets/swg/zone/object_controller/MessageQueueSecureTrade.java +++ /dev/null @@ -1,42 +0,0 @@ -package network.packets.swg.zone.object_controller; - -import com.projectswg.common.network.NetBuffer; - -public class MessageQueueSecureTrade extends ObjectController { - - public static final int CRC = 0x0115; - - private int tradeId; - private long trader; - private long reciever; - - public MessageQueueSecureTrade(int tradeId, long trader, long reciever) { - super(CRC); - this.tradeId = tradeId; - this.trader = trader; - this.reciever = reciever; - } - - public MessageQueueSecureTrade(NetBuffer data) { - super(CRC); - decode(data); - } - - @Override - public void decode(NetBuffer data) { - decodeHeader(data); - tradeId = data.getInt(); - trader = data.getLong(); - reciever = data.getLong(); - } - - @Override - public NetBuffer encode() { - NetBuffer data = NetBuffer.allocate(HEADER_LENGTH + 20); - encodeHeader(data); - data.addInt(tradeId); - data.addLong(trader); - data.addLong(reciever); - return data; - } -} \ No newline at end of file diff --git a/src/network/packets/swg/zone/object_controller/ObjectController.java b/src/network/packets/swg/zone/object_controller/ObjectController.java index 7dcd17181..ff07527ba 100644 --- a/src/network/packets/swg/zone/object_controller/ObjectController.java +++ b/src/network/packets/swg/zone/object_controller/ObjectController.java @@ -114,7 +114,7 @@ public abstract class ObjectController extends SWGPacket { case 0x04C5: return new IntendedTarget(data); case 0x00F5: return new MissionListRequest(data); case 0x041C: return new JTLTerminalSharedMessage(data); - case 0x0115: return new MessageQueueSecureTrade(data); + case 0x0115: return new SecureTrade(data); } Log.w("Unknown object controller: %08X", crc); return new GenericObjectController(crc, data); diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 8c6278e41..9d19ad18d 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -82,6 +82,7 @@ public class CreatureObject extends TangibleObject { private long statesBitmask = 0; private long lastTransform = 0; private TradeSession tradeSession = null; + private CreatureObject tradePartner = null; private SWGSet skills = new SWGSet(1, 3, StringType.ASCII); @@ -269,6 +270,14 @@ public class CreatureObject extends TangibleObject { public void setTradeSession(TradeSession tradeSession) { this.tradeSession = tradeSession; } + + public CreatureObject getTradePartner() { + return tradePartner; + } + + public void setTradePartner(CreatureObject tradePartner) { + this.tradePartner = tradePartner; + } public void setPosture(Posture posture) { this.posture = posture; diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index b8a052382..e394d48dc 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -52,9 +52,9 @@ public class TradeService extends Service { handleAcceptTransactionMessage(gpi.getPlayer()); } else if (packet instanceof UnAcceptTransactionMessage){ handleUnAcceptTransactionMessage(gpi.getPlayer()); - } else if (packet instanceof AddItemMessage){ + } /*else if (packet instanceof AddItemMessage){ handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer()); - } + }*/ } private void handleSecureTrade(SecureTrade packet, Player player, ObjectManager objectManager) { @@ -62,39 +62,40 @@ public class TradeService extends Service { CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); TradeSession tradeSession = new TradeSession(initiator, accepter); initiator.setTradeSession(tradeSession); - initiator.getTradeSession().getTradePartner(accepter); - handleTradeSessionRequest(initiator, accepter, tradeSession); + initiator.setTradePartner(accepter); + handleTradeSessionRequest(packet, player, initiator, accepter, tradeSession); + Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } private void handleAbortTradeMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new AbortTradeMessage()); - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new DenyTradeMessage()); - } else{ + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradePartner().sendSelf(new AbortTradeMessage()); + player.getCreatureObject().getTradePartner().sendSelf(new DenyTradeMessage()); + } else { player.getCreatureObject().sendSelf(new AbortTradeMessage()); player.getCreatureObject().sendSelf(new DenyTradeMessage()); } } private void handleDenyTradeMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new DenyTradeMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradePartner().sendSelf(new DenyTradeMessage()); } else{ player.getCreatureObject().sendSelf(new DenyTradeMessage()); } } private void handleAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new AcceptTransactionMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradePartner().sendSelf(new AcceptTransactionMessage()); } else{ player.getCreatureObject().sendSelf(new AcceptTransactionMessage()); } } private void handleUnAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new UnAcceptTransactionMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getObjectId()){ + player.getCreatureObject().getTradePartner().sendSelf(new UnAcceptTransactionMessage()); } else{ player.getCreatureObject().sendSelf(new UnAcceptTransactionMessage()); } @@ -102,35 +103,39 @@ public class TradeService extends Service { private void handleAddItemMessage(AddItemMessage packet, Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getObjectId()){ - player.getCreatureObject().getTradeSession().addToItemList(player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()), packet.getObjectId()); - for (long objectId : player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getTradeSession().getFromAccepterList()) { + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradeSession().addToItemList(player.getCreatureObject().getTradePartner(), packet.getObjectId()); + for (long objectId : player.getCreatureObject().getTradePartner().getTradeSession().getFromAccepterList()) { player.getCreatureObject().sendSelf(new AddItemMessage(objectId)); } } else{ - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getTradeSession().addToItemList(player.getCreatureObject(), packet.getObjectId()); - for (long objectId : player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).getTradeSession().getFromInitiatorList()) { - player.getCreatureObject().getTradeSession().getTradePartner(player.getCreatureObject()).sendSelf(new AddItemMessage(objectId)); + player.getCreatureObject().getTradePartner().getTradeSession().addToItemList(player.getCreatureObject(), packet.getObjectId()); + for (long objectId : player.getCreatureObject().getTradePartner().getTradeSession().getFromInitiatorList()) { + player.getCreatureObject().getTradePartner().sendSelf(new AddItemMessage(objectId)); } } } - private void handleTradeSessionRequest(CreatureObject initiator, CreatureObject accepter, TradeSession tradeSession) { + private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter, TradeSession tradeSession) { SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); requestBox.display(accepter.getOwner()); requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { - accepter.getTradeSession().getTradePartner(initiator); - accepter.setTradeSession(tradeSession); - if(initiator.getTradeSession().getTradePartner(accepter) != null && initiator.getTradeSession().getTradePartner(accepter).equals(accepter) && accepter.getTradeSession().getTradePartner(initiator) != null && accepter.getTradeSession().getTradePartner(initiator).equals(initiator)){ + if(initiator.getTradePartner() != null && initiator.getTradePartner().equals(accepter) && accepter.getTradePartner() != null && accepter.getTradePartner().equals(initiator)){ + accepter.setTradeSession(tradeSession); + accepter.setTradePartner(initiator); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); + Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } }); requestBox.addCancelButtonCallback("handleTradeRequestDeny", (player, actor, event, paramenters)-> { - initiator.sendSelf(new DenyTradeMessage()); - accepter.sendSelf(new DenyTradeMessage()); - initiator.sendSelf(new AbortTradeMessage()); - accepter.sendSelf(new AbortTradeMessage()); + if(packetSender.getCreatureObject().getObjectId() != accepter.getObjectId()){ + initiator.sendSelf(new DenyTradeMessage()); + initiator.sendSelf(new AbortTradeMessage()); + } else { + accepter.sendSelf(new DenyTradeMessage()); + accepter.sendSelf(new AbortTradeMessage()); + } }); Log.i("Player: %s sent TradeRequest to Player %s", initiator.getOwner().getCharacterName(), accepter.getOwner().getCharacterName()); } diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 7059dc03f..14831f491 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -52,12 +52,4 @@ public class TradeSession { public CreatureObject getAccepter() { return accepter; } - - public CreatureObject getTradePartner(CreatureObject self) { - if (self.equals(initiator)) { - return accepter; - } else { - return initiator; - } - } } \ No newline at end of file From 4dd71596c2c79c7f325624247d671dfabebe4fa4 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Wed, 28 Jun 2017 20:38:27 +0200 Subject: [PATCH 04/22] Refactored TradeSession and TradeService a bit --- .../objects/creature/CreatureObject.java | 9 --- src/services/trade/TradeService.java | 64 +++++++++---------- src/services/trade/TradeSession.java | 30 +++++++-- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 9d19ad18d..8c6278e41 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -82,7 +82,6 @@ public class CreatureObject extends TangibleObject { private long statesBitmask = 0; private long lastTransform = 0; private TradeSession tradeSession = null; - private CreatureObject tradePartner = null; private SWGSet skills = new SWGSet(1, 3, StringType.ASCII); @@ -270,14 +269,6 @@ public class CreatureObject extends TangibleObject { public void setTradeSession(TradeSession tradeSession) { this.tradeSession = tradeSession; } - - public CreatureObject getTradePartner() { - return tradePartner; - } - - public void setTradePartner(CreatureObject tradePartner) { - this.tradePartner = tradePartner; - } public void setPosture(Posture posture) { this.posture = posture; diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index e394d48dc..de12f1d3a 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -39,8 +39,8 @@ public class TradeService extends Service { private void handleGalacticPacketIntent(GalacticPacketIntent gpi) { Packet packet = gpi.getPacket(); - if (gpi.getPacket() instanceof SWGPacket) - Log.d("RX Packet: %s", ((SWGPacket) gpi.getPacket()).getPacketType()); + /*if (gpi.getPacket() instanceof SWGPacket) + Log.d("RX Packet: %s", ((SWGPacket) gpi.getPacket()).getPacketType());*/ if (packet instanceof SecureTrade) { handleSecureTrade((SecureTrade) packet,gpi.getPlayer(), gpi.getObjectManager()); @@ -52,9 +52,9 @@ public class TradeService extends Service { handleAcceptTransactionMessage(gpi.getPlayer()); } else if (packet instanceof UnAcceptTransactionMessage){ handleUnAcceptTransactionMessage(gpi.getPlayer()); - } /*else if (packet instanceof AddItemMessage){ + } else if (packet instanceof AddItemMessage){ handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer()); - }*/ + } } private void handleSecureTrade(SecureTrade packet, Player player, ObjectManager objectManager) { @@ -62,32 +62,29 @@ public class TradeService extends Service { CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); TradeSession tradeSession = new TradeSession(initiator, accepter); initiator.setTradeSession(tradeSession); - initiator.setTradePartner(accepter); - handleTradeSessionRequest(packet, player, initiator, accepter, tradeSession); + initiator.getTradeSession().setTradePartner(accepter); + handleTradeSessionRequest(packet, player, initiator, accepter); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } - private void handleAbortTradeMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradePartner().sendSelf(new AbortTradeMessage()); - player.getCreatureObject().getTradePartner().sendSelf(new DenyTradeMessage()); - } else { - player.getCreatureObject().sendSelf(new AbortTradeMessage()); - player.getCreatureObject().sendSelf(new DenyTradeMessage()); - } + private void handleAbortTradeMessage(Player player) { + player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new AbortTradeMessage()); + player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new DenyTradeMessage()); + player.getCreatureObject().sendSelf(new AbortTradeMessage()); + player.getCreatureObject().sendSelf(new DenyTradeMessage()); } private void handleDenyTradeMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradePartner().sendSelf(new DenyTradeMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new DenyTradeMessage()); } else{ player.getCreatureObject().sendSelf(new DenyTradeMessage()); } } private void handleAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradePartner().sendSelf(new AcceptTransactionMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new AcceptTransactionMessage()); } else{ player.getCreatureObject().sendSelf(new AcceptTransactionMessage()); } @@ -95,34 +92,33 @@ public class TradeService extends Service { private void handleUnAcceptTransactionMessage(Player player) { if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getObjectId()){ - player.getCreatureObject().getTradePartner().sendSelf(new UnAcceptTransactionMessage()); + player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new UnAcceptTransactionMessage()); } else{ player.getCreatureObject().sendSelf(new UnAcceptTransactionMessage()); } } - private void handleAddItemMessage(AddItemMessage packet, Player player) { - - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradeSession().addToItemList(player.getCreatureObject().getTradePartner(), packet.getObjectId()); - for (long objectId : player.getCreatureObject().getTradePartner().getTradeSession().getFromAccepterList()) { - player.getCreatureObject().sendSelf(new AddItemMessage(objectId)); - } - } else{ - player.getCreatureObject().getTradePartner().getTradeSession().addToItemList(player.getCreatureObject(), packet.getObjectId()); - for (long objectId : player.getCreatureObject().getTradePartner().getTradeSession().getFromInitiatorList()) { - player.getCreatureObject().getTradePartner().sendSelf(new AddItemMessage(objectId)); + private void handleAddItemMessage(AddItemMessage packet, Player player) { + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner().getObjectId()){ + player.getCreatureObject().getTradeSession().addToAccepterList(packet.getObjectId()); + for (long objectId : player.getCreatureObject().getTradeSession().getFromAccepterList()) { + player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new AddItemMessage(objectId)); + } + } else { + player.getCreatureObject().getTradeSession().addToInitiatorList(packet.getObjectId()); + for (long objectId : player.getCreatureObject().getTradeSession().getFromInitiatorList()) { + player.getCreatureObject().sendSelf(new AddItemMessage(objectId)); } } } - private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter, TradeSession tradeSession) { + private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); requestBox.display(accepter.getOwner()); requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { - if(initiator.getTradePartner() != null && initiator.getTradePartner().equals(accepter) && accepter.getTradePartner() != null && accepter.getTradePartner().equals(initiator)){ - accepter.setTradeSession(tradeSession); - accepter.setTradePartner(initiator); + if(initiator.getTradeSession().getTradePartner() != null && initiator.getTradeSession().getTradePartner().equals(accepter)){ + accepter.setTradeSession(initiator.getTradeSession()); + accepter.getTradeSession().setTradePartner(initiator); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 14831f491..4cdf8b0eb 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -13,6 +13,8 @@ public class TradeSession { private final List accepterTradeItems; private final CreatureObject initiator; private final CreatureObject accepter; + + private CreatureObject tradePartner = null; public TradeSession(CreatureObject initiator, CreatureObject accepter) { this.initiator = initiator; @@ -21,12 +23,20 @@ public class TradeSession { this.accepterTradeItems = new ArrayList(); } - public void addToItemList(CreatureObject requester, long objectId){ - if(requester.equals(this.initiator)){ - this.initiatorTradeItems.add(objectId); - } else { - this.accepterTradeItems.add(objectId); - } + public void addToInitiatorList(long objectId){ + this.initiatorTradeItems.add(objectId); + } + + public void addToAccepterList(long objectId){ + this.accepterTradeItems.add(objectId); + } + + public void removeFromInitiatorList(long objectId){ + this.initiatorTradeItems.remove(objectId); + } + + public void removeFromAccepterList(long objectId){ + this.accepterTradeItems.remove(objectId); } public void removeFromItemList(CreatureObject requester, long objectId){ @@ -51,5 +61,13 @@ public class TradeSession { public CreatureObject getAccepter() { return accepter; + } + + public CreatureObject getTradePartner() { + return tradePartner; + } + + public void setTradePartner(CreatureObject tradePartner) { + this.tradePartner = tradePartner; } } \ No newline at end of file From 452c364f99e21c530d276cf1d3d28dfb49b8cb71 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Thu, 29 Jun 2017 19:53:10 +0200 Subject: [PATCH 05/22] Refactored TradeService and TradeSession again --- src/services/trade/TradeService.java | 60 ++++++++++++++------------- src/services/trade/TradeSession.java | 61 ++++++++++++---------------- 2 files changed, 58 insertions(+), 63 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index de12f1d3a..262f6c577 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -6,7 +6,6 @@ import com.projectswg.common.debug.Log; import intents.PlayerEventIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; -import network.packets.swg.SWGPacket; import network.packets.swg.zone.object_controller.SecureTrade; import network.packets.swg.zone.trade.AbortTradeMessage; import network.packets.swg.zone.trade.AcceptTransactionMessage; @@ -62,53 +61,57 @@ public class TradeService extends Service { CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); TradeSession tradeSession = new TradeSession(initiator, accepter); initiator.setTradeSession(tradeSession); - initiator.getTradeSession().setTradePartner(accepter); handleTradeSessionRequest(packet, player, initiator, accepter); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } private void handleAbortTradeMessage(Player player) { - player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new AbortTradeMessage()); - player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new DenyTradeMessage()); - player.getCreatureObject().sendSelf(new AbortTradeMessage()); - player.getCreatureObject().sendSelf(new DenyTradeMessage()); + player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); + player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new DenyTradeMessage()); + player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); + player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new DenyTradeMessage()); } private void handleDenyTradeMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new DenyTradeMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getAccepter().getObjectId()){ + player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new DenyTradeMessage()); } else{ - player.getCreatureObject().sendSelf(new DenyTradeMessage()); + player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new DenyTradeMessage()); } } private void handleAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new AcceptTransactionMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getAccepter().getObjectId()){ + player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new AcceptTransactionMessage()); } else{ - player.getCreatureObject().sendSelf(new AcceptTransactionMessage()); + player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new AcceptTransactionMessage()); } } private void handleUnAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getObjectId()){ - player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new UnAcceptTransactionMessage()); + if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getAccepter().getObjectId()){ + player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new UnAcceptTransactionMessage()); } else{ - player.getCreatureObject().sendSelf(new UnAcceptTransactionMessage()); + player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new UnAcceptTransactionMessage()); } } - private void handleAddItemMessage(AddItemMessage packet, Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getTradePartner().getObjectId()){ - player.getCreatureObject().getTradeSession().addToAccepterList(packet.getObjectId()); - for (long objectId : player.getCreatureObject().getTradeSession().getFromAccepterList()) { - player.getCreatureObject().getTradeSession().getTradePartner().sendSelf(new AddItemMessage(objectId)); - } - } else { - player.getCreatureObject().getTradeSession().addToInitiatorList(packet.getObjectId()); - for (long objectId : player.getCreatureObject().getTradeSession().getFromInitiatorList()) { - player.getCreatureObject().sendSelf(new AddItemMessage(objectId)); - } + private void handleAddItemMessage(AddItemMessage packet, Player player) { + CreatureObject creature = player.getCreatureObject(); + if (creature.getTradeSession() == null) { + Log.w("Invalid Tradesession"); + return; + } + + CreatureObject partner = creature.getTradeSession().getTradePartner(creature); + if (partner == null) { + Log.w("Invalid trading session ...."); + return; + } + + creature.getTradeSession().addItem(creature, packet.getObjectId()); + for (long objectId : creature.getTradeSession().getFromItemList(creature)) { + partner.getOwner().sendPacket(new AddItemMessage(objectId)); } } @@ -116,9 +119,8 @@ public class TradeService extends Service { SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); requestBox.display(accepter.getOwner()); requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { - if(initiator.getTradeSession().getTradePartner() != null && initiator.getTradeSession().getTradePartner().equals(accepter)){ - accepter.setTradeSession(initiator.getTradeSession()); - accepter.getTradeSession().setTradePartner(initiator); + if(initiator.getTradeSession().getInitiator() != null){ + accepter.setTradeSession(initiator.getTradeSession()); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 4cdf8b0eb..29e6a873e 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -4,7 +4,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import resources.objects.SWGObject; +import com.projectswg.common.debug.Log; + import resources.objects.creature.CreatureObject; public class TradeSession { @@ -14,45 +15,35 @@ public class TradeSession { private final CreatureObject initiator; private final CreatureObject accepter; - private CreatureObject tradePartner = null; - - public TradeSession(CreatureObject initiator, CreatureObject accepter) { + public TradeSession(CreatureObject initiator, CreatureObject accepter) { this.initiator = initiator; this.accepter = accepter; this.initiatorTradeItems = new ArrayList(); this.accepterTradeItems = new ArrayList(); } - public void addToInitiatorList(long objectId){ - this.initiatorTradeItems.add(objectId); - } - - public void addToAccepterList(long objectId){ - this.accepterTradeItems.add(objectId); - } - - public void removeFromInitiatorList(long objectId){ - this.initiatorTradeItems.remove(objectId); - } - - public void removeFromAccepterList(long objectId){ - this.accepterTradeItems.remove(objectId); - } - - public void removeFromItemList(CreatureObject requester, long objectId){ - if(requester.equals(this.initiator)){ + public void removeFromItemList(CreatureObject requester, long objectId) { + if (requester.equals(this.initiator)) { this.initiatorTradeItems.remove(objectId); } else { this.accepterTradeItems.remove(objectId); } } - - public List getFromInitiatorList(){ - return Collections.unmodifiableList(initiatorTradeItems); + + public CreatureObject getTradePartner(CreatureObject self) { + if (self.equals(initiator)) { + return accepter; + } else { + return initiator; + } } - - public List getFromAccepterList(){ - return Collections.unmodifiableList(accepterTradeItems); + + public List getFromItemList(CreatureObject creature) { + if(this.initiator == creature){ + return Collections.unmodifiableList(initiatorTradeItems); + } else { + return Collections.unmodifiableList(accepterTradeItems); + } } public CreatureObject getInitiator() { @@ -63,11 +54,13 @@ public class TradeSession { return accepter; } - public CreatureObject getTradePartner() { - return tradePartner; + public void addItem(CreatureObject self, long itemId) { + if (this.initiator == self) { + initiatorTradeItems.add(itemId); + } else if (this.accepter == self) { + accepterTradeItems.add(itemId); + } else { + Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); + } } - - public void setTradePartner(CreatureObject tradePartner) { - this.tradePartner = tradePartner; - } } \ No newline at end of file From daed790e4dcca0572ca0d4ede1f95bbee6cd9a37 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 30 Jun 2017 20:02:08 +0200 Subject: [PATCH 06/22] Changed TradeService, TradeSessions and some Packets --- .../zone/object_controller/SecureTrade.java | 2 +- .../swg/zone/trade/AddItemMessage.java | 3 +- .../swg/zone/trade/GiveMoneyMessage.java | 4 ++ src/services/trade/TradeService.java | 65 ++++++++++++++----- src/services/trade/TradeSession.java | 33 ++++++---- 5 files changed, 75 insertions(+), 32 deletions(-) diff --git a/src/network/packets/swg/zone/object_controller/SecureTrade.java b/src/network/packets/swg/zone/object_controller/SecureTrade.java index 7a0e0f484..03e2ea267 100644 --- a/src/network/packets/swg/zone/object_controller/SecureTrade.java +++ b/src/network/packets/swg/zone/object_controller/SecureTrade.java @@ -48,7 +48,7 @@ public class SecureTrade extends ObjectController { public void setType(TradeMessageType type) { this.type = type; } - + public long getStarterId() { return starterId; } diff --git a/src/network/packets/swg/zone/trade/AddItemMessage.java b/src/network/packets/swg/zone/trade/AddItemMessage.java index 1896f7dc9..abc6bbb94 100644 --- a/src/network/packets/swg/zone/trade/AddItemMessage.java +++ b/src/network/packets/swg/zone/trade/AddItemMessage.java @@ -38,11 +38,12 @@ public class AddItemMessage extends SWGPacket{ private long objectId; public AddItemMessage(long objectId) { + super(); this.objectId = objectId; } public AddItemMessage() { - this.objectId = 0; + super(); } @Override diff --git a/src/network/packets/swg/zone/trade/GiveMoneyMessage.java b/src/network/packets/swg/zone/trade/GiveMoneyMessage.java index a8ef9702b..feddf2a53 100644 --- a/src/network/packets/swg/zone/trade/GiveMoneyMessage.java +++ b/src/network/packets/swg/zone/trade/GiveMoneyMessage.java @@ -41,6 +41,10 @@ public class GiveMoneyMessage extends SWGPacket{ super(); this.moneyAmount = moneyAmount; } + + public GiveMoneyMessage() { + super(); + } @Override public void decode(NetBuffer data) { diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 262f6c577..ad997f49c 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -12,6 +12,7 @@ import network.packets.swg.zone.trade.AcceptTransactionMessage; import network.packets.swg.zone.trade.AddItemMessage; import network.packets.swg.zone.trade.BeginTradeMessage; import network.packets.swg.zone.trade.DenyTradeMessage; +import network.packets.swg.zone.trade.GiveMoneyMessage; import network.packets.swg.zone.trade.UnAcceptTransactionMessage; import resources.objects.creature.CreatureObject; import resources.player.Player; @@ -29,8 +30,20 @@ public class TradeService extends Service { private void handlePlayerEventIntent(PlayerEventIntent pei) { switch (pei.getEvent()) { case PE_LOGGED_OUT: + if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ + pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().setTradeSession(null); + pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().setTradeSession(null); + } break; case PE_FIRST_ZONE: + if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ + pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().setTradeSession(null); + pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().setTradeSession(null); + } default: break; } @@ -53,6 +66,8 @@ public class TradeService extends Service { handleUnAcceptTransactionMessage(gpi.getPlayer()); } else if (packet instanceof AddItemMessage){ handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer()); + } else if (packet instanceof GiveMoneyMessage){ + handleGiveMoneyMessage((GiveMoneyMessage) packet, gpi.getPlayer()); } } @@ -66,33 +81,41 @@ public class TradeService extends Service { } private void handleAbortTradeMessage(Player player) { - player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); - player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new DenyTradeMessage()); - player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); - player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new DenyTradeMessage()); + TradeSession session = player.getCreatureObject().getTradeSession(); + + if(session == null) + return; + + session.getAccepter().sendSelf(new AbortTradeMessage()); + session.getAccepter().sendSelf(new DenyTradeMessage()); + session.getInitiator().sendSelf(new AbortTradeMessage()); + session.getInitiator().sendSelf(new DenyTradeMessage()); } private void handleDenyTradeMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getAccepter().getObjectId()){ - player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new DenyTradeMessage()); + TradeSession session = player.getCreatureObject().getTradeSession(); + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new DenyTradeMessage()); } else{ - player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new DenyTradeMessage()); + session.getInitiator().sendSelf(new DenyTradeMessage()); } } private void handleAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getAccepter().getObjectId()){ - player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new AcceptTransactionMessage()); + TradeSession session = player.getCreatureObject().getTradeSession(); + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new AcceptTransactionMessage()); } else{ - player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new AcceptTransactionMessage()); + session.getInitiator().sendSelf(new AcceptTransactionMessage()); } } private void handleUnAcceptTransactionMessage(Player player) { - if(player.getCreatureObject().getObjectId() != player.getCreatureObject().getTradeSession().getAccepter().getObjectId()){ - player.getCreatureObject().getTradeSession().getAccepter().sendSelf(new UnAcceptTransactionMessage()); + TradeSession session = player.getCreatureObject().getTradeSession(); + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new UnAcceptTransactionMessage()); } else{ - player.getCreatureObject().getTradeSession().getInitiator().sendSelf(new UnAcceptTransactionMessage()); + session.getInitiator().sendSelf(new UnAcceptTransactionMessage()); } } @@ -115,12 +138,22 @@ public class TradeService extends Service { } } + private void handleGiveMoneyMessage(GiveMoneyMessage packet, Player player) { + TradeSession session = player.getCreatureObject().getTradeSession(); + + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new GiveMoneyMessage(packet.getMoneyAmount())); + } else { + session.getInitiator().sendSelf(new GiveMoneyMessage(packet.getMoneyAmount())); + } + } + private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); requestBox.display(accepter.getOwner()); requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { - if(initiator.getTradeSession().getInitiator() != null){ - accepter.setTradeSession(initiator.getTradeSession()); + if(initiator.getTradeSession() != null && initiator.getTradeSession().getInitiator() != null){ + accepter.setTradeSession(initiator.getTradeSession()); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); @@ -133,7 +166,7 @@ public class TradeService extends Service { } else { accepter.sendSelf(new DenyTradeMessage()); accepter.sendSelf(new AbortTradeMessage()); - } + } }); Log.i("Player: %s sent TradeRequest to Player %s", initiator.getOwner().getCharacterName(), accepter.getOwner().getCharacterName()); } diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 29e6a873e..526408cd3 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -23,7 +23,7 @@ public class TradeSession { } public void removeFromItemList(CreatureObject requester, long objectId) { - if (requester.equals(this.initiator)) { + if (requester.equals(this.accepter)) { this.initiatorTradeItems.remove(objectId); } else { this.accepterTradeItems.remove(objectId); @@ -31,34 +31,39 @@ public class TradeSession { } public CreatureObject getTradePartner(CreatureObject self) { - if (self.equals(initiator)) { - return accepter; + if (self.equals(this.accepter)) { + return this.accepter; + } else if(self.equals(this.initiator)) { + return this.initiator; } else { - return initiator; - } + Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); + return self; + } } public List getFromItemList(CreatureObject creature) { - if(this.initiator == creature){ - return Collections.unmodifiableList(initiatorTradeItems); + if(creature.equals(this.accepter)){ + return Collections.unmodifiableList(this.initiatorTradeItems); } else { - return Collections.unmodifiableList(accepterTradeItems); + return Collections.unmodifiableList(this.accepterTradeItems); } } public CreatureObject getInitiator() { - return initiator; + return this.initiator; } public CreatureObject getAccepter() { - return accepter; + return this.accepter; } public void addItem(CreatureObject self, long itemId) { - if (this.initiator == self) { - initiatorTradeItems.add(itemId); - } else if (this.accepter == self) { - accepterTradeItems.add(itemId); + if (self.equals(this.initiator)) { + this.initiatorTradeItems.add(itemId); + System.out.println("Item added to Initiatorlist"); + } else if (self.equals(this.accepter)) { + this.accepterTradeItems.add(itemId); + System.out.println("Item added to Accepterlist"); } else { Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); } From a22ed6063dcf7a20b1818edeacf41eaedde7192a Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Sat, 1 Jul 2017 15:57:41 +0200 Subject: [PATCH 07/22] Added handling for remaining Packets --- src/services/trade/TradeService.java | 49 ++++++++++++++++++++++++++-- src/services/trade/TradeSession.java | 12 ++++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index ad997f49c..1cd13efde 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -6,14 +6,19 @@ import com.projectswg.common.debug.Log; import intents.PlayerEventIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; +import network.packets.swg.SWGPacket; import network.packets.swg.zone.object_controller.SecureTrade; +import network.packets.swg.zone.object_controller.SecureTrade.TradeMessageType; import network.packets.swg.zone.trade.AbortTradeMessage; import network.packets.swg.zone.trade.AcceptTransactionMessage; import network.packets.swg.zone.trade.AddItemMessage; import network.packets.swg.zone.trade.BeginTradeMessage; +import network.packets.swg.zone.trade.BeginVerificationMessage; import network.packets.swg.zone.trade.DenyTradeMessage; import network.packets.swg.zone.trade.GiveMoneyMessage; +import network.packets.swg.zone.trade.TradeCompleteMessage; import network.packets.swg.zone.trade.UnAcceptTransactionMessage; +import network.packets.swg.zone.trade.VerifyTradeMessage; import resources.objects.creature.CreatureObject; import resources.player.Player; import resources.sui.SuiButtons; @@ -51,8 +56,11 @@ public class TradeService extends Service { private void handleGalacticPacketIntent(GalacticPacketIntent gpi) { Packet packet = gpi.getPacket(); - /*if (gpi.getPacket() instanceof SWGPacket) - Log.d("RX Packet: %s", ((SWGPacket) gpi.getPacket()).getPacketType());*/ + if (packet instanceof SWGPacket){ + if((packet instanceof SecureTrade) || (packet instanceof AbortTradeMessage) || (packet instanceof DenyTradeMessage) || (packet instanceof AcceptTransactionMessage) || (packet instanceof UnAcceptTransactionMessage) + || (packet instanceof AddItemMessage) || (packet instanceof GiveMoneyMessage)) + Log.d("RX Packet: %s, Packet Name: %s", ((SWGPacket) gpi.getPacket()).getPacketType(), gpi.getPacket().toString()); + } if (packet instanceof SecureTrade) { handleSecureTrade((SecureTrade) packet,gpi.getPlayer(), gpi.getObjectManager()); @@ -68,6 +76,12 @@ public class TradeService extends Service { handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer()); } else if (packet instanceof GiveMoneyMessage){ handleGiveMoneyMessage((GiveMoneyMessage) packet, gpi.getPlayer()); + } else if (packet instanceof BeginVerificationMessage){ + handleBeginVerificationMessage(gpi.getPlayer()); + } else if (packet instanceof VerifyTradeMessage){ + handleVerifyTradeMessage(gpi.getPlayer()); + } else if (packet instanceof TradeCompleteMessage){ + handleTradeCompleteMessage(gpi.getPlayer()); } } @@ -148,12 +162,43 @@ public class TradeService extends Service { } } + private void handleVerifyTradeMessage(Player player) { + TradeSession session = player.getCreatureObject().getTradeSession(); + + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new VerifyTradeMessage()); + } else { + session.getInitiator().sendSelf(new VerifyTradeMessage()); + } + } + + private void handleTradeCompleteMessage(Player player) { + TradeSession session = player.getCreatureObject().getTradeSession(); + + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new TradeCompleteMessage()); + } else { + session.getInitiator().sendSelf(new TradeCompleteMessage()); + } + } + + private void handleBeginVerificationMessage(Player player) { + TradeSession session = player.getCreatureObject().getTradeSession(); + + if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ + session.getAccepter().sendSelf(new BeginVerificationMessage()); + } else { + session.getInitiator().sendSelf(new BeginVerificationMessage()); + } + } + private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); requestBox.display(accepter.getOwner()); requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { if(initiator.getTradeSession() != null && initiator.getTradeSession().getInitiator() != null){ accepter.setTradeSession(initiator.getTradeSession()); + accepter.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE_REVERSED, initiator.getObjectId(), accepter.getObjectId())); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 526408cd3..499fa22bf 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -39,8 +39,18 @@ public class TradeSession { Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); return self; } + } + + public List addToInitiatorList(long objectId){ + this.initiatorTradeItems.add(objectId); + return this.initiatorTradeItems; } - + + public List addToAccepterList(long objectId){ + this.accepterTradeItems.add(objectId); + return this.accepterTradeItems; + } + public List getFromItemList(CreatureObject creature) { if(creature.equals(this.accepter)){ return Collections.unmodifiableList(this.initiatorTradeItems); From cd9e86bfad3220f757024ffc57486a3fcac0e175 Mon Sep 17 00:00:00 2001 From: Undercova PSWG Date: Fri, 7 Jul 2017 16:45:58 +0000 Subject: [PATCH 08/22] Set entertainer flourish XP back to normal --- src/services/commands/EntertainmentService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/commands/EntertainmentService.java b/src/services/commands/EntertainmentService.java index 12fc47830..8f9137144 100644 --- a/src/services/commands/EntertainmentService.java +++ b/src/services/commands/EntertainmentService.java @@ -454,7 +454,7 @@ public class EntertainmentService extends Service { PerformanceData performanceData = performanceMap.get(performanceName); int flourishXpMod = performanceData.getFlourishXpMod(); int performanceCounter = performer.getPerformanceCounter(); - int xpGained = (int) (performanceCounter * (flourishXpMod * 3.8)); + int xpGained = (int) (performanceCounter * flourishXpMod); if(xpGained > 0) { new ExperienceIntent(performer, "entertainer", xpGained).broadcast(); From 19289fedaf0e18e0543cb2bb9af90b53a24380f9 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Sun, 9 Jul 2017 19:36:08 +0200 Subject: [PATCH 09/22] Refactored TradeService again Added Moneyhandling to TradeSession Added sendToPartner function to TradeSession Added StarterMoney to Charcreation --- .../swg/zone/trade/AddItemMessage.java | 2 - .../player/creation/CharacterCreation.java | 5 +- src/services/trade/TradeService.java | 186 ++++++++++++------ src/services/trade/TradeSession.java | 35 ++++ 4 files changed, 161 insertions(+), 67 deletions(-) diff --git a/src/network/packets/swg/zone/trade/AddItemMessage.java b/src/network/packets/swg/zone/trade/AddItemMessage.java index abc6bbb94..7a1885692 100644 --- a/src/network/packets/swg/zone/trade/AddItemMessage.java +++ b/src/network/packets/swg/zone/trade/AddItemMessage.java @@ -38,12 +38,10 @@ public class AddItemMessage extends SWGPacket{ private long objectId; public AddItemMessage(long objectId) { - super(); this.objectId = objectId; } public AddItemMessage() { - super(); } @Override diff --git a/src/services/player/creation/CharacterCreation.java b/src/services/player/creation/CharacterCreation.java index ee24d0524..10a3a7807 100644 --- a/src/services/player/creation/CharacterCreation.java +++ b/src/services/player/creation/CharacterCreation.java @@ -77,7 +77,6 @@ public class CharacterCreation { setPlayerObjectValues(playerObj); createHair(creatureObj, create.getHair(), create.getHairCustomization()); createStarterClothing(creatureObj, create.getRace()); - playerObj.setAdminTag(accessLevel); new ObjectCreatedIntent(creatureObj).broadcast(); return creatureObj; @@ -151,6 +150,8 @@ public class CharacterCreation { creatureObj.setObjectName(create.getName()); creatureObj.setPvpFlags(PvpFlag.PLAYER); creatureObj.setVolume(0x000F4240); + creatureObj.setBankBalance(1000); + creatureObj.setCashBalance(100); new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, create.getStartingPhase(), creatureObj, true).broadcast(); new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, "species_" + creatureObj.getRace().getSpecies(), creatureObj, true).broadcast(); @@ -161,7 +162,7 @@ public class CharacterCreation { defWeapon.setMinDamage(50); defWeapon.setMaxDamage(100); creatureObj.setEquippedWeapon(defWeapon); - createInventoryObject(creatureObj, "object/tangible/inventory/shared_character_inventory.iff"); + createDefaultObject(creatureObj, "object/tangible/inventory/shared_character_inventory.iff"); createInventoryObject(creatureObj, "object/tangible/datapad/shared_character_datapad.iff"); createInventoryObject(creatureObj, "object/tangible/inventory/shared_appearance_inventory.iff"); createInventoryObject(creatureObj, "object/tangible/bank/shared_character_bank.iff"); diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 1cd13efde..87c8bc946 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -1,9 +1,13 @@ package services.trade; +import java.util.ArrayList; +import java.util.List; + import com.projectswg.common.control.Service; import com.projectswg.common.debug.Log; import intents.PlayerEventIntent; +import intents.chat.ChatBroadcastIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; import network.packets.swg.SWGPacket; @@ -16,10 +20,15 @@ import network.packets.swg.zone.trade.BeginTradeMessage; import network.packets.swg.zone.trade.BeginVerificationMessage; import network.packets.swg.zone.trade.DenyTradeMessage; import network.packets.swg.zone.trade.GiveMoneyMessage; +import network.packets.swg.zone.trade.RemoveItemMessage; import network.packets.swg.zone.trade.TradeCompleteMessage; import network.packets.swg.zone.trade.UnAcceptTransactionMessage; import network.packets.swg.zone.trade.VerifyTradeMessage; +import resources.Posture; +import resources.containers.ContainerPermissionsType; +import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; +import resources.objects.custom.AIObject; import resources.player.Player; import resources.sui.SuiButtons; import resources.sui.SuiMessageBox; @@ -27,28 +36,41 @@ import services.objects.ObjectManager; public class TradeService extends Service { + private List tradeInitiators; + private List tradeAccepters; + private List tradeSessions; + public TradeService() { + tradeInitiators = new ArrayList(); + tradeAccepters = new ArrayList(); + tradeSessions = new ArrayList(); + registerForIntent(GalacticPacketIntent.class, gpi -> handleGalacticPacketIntent(gpi)); registerForIntent(PlayerEventIntent.class, pei -> handlePlayerEventIntent(pei)); } private void handlePlayerEventIntent(PlayerEventIntent pei) { switch (pei.getEvent()) { - case PE_LOGGED_OUT: + case PE_FIRST_ZONE: if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new TradeCompleteMessage()); pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new TradeCompleteMessage()); pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().setTradeSession(null); pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().setTradeSession(null); } break; - case PE_FIRST_ZONE: + case PE_LOGGED_OUT: if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new TradeCompleteMessage()); pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); + pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new TradeCompleteMessage()); pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().setTradeSession(null); pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().setTradeSession(null); } + break; default: break; } @@ -57,9 +79,7 @@ public class TradeService extends Service { private void handleGalacticPacketIntent(GalacticPacketIntent gpi) { Packet packet = gpi.getPacket(); if (packet instanceof SWGPacket){ - if((packet instanceof SecureTrade) || (packet instanceof AbortTradeMessage) || (packet instanceof DenyTradeMessage) || (packet instanceof AcceptTransactionMessage) || (packet instanceof UnAcceptTransactionMessage) - || (packet instanceof AddItemMessage) || (packet instanceof GiveMoneyMessage)) - Log.d("RX Packet: %s, Packet Name: %s", ((SWGPacket) gpi.getPacket()).getPacketType(), gpi.getPacket().toString()); + Log.d("RX Packet: %s, Packet Name: %s", ((SWGPacket) gpi.getPacket()).getPacketType(), gpi.getPacket().toString()); } if (packet instanceof SecureTrade) { @@ -73,7 +93,7 @@ public class TradeService extends Service { } else if (packet instanceof UnAcceptTransactionMessage){ handleUnAcceptTransactionMessage(gpi.getPlayer()); } else if (packet instanceof AddItemMessage){ - handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer()); + handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer(), gpi.getObjectManager()); } else if (packet instanceof GiveMoneyMessage){ handleGiveMoneyMessage((GiveMoneyMessage) packet, gpi.getPlayer()); } else if (packet instanceof BeginVerificationMessage){ @@ -88,53 +108,84 @@ public class TradeService extends Service { private void handleSecureTrade(SecureTrade packet, Player player, ObjectManager objectManager) { CreatureObject initiator = player.getCreatureObject(); CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); + + if(accepter.getTradeSession() != null){ + sendSystemMessage(initiator.getOwner(), "request_player_busy_no_obj"); + return; + } + + if(accepter.isInCombat()){ + return; + } + + if(initiator.isInCombat()){ + return; + } + + if(accepter instanceof AIObject){ + sendSystemMessage(initiator.getOwner(), "start_fail_target_not_player"); + return; + } + + if(initiator.getPosture() == Posture.INCAPACITATED){ + sendSystemMessage(initiator.getOwner(), "player_incapacitated"); + return; + } + + if(initiator.getPosture() == Posture.DEAD){ + sendSystemMessage(initiator.getOwner(), "player_dead"); + return; + } + + if(accepter.getPosture() == Posture.INCAPACITATED){ + sendSystemMessage(initiator.getOwner(), "target_incapacitated"); + return; + } + + if(accepter.getPosture() == Posture.DEAD){ + sendSystemMessage(initiator.getOwner(), "target_dead"); + return; + } + TradeSession tradeSession = new TradeSession(initiator, accepter); initiator.setTradeSession(tradeSession); + tradeSessions.add(tradeSession); + tradeInitiators.add(initiator); handleTradeSessionRequest(packet, player, initiator, accepter); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } private void handleAbortTradeMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); - if(session == null) + if(tradeSession == null) return; - session.getAccepter().sendSelf(new AbortTradeMessage()); - session.getAccepter().sendSelf(new DenyTradeMessage()); - session.getInitiator().sendSelf(new AbortTradeMessage()); - session.getInitiator().sendSelf(new DenyTradeMessage()); + tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); + tradeSession.getAccepter().sendSelf(new DenyTradeMessage()); + tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); + tradeSession.getInitiator().sendSelf(new DenyTradeMessage()); } private void handleDenyTradeMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new DenyTradeMessage()); - } else{ - session.getInitiator().sendSelf(new DenyTradeMessage()); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new DenyTradeMessage()); } private void handleAcceptTransactionMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new AcceptTransactionMessage()); - } else{ - session.getInitiator().sendSelf(new AcceptTransactionMessage()); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new AcceptTransactionMessage()); } private void handleUnAcceptTransactionMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new UnAcceptTransactionMessage()); - } else{ - session.getInitiator().sendSelf(new UnAcceptTransactionMessage()); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new UnAcceptTransactionMessage()); } - private void handleAddItemMessage(AddItemMessage packet, Player player) { + private void handleAddItemMessage(AddItemMessage packet, Player player, ObjectManager objectManager) { CreatureObject creature = player.getCreatureObject(); + TradeSession tradeSession = creature.getTradeSession(); + SWGObject tradeObject = objectManager.getObjectById(packet.getObjectId()); if (creature.getTradeSession() == null) { Log.w("Invalid Tradesession"); return; @@ -146,50 +197,37 @@ public class TradeService extends Service { return; } - creature.getTradeSession().addItem(creature, packet.getObjectId()); - for (long objectId : creature.getTradeSession().getFromItemList(creature)) { - partner.getOwner().sendPacket(new AddItemMessage(objectId)); + if(tradeObject.hasAttribute("no_trade")){ + sendSystemMessage(player, "add_item_failed_prose"); + tradeSession.sendToPartner(creature, new RemoveItemMessage(packet.getObjectId())); + tradeSession.removeFromItemList(creature, packet.getObjectId()); } + + creature.getTradeSession().addItem(creature, packet.getObjectId()); + tradeSession.sendToPartner(partner, new AddItemMessage(packet.getObjectId())); + partner.setContainerPermissions(ContainerPermissionsType.INVENTORY); + partner.addCustomAware(tradeObject); } private void handleGiveMoneyMessage(GiveMoneyMessage packet, Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new GiveMoneyMessage(packet.getMoneyAmount())); - } else { - session.getInitiator().sendSelf(new GiveMoneyMessage(packet.getMoneyAmount())); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.setMoneyAmount(player.getCreatureObject(), packet.getMoneyAmount()); + tradeSession.sendToPartner(player.getCreatureObject(), new GiveMoneyMessage(packet.getMoneyAmount())); } private void handleVerifyTradeMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new VerifyTradeMessage()); - } else { - session.getInitiator().sendSelf(new VerifyTradeMessage()); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new VerifyTradeMessage()); } private void handleTradeCompleteMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new TradeCompleteMessage()); - } else { - session.getInitiator().sendSelf(new TradeCompleteMessage()); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new TradeCompleteMessage()); } private void handleBeginVerificationMessage(Player player) { - TradeSession session = player.getCreatureObject().getTradeSession(); - - if(player.getCreatureObject().getObjectId() != session.getAccepter().getObjectId()){ - session.getAccepter().sendSelf(new BeginVerificationMessage()); - } else { - session.getInitiator().sendSelf(new BeginVerificationMessage()); - } + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new BeginVerificationMessage()); } private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { @@ -198,7 +236,9 @@ public class TradeService extends Service { requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { if(initiator.getTradeSession() != null && initiator.getTradeSession().getInitiator() != null){ accepter.setTradeSession(initiator.getTradeSession()); - accepter.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE_REVERSED, initiator.getObjectId(), accepter.getObjectId())); + tradeAccepters.add(accepter); + accepter.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); + initiator.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); @@ -214,5 +254,25 @@ public class TradeService extends Service { } }); Log.i("Player: %s sent TradeRequest to Player %s", initiator.getOwner().getCharacterName(), accepter.getOwner().getCharacterName()); + } + + private void sendSystemMessage(Player player, String str) { + new ChatBroadcastIntent(player, "@ui_trade:" + str).broadcast(); + } + + @Override + public boolean terminate() { + for (CreatureObject tradeAccepter : tradeAccepters) { + tradeAccepter.sendSelf(new AbortTradeMessage()); + tradeAccepter.sendSelf(new TradeCompleteMessage()); + tradeAccepter.setTradeSession(null); + } + for (CreatureObject tradeInitiator : tradeInitiators) { + tradeInitiator.sendSelf(new AbortTradeMessage()); + tradeInitiator.sendSelf(new TradeCompleteMessage()); + tradeInitiator.setTradeSession(null); + } + System.out.println("terminatetest"); + return super.terminate(); } } \ No newline at end of file diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 499fa22bf..1c2129928 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -3,9 +3,12 @@ package services.trade; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import com.projectswg.common.debug.Log; +import network.packets.swg.SWGPacket; +import network.packets.swg.zone.trade.AddItemMessage; import resources.objects.creature.CreatureObject; public class TradeSession { @@ -14,8 +17,12 @@ public class TradeSession { private final List accepterTradeItems; private final CreatureObject initiator; private final CreatureObject accepter; + private final AtomicInteger moneyAmountInitiator; + private final AtomicInteger moneyAmountAccepter; public TradeSession(CreatureObject initiator, CreatureObject accepter) { + this.moneyAmountInitiator = new AtomicInteger(); + this.moneyAmountAccepter = new AtomicInteger(); this.initiator = initiator; this.accepter = accepter; this.initiatorTradeItems = new ArrayList(); @@ -78,4 +85,32 @@ public class TradeSession { Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); } } + + public void sendToPartner(CreatureObject creature, SWGPacket packet) { + TradeSession tradeSession = creature.getTradeSession(); + if(creature.getObjectId() != tradeSession.getAccepter().getObjectId()){ + tradeSession.getAccepter().getOwner().sendPacket(packet); + } else { + tradeSession.getInitiator().getOwner().sendPacket(packet); + } + } + + public void setMoneyAmount(CreatureObject creature, int amount){ + if(creature.equals(this.initiator)){ + this.moneyAmountInitiator.set(amount); + } else if (creature.equals(this.initiator)){ + this.moneyAmountAccepter.set(amount); + } + } + + public AtomicInteger getMoneyAmount(CreatureObject creature) { + if(creature.equals(this.initiator)){ + return this.moneyAmountInitiator; + } else if (creature.equals(this.initiator)){ + return this.moneyAmountAccepter; + } + return this.moneyAmountAccepter; + } + + } \ No newline at end of file From ec603228e7779eb3462e8c6c60b5e1a6e346e2bd Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Sun, 9 Jul 2017 19:37:31 +0200 Subject: [PATCH 10/22] Added Tradepermission to inventoryPermission --- .../containers/InventoryPermissions.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/resources/containers/InventoryPermissions.java b/src/resources/containers/InventoryPermissions.java index 743a6cf13..0a2f2eb62 100644 --- a/src/resources/containers/InventoryPermissions.java +++ b/src/resources/containers/InventoryPermissions.java @@ -28,6 +28,8 @@ package resources.containers; import resources.objects.SWGObject; +import resources.objects.creature.CreatureObject; +import services.trade.TradeSession; class InventoryPermissions extends DefaultPermissions { @@ -37,7 +39,9 @@ class InventoryPermissions extends DefaultPermissions { return true; if (container.getOwner() == null) return false; - return requester.getOwner().equals(container.getOwner()); + if (!requester.getOwner().equals(container.getOwner())) + return false; + return canTradePartnerView(requester, container); } @Override @@ -48,4 +52,16 @@ class InventoryPermissions extends DefaultPermissions { return false; return requester.getOwner().equals(container.getOwner()); } -} + + private boolean canTradePartnerView(SWGObject requester, SWGObject container) { + CreatureObject creature = container.getOwner().getCreatureObject(); + if (creature == null) + return false; + TradeSession session = creature.getTradeSession(); + if (session == null || !session.getFromItemList(creature).contains(container.getObjectId())) + return false; + CreatureObject partner = session.getTradePartner(creature); + return partner != null && partner.equals(requester.getOwner()); + } + +} \ No newline at end of file From cafbb3d673eb3425ac8a7c5027a814026f1e8986 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 9 Jul 2017 20:56:29 -0500 Subject: [PATCH 11/22] Fixed QaTool recover --- .../commands/callbacks/QaToolCmdCallback.java | 17 ++++++++++------ src/services/player/LoginService.java | 20 +++++++++++++++++++ src/services/player/PlayerManager.java | 6 ++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/resources/commands/callbacks/QaToolCmdCallback.java b/src/resources/commands/callbacks/QaToolCmdCallback.java index 951efffb1..6914779ce 100644 --- a/src/resources/commands/callbacks/QaToolCmdCallback.java +++ b/src/resources/commands/callbacks/QaToolCmdCallback.java @@ -27,9 +27,12 @@ package resources.commands.callbacks; +import java.util.Map; + import com.projectswg.common.data.location.Location; import com.projectswg.common.data.location.Terrain; import com.projectswg.common.debug.Log; + import groovy.util.ResourceException; import groovy.util.ScriptException; import intents.chat.ChatBroadcastIntent; @@ -58,8 +61,6 @@ import services.objects.StaticItemService.ObjectCreationHandler; import services.player.PlayerManager; import utilities.Scripts; -import java.util.Map; - /** * Created by Waverunner on 8/19/2015 */ @@ -185,15 +186,19 @@ public class QaToolCmdCallback implements ICmdCallback { inputBox.display(player); } - private void recoverPlayer(ObjectManager objManager, PlayerManager playerManager, Player player, String args) { + private void recoverPlayer(ObjectManager objectManager, PlayerManager playerManager, Player player, String args) { args = args.trim(); - Player recoveree = playerManager.getPlayerByCreatureFirstName(args); - if (recoveree == null) { + long recoveree = playerManager.getCharacterIdByFirstName(args); + if (recoveree == 0) { sendSystemMessage(player, "Could not find player by first name: '" + args + "'"); return; } - CreatureObject obj = recoveree.getCreatureObject(); + SWGObject obj = objectManager.getObjectById(recoveree); + if (!(obj instanceof CreatureObject)) { + sendSystemMessage(player, "Object is not a creature: '" + args + "'"); + return; + } Location loc = new Location(3525, 4, -4807, Terrain.TATOOINE); new ObjectTeleportIntent(obj, loc).broadcast(); sendSystemMessage(player, "Sucessfully teleported " + obj.getObjectName() + " to " + loc.getPosition()); diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index dccdf42ba..a8722a452 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -83,6 +83,7 @@ public class LoginService extends Service { private RelationalDatabase database; private PreparedStatement getUser; private PreparedStatement getCharacter; + private PreparedStatement getCharacterFirstName; private PreparedStatement getCharacters; private PreparedStatement deleteCharacter; @@ -96,6 +97,7 @@ public class LoginService extends Service { database = RelationalServerFactory.getServerDatabase("login/login.db"); getUser = database.prepareStatement("SELECT * FROM users WHERE LOWER(username) = LOWER(?)"); getCharacter = database.prepareStatement("SELECT id FROM players WHERE LOWER(name) = ?"); + getCharacterFirstName = database.prepareStatement("SELECT id FROM players WHERE LOWER(name) = ? OR LOWER(name) LIKE ?"); getCharacters = database.prepareStatement("SELECT * FROM players WHERE userid = ?"); deleteCharacter = database.prepareStatement("DELETE FROM players WHERE id = ?"); return super.initialize(); @@ -107,6 +109,24 @@ public class LoginService extends Service { return super.terminate(); } + public long getCharacterIdByFirstName(String name) { + Assert.notNull(name); + name = name.trim().toLowerCase(Locale.US); + Assert.test(!name.isEmpty()); + synchronized (getCharacterFirstName) { + try { + getCharacterFirstName.setString(1, name + "%"); + try (ResultSet set = getCharacterFirstName.executeQuery()) { + if (set.next()) + return set.getLong("id"); + } + } catch (SQLException e) { + Log.e(e); + } + } + return 0; + } + public long getCharacterId(String name) { Assert.notNull(name); name = name.trim().toLowerCase(Locale.US); diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 9f8790388..9d96774ee 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -102,6 +102,12 @@ public class PlayerManager extends Manager { return null; } + public long getCharacterIdByFirstName(String name) { + Assert.notNull(name); + Assert.test(!name.trim().isEmpty()); + return loginService.getCharacterIdByFirstName(name); + } + public long getCharacterIdByName(String name) { Assert.notNull(name); Assert.test(!name.trim().isEmpty()); From 3a51476903207fcee58f2cca375787a457d63a9c Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Mon, 10 Jul 2017 21:14:58 +0200 Subject: [PATCH 12/22] Added Itemtransfer --- src/services/trade/TradeService.java | 41 ++++++++++++++++++++++------ src/services/trade/TradeSession.java | 34 ++++++++++------------- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 87c8bc946..6322c5c7c 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -99,7 +99,7 @@ public class TradeService extends Service { } else if (packet instanceof BeginVerificationMessage){ handleBeginVerificationMessage(gpi.getPlayer()); } else if (packet instanceof VerifyTradeMessage){ - handleVerifyTradeMessage(gpi.getPlayer()); + handleVerifyTradeMessage(gpi.getPlayer(), gpi.getObjectManager()); } else if (packet instanceof TradeCompleteMessage){ handleTradeCompleteMessage(gpi.getPlayer()); } @@ -162,9 +162,9 @@ public class TradeService extends Service { return; tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); - tradeSession.getAccepter().sendSelf(new DenyTradeMessage()); + tradeSession.getAccepter().sendSelf(new TradeCompleteMessage()); tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); - tradeSession.getInitiator().sendSelf(new DenyTradeMessage()); + tradeSession.getInitiator().sendSelf(new TradeCompleteMessage()); } private void handleDenyTradeMessage(Player player) { @@ -203,9 +203,9 @@ public class TradeService extends Service { tradeSession.removeFromItemList(creature, packet.getObjectId()); } - creature.getTradeSession().addItem(creature, packet.getObjectId()); - tradeSession.sendToPartner(partner, new AddItemMessage(packet.getObjectId())); + creature.getTradeSession().addItem(creature, tradeObject); partner.setContainerPermissions(ContainerPermissionsType.INVENTORY); + tradeSession.sendToPartner(partner, new AddItemMessage(packet.getObjectId())); partner.addCustomAware(tradeObject); } @@ -215,19 +215,42 @@ public class TradeService extends Service { tradeSession.sendToPartner(player.getCreatureObject(), new GiveMoneyMessage(packet.getMoneyAmount())); } - private void handleVerifyTradeMessage(Player player) { + private void handleVerifyTradeMessage(Player player, ObjectManager objectManager) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); - tradeSession.sendToPartner(player.getCreatureObject(), new VerifyTradeMessage()); + CreatureObject initiator = tradeSession.getInitiator(); + CreatureObject accepter = tradeSession.getAccepter(); + + if(!tradeSession.getFromItemList(initiator).isEmpty()){ + tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(initiator)); + } else if(!tradeSession.getFromItemList(accepter).isEmpty()){ + tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(accepter)); + } + long oldMoneyBalanceInititater = initiator.getCashBalance(); + long oldMoneyBalanceAccepter = accepter.getCashBalance(); + + if(tradeSession.getMoneyAmount(initiator).get() != 0){ + accepter.setCashBalance(oldMoneyBalanceAccepter + tradeSession.getMoneyAmount(initiator).get()); + initiator.setCashBalance(oldMoneyBalanceInititater - tradeSession.getMoneyAmount(initiator).get()); + } else { + initiator.setCashBalance(oldMoneyBalanceInititater + tradeSession.getMoneyAmount(accepter).get()); + accepter.setCashBalance(oldMoneyBalanceAccepter - tradeSession.getMoneyAmount(accepter).get()); + } + + accepter.sendSelf(new TradeCompleteMessage()); + initiator.sendSelf(new TradeCompleteMessage()); + } private void handleTradeCompleteMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); - tradeSession.sendToPartner(player.getCreatureObject(), new TradeCompleteMessage()); + tradeSession.getAccepter().setTradeSession(null); + tradeSession.getInitiator().setTradeSession(null); } private void handleBeginVerificationMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); - tradeSession.sendToPartner(player.getCreatureObject(), new BeginVerificationMessage()); + tradeSession.getAccepter().sendSelf(new VerifyTradeMessage()); + tradeSession.getInitiator().sendSelf(new VerifyTradeMessage()); } private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 1c2129928..614f13d98 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -8,13 +8,13 @@ import java.util.concurrent.atomic.AtomicInteger; import com.projectswg.common.debug.Log; import network.packets.swg.SWGPacket; -import network.packets.swg.zone.trade.AddItemMessage; +import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; public class TradeSession { - private final List initiatorTradeItems; - private final List accepterTradeItems; + private final List initiatorTradeItems; + private final List accepterTradeItems; private final CreatureObject initiator; private final CreatureObject accepter; private final AtomicInteger moneyAmountInitiator; @@ -25,8 +25,8 @@ public class TradeSession { this.moneyAmountAccepter = new AtomicInteger(); this.initiator = initiator; this.accepter = accepter; - this.initiatorTradeItems = new ArrayList(); - this.accepterTradeItems = new ArrayList(); + this.initiatorTradeItems = new ArrayList(); + this.accepterTradeItems = new ArrayList(); } public void removeFromItemList(CreatureObject requester, long objectId) { @@ -48,17 +48,7 @@ public class TradeSession { } } - public List addToInitiatorList(long objectId){ - this.initiatorTradeItems.add(objectId); - return this.initiatorTradeItems; - } - - public List addToAccepterList(long objectId){ - this.accepterTradeItems.add(objectId); - return this.accepterTradeItems; - } - - public List getFromItemList(CreatureObject creature) { + public List getFromItemList(CreatureObject creature) { if(creature.equals(this.accepter)){ return Collections.unmodifiableList(this.initiatorTradeItems); } else { @@ -74,12 +64,12 @@ public class TradeSession { return this.accepter; } - public void addItem(CreatureObject self, long itemId) { + public void addItem(CreatureObject self, SWGObject tradeObject) { if (self.equals(this.initiator)) { - this.initiatorTradeItems.add(itemId); + this.initiatorTradeItems.add(tradeObject); System.out.println("Item added to Initiatorlist"); } else if (self.equals(this.accepter)) { - this.accepterTradeItems.add(itemId); + this.accepterTradeItems.add(tradeObject); System.out.println("Item added to Accepterlist"); } else { Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); @@ -112,5 +102,9 @@ public class TradeSession { return this.moneyAmountAccepter; } - + public void moveToPartnerInventory(CreatureObject partner, List fromItemList) { + for (SWGObject tradeObject : getFromItemList(partner)) { + tradeObject.moveToContainer(partner.getSlottedObject("inventory")); + } + } } \ No newline at end of file From 4faf94e128332b6849e8adcf3369f1d8bdb47045 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Tue, 11 Jul 2017 20:14:21 +0200 Subject: [PATCH 13/22] Fixed InventoryPermissions Cleaned up TradeService Fixed TradeSession --- .../containers/InventoryPermissions.java | 6 +- src/services/trade/TradeService.java | 95 ++++++++----------- src/services/trade/TradeSession.java | 35 ++++--- 3 files changed, 62 insertions(+), 74 deletions(-) diff --git a/src/resources/containers/InventoryPermissions.java b/src/resources/containers/InventoryPermissions.java index 0a2f2eb62..3e1d8535c 100644 --- a/src/resources/containers/InventoryPermissions.java +++ b/src/resources/containers/InventoryPermissions.java @@ -39,7 +39,7 @@ class InventoryPermissions extends DefaultPermissions { return true; if (container.getOwner() == null) return false; - if (!requester.getOwner().equals(container.getOwner())) + if (requester.getOwner().equals(container.getOwner())) return false; return canTradePartnerView(requester, container); } @@ -57,11 +57,13 @@ class InventoryPermissions extends DefaultPermissions { CreatureObject creature = container.getOwner().getCreatureObject(); if (creature == null) return false; + if(container.getOwner() == null) + return false; TradeSession session = creature.getTradeSession(); if (session == null || !session.getFromItemList(creature).contains(container.getObjectId())) return false; CreatureObject partner = session.getTradePartner(creature); - return partner != null && partner.equals(requester.getOwner()); + return partner != null && partner.equals(requester); } } \ No newline at end of file diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 6322c5c7c..0a830bc29 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -36,39 +36,38 @@ import services.objects.ObjectManager; public class TradeService extends Service { - private List tradeInitiators; - private List tradeAccepters; private List tradeSessions; public TradeService() { - tradeInitiators = new ArrayList(); - tradeAccepters = new ArrayList(); tradeSessions = new ArrayList(); registerForIntent(GalacticPacketIntent.class, gpi -> handleGalacticPacketIntent(gpi)); registerForIntent(PlayerEventIntent.class, pei -> handlePlayerEventIntent(pei)); } - + + @Override + public boolean terminate() { + for (TradeSession tradeSession : tradeSessions) { + tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); + tradeSession.getAccepter().sendSelf(new TradeCompleteMessage()); + tradeSession.getAccepter().setTradeSession(null); + tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); + tradeSession.getInitiator().sendSelf(new TradeCompleteMessage()); + tradeSession.getInitiator().setTradeSession(null); + } + return super.terminate(); + } + private void handlePlayerEventIntent(PlayerEventIntent pei) { switch (pei.getEvent()) { case PE_FIRST_ZONE: if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ - pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new TradeCompleteMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new TradeCompleteMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().setTradeSession(null); - pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().setTradeSession(null); + abortTrade(pei.getPlayer()); } break; case PE_LOGGED_OUT: if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ - pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new AbortTradeMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().sendSelf(new TradeCompleteMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new AbortTradeMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().sendSelf(new TradeCompleteMessage()); - pei.getPlayer().getCreatureObject().getTradeSession().getAccepter().setTradeSession(null); - pei.getPlayer().getCreatureObject().getTradeSession().getInitiator().setTradeSession(null); + abortTrade(pei.getPlayer()); } break; default: @@ -93,7 +92,7 @@ public class TradeService extends Service { } else if (packet instanceof UnAcceptTransactionMessage){ handleUnAcceptTransactionMessage(gpi.getPlayer()); } else if (packet instanceof AddItemMessage){ - handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer(), gpi.getObjectManager()); + handleAddItemMessage((AddItemMessage) packet, gpi.getPlayer(), gpi.getObjectManager()); } else if (packet instanceof GiveMoneyMessage){ handleGiveMoneyMessage((GiveMoneyMessage) packet, gpi.getPlayer()); } else if (packet instanceof BeginVerificationMessage){ @@ -109,11 +108,6 @@ public class TradeService extends Service { CreatureObject initiator = player.getCreatureObject(); CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); - if(accepter.getTradeSession() != null){ - sendSystemMessage(initiator.getOwner(), "request_player_busy_no_obj"); - return; - } - if(accepter.isInCombat()){ return; } @@ -148,9 +142,9 @@ public class TradeService extends Service { } TradeSession tradeSession = new TradeSession(initiator, accepter); + tradeSessions.add(tradeSession); initiator.setTradeSession(tradeSession); tradeSessions.add(tradeSession); - tradeInitiators.add(initiator); handleTradeSessionRequest(packet, player, initiator, accepter); Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } @@ -161,10 +155,7 @@ public class TradeService extends Service { if(tradeSession == null) return; - tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); - tradeSession.getAccepter().sendSelf(new TradeCompleteMessage()); - tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); - tradeSession.getInitiator().sendSelf(new TradeCompleteMessage()); + abortTrade(player); } private void handleDenyTradeMessage(Player player) { @@ -174,7 +165,7 @@ public class TradeService extends Service { private void handleAcceptTransactionMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); - tradeSession.sendToPartner(player.getCreatureObject(), new AcceptTransactionMessage()); + tradeSession.sendToPartner(player.getCreatureObject(), new AcceptTransactionMessage()); } private void handleUnAcceptTransactionMessage(Player player) { @@ -220,29 +211,32 @@ public class TradeService extends Service { CreatureObject initiator = tradeSession.getInitiator(); CreatureObject accepter = tradeSession.getAccepter(); + if(!tradeSession.getFromItemList(accepter).isEmpty()){ + tradeSession.moveToPartnerInventory(accepter, tradeSession.getFromItemList(accepter)); + } + if(!tradeSession.getFromItemList(initiator).isEmpty()){ - tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(initiator)); - } else if(!tradeSession.getFromItemList(accepter).isEmpty()){ - tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(accepter)); + tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(initiator)); } + long oldMoneyBalanceInititater = initiator.getCashBalance(); long oldMoneyBalanceAccepter = accepter.getCashBalance(); - if(tradeSession.getMoneyAmount(initiator).get() != 0){ - accepter.setCashBalance(oldMoneyBalanceAccepter + tradeSession.getMoneyAmount(initiator).get()); - initiator.setCashBalance(oldMoneyBalanceInititater - tradeSession.getMoneyAmount(initiator).get()); + if(tradeSession.getMoneyAmount(initiator) != 0){ + accepter.setCashBalance(oldMoneyBalanceAccepter + tradeSession.getMoneyAmount(initiator)); + initiator.setCashBalance(oldMoneyBalanceInititater - tradeSession.getMoneyAmount(initiator)); } else { - initiator.setCashBalance(oldMoneyBalanceInititater + tradeSession.getMoneyAmount(accepter).get()); - accepter.setCashBalance(oldMoneyBalanceAccepter - tradeSession.getMoneyAmount(accepter).get()); + initiator.setCashBalance(oldMoneyBalanceInititater + tradeSession.getMoneyAmount(accepter)); + accepter.setCashBalance(oldMoneyBalanceAccepter - tradeSession.getMoneyAmount(accepter)); } - + accepter.sendSelf(new TradeCompleteMessage()); initiator.sendSelf(new TradeCompleteMessage()); - } private void handleTradeCompleteMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.sendToPartner(player.getCreatureObject(), new TradeCompleteMessage()); tradeSession.getAccepter().setTradeSession(null); tradeSession.getInitiator().setTradeSession(null); } @@ -259,7 +253,6 @@ public class TradeService extends Service { requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { if(initiator.getTradeSession() != null && initiator.getTradeSession().getInitiator() != null){ accepter.setTradeSession(initiator.getTradeSession()); - tradeAccepters.add(accepter); accepter.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); initiator.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); @@ -283,19 +276,13 @@ public class TradeService extends Service { new ChatBroadcastIntent(player, "@ui_trade:" + str).broadcast(); } - @Override - public boolean terminate() { - for (CreatureObject tradeAccepter : tradeAccepters) { - tradeAccepter.sendSelf(new AbortTradeMessage()); - tradeAccepter.sendSelf(new TradeCompleteMessage()); - tradeAccepter.setTradeSession(null); - } - for (CreatureObject tradeInitiator : tradeInitiators) { - tradeInitiator.sendSelf(new AbortTradeMessage()); - tradeInitiator.sendSelf(new TradeCompleteMessage()); - tradeInitiator.setTradeSession(null); - } - System.out.println("terminatetest"); - return super.terminate(); + private void abortTrade(Player player) { + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); + tradeSession.getAccepter().sendSelf(new TradeCompleteMessage()); + tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); + tradeSession.getInitiator().sendSelf(new TradeCompleteMessage()); + tradeSession.getAccepter().setTradeSession(null); + tradeSession.getInitiator().setTradeSession(null); } } \ No newline at end of file diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 614f13d98..44f659ad4 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -17,16 +17,16 @@ public class TradeSession { private final List accepterTradeItems; private final CreatureObject initiator; private final CreatureObject accepter; - private final AtomicInteger moneyAmountInitiator; - private final AtomicInteger moneyAmountAccepter; + private final AtomicInteger initiatorMoneyAmount; + private final AtomicInteger accepterMoneyAmount; public TradeSession(CreatureObject initiator, CreatureObject accepter) { - this.moneyAmountInitiator = new AtomicInteger(); - this.moneyAmountAccepter = new AtomicInteger(); + this.initiatorTradeItems = new ArrayList<>(); + this.accepterTradeItems = new ArrayList<>(); this.initiator = initiator; this.accepter = accepter; - this.initiatorTradeItems = new ArrayList(); - this.accepterTradeItems = new ArrayList(); + this.initiatorMoneyAmount = new AtomicInteger(); + this.accepterMoneyAmount = new AtomicInteger(); } public void removeFromItemList(CreatureObject requester, long objectId) { @@ -77,34 +77,33 @@ public class TradeSession { } public void sendToPartner(CreatureObject creature, SWGPacket packet) { - TradeSession tradeSession = creature.getTradeSession(); - if(creature.getObjectId() != tradeSession.getAccepter().getObjectId()){ - tradeSession.getAccepter().getOwner().sendPacket(packet); + if(creature.getObjectId() != this.getAccepter().getObjectId()){ + this.getAccepter().getOwner().sendPacket(packet); } else { - tradeSession.getInitiator().getOwner().sendPacket(packet); + this.getInitiator().getOwner().sendPacket(packet); } } public void setMoneyAmount(CreatureObject creature, int amount){ if(creature.equals(this.initiator)){ - this.moneyAmountInitiator.set(amount); + this.initiatorMoneyAmount.set(amount); } else if (creature.equals(this.initiator)){ - this.moneyAmountAccepter.set(amount); + this.accepterMoneyAmount.set(amount); } } - public AtomicInteger getMoneyAmount(CreatureObject creature) { + public int getMoneyAmount(CreatureObject creature) { if(creature.equals(this.initiator)){ - return this.moneyAmountInitiator; + return this.initiatorMoneyAmount.get(); } else if (creature.equals(this.initiator)){ - return this.moneyAmountAccepter; + return this.accepterMoneyAmount.get(); } - return this.moneyAmountAccepter; + return this.accepterMoneyAmount.get(); } public void moveToPartnerInventory(CreatureObject partner, List fromItemList) { - for (SWGObject tradeObject : getFromItemList(partner)) { - tradeObject.moveToContainer(partner.getSlottedObject("inventory")); + for (SWGObject tradeObject : fromItemList) { + tradeObject.moveToContainer(getTradePartner(partner).getSlottedObject("inventory")); } } } \ No newline at end of file From 47a3510f71804640e0216ece33a7a292ce19ad83 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Wed, 12 Jul 2017 18:34:48 +0200 Subject: [PATCH 14/22] Added syncronized to itemlists --- src/services/trade/TradeSession.java | 64 +++++++++++++++------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 44f659ad4..62554a7ee 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -30,18 +30,22 @@ public class TradeSession { } public void removeFromItemList(CreatureObject requester, long objectId) { - if (requester.equals(this.accepter)) { - this.initiatorTradeItems.remove(objectId); + if (requester.equals(accepter)) { + synchronized (initiatorTradeItems) { + initiatorTradeItems.remove(objectId); + } } else { - this.accepterTradeItems.remove(objectId); + synchronized (accepterTradeItems) { + accepterTradeItems.remove(objectId); + } } } public CreatureObject getTradePartner(CreatureObject self) { - if (self.equals(this.accepter)) { + if (self.equals(accepter)) { return this.accepter; - } else if(self.equals(this.initiator)) { - return this.initiator; + } else if(self.equals(initiator)) { + return initiator; } else { Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); return self; @@ -50,55 +54,57 @@ public class TradeSession { public List getFromItemList(CreatureObject creature) { if(creature.equals(this.accepter)){ - return Collections.unmodifiableList(this.initiatorTradeItems); + return Collections.unmodifiableList(initiatorTradeItems); } else { - return Collections.unmodifiableList(this.accepterTradeItems); + return Collections.unmodifiableList(accepterTradeItems); } } public CreatureObject getInitiator() { - return this.initiator; + return initiator; } public CreatureObject getAccepter() { - return this.accepter; + return accepter; } - public void addItem(CreatureObject self, SWGObject tradeObject) { - if (self.equals(this.initiator)) { - this.initiatorTradeItems.add(tradeObject); - System.out.println("Item added to Initiatorlist"); - } else if (self.equals(this.accepter)) { - this.accepterTradeItems.add(tradeObject); - System.out.println("Item added to Accepterlist"); + public void addItem(CreatureObject self, SWGObject tradeObject) { + if (self.equals(initiator)) { + synchronized (initiatorTradeItems) { + initiatorTradeItems.add(tradeObject); + } + } else if (self.equals(accepter)) { + synchronized (accepterTradeItems) { + accepterTradeItems.add(tradeObject); + } } else { Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); } } public void sendToPartner(CreatureObject creature, SWGPacket packet) { - if(creature.getObjectId() != this.getAccepter().getObjectId()){ - this.getAccepter().getOwner().sendPacket(packet); + if(creature.getObjectId() != getAccepter().getObjectId()){ + getAccepter().getOwner().sendPacket(packet); } else { - this.getInitiator().getOwner().sendPacket(packet); + getInitiator().getOwner().sendPacket(packet); } } public void setMoneyAmount(CreatureObject creature, int amount){ - if(creature.equals(this.initiator)){ - this.initiatorMoneyAmount.set(amount); - } else if (creature.equals(this.initiator)){ - this.accepterMoneyAmount.set(amount); + if(creature.equals(initiator)){ + initiatorMoneyAmount.set(amount); + } else if (creature.equals(initiator)){ + accepterMoneyAmount.set(amount); } } public int getMoneyAmount(CreatureObject creature) { - if(creature.equals(this.initiator)){ - return this.initiatorMoneyAmount.get(); - } else if (creature.equals(this.initiator)){ - return this.accepterMoneyAmount.get(); + if(creature.equals(initiator)){ + return initiatorMoneyAmount.get(); + } else if (creature.equals(initiator)){ + return accepterMoneyAmount.get(); } - return this.accepterMoneyAmount.get(); + return accepterMoneyAmount.get(); } public void moveToPartnerInventory(CreatureObject partner, List fromItemList) { From 938f5cfe6d879b66e7b86b13eb3653633bb2a297 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Wed, 12 Jul 2017 18:35:24 +0200 Subject: [PATCH 15/22] Removed unneeded this. --- src/services/trade/TradeSession.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 62554a7ee..3893789d8 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -43,7 +43,7 @@ public class TradeSession { public CreatureObject getTradePartner(CreatureObject self) { if (self.equals(accepter)) { - return this.accepter; + return accepter; } else if(self.equals(initiator)) { return initiator; } else { From d46f90e3f32403db765464f3f67c8c3b6832e279 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Thu, 13 Jul 2017 18:54:02 +0200 Subject: [PATCH 16/22] Removed extra Whitespace --- src/services/trade/TradeSession.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 3893789d8..744fba822 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -68,7 +68,7 @@ public class TradeSession { return accepter; } - public void addItem(CreatureObject self, SWGObject tradeObject) { + public void addItem(CreatureObject self, SWGObject tradeObject) { if (self.equals(initiator)) { synchronized (initiatorTradeItems) { initiatorTradeItems.add(tradeObject); From 5aebdcb7d21013172ec121862d97bd728e321519 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 14 Jul 2017 17:50:32 +0200 Subject: [PATCH 17/22] Refactored TradeService Refactored TradeSession --- src/services/trade/TradeService.java | 180 ++++++++++++--------------- src/services/trade/TradeSession.java | 117 ++++++++++++----- 2 files changed, 162 insertions(+), 135 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 0a830bc29..4b9707cb6 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -28,7 +28,6 @@ import resources.Posture; import resources.containers.ContainerPermissionsType; import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; -import resources.objects.custom.AIObject; import resources.player.Player; import resources.sui.SuiButtons; import resources.sui.SuiMessageBox; @@ -36,39 +35,34 @@ import services.objects.ObjectManager; public class TradeService extends Service { - private List tradeSessions; + private final List tradeSessions; public TradeService() { tradeSessions = new ArrayList(); - registerForIntent(GalacticPacketIntent.class, gpi -> handleGalacticPacketIntent(gpi)); - registerForIntent(PlayerEventIntent.class, pei -> handlePlayerEventIntent(pei)); + registerForIntent(GalacticPacketIntent.class, this::handleGalacticPacketIntent); + registerForIntent(PlayerEventIntent.class, this::handlePlayerEventIntent); } @Override - public boolean terminate() { + public boolean stop() { for (TradeSession tradeSession : tradeSessions) { - tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); - tradeSession.getAccepter().sendSelf(new TradeCompleteMessage()); - tradeSession.getAccepter().setTradeSession(null); - tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); - tradeSession.getInitiator().sendSelf(new TradeCompleteMessage()); - tradeSession.getInitiator().setTradeSession(null); + tradeSession.sendAbortTrade(); } - return super.terminate(); + return super.stop(); } private void handlePlayerEventIntent(PlayerEventIntent pei) { + if (pei.getPlayer().getCreatureObject() == null) + return; + TradeSession session = pei.getPlayer().getCreatureObject().getTradeSession(); + if (session == null) + return; + switch (pei.getEvent()) { case PE_FIRST_ZONE: - if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ - abortTrade(pei.getPlayer()); - } - break; case PE_LOGGED_OUT: - if(pei.getPlayer().getCreatureObject().getTradeSession() != null){ - abortTrade(pei.getPlayer()); - } + session.sendAbortTrade(); break; default: break; @@ -77,10 +71,7 @@ public class TradeService extends Service { private void handleGalacticPacketIntent(GalacticPacketIntent gpi) { Packet packet = gpi.getPacket(); - if (packet instanceof SWGPacket){ - Log.d("RX Packet: %s, Packet Name: %s", ((SWGPacket) gpi.getPacket()).getPacketType(), gpi.getPacket().toString()); - } - + if (packet instanceof SecureTrade) { handleSecureTrade((SecureTrade) packet,gpi.getPlayer(), gpi.getObjectManager()); } else if (packet instanceof AbortTradeMessage){ @@ -106,98 +97,90 @@ public class TradeService extends Service { private void handleSecureTrade(SecureTrade packet, Player player, ObjectManager objectManager) { CreatureObject initiator = player.getCreatureObject(); - CreatureObject accepter = (CreatureObject) objectManager.getObjectById(packet.getAccepterId()); - - if(accepter.isInCombat()){ - return; - } - - if(initiator.isInCombat()){ - return; - } - - if(accepter instanceof AIObject){ + SWGObject accepterObject = objectManager.getObjectById(packet.getAccepterId()); + CreatureObject accepter; + if (!(accepterObject instanceof CreatureObject) || !((CreatureObject) accepterObject).isPlayer()) { sendSystemMessage(initiator.getOwner(), "start_fail_target_not_player"); return; } + accepter = (CreatureObject) accepterObject; - if(initiator.getPosture() == Posture.INCAPACITATED){ + if(initiator.isInCombat() || accepter.isInCombat()){ + return; + } + + if(initiator.getPosture() == Posture.INCAPACITATED || accepter.getPosture() == Posture.INCAPACITATED){ sendSystemMessage(initiator.getOwner(), "player_incapacitated"); return; } - if(initiator.getPosture() == Posture.DEAD){ + if(initiator.getPosture() == Posture.DEAD || accepter.getPosture() == Posture.DEAD){ sendSystemMessage(initiator.getOwner(), "player_dead"); return; } - if(accepter.getPosture() == Posture.INCAPACITATED){ - sendSystemMessage(initiator.getOwner(), "target_incapacitated"); - return; - } - - if(accepter.getPosture() == Posture.DEAD){ - sendSystemMessage(initiator.getOwner(), "target_dead"); - return; - } - TradeSession tradeSession = new TradeSession(initiator, accepter); tradeSessions.add(tradeSession); initiator.setTradeSession(tradeSession); - tradeSessions.add(tradeSession); handleTradeSessionRequest(packet, player, initiator, accepter); - Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); + Log.d("Trade Session Request. Type=%s Initiator=%s Receipient=%s PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); } - private void handleAbortTradeMessage(Player player) { + private void handleAbortTradeMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); if(tradeSession == null) return; - - abortTrade(player); + + tradeSession.sendAbortTrade(); } private void handleDenyTradeMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + + if(tradeSession == null) + return; + tradeSession.sendToPartner(player.getCreatureObject(), new DenyTradeMessage()); } private void handleAcceptTransactionMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + + if(tradeSession == null) + return; + tradeSession.sendToPartner(player.getCreatureObject(), new AcceptTransactionMessage()); } private void handleUnAcceptTransactionMessage(Player player) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + + if(tradeSession == null) + return; + tradeSession.sendToPartner(player.getCreatureObject(), new UnAcceptTransactionMessage()); } private void handleAddItemMessage(AddItemMessage packet, Player player, ObjectManager objectManager) { CreatureObject creature = player.getCreatureObject(); TradeSession tradeSession = creature.getTradeSession(); - SWGObject tradeObject = objectManager.getObjectById(packet.getObjectId()); - if (creature.getTradeSession() == null) { - Log.w("Invalid Tradesession"); - return; - } - - CreatureObject partner = creature.getTradeSession().getTradePartner(creature); - if (partner == null) { - Log.w("Invalid trading session ...."); + if (tradeSession == null) { + Log.w("Invalid TradeSession"); return; } + SWGObject tradeObject = objectManager.getObjectById(packet.getObjectId()); if(tradeObject.hasAttribute("no_trade")){ sendSystemMessage(player, "add_item_failed_prose"); tradeSession.sendToPartner(creature, new RemoveItemMessage(packet.getObjectId())); tradeSession.removeFromItemList(creature, packet.getObjectId()); } - creature.getTradeSession().addItem(creature, tradeObject); - partner.setContainerPermissions(ContainerPermissionsType.INVENTORY); - tradeSession.sendToPartner(partner, new AddItemMessage(packet.getObjectId())); - partner.addCustomAware(tradeObject); + tradeObject.setContainerPermissions(ContainerPermissionsType.INVENTORY); + tradeSession.addItem(creature, tradeObject); + tradeSession.sendToPartner(creature, new AddItemMessage(packet.getObjectId())); + tradeSession.getTradePartner(creature).addCustomAware(tradeObject); } private void handleGiveMoneyMessage(GiveMoneyMessage packet, Player player) { @@ -208,28 +191,32 @@ public class TradeService extends Service { private void handleVerifyTradeMessage(Player player, ObjectManager objectManager) { TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + CreatureObject creature = player.getCreatureObject(); CreatureObject initiator = tradeSession.getInitiator(); CreatureObject accepter = tradeSession.getAccepter(); - - if(!tradeSession.getFromItemList(accepter).isEmpty()){ - tradeSession.moveToPartnerInventory(accepter, tradeSession.getFromItemList(accepter)); - } - if(!tradeSession.getFromItemList(initiator).isEmpty()){ - tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(initiator)); + if(creature.equals(accepter) && !tradeSession.isAccepterVerified()){ + accepter.sendSelf(new VerifyTradeMessage()); + tradeSession.setAccepterVerified(true); } - long oldMoneyBalanceInititater = initiator.getCashBalance(); - long oldMoneyBalanceAccepter = accepter.getCashBalance(); - - if(tradeSession.getMoneyAmount(initiator) != 0){ - accepter.setCashBalance(oldMoneyBalanceAccepter + tradeSession.getMoneyAmount(initiator)); - initiator.setCashBalance(oldMoneyBalanceInititater - tradeSession.getMoneyAmount(initiator)); - } else { - initiator.setCashBalance(oldMoneyBalanceInititater + tradeSession.getMoneyAmount(accepter)); - accepter.setCashBalance(oldMoneyBalanceAccepter - tradeSession.getMoneyAmount(accepter)); + if(creature.equals(initiator) && !tradeSession.isInitiatorVerified()){ + initiator.sendSelf(new VerifyTradeMessage()); + tradeSession.setInititatorVerified(true); } + if (!tradeSession.isInitiatorVerified() || !tradeSession.isAccepterVerified()) + return; + + tradeSession.moveToPartnerInventory(accepter, tradeSession.getFromItemList(accepter)); + tradeSession.moveToPartnerInventory(initiator, tradeSession.getFromItemList(initiator)); + + long initiatorTransfer = tradeSession.getMoneyAmount(initiator); + long accepterTransfer = tradeSession.getMoneyAmount(accepter); + + initiator.setCashBalance(initiator.getCashBalance() + accepterTransfer - initiatorTransfer); + accepter.setCashBalance(accepter.getCashBalance() + initiatorTransfer - accepterTransfer); + accepter.sendSelf(new TradeCompleteMessage()); initiator.sendSelf(new TradeCompleteMessage()); } @@ -242,26 +229,27 @@ public class TradeService extends Service { } private void handleBeginVerificationMessage(Player player) { - TradeSession tradeSession = player.getCreatureObject().getTradeSession(); + TradeSession tradeSession = player.getCreatureObject().getTradeSession(); tradeSession.getAccepter().sendSelf(new VerifyTradeMessage()); tradeSession.getInitiator().sendSelf(new VerifyTradeMessage()); } - private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { - SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); + private void handleTradeSessionRequest(SecureTrade packet, Player packetSender , CreatureObject initiator, CreatureObject accepter) { + SuiMessageBox requestBox = new SuiMessageBox(SuiButtons.OK_CANCEL, "Trade Request", accepter.getOwner().getCharacterName() + " wants to trade with you.\nDo you want to accept the request?"); requestBox.display(accepter.getOwner()); requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> { - if(initiator.getTradeSession() != null && initiator.getTradeSession().getInitiator() != null){ - accepter.setTradeSession(initiator.getTradeSession()); - accepter.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); - initiator.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); - initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); - accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); - Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); - } + if(initiator.getTradeSession() == null) + return; + + accepter.setTradeSession(initiator.getTradeSession()); + accepter.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); + initiator.sendSelf(new SecureTrade(TradeMessageType.REQUEST_TRADE, initiator.getObjectId(), accepter.getObjectId())); + initiator.sendSelf(new BeginTradeMessage(accepter.getObjectId())); + accepter.sendSelf(new BeginTradeMessage(initiator.getObjectId())); + Log.d("Trade Session Request. Type=%s Initiator=%d Receipient=%d PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); }); requestBox.addCancelButtonCallback("handleTradeRequestDeny", (player, actor, event, paramenters)-> { - if(packetSender.getCreatureObject().getObjectId() != accepter.getObjectId()){ + if(packetSender.getCreatureObject().equals(initiator)){ initiator.sendSelf(new DenyTradeMessage()); initiator.sendSelf(new AbortTradeMessage()); } else { @@ -275,14 +263,4 @@ public class TradeService extends Service { private void sendSystemMessage(Player player, String str) { new ChatBroadcastIntent(player, "@ui_trade:" + str).broadcast(); } - - private void abortTrade(Player player) { - TradeSession tradeSession = player.getCreatureObject().getTradeSession(); - tradeSession.getAccepter().sendSelf(new AbortTradeMessage()); - tradeSession.getAccepter().sendSelf(new TradeCompleteMessage()); - tradeSession.getInitiator().sendSelf(new AbortTradeMessage()); - tradeSession.getInitiator().sendSelf(new TradeCompleteMessage()); - tradeSession.getAccepter().setTradeSession(null); - tradeSession.getInitiator().setTradeSession(null); - } } \ No newline at end of file diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index 744fba822..c8c5d43e3 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -3,13 +3,18 @@ package services.trade; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import com.projectswg.common.debug.Log; +import com.projectswg.common.debug.Assert; import network.packets.swg.SWGPacket; +import network.packets.swg.zone.trade.AbortTradeMessage; +import network.packets.swg.zone.trade.TradeCompleteMessage; import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; +import resources.player.Player; public class TradeSession { @@ -19,71 +24,76 @@ public class TradeSession { private final CreatureObject accepter; private final AtomicInteger initiatorMoneyAmount; private final AtomicInteger accepterMoneyAmount; + private final AtomicBoolean initiatorVerified; + private final AtomicBoolean accepterVerified; public TradeSession(CreatureObject initiator, CreatureObject accepter) { this.initiatorTradeItems = new ArrayList<>(); this.accepterTradeItems = new ArrayList<>(); - this.initiator = initiator; - this.accepter = accepter; + this.initiator = Objects.requireNonNull(initiator, "Initiator cannot be null!"); + this.accepter = Objects.requireNonNull(accepter, "Accepter cannot be null!"); this.initiatorMoneyAmount = new AtomicInteger(); this.accepterMoneyAmount = new AtomicInteger(); + this.initiatorVerified = new AtomicBoolean(); + this.accepterVerified = new AtomicBoolean(); } public void removeFromItemList(CreatureObject requester, long objectId) { - if (requester.equals(accepter)) { + Assert.test(isInTradeSession(requester), "Creature is not a part of this trade session!"); + if(isInitiator(requester)){ synchronized (initiatorTradeItems) { initiatorTradeItems.remove(objectId); } + } else { synchronized (accepterTradeItems) { accepterTradeItems.remove(objectId); } } } - - public CreatureObject getTradePartner(CreatureObject self) { - if (self.equals(accepter)) { + + public CreatureObject getTradePartner(CreatureObject creature) { + Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); + if(isInitiator(creature)){ return accepter; - } else if(self.equals(initiator)) { - return initiator; } else { - Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); - return self; - } + return initiator; + } } public List getFromItemList(CreatureObject creature) { - if(creature.equals(this.accepter)){ + Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); + if(isInitiator(creature)){ return Collections.unmodifiableList(initiatorTradeItems); } else { return Collections.unmodifiableList(accepterTradeItems); } } - + public CreatureObject getInitiator() { return initiator; } - + public CreatureObject getAccepter() { return accepter; } - - public void addItem(CreatureObject self, SWGObject tradeObject) { - if (self.equals(initiator)) { - synchronized (initiatorTradeItems) { - initiatorTradeItems.add(tradeObject); - } - } else if (self.equals(accepter)) { - synchronized (accepterTradeItems) { - accepterTradeItems.add(tradeObject); - } - } else { - Log.w("Invalid trade item owner for session: %s (initiator=%s, accepter=%s)", self, initiator, accepter); - } + + public void addItem(CreatureObject creature, SWGObject tradeObject) { + Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); + if(isInitiator(creature)){ + synchronized (initiatorTradeItems) { + initiatorTradeItems.add(tradeObject); + } + } else { + synchronized (accepterTradeItems) { + accepterTradeItems.add(tradeObject); + } + } } public void sendToPartner(CreatureObject creature, SWGPacket packet) { - if(creature.getObjectId() != getAccepter().getObjectId()){ + Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); + if(isInitiator(creature)){ // Obique: don't use object id comparisons getAccepter().getOwner().sendPacket(packet); } else { getInitiator().getOwner().sendPacket(packet); @@ -91,20 +101,21 @@ public class TradeSession { } public void setMoneyAmount(CreatureObject creature, int amount){ - if(creature.equals(initiator)){ + Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); + if(isInitiator(creature)){ initiatorMoneyAmount.set(amount); - } else if (creature.equals(initiator)){ + } else { accepterMoneyAmount.set(amount); } } public int getMoneyAmount(CreatureObject creature) { - if(creature.equals(initiator)){ + Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); + if(isInitiator(creature)){ return initiatorMoneyAmount.get(); - } else if (creature.equals(initiator)){ + } else { return accepterMoneyAmount.get(); } - return accepterMoneyAmount.get(); } public void moveToPartnerInventory(CreatureObject partner, List fromItemList) { @@ -112,4 +123,42 @@ public class TradeSession { tradeObject.moveToContainer(getTradePartner(partner).getSlottedObject("inventory")); } } + + public boolean isInitiatorVerified() { + return initiatorVerified.get(); + } + + public boolean isAccepterVerified() { + return accepterVerified.get(); + } + + public void setInititatorVerified(boolean initiatorVerfified){ + this.initiatorVerified.set(initiatorVerfified); + } + + public void setAccepterVerified(boolean accepterVerified){ + this.accepterVerified.set(accepterVerified); + } + + public void sendAbortTrade() { + Player accepter = this.accepter.getOwner(); + Player initiator = this.initiator.getOwner(); + if (accepter != null) + accepter.sendPacket(new AbortTradeMessage(), new TradeCompleteMessage()); + if (initiator != null) + initiator.sendPacket(new AbortTradeMessage(), new TradeCompleteMessage()); + + if (initiator.getCreatureObject() != null) + initiator.getCreatureObject().setTradeSession(null); + if (accepter.getCreatureObject() != null) + accepter.getCreatureObject().setTradeSession(null); + } + + private boolean isInitiator(CreatureObject creature) { + return creature.equals(initiator); + } + + private boolean isInTradeSession(CreatureObject creature) { + return isInitiator(creature) || (accepter != null && creature.equals(accepter)); + } } \ No newline at end of file From 85818d6361d51a1ad865b2c9fd6d976694b1ba2c Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 14 Jul 2017 17:56:23 +0200 Subject: [PATCH 18/22] Fixed an unused Import Fixed Debug log --- src/services/trade/TradeService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 4b9707cb6..63490fdb4 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -10,7 +10,6 @@ import intents.PlayerEventIntent; import intents.chat.ChatBroadcastIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; -import network.packets.swg.SWGPacket; import network.packets.swg.zone.object_controller.SecureTrade; import network.packets.swg.zone.object_controller.SecureTrade.TradeMessageType; import network.packets.swg.zone.trade.AbortTradeMessage; @@ -123,7 +122,7 @@ public class TradeService extends Service { tradeSessions.add(tradeSession); initiator.setTradeSession(tradeSession); handleTradeSessionRequest(packet, player, initiator, accepter); - Log.d("Trade Session Request. Type=%s Initiator=%s Receipient=%s PacketSenderID: %d", packet.getType(), packet.getStarterId(), packet.getAccepterId(), player.getCreatureObject().getObjectId()); + Log.d("Trade Session Request. Type=%s Initiator=%s Receipient=%s PacketSenderID: %d", packet.getType(), initiator, accepter, player.getCreatureObject().getObjectId()); } private void handleAbortTradeMessage(Player player) { From 770bb0b6b3bcc42995e795ccb5ae00a48201c933 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 14 Jul 2017 18:01:44 +0200 Subject: [PATCH 19/22] Changed the a Warning Log entry to be more descriptive Removed a comment --- src/services/trade/TradeService.java | 2 +- src/services/trade/TradeSession.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 63490fdb4..16d95fcea 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -165,7 +165,7 @@ public class TradeService extends Service { CreatureObject creature = player.getCreatureObject(); TradeSession tradeSession = creature.getTradeSession(); if (tradeSession == null) { - Log.w("Invalid TradeSession"); + Log.w("Invalid TradeSession for handleAddItemMessage. Creature %s: ", creature); return; } diff --git a/src/services/trade/TradeSession.java b/src/services/trade/TradeSession.java index c8c5d43e3..e0cdf5108 100644 --- a/src/services/trade/TradeSession.java +++ b/src/services/trade/TradeSession.java @@ -93,7 +93,7 @@ public class TradeSession { public void sendToPartner(CreatureObject creature, SWGPacket packet) { Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!"); - if(isInitiator(creature)){ // Obique: don't use object id comparisons + if(isInitiator(creature)){ getAccepter().getOwner().sendPacket(packet); } else { getInitiator().getOwner().sendPacket(packet); From 320dd29d033345e2b3c9bd830a27b8350f9088a2 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 14 Jul 2017 18:37:42 +0200 Subject: [PATCH 20/22] Added Check for Equiped Items --- src/resources/objects/SWGObject.java | 4 ++++ src/services/trade/TradeService.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 8bb33d16d..4a698d3dd 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -295,6 +295,10 @@ public abstract class SWGObject extends BaselineObject implements Comparable getSlots() { return new HashMap<>(slots); } diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 16d95fcea..bb8858bd1 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -170,6 +170,10 @@ public class TradeService extends Service { } SWGObject tradeObject = objectManager.getObjectById(packet.getObjectId()); + if(creature.hasSlottedObject(tradeObject)){ + return; + } + if(tradeObject.hasAttribute("no_trade")){ sendSystemMessage(player, "add_item_failed_prose"); tradeSession.sendToPartner(creature, new RemoveItemMessage(packet.getObjectId())); From 67136ff0decf4e571ebea7b6d2abd99bede26fdd Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 14 Jul 2017 18:52:57 +0200 Subject: [PATCH 21/22] Change the handling of Notrade and equipped Items for Trading --- src/services/trade/TradeService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index bb8858bd1..27428b6a8 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -171,13 +171,13 @@ public class TradeService extends Service { SWGObject tradeObject = objectManager.getObjectById(packet.getObjectId()); if(creature.hasSlottedObject(tradeObject)){ + tradeSession.sendAbortTrade(); return; } if(tradeObject.hasAttribute("no_trade")){ sendSystemMessage(player, "add_item_failed_prose"); - tradeSession.sendToPartner(creature, new RemoveItemMessage(packet.getObjectId())); - tradeSession.removeFromItemList(creature, packet.getObjectId()); + tradeSession.sendAbortTrade(); } tradeObject.setContainerPermissions(ContainerPermissionsType.INVENTORY); From 6971887611774009b231b5c8d8727e899efe5c18 Mon Sep 17 00:00:00 2001 From: Tacef Ine Date: Fri, 14 Jul 2017 21:05:25 +0200 Subject: [PATCH 22/22] Fixed Inventorypermissions --- src/resources/containers/InventoryPermissions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/containers/InventoryPermissions.java b/src/resources/containers/InventoryPermissions.java index 3e1d8535c..4055ffeb6 100644 --- a/src/resources/containers/InventoryPermissions.java +++ b/src/resources/containers/InventoryPermissions.java @@ -40,7 +40,7 @@ class InventoryPermissions extends DefaultPermissions { if (container.getOwner() == null) return false; if (requester.getOwner().equals(container.getOwner())) - return false; + return true; return canTradePartnerView(requester, container); }