protected override bool Process(Player player, RealmTime time, string args) { if (args.Length == 0) { player.SendHelp("Usage: /gimme <Itemname>"); return false; } ushort objType; if (!player.Manager.GameData.IdToObjectType.TryGetValue(args, out objType)) { player.SendError("Unknown item type!"); return false; } for (int i = 0; i < player.Inventory.Length; i++) if (player.Inventory[i] == null) { player.Inventory[i] = player.Manager.GameData.Items[objType]; player.UpdateCount++; player.SaveToCharacter(); player.SendInfo("Success!"); return true; } player.SendError("Not enough space in inventory!"); return false; }
private void DoTrade() { if (tradeTarget != null && Owner != null && tradeTarget.Owner != null && Owner == tradeTarget.Owner) { int thisemptyslots = 0; int targetemptyslots = 0; List <Item> thisItems = new List <Item>(); List <ItemData> thisDatas = new List <ItemData>(); for (int i = 0; i < trade.Length; i++) { if (trade[i]) { thisItems.Add(Inventory[i]); thisDatas.Add(Inventory.Data[i]); Inventory[i] = null; Inventory.Data[i] = null; UpdateCount++; if (itemnumber1 == 0) { try { items1 = items1 + " " + thisItems[itemnumber1].ObjectId; } catch (Exception e) { client.SendPacket(new TradeDonePacket { Result = 1, Message = "Error." }); log.Error(e); } } else if (itemnumber1 > 0) { items1 = items1 + ", " + thisItems[itemnumber1].ObjectId; } itemnumber1++; } } List <Item> targetItems = new List <Item>(); List <ItemData> targetDatas = new List <ItemData>(); for (int i = 0; i < tradeTarget.trade.Length; i++) { if (tradeTarget.trade[i]) { targetItems.Add(tradeTarget.Inventory[i]); targetDatas.Add(tradeTarget.Inventory.Data[i]); tradeTarget.Inventory[i] = null; tradeTarget.Inventory.Data[i] = null; tradeTarget.UpdateCount++; if (itemnumber2 == 0) { try { items2 = items2 + " " + targetItems[itemnumber2].ObjectId; } catch (Exception e) { client.SendPacket(new TradeDonePacket { Result = 1, Message = "Error." }); log.Error(e); } } else if (itemnumber2 > 0) { items2 = items2 + ", " + targetItems[itemnumber2].ObjectId; } itemnumber2++; } } for (int i = 0; i != Inventory.Length; i++) { if (Inventory[i] == null) { if (SlotTypes[i] == 10) { thisemptyslots++; } else { for (int j = 0; j < targetItems.Count; j++) { if (targetItems[j].SlotType == SlotTypes[i]) { thisemptyslots++; break; } } } } } for (int i = 0; i != tradeTarget.Inventory.Length; i++) { if (SlotTypes[i] == 10) { targetemptyslots++; } else { for (int j = 0; j < thisItems.Count; j++) { try { if (thisItems[j].SlotType == SlotTypes[i]) { targetemptyslots++; break; } } catch (Exception e) { client.SendPacket(new TradeDonePacket { Result = 1, Message = "Error." }); log.Error(e); } } } } if (targetemptyslots >= thisItems.Count && thisemptyslots >= targetItems.Count) { if (targetItems.Count == 0) { targetItems.Add(null); targetDatas.Add(null); } if (thisItems.Count == 0) { thisItems.Add(null); thisDatas.Add(null); } for (int i = 0; i < Inventory.Length; i++) //put items by slotType { if (Inventory[i] == null) { if (SlotTypes[i] == 10) { Inventory[i] = targetItems[0]; Inventory.Data[i] = targetDatas[0]; if (Inventory.Data[i] != null) { Inventory.Data[i].ResetStrange(); } targetItems.RemoveAt(0); targetDatas.RemoveAt(0); } else { int itmIdx = -1; for (int j = 0; j < targetItems.Count; j++) { try { if (targetItems[j].SlotType == SlotTypes[i] && targetItems[j].LevelRequirement <= Level) { itmIdx = j; break; } } catch { itmIdx = -1; } } if (itmIdx != -1) { Inventory[i] = targetItems[itmIdx]; Inventory.Data[i] = targetDatas[itmIdx]; if (Inventory.Data[i] != null) { Inventory.Data[i].ResetStrange(); } targetItems.RemoveAt(itmIdx); targetDatas.RemoveAt(itmIdx); } } if (targetItems.Count == 0) { break; } } } for (int i = 0; i < tradeTarget.Inventory.Length; i++) //put items by slotType { if (tradeTarget.Inventory[i] == null) { if (tradeTarget.SlotTypes[i] == 10) { tradeTarget.Inventory[i] = thisItems[0]; tradeTarget.Inventory.Data[i] = thisDatas[0]; if (tradeTarget.Inventory.Data[i] != null) { tradeTarget.Inventory.Data[i].ResetStrange(); } thisItems.RemoveAt(0); thisDatas.RemoveAt(0); } else { int itmIdx = -1; for (int j = 0; j < thisItems.Count; j++) { try { if (thisItems[j].SlotType == tradeTarget.SlotTypes[i] && thisItems[i].LevelRequirement <= tradeTarget.Level) { itmIdx = j; break; } } catch { itmIdx = -1; } } if (itmIdx != -1) { tradeTarget.Inventory[i] = thisItems[itmIdx]; tradeTarget.Inventory.Data[i] = thisDatas[itmIdx]; if (tradeTarget.Inventory.Data[i] != null) { tradeTarget.Inventory.Data[i].ResetStrange(); } thisItems.RemoveAt(itmIdx); thisDatas.RemoveAt(itmIdx); } } if (thisItems.Count == 0) { break; } } } client.SendPacket(new TradeDonePacket { Result = 1, Message = "Trade successful!" }); tradeTarget.client.SendPacket(new TradeDonePacket { Result = 1, Message = "Trade successful!" }); items1 = ""; items2 = ""; itemnumber1 = 0; itemnumber2 = 0; UpdateCount++; SaveToCharacter(); tradeTarget.UpdateCount++; tradeTarget.SaveToCharacter(); tradeTarget.tradeTarget = null; tradeTarget.trade = null; tradeTarget.tradeAccepted = false; tradeTarget = null; trade = null; tradeAccepted = false; } else { client.SendPacket(new TradeDonePacket { Result = 1, Message = "Exploit Halted! You have been logged." }); tradeTarget.client.SendPacket(new TradeDonePacket { Result = 1, Message = "Exploit Halted! You have been logged." }); items1 = ""; items2 = ""; itemnumber1 = 0; itemnumber2 = 0; UpdateCount++; tradeTarget.UpdateCount++; tradeTarget.tradeTarget = null; tradeTarget.trade = null; tradeTarget.tradeAccepted = false; tradeTarget = null; trade = null; tradeAccepted = false; } } else { if (this != null) { client.SendPacket(new TradeDonePacket { Result = 1, Message = "Exploit Halted! You have been logged." }); } if (tradeTarget != null) { tradeTarget.client.SendPacket(new TradeDonePacket { Result = 1, Message = "Exploit Halted! You have been logged." }); } items1 = ""; items2 = ""; itemnumber1 = 0; itemnumber2 = 0; UpdateCount++; tradeTarget.UpdateCount++; tradeTarget.tradeTarget = null; tradeTarget.trade = null; tradeTarget.tradeAccepted = false; tradeTarget = null; trade = null; tradeAccepted = false; } }
public override void Buy(Player player) { if (ObjectType == 0x01ca) //Merchant { if (TryDeduct(player)) { for (int 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]; Manager.Data.AddDatabaseOperation(db => { switch (Currency) { case CurrencyType.Gold: player.Credits = player.Client.Account.Credits = db.UpdateCredit(player.Client.Account, -Price); break; case CurrencyType.Fame: player.CurrentFame = player.Client.Account.Stats.Fame = db.UpdateFame(player.Client.Account, -Price); break; case CurrencyType.GuildFame: throw new ArgumentException("No guild fame pl0x"); case CurrencyType.Silver: player.Silver = player.Client.Account.Silver = db.UpdateSilver(player.Client.Account, -Price); break; default: throw new ArgumentOutOfRangeException(); } player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "Purchase Successful" }); }).ContinueWith(task => { MRemaining--; player.UpdateCount++; player.SaveToCharacter(); UpdateCount++; }, TaskContinuationOptions.NotOnFaulted); return; } } catch (Exception e) { log.Error(e); } } player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "You cannot purchase when your inventory is 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 = "Not Enough Gold" }); break; case CurrencyType.Fame: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_FAME, Message = "Not Enough Fame" }); break; case CurrencyType.Silver: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_SILVER, Message = "Not Enough Silver" }); break; } } } }
private void DoTrade() { string msg = "Trade Successful!"; string failmsg = "An error occured while trading!"; 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 = failmsg }); } if (tradeTarget != null) { tradeTarget.psr.SendPacket(new TradeDonePacket { Result = 1, Message = failmsg }); } //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 (Item1 == 0) { itemList1 = itemList1 + " " + thisItems[Item1].ObjectId; } else if (Item1 > 0) { itemList1 = itemList1 + ", " + thisItems[Item1].ObjectId; } Item1++; } if (tradeTarget.trade[i] && !tradeTarget.Inventory[i].Soulbound) { targetItems.Add(tradeTarget.Inventory[i]); tradeTarget.Inventory[i] = null; tradeTarget.UpdateCount++; // save target trade info if (Item2 == 0) { itemList2 = itemList2 + " " + targetItems[Item2].ObjectId; } else if (Item2 > 0) { itemList2 = itemList2 + ", " + targetItems[Item2].ObjectId; } Item2++; } } // 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!"; } // 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(); // clean up itemList1 = ""; itemList2 = ""; Item1 = 0; Item2 = 0; UpdateCount++; tradeTarget.UpdateCount++; tradeTarget.tradeTarget = null; tradeTarget.trade = null; tradeTarget.tradeAccepted = false; tradeTarget = null; trade = null; tradeAccepted = false; }
public override void Buy(Player player) { if (ObjectType == 0x01ca) //Merchant { if (TryDeduct(player)) { for (int 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]; Manager.Data.AddPendingAction(db => { 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.Souls) { player.Souls = player.Client.Account.Souls = db.UpdateSouls(player.Client.Account, -Price); } player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "Purchase Successful" }); }, PendingPriority.Emergent); MRemaining--; player.UpdateCount++; player.SaveToCharacter(); UpdateCount++; return; } } catch (Exception e) { log.Error(e); } } player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "You cannot purchase when your inventory is 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 = "Not Enough Gold" }); break; case CurrencyType.Fame: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_FAME, Message = "Not Enough Fame" }); break; case CurrencyType.Souls: player.Client.SendPacket(new BuyResultPacket { Result = BUY_NO_SOUL, Message = "Not Enough Souls" }); break; } } } }
public override void Buy(Player player) { logger.Info("Buying item"); if (ObjectType == 0x01ca) //Merchant { logger.Info("Is merchant"); if (TryDeduct(player)) { logger.Info("Has currency"); for (var i = 0; i < player.Inventory.Length; i++) { logger.Info("Going through inventory"); try { XElement ist; Manager.GameData.ObjectTypeToElement.TryGetValue((ushort)MType, out ist); if (player.Inventory[i] == null && (player.SlotTypes[i] == 0 || 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) { Manager.Database.UpdateFame(player.Client.Account, -Price); player.CurrentFame = player.Client.Account.Fame; } if (Currency == CurrencyType.Gold) { Manager.Database.UpdateCredit(player.Client.Account, -Price); player.Credits = player.Client.Account.Credits; } if (Currency == CurrencyType.FortuneTokens) { Manager.Database.UpdateTokens(player.Client.Account, -Price); player.Tokens = player.Client.Account.FortuneTokens; } player.Client.SendPacket(new BuyResultPacket { Result = 0, Message = "{\"key\":\"server.buy_success\"}" }); MRemaining--; player.UpdateCount++; player.SaveToCharacter(); UpdateCount++; return; } player.Client.SendPacket(new BuyResultPacket { Result = -1, Message = "Mark f****d up" }); logger.Info(player.Inventory[i]); logger.Info(player.SlotTypes[i]); logger.Info(ist.Element("SlotType").Value); } catch (Exception e) { logger.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; } } } ; }