public override void Buy(Player player) { Manager.Database.DoActionAsync(db => { if (ObjectType == 0x01ca) //Merchant { if (TryDeduct(player)) { for (var i = 0; i < player.Inventory.Length; i++) { try { XElement ist; Manager.GameData.ObjectTypeToElement.TryGetValue((ushort)MType, out ist); if (player.Inventory[i] == null && (player.SlotTypes[i] == 10 || player.SlotTypes[i] == Convert.ToInt16(ist.Element("SlotType").Value))) // Exploit fix - No more mnovas as weapons! { player.Inventory[i] = Manager.GameData.Items[(ushort)MType]; if (Currency == CurrencyType.Fame) player.CurrentFame = player.Client.Account.Stats.Fame = db.UpdateFame(player.Client.Account, -Price); if (Currency == CurrencyType.Gold) player.Credits = player.Client.Account.Credits = db.UpdateCredit(player.Client.Account, -Price); if (Currency == CurrencyType.FortuneTokens) player.Tokens = player.Client.Account.FortuneTokens = db.UpdateFortuneToken(player.Client.Account, -Price); player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "{\"key\":\"server.buy_success\"}" }); MRemaining--; player.UpdateCount++; player.SaveToCharacter(); UpdateCount++; return; } } catch (Exception e) { log.Error(e); } } player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "{\"key\":\"server.inventory_full\"}" }); } else { if (player.Stars < RankReq) { player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "Not enough stars!" }); return; } switch (Currency) { case CurrencyType.Gold: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_GOLD, Message = "{\"key\":\"server.not_enough_gold\"}" }); break; case CurrencyType.Fame: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_FAME, Message = "{\"key\":\"server.not_enough_fame\"}" }); break; case CurrencyType.FortuneTokens: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_FORTUNETOKENS, Message = "{\"key\":\"server.not_enough_fortunetokens\"}" }); break; } } } }); }
private void DoTrade() { string failedMsg = "Error while trading. Trade unsuccessful."; string msg = "Trade Successful!"; var thisItems = new List <Item>(); var targetItems = new List <Item>(); // make sure trade targets are valid if (tradeTarget == null || Owner == null || tradeTarget.Owner == null || Owner != tradeTarget.Owner) { if (this != null) { psr.SendPacket(new TradeDonePacket { Result = 1, Message = failedMsg }); } if (tradeTarget != null) { tradeTarget.psr.SendPacket(new TradeDonePacket { Result = 1, Message = failedMsg }); } //TODO - logThis return; } // get trade items for (int i = 4; i < Inventory.Length; i++) { if (trade[i] && !Inventory[i].Soulbound) { thisItems.Add(Inventory[i]); Inventory[i] = null; UpdateCount++; // save this trade info if (itemnumber1 == 0) { items1 = items1 + " " + thisItems[itemnumber1].ObjectId; } else if (itemnumber1 > 0) { items1 = items1 + ", " + thisItems[itemnumber1].ObjectId; } itemnumber1++; } if (tradeTarget.trade[i] && !tradeTarget.Inventory[i].Soulbound) { targetItems.Add(tradeTarget.Inventory[i]); tradeTarget.Inventory[i] = null; tradeTarget.UpdateCount++; // save target trade info if (itemnumber2 == 0) { items2 = items2 + " " + targetItems[itemnumber2].ObjectId; } else if (itemnumber2 > 0) { items2 = items2 + ", " + targetItems[itemnumber2].ObjectId; } itemnumber2++; } } // move thisItems -> tradeTarget for (int j = thisItems.Count - 1; j >= 0; j--) { for (int i = 0; i < tradeTarget.Inventory.Length; i++) { if ((tradeTarget.SlotTypes[i] == 0 && tradeTarget.Inventory[i] == null) || (thisItems[j] != null && tradeTarget.SlotTypes[i] == thisItems[j].SlotType && tradeTarget.Inventory[i] == null)) { tradeTarget.Inventory[i] = thisItems[j]; thisItems.RemoveAt(j); break; } } } // move tradeItems -> this for (int j = targetItems.Count - 1; j >= 0; j--) { for (int i = 0; i < Inventory.Length; i++) { if ((SlotTypes[i] == 0 && Inventory[i] == null) || (targetItems[j] != null && SlotTypes[i] == targetItems[j].SlotType && Inventory[i] == null)) { Inventory[i] = targetItems[j]; targetItems.RemoveAt(j); break; } } } // check for lingering items if (thisItems.Count > 0 || targetItems.Count > 0) { msg = "An error occured while trading! Some items were lost!"; } // trade successful, notify and save psr.SendPacket(new TradeDonePacket { Result = 1, Message = msg }); tradeTarget.psr.SendPacket(new TradeDonePacket { Result = 1, Message = msg }); SaveToCharacter(); psr.Save(); tradeTarget.SaveToCharacter(); tradeTarget.psr.Save(); // log trade const string dir = @"logs"; if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } using (var writer = new StreamWriter(@"logs\TradeLog.log", true)) { writer.WriteLine(Name + " traded " + "{" + items1 + "}" + " with " + tradeTarget.Name + " for " + "{" + items2 + "}"); } Console.Out.WriteLine(Name + " traded " + "{" + items1 + "}" + " with " + tradeTarget.Name + " for " + "{" + items2 + "}"); // clean up items1 = ""; items2 = ""; itemnumber1 = 0; itemnumber2 = 0; UpdateCount++; tradeTarget.UpdateCount++; name1 = ""; name2 = ""; tradeTarget.tradeTarget = null; tradeTarget.trade = null; tradeTarget.tradeAccepted = false; tradeTarget = null; trade = null; tradeAccepted = false; }