Add Trading :D

This commit is contained in:
SilicaAndPina 2021-02-26 14:01:38 +13:00
parent 507d8910dc
commit ee3fc56839
7 changed files with 237 additions and 13 deletions

View file

@ -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":"<B>Final Trade Review - Only accept if you feel trade is 100% Fair!</B>",
"final_review":"^H<B>Final Trade Review - Only accept if you feel trade is 100% Fair!</B>",
"you_offering":"<B>You are offering %PLAYERNAME% the following:</B> ",
"you_offering":"^H<B>You are offering %PLAYERNAME% the following:</B> ",
"add_items":"^T6Add additional trade items:^D58|ADD^R1",
"other_offering":"^H<B>%PLAYERNAME% is offering you the following:</B>",
@ -262,6 +262,8 @@
"money_offer_submenu":"<B>How much money do you want to OFFER player?</B>^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":"<B>Players Nearby:</B>",
"players_nearby":"<B>Players Nearby:</B><BR>",
"east":"<B>East:</B>",
"west":"<B>West:</B>",
"south":"<B>South:</B>",

View file

@ -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;

View file

@ -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; // <BR>
string npc = buildNpc(user, specialTile.X, specialTile.Y);
message += npc;

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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;