Merged projectswg/holocore into quality_assurance

This commit is contained in:
DaddyAP
2017-07-16 18:06:01 -05:00
28 changed files with 1320 additions and 66 deletions
+25
View File
@@ -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);
@@ -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;
}
}
@@ -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);
@@ -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<Integer, TradeMessageType> 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);
}
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -0,0 +1,66 @@
/************************************************************************************
* 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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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() {
}
@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;
}
}
@@ -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 <http://www.gnu.org/licenses/>
******************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -0,0 +1,68 @@
/************************************************************************************
* 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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
public GiveMoneyMessage() {
super();
}
@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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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 <http://www.gnu.org/licenses/>. *
* *
***********************************************************************************/
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;
}
}
@@ -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;
@@ -59,8 +62,6 @@ import services.objects.StaticItemService.ObjectCreationHandler;
import services.player.PlayerManager;
import utilities.Scripts;
import java.util.Map;
/**
* Created by Waverunner on 8/19/2015
*/
@@ -186,15 +187,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());
@@ -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 true;
return canTradePartnerView(requester, container);
}
@Override
@@ -48,4 +52,18 @@ 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;
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);
}
}
+4
View File
@@ -295,6 +295,10 @@ public abstract class SWGObject extends BaselineObject implements Comparable<SWG
slots.put(name, value);
}
public boolean hasSlottedObject(SWGObject obj) {
return slots.containsValue(obj);
}
public Map<String, SWGObject> getSlots() {
return new HashMap<>(slots);
}
@@ -63,6 +63,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 {
@@ -83,6 +84,7 @@ public class CreatureObject extends TangibleObject {
private int battleFatigue = 0;
private long statesBitmask = 0;
private long lastTransform = 0;
private TradeSession tradeSession = null;
private SWGSet<String> skills = new SWGSet<String>(1, 3, StringType.ASCII);
@@ -265,8 +267,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());
@@ -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();
+5 -1
View File
@@ -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<Long, IntentChain> 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));
+10 -10
View File
@@ -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) {
+20
View File
@@ -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);
+6
View File
@@ -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());
@@ -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");
+269
View File
@@ -0,0 +1,269 @@
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.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.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.player.Player;
import resources.sui.SuiButtons;
import resources.sui.SuiMessageBox;
import services.objects.ObjectManager;
public class TradeService extends Service {
private final List<TradeSession> tradeSessions;
public TradeService() {
tradeSessions = new ArrayList<TradeSession>();
registerForIntent(GalacticPacketIntent.class, this::handleGalacticPacketIntent);
registerForIntent(PlayerEventIntent.class, this::handlePlayerEventIntent);
}
@Override
public boolean stop() {
for (TradeSession tradeSession : tradeSessions) {
tradeSession.sendAbortTrade();
}
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:
case PE_LOGGED_OUT:
session.sendAbortTrade();
break;
default:
break;
}
}
private void handleGalacticPacketIntent(GalacticPacketIntent gpi) {
Packet packet = gpi.getPacket();
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(), gpi.getObjectManager());
} 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(), gpi.getObjectManager());
} else if (packet instanceof TradeCompleteMessage){
handleTradeCompleteMessage(gpi.getPlayer());
}
}
private void handleSecureTrade(SecureTrade packet, Player player, ObjectManager objectManager) {
CreatureObject initiator = player.getCreatureObject();
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.isInCombat() || accepter.isInCombat()){
return;
}
if(initiator.getPosture() == Posture.INCAPACITATED || accepter.getPosture() == Posture.INCAPACITATED){
sendSystemMessage(initiator.getOwner(), "player_incapacitated");
return;
}
if(initiator.getPosture() == Posture.DEAD || accepter.getPosture() == Posture.DEAD){
sendSystemMessage(initiator.getOwner(), "player_dead");
return;
}
TradeSession tradeSession = new TradeSession(initiator, accepter);
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(), initiator, accepter, player.getCreatureObject().getObjectId());
}
private void handleAbortTradeMessage(Player player) {
TradeSession tradeSession = player.getCreatureObject().getTradeSession();
if(tradeSession == null)
return;
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();
if (tradeSession == null) {
Log.w("Invalid TradeSession for handleAddItemMessage. Creature %s: ", creature);
return;
}
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.sendAbortTrade();
}
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) {
TradeSession tradeSession = player.getCreatureObject().getTradeSession();
tradeSession.setMoneyAmount(player.getCreatureObject(), packet.getMoneyAmount());
tradeSession.sendToPartner(player.getCreatureObject(), new GiveMoneyMessage(packet.getMoneyAmount()));
}
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(creature.equals(accepter) && !tradeSession.isAccepterVerified()){
accepter.sendSelf(new VerifyTradeMessage());
tradeSession.setAccepterVerified(true);
}
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());
}
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.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?");
requestBox.display(accepter.getOwner());
requestBox.addOkButtonCallback("handleTradeRequest", (player, actor, event, paramenters)-> {
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().equals(initiator)){
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());
}
private void sendSystemMessage(Player player, String str) {
new ChatBroadcastIntent(player, "@ui_trade:" + str).broadcast();
}
}
+164
View File
@@ -0,0 +1,164 @@
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.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 {
private final List<SWGObject> initiatorTradeItems;
private final List<SWGObject> accepterTradeItems;
private final CreatureObject initiator;
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 = 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) {
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 creature) {
Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!");
if(isInitiator(creature)){
return accepter;
} else {
return initiator;
}
}
public List<SWGObject> getFromItemList(CreatureObject creature) {
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 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) {
Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!");
if(isInitiator(creature)){
getAccepter().getOwner().sendPacket(packet);
} else {
getInitiator().getOwner().sendPacket(packet);
}
}
public void setMoneyAmount(CreatureObject creature, int amount){
Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!");
if(isInitiator(creature)){
initiatorMoneyAmount.set(amount);
} else {
accepterMoneyAmount.set(amount);
}
}
public int getMoneyAmount(CreatureObject creature) {
Assert.test(isInTradeSession(creature), "Creature is not a part of this trade session!");
if(isInitiator(creature)){
return initiatorMoneyAmount.get();
} else {
return accepterMoneyAmount.get();
}
}
public void moveToPartnerInventory(CreatureObject partner, List<SWGObject> fromItemList) {
for (SWGObject tradeObject : fromItemList) {
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));
}
}