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;