From 2a10c12df356c2dfbb5a4b02ca9e36faa44aae12 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 23 Jul 2013 18:11:44 -0400 Subject: [PATCH 1/4] Delta for changing titles added --- src/resources/objects/player/PlayerMessageBuilder.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/resources/objects/player/PlayerMessageBuilder.java b/src/resources/objects/player/PlayerMessageBuilder.java index 381ae5f4..c8d2dc2c 100644 --- a/src/resources/objects/player/PlayerMessageBuilder.java +++ b/src/resources/objects/player/PlayerMessageBuilder.java @@ -365,6 +365,16 @@ public class PlayerMessageBuilder extends ObjectMessageBuilder { } + public IoBuffer buildTitleDelta(String title) { + IoBuffer buffer = bufferPool.allocate(4 + getAsciiString(title).length, false).order(ByteOrder.LITTLE_ENDIAN); + buffer.put(getAsciiString(title)); + int size = buffer.position(); + buffer.flip(); + buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 0x07, buffer, size + 4); + return buffer; + + } + public int getProfData(String profession) { switch (profession) { From de0255b3c7f73c174074400fdcc3f217f72fe73b Mon Sep 17 00:00:00 2001 From: Waverunner Date: Wed, 17 Jul 2013 10:50:46 -0400 Subject: [PATCH 2/4] /setcurrentskilltitle added --- scripts/commands/setcurrentskilltitle.py | 9 +++++++++ src/services/SimulationService.java | 1 + 2 files changed, 10 insertions(+) create mode 100644 scripts/commands/setcurrentskilltitle.py diff --git a/scripts/commands/setcurrentskilltitle.py b/scripts/commands/setcurrentskilltitle.py new file mode 100644 index 00000000..9ae1cb6e --- /dev/null +++ b/scripts/commands/setcurrentskilltitle.py @@ -0,0 +1,9 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + playerObject = actor.getSlottedObject('ghost') + playerObject.setTitle(str(commandString)) + return \ No newline at end of file diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 660ae50f..e47f5bf1 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -110,6 +110,7 @@ public class SimulationService implements INetworkDispatch { core.commandService.registerCommand("object"); core.commandService.registerCommand("getattributesbatch"); core.commandService.registerCommand("pvp"); + core.commandService.registerCommand("setcurrentskilltitle"); } From e7b01a437716634d5fca9da533dd8eb2bfc93ecb Mon Sep 17 00:00:00 2001 From: Waverunner Date: Thu, 25 Jul 2013 20:20:28 -0400 Subject: [PATCH 3/4] Trade Service added --- src/main/NGECore.java | 7 +- .../AbortTradeMessage.java | 25 ++ .../AcceptTransactionMessage.java | 25 ++ .../AddItemMessage.java | 54 ++++ .../BeginTradeMessage.java | 33 +++ .../BeginVerificationMessage.java | 22 ++ .../DenyTradeMessage.java | 24 ++ .../GiveMoneyMessage.java | 39 +++ .../RemoveItemMessage.java | 39 +++ .../TradeCompleteMessage.java | 24 ++ .../UnAcceptTransactionMessage.java | 24 ++ .../VerifyTradeMessage.java | 24 ++ .../objectControllerObjects/SecureTrade.java | 63 ++++ .../common/ObjControllerOpcodes.java | 1 + src/resources/common/Opcodes.java | 10 +- .../objects/group/GroupMessageBuilder.java | 26 -- .../objects/player/PlayerMessageBuilder.java | 12 - src/services/LoginService.java | 6 + src/services/trade/TradeService.java | 279 ++++++++++++++++++ 19 files changed, 697 insertions(+), 40 deletions(-) create mode 100644 src/protocol/swg/clientSecureTradeManager/AbortTradeMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/AcceptTransactionMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/AddItemMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/BeginTradeMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/BeginVerificationMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/DenyTradeMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/GiveMoneyMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/RemoveItemMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/TradeCompleteMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/UnAcceptTransactionMessage.java create mode 100644 src/protocol/swg/clientSecureTradeManager/VerifyTradeMessage.java create mode 100644 src/protocol/swg/objectControllerObjects/SecureTrade.java delete mode 100644 src/resources/objects/group/GroupMessageBuilder.java create mode 100644 src/services/trade/TradeService.java diff --git a/src/main/NGECore.java b/src/main/NGECore.java index f8cae0d5..34602e3f 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -45,6 +45,7 @@ import services.map.MapService; import services.object.ObjectService; import services.object.UpdateService; import services.sui.SUIService; +import services.trade.TradeService; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.CrcStringTableVisitor; import engine.clientdata.visitors.DatatableVisitor; @@ -99,6 +100,7 @@ public class NGECore { public SUIService suiService; public GuildService guildService; public GCWService gcwService; + public TradeService tradeService; // Login Server public NetworkDispatch loginDispatch; @@ -178,7 +180,7 @@ public class NGECore { terrainService.addPlanet(1, "tatooine", "terrain/tatooine.trn", true); terrainService.loadSnapShotObjects(); - + // Zone services that need to be loaded after the above simulationService = new SimulationService(this); zoneDispatch.addService(simulationService); @@ -189,6 +191,9 @@ public class NGECore { gcwService = new GCWService(this); zoneDispatch.addService(gcwService); + tradeService = new TradeService(this); + zoneDispatch.addService(tradeService); + didServerCrash = false; System.out.println("Started Server."); } diff --git a/src/protocol/swg/clientSecureTradeManager/AbortTradeMessage.java b/src/protocol/swg/clientSecureTradeManager/AbortTradeMessage.java new file mode 100644 index 00000000..fda11b4a --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/AbortTradeMessage.java @@ -0,0 +1,25 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class AbortTradeMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + data.getShort(); + data.getInt(); + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0x9CA80F98); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/AcceptTransactionMessage.java b/src/protocol/swg/clientSecureTradeManager/AcceptTransactionMessage.java new file mode 100644 index 00000000..2a50786a --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/AcceptTransactionMessage.java @@ -0,0 +1,25 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class AcceptTransactionMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + data.getShort(); + data.getInt(); + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0xB131CA17); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/AddItemMessage.java b/src/protocol/swg/clientSecureTradeManager/AddItemMessage.java new file mode 100644 index 00000000..5013afcf --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/AddItemMessage.java @@ -0,0 +1,54 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import main.NGECore; + +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.objects.SWGObject; +import protocol.swg.SWGMessage; + +public class AddItemMessage extends SWGMessage { + + private NGECore core; + private SWGObject tradeObject; + private long tradeObjectID; + + @Override + public void deserialize(IoBuffer data) { + data.getShort(); + data.getInt(); + setTradeObjectID(data.getLong()); + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(200).order(ByteOrder.LITTLE_ENDIAN); + result.setAutoExpand(true); + + result.putShort((short) 2); + result.putInt(0x1E8D1356); + result.putLong(tradeObjectID); + return result.flip(); + } + + public long getTradeObjectID() { + return this.tradeObjectID; + + } + + public SWGObject getTradeObject() { + return this.tradeObject; + } + + public void setTradeObject(SWGObject object) { + this.tradeObject = object; + this.tradeObjectID = object.getObjectID(); + } + + public void setTradeObjectID(long objectID) { + this.tradeObjectID = objectID; + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/BeginTradeMessage.java b/src/protocol/swg/clientSecureTradeManager/BeginTradeMessage.java new file mode 100644 index 00000000..b5481cd9 --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/BeginTradeMessage.java @@ -0,0 +1,33 @@ +package protocol.swg.clientSecureTradeManager; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class BeginTradeMessage extends SWGMessage { + + private long objectId; + + public BeginTradeMessage(long objectId) { + this.objectId = objectId; + } + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 2); + result.putInt(0x325932D8); + result.putLong(objectId); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/BeginVerificationMessage.java b/src/protocol/swg/clientSecureTradeManager/BeginVerificationMessage.java new file mode 100644 index 00000000..3ea0b7e0 --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/BeginVerificationMessage.java @@ -0,0 +1,22 @@ +package protocol.swg.clientSecureTradeManager; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class BeginVerificationMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20); + result.putShort((short) 1); + result.putInt(0xE7491DF5); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/DenyTradeMessage.java b/src/protocol/swg/clientSecureTradeManager/DenyTradeMessage.java new file mode 100644 index 00000000..7a8b97a7 --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/DenyTradeMessage.java @@ -0,0 +1,24 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class DenyTradeMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0x6EC28670); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/GiveMoneyMessage.java b/src/protocol/swg/clientSecureTradeManager/GiveMoneyMessage.java new file mode 100644 index 00000000..0cbbe5e8 --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/GiveMoneyMessage.java @@ -0,0 +1,39 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class GiveMoneyMessage extends SWGMessage { + + private int credits; + + @Override + public void deserialize(IoBuffer data) { + + data.getShort(); + data.getInt(); + + setTradingCredits(data.getInt()); + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(40).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 2); + result.putInt(0xD1527EE8); + result.putInt(credits); + return result.flip(); + } + + public int getTradingCredits() { + return this.credits; + } + + public void setTradingCredits(int credits) { + this.credits = credits; + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/RemoveItemMessage.java b/src/protocol/swg/clientSecureTradeManager/RemoveItemMessage.java new file mode 100644 index 00000000..ef5873f8 --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/RemoveItemMessage.java @@ -0,0 +1,39 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.objects.SWGObject; +import protocol.swg.SWGMessage; + +public class RemoveItemMessage extends SWGMessage { + + private long objectID; + + @Override + public void deserialize(IoBuffer data) { + data.getShort(); + data.getInt(); + + setObjectID(data.getLong()); + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0x4417AF8B); + result.putLong(objectID); + return result.flip(); + } + + public void setObjectID(long objectID) { + this.objectID = objectID; + } + + public long getObjectID() { + return this.objectID; + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/TradeCompleteMessage.java b/src/protocol/swg/clientSecureTradeManager/TradeCompleteMessage.java new file mode 100644 index 00000000..b557ba8c --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/TradeCompleteMessage.java @@ -0,0 +1,24 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class TradeCompleteMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0xC542038B); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/UnAcceptTransactionMessage.java b/src/protocol/swg/clientSecureTradeManager/UnAcceptTransactionMessage.java new file mode 100644 index 00000000..246888dd --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/UnAcceptTransactionMessage.java @@ -0,0 +1,24 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class UnAcceptTransactionMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0xE81E4382); + return result.flip(); + } + +} diff --git a/src/protocol/swg/clientSecureTradeManager/VerifyTradeMessage.java b/src/protocol/swg/clientSecureTradeManager/VerifyTradeMessage.java new file mode 100644 index 00000000..7e10fdbc --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/VerifyTradeMessage.java @@ -0,0 +1,24 @@ +package protocol.swg.clientSecureTradeManager; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class VerifyTradeMessage extends SWGMessage { + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + result.putShort((short) 1); + result.putInt(0x9AE247EE); + return result.flip(); + } + +} diff --git a/src/protocol/swg/objectControllerObjects/SecureTrade.java b/src/protocol/swg/objectControllerObjects/SecureTrade.java new file mode 100644 index 00000000..ddc089b7 --- /dev/null +++ b/src/protocol/swg/objectControllerObjects/SecureTrade.java @@ -0,0 +1,63 @@ +package protocol.swg.objectControllerObjects; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.objects.SWGObject; +import protocol.swg.ObjControllerMessage; +import resources.objects.creature.CreatureObject; + +public class SecureTrade extends ObjControllerObject{ + + private long senderID; + private long recieverID; + private short unknown; + + public SecureTrade() { + } + + @Override + public void deserialize(IoBuffer data) { + + //setUnknown(data.getShort()); + System.out.println("SecureTrade deserialize Dump: " + data.getHexDump()); + setSenderID(data.getLong()); // FINE AT SPOT GOT RIGHT SENDER ID. DUMPING DUMPS IT HERE. + data.getLong(); // skip through 0's + data.getLong(); // skip through 0's + setRecieverID(data.getLong()); + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(100).order(ByteOrder.LITTLE_ENDIAN); + result.setAutoExpand(true); + + result.putInt(ObjControllerMessage.SPACIAL_CHAT); + result.putInt(1); + result.putLong(senderID); + result.putLong(0); + result.putLong(0); + result.putLong(recieverID); + + return result.flip(); + } + + public long getSenderID() { return this.senderID; } + public long getRecieverID() { return this.recieverID; } + public short getUnkn() { return this.unknown; } + + public void setUnknown(short unknown) { + this.unknown = unknown; + } + public void setSenderID(long senderID) { + this.senderID = senderID; + } + + public void setRecieverID(long recieverID) { + this.recieverID = recieverID; + } + + +} diff --git a/src/resources/common/ObjControllerOpcodes.java b/src/resources/common/ObjControllerOpcodes.java index 00d21831..21b58e82 100644 --- a/src/resources/common/ObjControllerOpcodes.java +++ b/src/resources/common/ObjControllerOpcodes.java @@ -28,5 +28,6 @@ public class ObjControllerOpcodes { public static final int COMMAND_QUEUE_ENQUEUE = 0x16010000; public static final int TARGET_UPDATE = 0x26010000; public static final int OBJECT_MENU_REQUEST = 0x46010000; + public static final int SECURE_TRADE = 0x15010000; } diff --git a/src/resources/common/Opcodes.java b/src/resources/common/Opcodes.java index 1991054c..785e784d 100644 --- a/src/resources/common/Opcodes.java +++ b/src/resources/common/Opcodes.java @@ -44,5 +44,13 @@ public class Opcodes { public static int SelectCharacter = 0xB5098D76; public static int SuiEventNotification = 0x092D3564; public static int DeltasMessage = 0x12862153; - + public static int ChatAddFriend = 0x6FE7BD90; + public static int AbortTradeMessage = 0x9CA80F98; + public static int TradeCompleteMessage = 0xC542038B; + public static int AddItemMessage = 0x1E8D1356; + public static int RemoveItemMessage = 0x4417AF8B; + public static int GiveMoneyMessage = 0xD1527EE8; + public static int AcceptTransactionMessage = 0xB131CA17; + public static int UnAcceptTransactionMessage = 0xE81E4382; + public static int VerifyTradeMessage = 0x9AE247EE; } diff --git a/src/resources/objects/group/GroupMessageBuilder.java b/src/resources/objects/group/GroupMessageBuilder.java deleted file mode 100644 index e23f3ee6..00000000 --- a/src/resources/objects/group/GroupMessageBuilder.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 - * - * This File is part of NGECore2. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - * - * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. - * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. - ******************************************************************************/ -package resources.objects.group; - -public class GroupMessageBuilder { - -} diff --git a/src/resources/objects/player/PlayerMessageBuilder.java b/src/resources/objects/player/PlayerMessageBuilder.java index 0f49ec38..a7041609 100644 --- a/src/resources/objects/player/PlayerMessageBuilder.java +++ b/src/resources/objects/player/PlayerMessageBuilder.java @@ -400,18 +400,6 @@ public class PlayerMessageBuilder extends ObjectMessageBuilder { } } - - public IoBuffer buildTitleDelta(String title) { - - IoBuffer buffer = bufferPool.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(getAsciiString(title)); - int size = buffer.position(); - buffer.flip(); - buffer = createDelta("PLAY", (byte) 3, (short) 1, (short) 1, buffer, size + 4); - - return buffer; - - } @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 9f634be6..92a3d42c 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -136,6 +136,12 @@ public class LoginService implements INetworkDispatch{ StationIdHasJediSlot jediSlot = new StationIdHasJediSlot(false); ServerNowEpochTime time = new ServerNowEpochTime((int) (System.currentTimeMillis() / 1000)); + if (client.getSession().containsAttribute("tradeSession") == true) { + System.out.println("Has attribute: " + session.getAttribute("tradeSession").toString()); + client.getSession().removeAttribute("tradeSession"); + System.out.println("Removed tradeSession Attribute @ LoginService.java"); + } + session.write(time.serialize()); session.write(clientToken.serialize()); session.write(servers.serialize()); diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java new file mode 100644 index 00000000..8ba2e9a3 --- /dev/null +++ b/src/services/trade/TradeService.java @@ -0,0 +1,279 @@ +package services.trade; + +import java.nio.ByteOrder; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import main.NGECore; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + +import protocol.swg.ObjControllerMessage; +import protocol.swg.clientSecureTradeManager.AbortTradeMessage; +import protocol.swg.clientSecureTradeManager.AcceptTransactionMessage; +import protocol.swg.clientSecureTradeManager.AddItemMessage; +import protocol.swg.clientSecureTradeManager.BeginTradeMessage; +import protocol.swg.clientSecureTradeManager.GiveMoneyMessage; +import protocol.swg.clientSecureTradeManager.RemoveItemMessage; +import protocol.swg.clientSecureTradeManager.TradeCompleteMessage; +import protocol.swg.clientSecureTradeManager.UnAcceptTransactionMessage; +import protocol.swg.objectControllerObjects.SecureTrade; +import resources.common.ObjControllerOpcodes; +import resources.common.Opcodes; +import resources.objects.creature.CreatureObject; +import engine.clients.Client; +import engine.resources.objects.SWGObject; +import engine.resources.service.INetworkDispatch; +import engine.resources.service.INetworkRemoteEvent; + +public class TradeService implements INetworkDispatch{ + + private NGECore core; + + private long recieverID; + private long senderID; + + public TradeService(NGECore core) { + this.core = core; + } + + + @Override + public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + + objControllerOpcodes.put(ObjControllerOpcodes.SECURE_TRADE, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + data.order(ByteOrder.LITTLE_ENDIAN); + + SecureTrade request = new SecureTrade(); + request.deserialize(data); + + senderID = request.getSenderID(); + recieverID = request.getRecieverID(); + + CreatureObject recieverObject = (CreatureObject) core.objectService.getObject(recieverID); + CreatureObject senderObject = (CreatureObject) core.objectService.getObject(senderID); + + Client senderClient = senderObject.getClient(); + Client recieverClient = recieverObject.getClient(); + + int senderClientId = senderClient.getConnectionId(); + int recieverClientId = recieverClient.getConnectionId(); + + //System.out.println("Sender isConnected: " + senderObject.getClient().getSession().isConnected()); + //System.out.println("Reciever isConnected: " + recieverObject.getClient().getSession().isConnected()); + + if (recieverClient.getSession().containsAttribute("tradeSession") == true) { + + if(senderClient.getSession().containsAttribute("tradeSession") == false) { + { + senderClient.getSession().setAttribute("tradeSession", recieverID); + } + + BeginTradeMessage senderResponse = new BeginTradeMessage(recieverID); + senderClient.getSession().write(senderResponse.serialize()); + + BeginTradeMessage recieverResponse = new BeginTradeMessage(senderID); + recieverClient.getSession().write(recieverResponse.serialize()); + + } + + } + else { + + // creates a new trade session for the user who sent the request. It's given the objectID + // that the player wants to trade with. + senderClient.getSession().setAttribute("tradeSession", recieverID); + //System.out.println("Added trade session to " + senderClient.getParent().getCustomName() + " with the key of: " + senderClient.getSession().getAttribute("tradeSession").toString()); + + recieverObject.sendSystemMessage(senderObject.getCustomName() + " wants to trade with you.", (byte) 0); + + } + } + + }); + + swgOpcodes.put(Opcodes.AbortTradeMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + data.order(ByteOrder.LITTLE_ENDIAN); + data.position(0); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); + + CreatureObject tradee = (CreatureObject) core.objectService.getObject(tradingWithClient); + Client tradeeClient = tradee.getClient(); + + + if(client == null || client.getSession() == null) + return; + + SWGObject object = client.getParent(); + SWGObject tradeeObject = tradeeClient.getParent(); + if(object == null) + return; + + TradeCompleteMessage completeTrade = new TradeCompleteMessage(); + AbortTradeMessage response = new AbortTradeMessage(); + + tradeeClient.getSession().write(response.serialize()); + client.getSession().write(response.serialize()); + + client.getSession().removeAttribute("tradeSession"); + tradeeClient.getSession().removeAttribute("tradeSession"); + + if (tradeeClient.getSession().containsAttribute("tradeSession") && client.getSession().containsAttribute("tradeSession")) + return; + + client.getSession().write(completeTrade.serialize()); + tradeeClient.getSession().write(completeTrade.serialize()); + + } + + + }); + + swgOpcodes.put(Opcodes.AddItemMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + data.order(ByteOrder.LITTLE_ENDIAN); + data.position(0); + + AddItemMessage addItem = new AddItemMessage(); + addItem.deserialize(data); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + + long tradeItemID = addItem.getTradeObjectID(); + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); + + CreatureObject tradee = (CreatureObject) core.objectService.getObject(tradingWithClient); + SWGObject objectToTrade = (SWGObject) core.objectService.getObject(tradeItemID); + + if (objectToTrade == null) { + System.out.println("objectToTrade is null: " + tradeItemID); + return; + } + + System.out.println("Trading item: " + objectToTrade.getCustomName() + " detail: " + objectToTrade.getDetailFilename()); + + AddItemMessage tradeeResponse = new AddItemMessage(); + tradeeResponse.setTradeObjectID(tradeItemID); + tradee.getClient().getSession().write(tradeeResponse.serialize()); + + //System.out.println("AddItemMessage in TradeService: " + data.getHexDump()); + + } + + }); + + swgOpcodes.put(Opcodes.GiveMoneyMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + data.order(ByteOrder.LITTLE_ENDIAN); + data.position(0); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); + + CreatureObject tradingPartner = (CreatureObject) core.objectService.getObject(tradingWithClient); + CreatureObject sender = (CreatureObject) client.getParent(); + + GiveMoneyMessage fromClient = new GiveMoneyMessage(); + fromClient.deserialize(data); + + int givingCredits = fromClient.getTradingCredits(); + + if (givingCredits <= sender.getCashCredits()) { + + GiveMoneyMessage toTradingPartner = new GiveMoneyMessage(); + toTradingPartner.setTradingCredits(givingCredits); + + tradingPartner.getClient().getSession().write(toTradingPartner.serialize()); + } + + } + + }); + + swgOpcodes.put(Opcodes.RemoveItemMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { + + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.position(0); + + RemoveItemMessage request = new RemoveItemMessage(); + + long tradingObjectID = request.getObjectID(); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); + + CreatureObject tradePartner = (CreatureObject) core.objectService.getObject(tradingWithClient); + + RemoveItemMessage response = new RemoveItemMessage(); + response.setObjectID(tradingObjectID); + tradePartner.getClient().getSession().write(response.serialize()); + + } + + }); + + swgOpcodes.put(Opcodes.AcceptTransactionMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { + + // client sends this packet to the server and then the server sends it to client. + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); + + CreatureObject tradePartner = (CreatureObject) core.objectService.getObject(tradingWithClient); + + AcceptTransactionMessage acceptedTrade = new AcceptTransactionMessage(); + tradePartner.getClient().getSession().write(acceptedTrade.serialize()); + + } + + }); + + swgOpcodes.put(Opcodes.UnAcceptTransactionMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); + + CreatureObject tradePartner = (CreatureObject) core.objectService.getObject(tradingWithClient); + + UnAcceptTransactionMessage undoAccept = new UnAcceptTransactionMessage(); + tradePartner.getClient().getSession().write(undoAccept.serialize()); + } + + }); + + // TODO: Add verification system and item lists + + } + + + @Override + public void shutdown() { + // XXX Auto-generated method stub + + } + +} From 853948b97187f987eae3538eebb561497d7bcfe2 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Fri, 26 Jul 2013 14:10:15 -0400 Subject: [PATCH 4/4] Finished up TradeService, moved trading opcodes --- nge.cfg | 2 +- .../TradeOpcodes.java | 15 ++ .../objectControllerObjects/SecureTrade.java | 4 +- src/resources/common/Opcodes.java | 9 +- src/services/trade/TradeService.java | 238 ++++++++++++++++-- 5 files changed, 229 insertions(+), 39 deletions(-) create mode 100644 src/protocol/swg/clientSecureTradeManager/TradeOpcodes.java diff --git a/nge.cfg b/nge.cfg index 7c755fa7..9d193de7 100644 --- a/nge.cfg +++ b/nge.cfg @@ -8,6 +8,6 @@ PING.PORT=44462 DB.NAME=nge DB.USER=postgres DB.URL=localhost -DB.PASS= +DB.PASS=nge GALAXY_ID=2 GALAXY_NAME=Local Connection \ No newline at end of file diff --git a/src/protocol/swg/clientSecureTradeManager/TradeOpcodes.java b/src/protocol/swg/clientSecureTradeManager/TradeOpcodes.java new file mode 100644 index 00000000..dfea8dcd --- /dev/null +++ b/src/protocol/swg/clientSecureTradeManager/TradeOpcodes.java @@ -0,0 +1,15 @@ +package protocol.swg.clientSecureTradeManager; + +public class TradeOpcodes { + + public static int AbortTradeMessage = 0x9CA80F98; + public static int TradeCompleteMessage = 0xC542038B; + public static int AddItemMessage = 0x1E8D1356; + public static int RemoveItemMessage = 0x4417AF8B; + public static int GiveMoneyMessage = 0xD1527EE8; + public static int AcceptTransactionMessage = 0xB131CA17; + public static int UnAcceptTransactionMessage = 0xE81E4382; + public static int VerifyTradeMessage = 0x9AE247EE; + public static int AddItemFailedMessage = 0x69D3E1D2; + public static int BeginVerificationMessage = 0xE7491DF5; +} diff --git a/src/protocol/swg/objectControllerObjects/SecureTrade.java b/src/protocol/swg/objectControllerObjects/SecureTrade.java index ddc089b7..f07f1709 100644 --- a/src/protocol/swg/objectControllerObjects/SecureTrade.java +++ b/src/protocol/swg/objectControllerObjects/SecureTrade.java @@ -20,9 +20,7 @@ public class SecureTrade extends ObjControllerObject{ @Override public void deserialize(IoBuffer data) { - //setUnknown(data.getShort()); - System.out.println("SecureTrade deserialize Dump: " + data.getHexDump()); - setSenderID(data.getLong()); // FINE AT SPOT GOT RIGHT SENDER ID. DUMPING DUMPS IT HERE. + setSenderID(data.getLong()); data.getLong(); // skip through 0's data.getLong(); // skip through 0's setRecieverID(data.getLong()); diff --git a/src/resources/common/Opcodes.java b/src/resources/common/Opcodes.java index 785e784d..9501563f 100644 --- a/src/resources/common/Opcodes.java +++ b/src/resources/common/Opcodes.java @@ -45,12 +45,5 @@ public class Opcodes { public static int SuiEventNotification = 0x092D3564; public static int DeltasMessage = 0x12862153; public static int ChatAddFriend = 0x6FE7BD90; - public static int AbortTradeMessage = 0x9CA80F98; - public static int TradeCompleteMessage = 0xC542038B; - public static int AddItemMessage = 0x1E8D1356; - public static int RemoveItemMessage = 0x4417AF8B; - public static int GiveMoneyMessage = 0xD1527EE8; - public static int AcceptTransactionMessage = 0xB131CA17; - public static int UnAcceptTransactionMessage = 0xE81E4382; - public static int VerifyTradeMessage = 0x9AE247EE; + } diff --git a/src/services/trade/TradeService.java b/src/services/trade/TradeService.java index 8ba2e9a3..6757d951 100644 --- a/src/services/trade/TradeService.java +++ b/src/services/trade/TradeService.java @@ -1,6 +1,8 @@ package services.trade; import java.nio.ByteOrder; +import java.util.Hashtable; +import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -14,13 +16,15 @@ import protocol.swg.clientSecureTradeManager.AbortTradeMessage; import protocol.swg.clientSecureTradeManager.AcceptTransactionMessage; import protocol.swg.clientSecureTradeManager.AddItemMessage; import protocol.swg.clientSecureTradeManager.BeginTradeMessage; +import protocol.swg.clientSecureTradeManager.BeginVerificationMessage; +import protocol.swg.clientSecureTradeManager.DenyTradeMessage; import protocol.swg.clientSecureTradeManager.GiveMoneyMessage; import protocol.swg.clientSecureTradeManager.RemoveItemMessage; import protocol.swg.clientSecureTradeManager.TradeCompleteMessage; +import protocol.swg.clientSecureTradeManager.TradeOpcodes; import protocol.swg.clientSecureTradeManager.UnAcceptTransactionMessage; import protocol.swg.objectControllerObjects.SecureTrade; import resources.common.ObjControllerOpcodes; -import resources.common.Opcodes; import resources.objects.creature.CreatureObject; import engine.clients.Client; import engine.resources.objects.SWGObject; @@ -34,6 +38,14 @@ public class TradeService implements INetworkDispatch{ private long recieverID; private long senderID; + + private Hashtable tradingObjectsTable = new Hashtable(); + // key = objectToGive, value = giver's ID + + // need to be sure that no giver ID exists in table before adding value + private Hashtable tradingCreditsTable = new Hashtable(); + // key = ID of giver value = amnt recieving + public TradeService(NGECore core) { this.core = core; } @@ -67,7 +79,7 @@ public class TradeService implements INetworkDispatch{ //System.out.println("Reciever isConnected: " + recieverObject.getClient().getSession().isConnected()); if (recieverClient.getSession().containsAttribute("tradeSession") == true) { - + if(senderClient.getSession().containsAttribute("tradeSession") == false) { { senderClient.getSession().setAttribute("tradeSession", recieverID); @@ -87,7 +99,6 @@ public class TradeService implements INetworkDispatch{ // creates a new trade session for the user who sent the request. It's given the objectID // that the player wants to trade with. senderClient.getSession().setAttribute("tradeSession", recieverID); - //System.out.println("Added trade session to " + senderClient.getParent().getCustomName() + " with the key of: " + senderClient.getSession().getAttribute("tradeSession").toString()); recieverObject.sendSystemMessage(senderObject.getCustomName() + " wants to trade with you.", (byte) 0); @@ -96,7 +107,7 @@ public class TradeService implements INetworkDispatch{ }); - swgOpcodes.put(Opcodes.AbortTradeMessage, new INetworkRemoteEvent() { + swgOpcodes.put(TradeOpcodes.AbortTradeMessage, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer data) throws Exception { @@ -105,13 +116,24 @@ public class TradeService implements INetworkDispatch{ Client client = core.getClient((Integer) session.getAttribute("connectionId")); + if (client == null) + return; + + if (client.getSession().getAttribute("tradeSession") == null) + { + TradeCompleteMessage completeTrade = new TradeCompleteMessage(); + AbortTradeMessage nullResponse = new AbortTradeMessage(); + client.getSession().write(completeTrade.serialize()); + client.getSession().write(nullResponse.serialize()); + } + long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); CreatureObject tradee = (CreatureObject) core.objectService.getObject(tradingWithClient); Client tradeeClient = tradee.getClient(); - if(client == null || client.getSession() == null) + if(client.getSession() == null) return; SWGObject object = client.getParent(); @@ -119,18 +141,32 @@ public class TradeService implements INetworkDispatch{ if(object == null) return; + SWGObject tradeObject = null; + + Iterator> itr = tradingObjectsTable.entrySet().iterator(); + + while (itr.hasNext()) { + Map.Entry entry = itr.next(); + + if(tradingWithClient == entry.getValue()) { + tradeObject = entry.getKey(); + itr.remove(); + } + } + + client.getSession().removeAttribute("tradeSession"); + tradeeClient.getSession().removeAttribute("tradeSession"); + + // make sure that tradeSession got removed. + if (tradeeClient.getSession().containsAttribute("tradeSession") && client.getSession().containsAttribute("tradeSession")) + return; + TradeCompleteMessage completeTrade = new TradeCompleteMessage(); AbortTradeMessage response = new AbortTradeMessage(); tradeeClient.getSession().write(response.serialize()); client.getSession().write(response.serialize()); - client.getSession().removeAttribute("tradeSession"); - tradeeClient.getSession().removeAttribute("tradeSession"); - - if (tradeeClient.getSession().containsAttribute("tradeSession") && client.getSession().containsAttribute("tradeSession")) - return; - client.getSession().write(completeTrade.serialize()); tradeeClient.getSession().write(completeTrade.serialize()); @@ -139,7 +175,7 @@ public class TradeService implements INetworkDispatch{ }); - swgOpcodes.put(Opcodes.AddItemMessage, new INetworkRemoteEvent() { + swgOpcodes.put(TradeOpcodes.AddItemMessage, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer data) throws Exception { @@ -151,6 +187,9 @@ public class TradeService implements INetworkDispatch{ Client client = core.getClient((Integer) session.getAttribute("connectionId")); + if (client == null) + return; + long tradeItemID = addItem.getTradeObjectID(); long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); @@ -162,19 +201,23 @@ public class TradeService implements INetworkDispatch{ return; } - System.out.println("Trading item: " + objectToTrade.getCustomName() + " detail: " + objectToTrade.getDetailFilename()); - - AddItemMessage tradeeResponse = new AddItemMessage(); - tradeeResponse.setTradeObjectID(tradeItemID); - tradee.getClient().getSession().write(tradeeResponse.serialize()); - - //System.out.println("AddItemMessage in TradeService: " + data.getHexDump()); - + else { + + addItemForTrade(objectToTrade, tradingWithClient); + System.out.println("Trading item: " + objectToTrade.getCustomName() + " detail: " + objectToTrade.getDetailFilename()); + + System.out.println("tradingObjectTable: " + tradingObjectsTable.toString()); + AddItemMessage tradeeResponse = new AddItemMessage(); + tradeeResponse.setTradeObjectID(tradeItemID); + tradee.getClient().getSession().write(tradeeResponse.serialize()); + + //System.out.println("AddItemMessage in TradeService: " + data.getHexDump()); + } } }); - swgOpcodes.put(Opcodes.GiveMoneyMessage, new INetworkRemoteEvent() { + swgOpcodes.put(TradeOpcodes.GiveMoneyMessage, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer data) throws Exception { @@ -195,6 +238,8 @@ public class TradeService implements INetworkDispatch{ if (givingCredits <= sender.getCashCredits()) { + addMoneyForTrade(tradingWithClient, givingCredits); + GiveMoneyMessage toTradingPartner = new GiveMoneyMessage(); toTradingPartner.setTradingCredits(givingCredits); @@ -205,7 +250,7 @@ public class TradeService implements INetworkDispatch{ }); - swgOpcodes.put(Opcodes.RemoveItemMessage, new INetworkRemoteEvent() { + swgOpcodes.put(TradeOpcodes.RemoveItemMessage, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { @@ -215,7 +260,7 @@ public class TradeService implements INetworkDispatch{ RemoveItemMessage request = new RemoveItemMessage(); - long tradingObjectID = request.getObjectID(); + long objectToKeepID = request.getObjectID(); Client client = core.getClient((Integer) session.getAttribute("connectionId")); long tradingWithClient = (long) client.getSession().getAttribute("tradeSession"); @@ -223,14 +268,15 @@ public class TradeService implements INetworkDispatch{ CreatureObject tradePartner = (CreatureObject) core.objectService.getObject(tradingWithClient); RemoveItemMessage response = new RemoveItemMessage(); - response.setObjectID(tradingObjectID); + response.setObjectID(objectToKeepID); tradePartner.getClient().getSession().write(response.serialize()); + removeItemForTrade(core.objectService.getObject(objectToKeepID)); } }); - swgOpcodes.put(Opcodes.AcceptTransactionMessage, new INetworkRemoteEvent() { + swgOpcodes.put(TradeOpcodes.AcceptTransactionMessage, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { @@ -249,7 +295,7 @@ public class TradeService implements INetworkDispatch{ }); - swgOpcodes.put(Opcodes.UnAcceptTransactionMessage, new INetworkRemoteEvent() { + swgOpcodes.put(TradeOpcodes.UnAcceptTransactionMessage, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { @@ -263,12 +309,150 @@ public class TradeService implements INetworkDispatch{ tradePartner.getClient().getSession().write(undoAccept.serialize()); } + }); + // not used, but just in case.... VerifyTradeMessage is sent instead when a user + // hits the Accept button. Can use this as an additional check if need to. + swgOpcodes.put(TradeOpcodes.BeginVerificationMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { + System.out.println("Got BeginVerificationMessage"); + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + client.getSession().setAttribute("tradeSessionIsVerified"); + System.out.println("Verified client"); + + } + }); - // TODO: Add verification system and item lists + swgOpcodes.put(TradeOpcodes.VerifyTradeMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { + + // Sent first! + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + long tradingWithClient = (long) getTradeAttribute(client); + + CreatureObject tradePartner = (CreatureObject) core.objectService.getObject(tradingWithClient); + CreatureObject actingTrader = (CreatureObject) client.getParent(); + CreatureObject tradePartnerContainer = (CreatureObject) tradePartner.getContainer(); + + SWGObject tradePartnerInventory = tradePartner.getSlottedObject("inventory"); + SWGObject actingTraderInventory = actingTrader.getSlottedObject("inventory"); + SWGObject tradeObject = null; + + //if (tradePartner == null || actingTrader == null) + //return; + + //BeginVerificationMessage verifyMessage = new BeginVerificationMessage(); + //client.getSession().write(verifyMessage.serialize()); + //client.getSession().setAttribute("tradeSessionIsVerified"); + //tradePartner.getClient().getSession().write(verifyMessage.serialize()); + //tradePartner.getClient().getSession().setAttribute("tradeSessionIsVerified"); + + client.getSession().setAttribute("tradeSessionIsVerified"); + + if (tradePartner.getClient().getSession().getAttribute("tradeSessionIsVerified") == null) + return; + + else if (tradePartner.getClient().getSession().containsAttribute("tradeSessionIsVerified")) + { + + Iterator> itr = tradingObjectsTable.entrySet().iterator(); + + while (itr.hasNext()) { + Map.Entry entry = itr.next(); + + if(tradingWithClient == entry.getValue()) { + tradeObject = entry.getKey(); + if (actingTrader == null || tradePartnerContainer == null || tradePartner == null) + { + cleanTradeSession(client, tradePartner.getClient()); + } + actingTraderInventory.transferTo(tradePartner, tradePartnerInventory, tradeObject); + itr.remove(); + } + + } + + int moneyToGive = 0; + + for(Map.Entry entry : tradingCreditsTable.entrySet()) { + if(tradingWithClient == entry.getKey()) { + moneyToGive = entry.getValue(); + tradingCreditsTable.remove(tradingWithClient); + } + } + + int tradePartnerCredits = tradePartner.getCashCredits(); + + if (moneyToGive != 0) { + actingTrader.setCashCredits(tradePartnerCredits - moneyToGive); + tradePartner.setCashCredits(tradePartnerCredits + moneyToGive); + } + + + System.out.println("Finished trading items/credits"); + + cleanTradeSession(client, tradePartner.getClient()); + + } + + } + + }); } + public long getTradeAttribute(Client client) { + long tradeSessionValue; + tradeSessionValue = (long) client.getSession().getAttribute("tradeSession"); + return tradeSessionValue; + } + + public Hashtable getTradingObjectMap() { + return tradingObjectsTable; + } + + public void addItemForTrade(SWGObject swgObject, long tradePartnerID) { + if (tradingObjectsTable.containsKey(swgObject)) { + removeItemForTrade(swgObject); + } + tradingObjectsTable.put(swgObject, tradePartnerID); + } + + public void removeItemForTrade(SWGObject swgObject) { + tradingObjectsTable.remove(swgObject); + } + + public void addMoneyForTrade(long tradePartnerID, int creditsAmount) { + if (tradingCreditsTable.containsKey(tradePartnerID)) + { + removeMoneyForTrade(tradePartnerID); + } + tradingCreditsTable.put(tradePartnerID, creditsAmount); + } + + public void removeMoneyForTrade(long tradePartnerID) { + tradingCreditsTable.remove(tradePartnerID); + } + + public void cleanTradeSession(Client actorClient, Client targetTradeClient) { + + TradeCompleteMessage partnerCompleteTrade = new TradeCompleteMessage(); + targetTradeClient.getSession().write(partnerCompleteTrade.serialize()); + + TradeCompleteMessage clientCompleteTrade = new TradeCompleteMessage(); + actorClient.getSession().write(clientCompleteTrade.serialize()); + + actorClient.getSession().removeAttribute("tradeSession"); + actorClient.getSession().removeAttribute("tradeSessionIsVerified"); + targetTradeClient.getSession().removeAttribute("tradeSession"); + targetTradeClient.getSession().removeAttribute("tradeSessionIsVerified"); + + } @Override public void shutdown() {