More trade stufs.

This commit is contained in:
SilicaAndPina 2021-02-24 22:36:15 +13:00
parent 0c511c73f2
commit 15ab1bccf7
8 changed files with 299 additions and 11 deletions

View file

@ -234,8 +234,8 @@
"you_offering":"<B>You are offering %PLAYERNAME% the following:</B> ",
"add_items":"^T6Add additional trade items:^D58|ADD^R1^H",
"other_offering":"<B>%PLAYERNAME% is offering you the following:</B>",
"add_items":"^T6Add additional trade items:^D58|ADD^R1",
"other_offering":"^H<B>%PLAYERNAME% is offering you the following:</B>",
"when_done_click":"^T8When you are done offering things click ^D59|DONE^R1",
"cancel_anytime":"^T6You may cancel trade at any time^B1J%PLAYERID%^R1",

View file

@ -45,9 +45,9 @@ namespace HISP.Game
public static string TradeOfferItem;
public static string TradeOfferItemFormat;
public static string TradeOfferObjectOtherPlayerInvFull;
public static string TradeOfferItemOtherPlayerInvFull;
// Trading : Money Offer Submenu
// Trading : Offer Submenu
public static string TradeMoneyOfferSubmenuFormat;
public static string TradeItemOfferSubmenuFormat;

View file

@ -41,6 +41,7 @@ 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)
@ -406,11 +407,114 @@ namespace HISP.Game
throw new Exception("A mathematically impossible error occured. please check wether the laws of physics still apply.");
}
public static string BuildTradeAdd(Trade trade)
{
string message = Messages.FormatTradeWhatToOffer(trade.OtherTrade.Trader.Username);
message += Messages.TradeOfferMoney;
message += Messages.TradeOfferHorse;
foreach(HorseInstance horse in trade.Trader.HorseInventory.HorseList)
{
bool tacked = (horse.Equipment.Saddle != null || horse.Equipment.SaddlePad != null || horse.Equipment.Bridle != null || horse.Equipment.Companion != null);
message += Messages.FormatTradeOfferHorse(horse.Name, tacked, horse.RandomId);
}
if(trade.Trader.Inventory.Count >= trade.Trader.MaxItems)
{
message += Messages.TradeOfferItemOtherPlayerInvFull;
}
else
{
message += Messages.TradeOfferItem;
foreach(InventoryItem item in trade.Trader.Inventory.GetItemList())
{
Item.ItemInformation itemInfo = Item.GetItemById(item.ItemId);
message += Messages.FormatTradeOfferItem(itemInfo.IconId, itemInfo.Name, item.ItemInstances.Count, item.ItemId);
}
}
message += Messages.BackToMap;
message += Messages.MetaTerminator;
return message;
}
public static string BuildTradeAddItem(int totalItems)
{
string message = "";
message += Messages.FormatTradeOfferItemSubmenu(totalItems);
message += Messages.BackToMap;
message += Messages.MetaTerminator;
return message;
}
public static string BuildTradeAddMoney(int curMoney)
{
string message = "";
message += Messages.FormatTradeOfferMoneySubmenu(curMoney);
message += Messages.BackToMap;
message += Messages.MetaTerminator;
return message;
}
public static string BuildTrade(Trade trade)
{
bool otherAccepted = (trade.OtherTrade.Stage == "ACCEPTED");
bool youAccepted = trade.Stage == "ACCEPTED";
string message = "";
message += Messages.FormatTradeWithPlayer(trade.OtherTrade.Trader.Username);
if (trade.Stage == "DONE" && trade.OtherTrade.Stage == "DONE")
message += Messages.TradeFinalReview;
else if (trade.Stage == "DONE")
message += Messages.TradeWaitingForOtherDone;
else if (trade.OtherTrade.Stage == "DONE")
message += Messages.TradeOtherPlayerIsDone;
message += Messages.FormatTradeYourOffering(trade.OtherTrade.Trader.Username);
if (trade.MoenyOffered == 0 && trade.ItemsOffered.Count == 0 && trade.HorsesOffered.Count == 0)
message += Messages.TradeOfferingNothing;
if (trade.MoenyOffered > 0)
message += Messages.FormatTradeMoneyOffer(trade.MoenyOffered);
if(trade.HorsesOffered.Count > 0)
foreach(HorseInstance horse in trade.HorsesOffered)
message += Messages.FormatTradeHorseOffer(horse.Name, horse.RandomId);
if(trade.ItemsOffered.Count > 0)
foreach(ItemInstance[] item in trade.ItemsOffered)
{
Item.ItemInformation itemInfo = item[0].GetItemInfo();
string name = itemInfo.Name;
if (item.Length > 1)
name = itemInfo.PluralName;
message += Messages.FormatTradeItemOffer(item.Length, name);
}
if(trade.Stage == "OPEN")
message += Messages.TradeAddItems;
message += Messages.FormatTradeOtherOffering(trade.OtherTrade.Trader.Username);
if (trade.OtherTrade.MoenyOffered == 0 && trade.OtherTrade.ItemsOffered.Count == 0 && trade.OtherTrade.HorsesOffered.Count == 0)
message += Messages.TradeOfferingNothing;
if (trade.OtherTrade.MoenyOffered > 0)
message += Messages.FormatTradeMoneyOffer(trade.OtherTrade.MoenyOffered);
if (trade.OtherTrade.HorsesOffered.Count > 0)
foreach (HorseInstance horse in trade.OtherTrade.HorsesOffered)
message += Messages.FormatTradeHorseOffer(horse.Name, horse.RandomId);
if (trade.OtherTrade.ItemsOffered.Count > 0)
foreach (ItemInstance[] item in trade.OtherTrade.ItemsOffered)
{
Item.ItemInformation itemInfo = item[0].GetItemInfo();
string name = itemInfo.Name;
if (item.Length > 1)
name = itemInfo.PluralName;
message += Messages.FormatTradeItemOffer(item.Length, name);
}
if (trade.Stage == "OPEN")
message += Messages.TradeWhenDoneClick;
if (((trade.Stage == "DONE" || trade.Stage == "ACCEPTED") && (trade.OtherTrade.Stage == "DONE" || trade.Stage == "ACCEPTED")) )
message += Messages.TradeAcceptTrade;
message += Messages.TradeCancelAnytime;
return message;
}

View file

@ -1,6 +1,8 @@
using HISP.Game.Horse;
using HISP.Game;
using HISP.Game.Horse;
using HISP.Game.Items;
using HISP.Security;
using HISP.Server;
using System;
using System.Collections.Generic;
using System.Linq;
@ -25,7 +27,38 @@ namespace HISP.Player
public int MoenyOffered = 0;
public List<HorseInstance> HorsesOffered = new List<HorseInstance>();
public List<ItemInstance> ItemsOffered = new List<ItemInstance>();
public List<ItemInstance[]> ItemsOffered = new List<ItemInstance[]>();
private void endTrade()
{
Trader.PendingTradeTo = 0;
Trader.TradingWith = null;
OtherTrade.Trader.PendingTradeTo = 0;
OtherTrade.Trader.TradingWith = null;
GameServer.UpdateArea(Trader.LoggedinClient);
GameServer.UpdateArea(OtherTrade.Trader.LoggedinClient);
}
public void CancelTrade()
{
byte[] tradeCanceled = PacketBuilder.CreateChat(Messages.TradeCanceledByYouMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
Trader.LoggedinClient.SendPacket(tradeCanceled);
byte[] tradeCanceledOther = PacketBuilder.CreateChat(Messages.FormatTradeCanceledByPlayer(Trader.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
OtherTrade.Trader.LoggedinClient.SendPacket(tradeCanceledOther);
endTrade();
}
public void CancelTradeMoved()
{
byte[] playerMoved = PacketBuilder.CreateChat(Messages.TradeCanceledBecuasePlayerMovedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
Trader.LoggedinClient.SendPacket(playerMoved);
OtherTrade.Trader.LoggedinClient.SendPacket(playerMoved);
endTrade();
}
}
}

View file

@ -78,6 +78,7 @@ namespace HISP.Player
public string PawneerOrderColor = "";
public string PawneerOrderGender = "";
public int PendingTradeTo;
public Mailbox MailBox;
public Friends Friends;
public string Password; // For chat filter.

View file

@ -838,7 +838,7 @@ namespace HISP.Server
Messages.TradeWhenDoneClick = gameData.messages.meta.player_interaction.trade.when_done_click;
Messages.TradeCancelAnytime = gameData.messages.meta.player_interaction.trade.cancel_anytime;
Messages.TradeAcceptedMessage = gameData.messages.meta.player_interaction.trade.accept_trade;
Messages.TradeAcceptTrade = gameData.messages.meta.player_interaction.trade.accept_trade;
Messages.TradeOfferingNothing = gameData.messages.meta.player_interaction.trade.offering_nothing;
Messages.TradeOfferingMoneyFormat = gameData.messages.meta.player_interaction.trade.offering_money;
@ -856,7 +856,7 @@ namespace HISP.Server
Messages.TradeOfferItem = gameData.messages.meta.player_interaction.trade.offer_object;
Messages.TradeOfferItemFormat = gameData.messages.meta.player_interaction.trade.offer_object_format;
Messages.TradeOfferObjectOtherPlayerInvFull = gameData.messages.meta.player_interaction.trade.offer_object_inv_full;
Messages.TradeOfferItemOtherPlayerInvFull = gameData.messages.meta.player_interaction.trade.offer_object_inv_full;
// Trading : Offer Submenu
@ -879,6 +879,7 @@ namespace HISP.Server
Messages.TradeAcceptedMessage = gameData.messages.meta.player_interaction.trade.trade_accepted;
Messages.TradeCanceledByYouMessage = gameData.messages.meta.player_interaction.trade.you_canceled;
Messages.TradeCanceledByOtherPlayerFormat = gameData.messages.meta.player_interaction.trade.other_canceled;
Messages.TradeCanceledBecuasePlayerMovedMessage = gameData.messages.meta.player_interaction.trade.trade_canceled_moved;
Messages.TradeCanceledInterupted = gameData.messages.meta.player_interaction.trade.trade_interupted;
Messages.TradeYouCantHandleMoreHorses = gameData.messages.meta.player_interaction.trade.cant_handle_more_horses;

View file

@ -200,6 +200,124 @@ namespace HISP.Server
Logger.ErrorPrint(sender.RemoteIp + " Requested Bird Map when not logged in.");
return;
}
byte method = packet[1];
switch(method)
{
case PacketBuilder.PLAYER_INTERACTION_TRADE_REJECT:
if (sender.LoggedinUser.TradingWith != null)
sender.LoggedinUser.TradingWith.CancelTrade();
break;
case PacketBuilder.PLAYER_INTERACTION_ADD_ITEM:
if (sender.LoggedinUser.TradingWith == null)
break;
if (packet.Length < 5)
break;
string packetStr = Encoding.UTF8.GetString(packet);
string idStr = packetStr.Substring(2, packetStr.Length - 4);
char firstChar = idStr[0];
switch(firstChar)
{
case '3': // Money
if (sender.LoggedinUser.Bids.Count > 0)
{
byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(cantBuyWhileAuctioning);
break;
}
byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddMoney(sender.LoggedinUser.Money));
sender.SendPacket(metaPacket);
break;
case '2': // Horse
string horseRandomIdStr = idStr.Substring(1);
int horseRandomId = -1;
try
{
horseRandomId = int.Parse(horseRandomIdStr);
}
catch (FormatException)
{
break;
}
if (!sender.LoggedinUser.HorseInventory.HorseIdExist(horseRandomId))
break;
HorseInstance horse = sender.LoggedinUser.HorseInventory.GetHorseById(horseRandomId);
sender.LoggedinUser.TradingWith.HorsesOffered.Add(horse);
UpdateArea(sender);
UpdateArea(sender.LoggedinUser.TradingWith.Trader.LoggedinClient);
break;
case '1': // Item
string itemIdStr = idStr.Substring(1);
int itemId = -1;
try
{
itemId = int.Parse(itemIdStr);
}
catch(FormatException)
{
break;
}
if (!sender.LoggedinUser.Inventory.HasItemId(itemId))
break;
InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
byte[] addItemPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddItem(item.ItemInstances.Count));
sender.SendPacket(addItemPacket);
break;
}
break;
case PacketBuilder.PLAYER_INTERACTION_TRADE:
packetStr = Encoding.UTF8.GetString(packet);
string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
int playerId = -1;
try
{
playerId = int.Parse(playerIdStr);
}
catch(FormatException)
{
Logger.InfoPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN.");
}
if(IsUserOnline(playerId))
{
User user = GetUserById(playerId);
byte[] tradeMsg = PacketBuilder.CreateChat(Messages.TradeRequiresBothPlayersMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(tradeMsg);
sender.LoggedinUser.PendingTradeTo = user.Id;
if (user.PendingTradeTo == sender.LoggedinUser.Id)
{
// Start Trade
Trade tradeWithYou = new Trade(sender.LoggedinUser);
Trade tradeWithOther = new Trade(user);
tradeWithYou.OtherTrade = tradeWithOther;
tradeWithOther.OtherTrade = tradeWithYou;
sender.LoggedinUser.TradingWith = tradeWithYou;
user.TradingWith = tradeWithOther;
UpdateArea(sender);
UpdateArea(user.LoggedinClient);
}
}
break;
default:
Logger.DebugPrint("Unknown Player interaction Method: 0x" + method.ToString("X") + " Packet: "+BitConverter.ToString(packet).Replace("-", " "));
break;
}
return;
}
public static void OnBirdMapRequested(GameClient sender, byte[] packet)
{
@ -2288,6 +2406,25 @@ namespace HISP.Server
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMiscStats(sender.LoggedinUser));
sender.SendPacket(metaPacket);
break;
case "58": // Add new item to trade
if(sender.LoggedinUser.TradingWith != null)
{
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAdd(sender.LoggedinUser.TradingWith));
sender.SendPacket(metaPacket);
}
break;
case "59": // Done
if (sender.LoggedinUser.TradingWith != null)
{
sender.LoggedinUser.TradingWith.Stage = "DONE";
if (sender.LoggedinUser.TradingWith.OtherTrade.Trader.MetaPriority == false)
UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
UpdateArea(sender);
}
break;
case "60": // Ranch Sell
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSellConfirmation());
@ -3874,6 +4011,9 @@ namespace HISP.Server
}
}
if (loggedInUser.TradingWith != null)
loggedInUser.TradingWith.CancelTradeMoved();
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true);
sender.SendPacket(moveResponse);
}
@ -6193,6 +6333,13 @@ namespace HISP.Server
return;
}
if(forClient.LoggedinUser.TradingWith != null)
{
forClient.LoggedinUser.MetaPriority = true;
byte[] tradeMeta = PacketBuilder.CreateMetaPacket(Meta.BuildTrade(forClient.LoggedinUser.TradingWith));
forClient.SendPacket(tradeMeta);
return;
}
forClient.LoggedinUser.MetaPriority = false;

View file

@ -52,7 +52,9 @@ namespace HISP.Server
public const byte PACKET_AUCTION = 0x24;
public const byte PACKET_PLAYER_INTERACTION = 0x2A;
public const byte PLAYER_INTERACTION_TRADE = 0x31;
public const byte PLAYER_INTERACTION_TRADE = 0x28;
public const byte PLAYER_INTERACTION_ADD_ITEM = 0x29;
public const byte PLAYER_INTERACTION_TRADE_REJECT = 0x2B;
public const byte AUCTION_BID_100 = 0x29;
public const byte AUCTION_BID_1K = 0x2A;