diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json
index c460acc..550ec53 100755
--- a/DataCollection/gamedata.json
+++ b/DataCollection/gamedata.json
@@ -226,13 +226,13 @@
"tag_button":"^B1X%PLAYERID%",
"pm_button":"^B1P%PLAYERNAME%",
"trade":{
- "trading_with":"^ATTrading with %PLAYERNAME%^H",
+ "trading_with":"^ATTrading with %PLAYERNAME%",
"trade_wait_for_done":"^LWaiting for other player to click DONE.^R1",
"other_player_is_done":"^LOther player is DONE adding things to the offer.^R1",
- "final_review":"Final Trade Review - Only accept if you feel trade is 100% Fair!",
+ "final_review":"^HFinal Trade Review - Only accept if you feel trade is 100% Fair!",
- "you_offering":"You are offering %PLAYERNAME% the following: ",
+ "you_offering":"^HYou are offering %PLAYERNAME% the following: ",
"add_items":"^T6Add additional trade items:^D58|ADD^R1",
"other_offering":"^H%PLAYERNAME% is offering you the following:",
@@ -262,6 +262,8 @@
"money_offer_submenu":"How much money do you want to OFFER player?^PMAmount of money to offer:|%CURRENTMONEYOFFER%^PS3|Add to offer^R1",
"object_offer_submenu":"^PMQuantity of item (%QUANTITY% max):|1^R1^PS3|Add to offer^R1",
+
+
"waiting_for_other_to_accept":"Waiting for other player to Accept or Reject trade...",
"requires_both_players":"Trade process requires other player to click TRADE with you also before it will start.",
@@ -282,6 +284,9 @@
"cant_handle_more_horses":"You cannot handle this many more horses!",
"other_player_cant_handle_more_horses":"Player %PLAYERNAME% cannot handle this many more horses!",
+ "other_carry_more":"Buyer cannot carry that quantity of one of the items!",
+ "you_cant_carry_more":"You cannot carry that quantity of one of the items!",
+
"trade_spent":"You spent $%MONEY% in the trade.",
"trade_received":"You received $%MONEY% in the trade.",
@@ -998,7 +1003,7 @@
"grab_all":"^T3^B4R^R1"
},
"nearby":{
- "players_nearby":"Players Nearby:",
+ "players_nearby":"Players Nearby:
",
"east":"East:",
"west":"West:",
"south":"South:",
diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs
index 5adc9c9..c4a5c40 100755
--- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs
+++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs
@@ -77,6 +77,9 @@ namespace HISP.Game
public static string TradeYouSpentMoneyMessageFormat;
public static string TradeYouReceivedMoneyMessageFormat;
+ public static string TradeYouCantCarryMoreItems;
+ public static string TradeOtherCantCarryMoreItems;
+
public static string TradeNotAllowedWhileBidding;
public static string TradeNotAllowedWhileOtherBidding;
diff --git a/Horse Isle Server/HorseIsleServer/Game/Meta.cs b/Horse Isle Server/HorseIsleServer/Game/Meta.cs
index 801e97c..ab0cb4b 100755
--- a/Horse Isle Server/HorseIsleServer/Game/Meta.cs
+++ b/Horse Isle Server/HorseIsleServer/Game/Meta.cs
@@ -41,7 +41,6 @@ namespace HISP.Game
User[] playersAt = GameServer.GetUsersAt(x, y, true, true);
if(playersAt.Length > 1)
{
- playersHere += Messages.Seperator;
playersHere += Messages.PlayersHere;
int count = 0;
foreach(User playerAt in playersAt)
@@ -72,7 +71,7 @@ namespace HISP.Game
return playersHere;
}
- private static string buildNearbyString(int x, int y)
+ private static string buildNearbyString(int x, int y, bool showNearbyPlayersHeader=true)
{
string playersNearby = "";
@@ -80,9 +79,10 @@ namespace HISP.Game
int count = 0;
if (nearbyUsers.Length > 1)
{
- playersNearby += Messages.Seperator;
- playersNearby += Messages.NearbyPlayers;
- playersNearby += Messages.Seperator;
+ if(showNearbyPlayersHeader)
+ {
+ playersNearby += Messages.NearbyPlayers;
+ }
string usersWest = "";
string usersNorth = "";
@@ -956,7 +956,8 @@ namespace HISP.Game
public static string BuildNearbyList(User user)
{
- string message = Messages.NearbyPlayersListHeader;
+ string message = "";
+ message += Messages.NearbyPlayersListHeader;
User[] nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, false, true);
foreach (User nearbyUser in nearbyUsers)
{
@@ -2558,6 +2559,7 @@ namespace HISP.Game
if (specialTile.Description != null && specialTile.Description != "")
message += specialTile.Description;
+ message += Messages.Seperator; //
string npc = buildNpc(user, specialTile.X, specialTile.Y);
message += npc;
diff --git a/Horse Isle Server/HorseIsleServer/Player/Trade.cs b/Horse Isle Server/HorseIsleServer/Player/Trade.cs
index b31150a..bd087bd 100644
--- a/Horse Isle Server/HorseIsleServer/Player/Trade.cs
+++ b/Horse Isle Server/HorseIsleServer/Player/Trade.cs
@@ -1,5 +1,6 @@
using HISP.Game;
using HISP.Game.Horse;
+using HISP.Game.Inventory;
using HISP.Game.Items;
using HISP.Security;
using HISP.Server;
@@ -41,6 +42,164 @@ namespace HISP.Player
GameServer.UpdateArea(OtherTrade.Trader.LoggedinClient);
}
+ public void CompleteTrade()
+ {
+ bool fail = false;
+ // Check hell
+ if (OtherTrade.Trader.Money < 0)
+ {
+ byte[] otherNegativeMoneyNotAllowed = PacketBuilder.CreateChat(Messages.TradeOtherPlayerHasNegativeMoney, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(otherNegativeMoneyNotAllowed);
+ fail = true;
+ }
+ if (Trader.Money < 0)
+ {
+ byte[] negativeMoneyNotAllowed = PacketBuilder.CreateChat(Messages.TradeYouHaveNegativeMoney, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(negativeMoneyNotAllowed);
+ fail = true;
+ }
+ if (OtherTrade.Trader.Bids.Count > 0)
+ {
+ byte[] tradeNotAllowedWhileOtherBidding = PacketBuilder.CreateChat(Messages.TradeNotAllowedWhileOtherBidding, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeNotAllowedWhileOtherBidding);
+ fail = true;
+ }
+ if (Trader.Bids.Count > 0)
+ {
+ byte[] tradeNotAllowedWhileBidding = PacketBuilder.CreateChat(Messages.TradeNotAllowedWhileBidding, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeNotAllowedWhileBidding);
+ fail = true;
+ }
+ if (OtherTrade.Trader.HorseInventory.HorseList.Length > OtherTrade.Trader.MaxHorses)
+ {
+ byte[] tradeYouHaveTooManyHorses = PacketBuilder.CreateChat(Messages.TradeYouCantHandleMoreHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeYouHaveTooManyHorses);
+ fail = true;
+ }
+ if (Trader.HorseInventory.HorseList.Length > Trader.MaxHorses)
+ {
+ byte[] tradeYouHaveTooManyHorses = PacketBuilder.CreateChat(Messages.TradeYouCantHandleMoreHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeYouHaveTooManyHorses);
+ fail = true;
+ }
+
+
+ /*
+ * Item Checks
+ */
+
+ bool itemYouFail = false;
+ foreach (ItemInstance[] inst in OtherTrade.ItemsOffered)
+ {
+ if (Trader.Inventory.HasItemId(inst[0].ItemId))
+ {
+ InventoryItem items = Trader.Inventory.GetItemByItemId(inst[0].ItemId);
+ if (items.ItemInstances.Count + inst.Length >= ConfigReader.MAX_STACK)
+ {
+ itemYouFail = true;
+ }
+ }
+ }
+
+ if (itemYouFail)
+ {
+ fail = true;
+ byte[] tradeTooManyItems = PacketBuilder.CreateChat(Messages.TradeYouCantCarryMoreItems, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeTooManyItems);
+ }
+
+ bool itemOtherFail = false;
+ foreach (ItemInstance[] inst in ItemsOffered)
+ {
+ if (OtherTrade.Trader.Inventory.HasItemId(inst[0].ItemId))
+ {
+ InventoryItem items = OtherTrade.Trader.Inventory.GetItemByItemId(inst[0].ItemId);
+ if (items.ItemInstances.Count + inst.Length >= ConfigReader.MAX_STACK)
+ {
+ itemOtherFail = true;
+ }
+ }
+ }
+
+ if (itemOtherFail)
+ {
+ fail = true;
+ byte[] tradeTooManyItems = PacketBuilder.CreateChat(Messages.TradeOtherCantCarryMoreItems, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeTooManyItems);
+ }
+
+ if (fail)
+ goto cancelTrade;
+ else
+ goto acceptTrade;
+
+
+ acceptTrade:;
+ byte[] tradeAccepted = PacketBuilder.CreateChat(Messages.TradeAcceptedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeAccepted);
+
+ if (MoneyOffered > 0) // Transfer Money
+ {
+ Trader.Money -= MoneyOffered;
+ byte[] tradeSpentMoney = PacketBuilder.CreateChat(Messages.FormatTradeYouSpent(MoneyOffered), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeSpentMoney);
+ }
+
+ if(OtherTrade.MoneyOffered > 0)
+ {
+ Trader.Money += OtherTrade.MoneyOffered;
+ byte[] tradeReceivedMoney = PacketBuilder.CreateChat(Messages.FormatTradeYouReceived(OtherTrade.MoneyOffered), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeReceivedMoney);
+ }
+
+ foreach (HorseInstance inst in HorsesOffered) // Transfer Horses
+ {
+ inst.Owner = OtherTrade.Trader.Id;
+ Trader.HorseInventory.DeleteHorse(inst, false);
+ OtherTrade.Trader.HorseInventory.AddHorse(inst, false);
+ }
+
+ foreach (ItemInstance[] item in ItemsOffered) // Transfer Items
+ {
+ foreach (ItemInstance itm in item)
+ {
+ Trader.Inventory.Remove(itm);
+ OtherTrade.Trader.Inventory.Add(itm);
+ }
+ }
+
+
+ Trader.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Trading).Count++;
+
+
+ if (Trader.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Trading).Count >= 100)
+ Trader.Awards.AddAward(Award.GetAwardById(29)); // Trader
+ if (Trader.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Trading).Count >= 1000)
+ Trader.Awards.AddAward(Award.GetAwardById(50)); // Pro Trader
+
+ endTrade();
+ return;
+
+ cancelTrade:;
+ byte[] tradeCanceled = PacketBuilder.CreateChat(Messages.TradeCanceledInterupted, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(tradeCanceled);
+ endTrade();
+ return;
+
+ }
+ public void AcceptTrade()
+ {
+ byte[] waitingForAccept = PacketBuilder.CreateChat(Messages.TradeWaitingForOthersToAcceptMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ Trader.LoggedinClient.SendPacket(waitingForAccept);
+
+ if (OtherTrade.Stage == "ACCEPTED")
+ {
+ CompleteTrade();
+ OtherTrade.CompleteTrade();
+ }
+
+ Stage = "ACCEPTED";
+ }
public void CancelTrade()
{
byte[] tradeCanceled = PacketBuilder.CreateChat(Messages.TradeCanceledByYouMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs
index c3176ee..6599a77 100755
--- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs
+++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs
@@ -885,6 +885,9 @@ namespace HISP.Server
Messages.TradeYouCantHandleMoreHorses = gameData.messages.meta.player_interaction.trade.cant_handle_more_horses;
Messages.TradeOtherPlayerCantHandleMoreHorsesFormat = gameData.messages.meta.player_interaction.trade.other_player_cant_handle_more_horses;
+ Messages.TradeOtherCantCarryMoreItems = gameData.messages.meta.player_interaction.trade.other_carry_more;
+ Messages.TradeYouCantCarryMoreItems = gameData.messages.meta.player_interaction.trade.you_cant_carry_more;
+
Messages.TradeYouSpentMoneyMessageFormat = gameData.messages.meta.player_interaction.trade.trade_spent;
Messages.TradeYouReceivedMoneyMessageFormat = gameData.messages.meta.player_interaction.trade.trade_received;
diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs
index 85abf89..2255850 100755
--- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs
+++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs
@@ -207,6 +207,10 @@ namespace HISP.Server
if (sender.LoggedinUser.TradingWith != null)
sender.LoggedinUser.TradingWith.CancelTrade();
break;
+ case PacketBuilder.PLAYER_INTERACTION_ACCEPT:
+ if (sender.LoggedinUser.TradingWith != null)
+ sender.LoggedinUser.TradingWith.AcceptTrade();
+ break;
case PacketBuilder.PLAYER_INTERACTION_ADD_ITEM:
if (sender.LoggedinUser.TradingWith == null)
break;
@@ -228,6 +232,7 @@ namespace HISP.Server
}
sender.LoggedinUser.TradeMenuPriority = true;
+ sender.LoggedinUser.AttemptingToOfferItem = -1;
byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddMoney(sender.LoggedinUser.TradingWith.MoneyOffered));
sender.SendPacket(metaPacket);
@@ -252,8 +257,8 @@ namespace HISP.Server
sender.LoggedinUser.TradingWith.HorsesOffered.Add(horse);
UpdateArea(sender);
- if(!sender.LoggedinUser.TradingWith.Trader.TradeMenuPriority)
- UpdateArea(sender.LoggedinUser.TradingWith.Trader.LoggedinClient);
+ if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
+ UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
break;
case '1': // Item
@@ -1879,10 +1884,40 @@ namespace HISP.Server
}
break;
- case 3: // Add Item to Trade
+ case 3: // Add Item or Money to Trade
{
if (dynamicInput.Length >= 2)
{
+ if(sender.LoggedinUser.AttemptingToOfferItem == -1) // Money
+ {
+ string answer = dynamicInput[1];
+ int amountMoney = -1;
+ try
+ {
+ amountMoney = int.Parse(answer);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (Money TRADE, amount is NaN)");
+ }
+
+ if(sender.LoggedinUser.Money <= amountMoney)
+ {
+ byte[] tooMuchMoney = PacketBuilder.CreateChat(Messages.TradeMoneyOfferTooMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooMuchMoney);
+ break;
+ }
+
+ sender.LoggedinUser.TradingWith.MoneyOffered = amountMoney;
+
+ UpdateArea(sender);
+ if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
+ UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
+ break;
+ }
+
+
+
if (Item.ItemIdExist(sender.LoggedinUser.AttemptingToOfferItem))
{
string answer = dynamicInput[1];
@@ -2731,6 +2766,12 @@ namespace HISP.Server
sender.SendPacket(soldHorseMessage);
sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count++;
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 100)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(44)); // Vendor
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(45)); // Pro Vendor
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(52)); // Top Vendor
UpdateArea(sender);
@@ -3400,6 +3441,16 @@ namespace HISP.Server
break;
}
sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count++;
+
+ if(sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 100)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(30)); // Well Wisher
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(31)); // Star Wisher
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(51)); // Extraordanary Wisher
+
byte[] msg = PacketBuilder.CreateChat(message, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(msg);
diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs
index 3757570..577eb6f 100755
--- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs
+++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs
@@ -54,6 +54,7 @@ namespace HISP.Server
public const byte PLAYER_INTERACTION_TRADE = 0x28;
public const byte PLAYER_INTERACTION_ADD_ITEM = 0x29;
+ public const byte PLAYER_INTERACTION_ACCEPT = 0x2A;
public const byte PLAYER_INTERACTION_TRADE_REJECT = 0x2B;
public const byte AUCTION_BID_100 = 0x29;