SaveToCharacter() public method

public SaveToCharacter ( ) : void
return void
 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;
 }
Example #2
0
        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;
        }
Example #5
0
        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;
                    }
                }
            }
        }
Example #6
0
        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;
                    }
                }
            }
            ;
        }