예제 #1
0
        public override bool SellItem(WorldClient Client, InventoryItemModel Item, ushort Quantity)
        {
            if (this.myEnd)
            {
                return(false);
            }

            if (Quantity > Item.Quantity)
            {
                Quantity = (ushort)Item.Quantity;
            }

            uint Refund = (uint)Math.Floor((double)ItemTemplateTable.GetTemplate(Item.TemplateID).Price / 10) * Quantity;

            Client.Character.InventoryCache.AddKamas(Refund);
            if (Quantity == Item.Quantity)
            {
                //DatabaseEntities.TryDeleteItem(Item);
                InventoryItemTable.removeItem(Item.ID);
                Client.Send(new ObjectRemoveMessage(Item.ID));
            }
            else
            {
                Client.Character.InventoryCache.UpdateObjectquantity(Item, Item.Quantity - Quantity);
            }

            Client.Send(new AccountStatsMessage(Client.Character));

            return(true);
        }
예제 #2
0
        public override bool BuyItem(WorldClient Client, uint TemplateId, ushort Quantity)
        {
            if (this.myEnd || Quantity <= 0)  // ne devrait jamais arriver
            {
                return(false);
            }

            if (!this.Npc.HasItemTemplate((int)TemplateId))
            {
                return(false);
            }

            var Price   = ShopNpcTable.Kolizeum.FirstOrDefault(x => x.Value.Where(y => y == (int)TemplateId).Count() > 0).Key *Quantity;
            var CachedP = Client.Character.InventoryCache.getCache().Values.Where(x => x.TemplateID == Settings.AppSettings.GetIntElement("Kolizeum.WinItem")).Count();

            if (Price > CachedP)
            {
                Client.Send(new ChatGameMessage("Il vous manque " + (Price - CachedP) + " Kolizetons", "3882AC"));
                return(false);
            }

            Client.Character.InventoryCache.removeByTemplateID(Settings.AppSettings.GetIntElement("Kolizeum.WinItem"), Price);

            if (InventoryItemTable.TryCreateItem((int)TemplateId, Client.Character, Quantity, useMax: true) == null)
            {
                return(false);
            }

            AccountTable.SubstractPoints(Client.Account.ID, Price);
            Client.Send(new ChatGameMessage("Il vous rêste désormais " + (CachedP - Price) + " Points", "3882AC"));

            return(true);
        }
예제 #3
0
        public CharacterInventory(Player character)
        {
            this.Player = character;
            if (!String.IsNullOrEmpty(character.Stuff))
            {
                if (character.Stuff[character.Stuff.Length - 1] == '|')
                {
                    character.Stuff = character.Stuff.Substring(0, character.Stuff.Length - 1);
                }
                InventoryItemTable.Load(character.Stuff.Replace("|", ","));
            }
            foreach (String item in Regex.Split(character.Stuff, "\\|"))
            {
                if (String.IsNullOrEmpty(item))
                {
                    continue;
                }
                int guid = int.Parse(item);

                InventoryItemModel obj = InventoryItemTable.getItem(guid);
                if (obj != null)
                {
                    Add(obj);
                }
            }
        }
예제 #4
0
 public void Save()
 {
     this.Friends = "";
     foreach (KeyValuePair <int, String> Key in this.FriendsList)
     {
         this.Friends += Key.Key + "|" + Key.Value + ";";
     }
     this.Ennemys = "";
     foreach (KeyValuePair <int, String> Key in this.EnnemyList)
     {
         this.Ennemys += Key.Key + "|" + Key.Value + ";";
     }
     this.Bank = "";
     foreach (KeyValuePair <long, InventoryItemModel> KeyPair in this.bankItems)
     {
         this.Bank += KeyPair.Key + ";";
         InventoryItemTable.Update(KeyPair.Value);
     }
     this.Stables = "";
     foreach (KeyValuePair <int, Mount> KeyPair in this.Mounts)
     {
         this.Stables += KeyPair.Key + ";";
     }
     AccountDataTable.Update(this);
 }
예제 #5
0
        private static void ProcessObjectEatLivingItemRequest(WorldClient Client, string Packet)
        {
            if (Client.GetFight() != null && (int)Client.GetFight().FightState > 2)
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            var Data = Packet.Split('|');

            long ItemGuid    = 0;
            long IdEatObject = 0;

            if (!long.TryParse(Data[0].Substring(2), out ItemGuid))
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            if (!long.TryParse(Data[2], out IdEatObject))
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            var Item     = Client.Character.InventoryCache.GetItem(ItemGuid);
            var ItemAlim = Client.Character.InventoryCache.GetItem(IdEatObject);

            if (Item == null || ItemAlim == null)
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            if (Item.SpeakingItem == null)
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            if ((ItemAlim.Quantity > 1) && (Item.Quantity - 1 > 0))
            {
                int newQ = ItemAlim.Quantity - 1;
                InventoryItemTable.TryCreateItem(ItemAlim.TemplateID, Client.Character, Stats: ItemAlim.GetStats().ToItemStats(), quantity: newQ);
                Client.Character.InventoryCache.UpdateObjectquantity(ItemAlim, 1);
            }
            long xp = long.Parse(ItemAlim.Template.Level.ToString());

            Item.SpeakingItem.EXP += xp;
            Client.Character.InventoryCache.RemoveItem(ItemAlim);
            InventoryItemTable.removeItem(ItemAlim.ID);
            Client.Send(new ObjectRemoveMessage(ItemAlim.ID));
            Client.Send(new ObjectRefreshMessage(Item));
            Client.Character.myMap.SendToMap(new ObjectActualiseMessage(Client.Character));
            if (Client.GetFight() != null)
            {
                Client.GetFight().SendToFight(new ObjectActualiseMessage(Client.Character));
            }
            Client.Send(new AccountStatsMessage(Client.Character));
        }
예제 #6
0
        public override bool BuyItem(WorldClient Client, uint TemplateId, ushort Quantity)
        {
            if (this.myEnd) // ne devrait jamais arriver
            {
                return(false);
            }

            if (!this.Npc.HasItemTemplate((int)TemplateId))
            {
                return(false);
            }

            var Price = this.Npc.GetItemTemplate((int)TemplateId).Price;

            if (Price > Client.Character.Kamas)
            {
                return(false);
            }

            if (InventoryItemTable.TryCreateItem((int)TemplateId, Client.Character, Quantity) == null)
            {
                return(false);
            }

            Client.Character.InventoryCache.SubstractKamas(Price);
            Client.Send(new AccountStatsMessage(Client.Character));

            return(true);
        }
예제 #7
0
        public static void removeFromBank(Player character, int guid, int qua)
        {
            InventoryItemModel BankObj = InventoryItemTable.getItem(guid);

            if (BankObj == null)
            {
                character.Send(new BasicNoOperationMessage());
                return;
            }
            if (!character.Client.Account.Data.bankItems.ContainsKey(guid))
            {
                Logger.Error("Le joueur " + character.Name + " a tenter de retirer un Item en banque qu'il n'avait pas.");
            }
            InventoryItemModel PersoObj = character.InventoryCache.ItemsCache.Values.FirstOrDefault(x => x.TemplateID == BankObj.TemplateID && x.GetStats().ToItemStats() == BankObj.GetStats().ToItemStats() && x.ID != BankObj.ID && x.Position == -1); /* getSimilarBankItem(Character, BankObj);*/
            int newQua = BankObj.Quantity - qua;

            if (PersoObj == null)
            {
                if (newQua <= 0)
                {
                    character.Client.Account.Data.bankItems.Remove(guid);
                    character.InventoryCache.Add(BankObj, false);
                    String str = "O-" + guid;
                    character.Send(new BankUpdateMessage(str));
                }
                else
                {
                    PersoObj = getCloneItem(BankObj, qua);
                    InventoryItemTable.addItem(PersoObj, true);
                    character.InventoryCache.Add(PersoObj, false);
                    String str = "O+" + BankObj.ID + "|" + BankObj.Quantity + "|" + BankObj.TemplateID + "|" + BankObj.GetStats().ToItemStats();
                    character.Send(new BankUpdateMessage(str));
                }
            }
            else
            {
                if (newQua <= 0)
                {
                    character.Client.Account.Data.bankItems.Remove(BankObj.ID);
                    InventoryItemTable.removeItem(BankObj.ID);
                    PersoObj.Quantity += BankObj.Quantity;
                    character.Send(new ObjectQuantityMessage(PersoObj.ID, PersoObj.Quantity));
                    String str = "O-" + guid;
                    character.Send(new BankUpdateMessage(str));
                }
                else
                {
                    BankObj.Quantity   = newQua;
                    PersoObj.Quantity += qua;
                    character.Send(new ObjectQuantityMessage(PersoObj.ID, PersoObj.Quantity));
                    String str = "O+" + BankObj.ID + "|" + BankObj.Quantity + "|" + BankObj.TemplateID + "|" + BankObj.GetStats().ToItemStats();
                    character.Send(new BankUpdateMessage(str));
                }
            }
            //SEND POD MESSAGE ?
            character.GetClient().Account.Data.Save();
        }
예제 #8
0
        private static void ProcessObjectUseRequest(WorldClient Client, string Packet)
        {
            int    guid       = -1;
            int    targetGuid = -1;
            int    targetCell = -1;
            Player Target     = null;

            try
            {
                String[] infos = Regex.Split(Packet.Substring(2), "\\|");
                guid = int.Parse(infos[0]);
                if (infos.Length == 3)
                {
                    targetCell = int.Parse(infos[2]);
                }
                try //try
                {
                    targetGuid = int.Parse(infos[1]);
                }
                catch (Exception e)
                {
                    targetGuid = -1;
                };
            }
            catch (Exception e)
            {
                Logger.Error(e);
                return;
            }
            if (CharacterTable.GetCharacter(targetGuid) != null)
            {
                Target = CharacterTable.GetCharacter(targetGuid);
            }
            if (!Client.Character.InventoryCache.hasItemGuid(guid))
            {
                return;
            }

            InventoryItemModel obj = InventoryItemTable.getItem(guid);
            ItemTemplateModel  T   = obj.Template;

            if (!T.Criterions.Equals("") && !ConditionParser.validConditions(Client.Character, T.Criterions))
            {
                Client.Send(new ImMessage("119|43"));
                return;
            }
            if (T.ItemType == ItemTypeEnum.ITEM_TYPE_PAIN || T.ItemType == ItemTypeEnum.ITEM_TYPE_VIANDE_COMESTIBLE)
            {
                Client.Character.myMap.SendToMap(new MapEmoticoneMessage(Client.Character.ActorId, 17));
            }
            else if (T.ItemType == ItemTypeEnum.ITEM_TYPE_BIERE)
            {
                Client.Character.myMap.SendToMap(new MapEmoticoneMessage(Client.Character.ActorId, 18));
            }
            T.applyAction(Client.Character, Target, guid, (short)targetCell);
        }
예제 #9
0
 public void Intialize()
 {
     if (Intialized)
     {
         return;
     }
     if (this.LivingItem != 0)
     {
         InventoryItemTable.Load(this.LivingItem);
     }
     Intialized = true;
 }
예제 #10
0
        public static void Initialize()
        {
            nextPlayerGuid = CharacterTable.getNextGuid();
            nextPlayerGuid++;
            nextItemGuid = InventoryItemTable.getNextGuid();
            nextItemGuid++;
            nextGuildId = GuildTable.getNextGuid();
            nextGuildId++;
            nextMountId = MountTable.getNextGuid();
            nextMountId++;
            nextSpeakingId = SpeakingTable.getNextGuid();
            nextSpeakingId++;
            SpellTable.Load();
            ExpFloorTable.Load();
            MonsterTable.Load();
            ItemTemplateTable.Load();
            ItemTemplateTable.LoadItemActions();
            ItemSetTable.Load();
            DropTable.Load();
            TitleTable.Load();
            IObjectTemplateTable.Load();
            AreaTable.Load();
            AreaSubTable.Load();
            MapTable.Load();
            MapTable.LoadActions();
            CellActionTable.Load();
            MobGroupFixTable.Load();
            BreedTable.Load();
            NpcTemplateTable.Load();
            NpcTemplateTable.LoadPlaces();
            NpcQuestionTable.Load();
            NpcReplyTable.Load();
            ShopNpcTable.Initialize();
            GuildTable.Load();
            CharactersGuildTable.Load();
            TaxCollectorTable.Load();
            PrismeTable.Load();
            BidHouseTable.Load();
            BidHouseTable.LoadItems();
            MountParkTable.Load();
            StaticMountTable.Load();
            MountTable.Load();//TODO Dynamic load of Character mount
            ZaapTable.Load();
            ZaapiTable.Load();

            var Timer = new System.Timers.Timer(1000 * 60 * 25);

            Timer.Elapsed += delegate(object sender, ElapsedEventArgs e)
            {
                Save();
            };
            Timer.Start();
        }
예제 #11
0
 public override void Execute(WorldClient client, CommandParameters parameters)
 {
     if (parameters.Lenght > 0)
     {
         int itemID = 0;
         try
         {
             itemID = parameters.GetIntParameter(0);
         }
         catch (FormatException e)
         {
             client.Send(new ConsoleMessage("Parametres invalide !", ConsoleColorEnum.RED));
             return;
         }
         var itemTemplate = ItemTemplateTable.GetTemplate(itemID);
         var quantity     = 1;
         var style        = false;
         if (itemTemplate != null)
         {
             if (parameters.Lenght > 1)
             {
                 try
                 {
                     quantity = parameters.GetIntParameter(1);
                 }
                 catch (FormatException e)
                 {
                     client.Send(new ConsoleMessage("Parametres invalide !", ConsoleColorEnum.RED));
                     return;
                 }
             }
             if (parameters.Lenght > 2)
             {
                 var styleStr = parameters.GetParameter(2).ToLower();
                 if (styleStr == "max")
                 {
                     style = true;
                 }
             }
             var item = InventoryItemTable.TryCreateItem(itemID, client.Character, 1, -1, null, style);
             client.Send(new ConsoleMessage("L'objet <b>'" + itemTemplate.Name + "'</b> a correctement ete generer !", ConsoleColorEnum.GREEN));
         }
         else
         {
             client.Send(new ConsoleMessage("Impossible de trouver l'objet n°" + itemID, ConsoleColorEnum.RED));
         }
     }
     else
     {
         client.Send(new ConsoleMessage("Parametres invalide !", ConsoleColorEnum.RED));
     }
 }
예제 #12
0
        public void Initialize()
        {
            Item = InventoryItemTable.Load(ItemID);

            if (Item == null)
            {
                BidHouseTable.Delete(ItemID);
                return;
            }

            BH.addObject(this);
            BH = null;
        }
예제 #13
0
        private static void ProcessObjectUnEquipLivingItem(WorldClient Client, string Packet)
        {
            if (Client.GetFight() != null && (int)Client.GetFight().FightState > 2)
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }
            var Data = Packet.Split('|');

            long ItemGuid = 0;

            if (!long.TryParse(Data[0].Substring(2), out ItemGuid))
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            var Item  = Client.Character.InventoryCache.GetItem(ItemGuid);
            var OldId = Item.SpeakingID;

            if (Item == null || Item.SpeakingItem == null)
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }

            if (Item.SpeakingItem.Associated == 1)
            {
                long ObjeOriginialID = Item.SpeakingItem.LivingItem;
                var  objv            = InventoryItemTable.getItem(ObjeOriginialID);
                if (objv == null)
                {
                    Client.Send(new BasicNoOperationMessage());
                    return;
                }
                objv.SpeakingID = OldId;
                Item.SpeakingItem.LinkedItem = ObjeOriginialID;
                Item.SpeakingItem.Associated = 0;
                Item.SpeakingID = 0;
                Client.Character.InventoryCache.Add(objv);;
                Client.Send(new ObjectRefreshMessage(Item));
                Client.Character.myMap.SendToMap(new ObjectActualiseMessage(Client.Character));
                if (Client.GetFight() != null)
                {
                    Client.GetFight().SendToFight(new ObjectActualiseMessage(Client.Character));
                }
            }
        }
예제 #14
0
        public Boolean BuyObject(int LineID, int Count, long Price, Player Character)
        {
            Boolean possible = true;

            try
            {
                if (Character.Kamas < Price)
                {
                    return(false);
                }
                var Line        = getLine(LineID);
                var ObjectToBuy = Line.Have(Count, Price);
                Character.InventoryCache.SubstractKamas(Price);
                if (ObjectToBuy.Owner != -1)
                {
                    var OwnerClient = Network.WorldServer.Clients.Find(x => x.Account != null && x.Account.ID == ObjectToBuy.Owner);
                    if (OwnerClient != null)
                    {
                        OwnerClient.Account.Data.BankKamas += ObjectToBuy.Price;
                        OwnerClient.Send(new TextInformationMessage(TextInformationTypeEnum.INFO, 65, new String[] { Price.ToString(), ObjectToBuy.Item.TemplateID.ToString(), 1 + "" }));
                    }
                    else
                    {
                        AccountDataTable.UpdateKamas(ObjectToBuy.Price, ObjectToBuy.Owner);
                        //TODO Cache vous IM MSG
                    }
                }
                Character.Send(new AccountStatsMessage(Character));
                var OldItem = ObjectToBuy.Item;
                Character.InventoryCache.Add(OldItem);

                OldItem.Template.newSold(ObjectToBuy.getQuantity(true), Price);
                DestroyObject(ObjectToBuy);
                BidHouseTable.Delete(ObjectToBuy.Item.ID);
                if (ObjectToBuy.Owner == -1)
                {
                    InventoryItemTable.Add(OldItem);
                }
                ObjectToBuy = null;
            }
            catch (Exception e)
            {
                possible = false;
            }
            return(possible);
        }
예제 #15
0
        public static void ProcessObjectDestroyMessage(WorldClient Client, string Packet)
        {
            String[] infos = Regex.Split(Packet.Substring(2), "\\|");
            try
            {
                int guid = int.Parse(infos[0]);
                int qua  = 1;
                try
                {
                    qua = int.Parse(infos[1]);
                }
                catch (Exception e)
                {
                    return;
                }

                InventoryItemModel obj = InventoryItemTable.getItem(guid);

                if (!Client.Character.InventoryCache.hasItemGuid(guid) || qua <= 0 || obj == null)
                {
                    Client.Send(new BasicNoOperationMessage());
                    return;
                }

                int newQua = obj.Quantity - qua;
                if (newQua <= 0)
                {
                    Client.Character.InventoryCache.remove(guid);
                    InventoryItemTable.removeItem(guid);
                    Client.Send(new ObjectRemoveMessage(guid));
                }
                else
                {
                    obj.Quantity = newQua;
                    Client.Send(new ObjectQuantityMessage(guid, newQua));
                }
                Client.Send(new AccountStatsMessage(Client.GetCharacter()));
                Client.Send(new InventoryWeightMessage(0, 2000));
            }
            catch (Exception e) { Client.Send(new BasicNoOperationMessage()); }
        }
예제 #16
0
        public void Intialize()
        {
            if (myIntialized)
            {
                return;
            }

            foreach (String str in ItemList.Split(';'))
            {
                try
                {
                    if (String.IsNullOrEmpty(str))
                    {
                        continue;
                    }
                    long idd;
                    if (!long.TryParse(str, out idd))
                    {
                        continue;
                    }
                    InventoryItemModel obj = InventoryItemTable.getItem(idd);
                    if (obj != null)
                    {
                        Items.Add(obj.ID, obj);
                    }
                    else
                    {
                        obj = InventoryItemTable.Load(idd);
                        if (obj != null)
                        {
                            Items.Add(obj.ID, obj);
                        }
                    }
                }
                catch (Exception e) { continue; }
            }


            myIntialized = true;
        }
예제 #17
0
 public static void GiveItem(ActionModel action, Player perso, Player target, int itemID, int cellID)
 {
     try
     {
         int     tID   = int.Parse(action.args.Split(',')[0]);
         int     count = int.Parse(action.args.Split(',')[1]);
         Boolean send  = true;
         if (action.args.Split(',').Length > 2)
         {
             send = action.args.Split(',')[2].Equals("1");
         }
         if (count > 0)
         {
             var item = InventoryItemTable.TryCreateItem(itemID, perso, count, -1, null);
         }
         else
         {
             perso.InventoryCache.removeByTemplateID(tID, -count);
         }
         if (perso.IsOnline())//on envoie le Packet qui indique l'ajout//retrait d'un item
         {
             //POD
             if (send)
             {
                 if (count >= 0)
                 {
                     perso.Send(new TextInformationMessage(TextInformationTypeEnum.INFO, 21, +count + "~" + tID));
                 }
                 else if (count < 0)
                 {
                     perso.Send(new TextInformationMessage(TextInformationTypeEnum.INFO, 22, + -count + "~" + tID));
                 }
             }
         }
     }
     catch (Exception e)
     {
         Logger.Error(e);
     }
 }
예제 #18
0
        public bool TryMergeItem(int TemplateId, string Stats, ItemSlotEnum Slot, int Quantity = 1, InventoryItemModel RemoveItem = null)
        {
            if (Slot < ItemSlotEnum.SLOT_AMULETTE || Slot > ItemSlotEnum.SLOT_BOUCLIER)
            {
                var ItemsCopy = this.ItemsCache.ToArray();

                foreach (var Item in ItemsCopy)
                {
                    if (Item.Value.GetStats().ToItemStats() == Stats && Item.Value.TemplateID == TemplateId && Item.Value.Slot == Slot)
                    {
                        if (RemoveItem != null)
                        {
                            InventoryItemTable.removeItem(RemoveItem.ID);
                            Player.Send(new ObjectRemoveMessage(RemoveItem.ID));
                        }

                        this.UpdateObjectquantity(Item.Value, Item.Value.Quantity + Quantity);
                        return(true);
                    }
                }
            }

            return(false);
        }
예제 #19
0
        public override void OverridableEndFight(FightTeam Winners, FightTeam Loosers)
        {
            var WinnersFighter = Winners.GetFighters().OfType <CharacterFighter>().ToList();
            var LoosersFighter = Loosers.GetFighters().OfType <CharacterFighter>().ToList();

            var WinnersTotalCote = WinnersFighter.Sum(x => x.Character.Cote);
            var LoosersTotalCote = LoosersFighter.Sum(x => x.Character.Cote);

            int WinCote = 0, LooseCote = 0;

            if (LoosersTotalCote - WinnersTotalCote < 0)
            {
                WinCote = 25;
            }
            else if (WinnersTotalCote - LoosersTotalCote < 0)
            {
                WinCote = 75;
            }
            else
            {
                WinCote = 50;
            }

            if (LoosersTotalCote - WinnersTotalCote < 0)
            {
                LooseCote = 25;
            }
            else if (WinnersTotalCote - LoosersTotalCote < 0)
            {
                LooseCote = 75;
            }
            else
            {
                LooseCote = 50;
            }



            var PossibleItemLoot = new List <ItemLoot>();
            var ItemDroped       = new Dictionary <int, int>()
            {
                { Settings.AppSettings.GetIntElement("Kolizeum.WinItem"), 3 },
            };

            foreach (var Fighter in LoosersFighter)
            {
                int CoteLoosed = LooseCote;

                if (!Fighter.Left)
                {
                    if (Fighter.Character.Cote - LooseCote < 0)
                    {
                        CoteLoosed = Fighter.Character.Cote;
                    }
                    Fighter.Character.Cote -= CoteLoosed;
                }

                this.myResult.AddResult(Fighter, false, WinExp: -CoteLoosed);
            }

            foreach (var Fighter in WinnersFighter)
            {
                if (!Fighter.Left)
                {
                    Fighter.Character.Cote += WinCote;
                    this.myResult.AddResult(Fighter, true, WinExp: WinCote, WinItems: ItemDroped);
                    InventoryItemTable.TryCreateItem(ItemDroped.First().Key, Fighter.Character, ItemDroped.First().Value);
                }
                else
                {
                    this.myResult.AddResult(Fighter, true);
                }
            }
            base.EndFight();
        }
예제 #20
0
 public void Initialize()
 {
     if (myInitialized)
     {
         return;
     }
     try
     {
         BHI = new Dictionary <int, List <BidHouseItem> >();
         if (!BidHouseTable.BHITEMS.ContainsKey(this.Guid))
         {
             BidHouseTable.BHITEMS.Add(Guid, new Dictionary <int, List <BidHouseItem> >());
         }
         BHI = BidHouseTable.BHITEMS[Guid];
         foreach (String s in Friends.Split(';'))
         {
             if (String.IsNullOrEmpty(s))
             {
                 continue;
             }
             FriendsList.Add(Convert.ToInt32(s.Split('|')[0]), s.Split('|')[1]);
         }
         foreach (String s in Ennemys.Split(';'))
         {
             if (String.IsNullOrEmpty(s))
             {
                 continue;
             }
             EnnemyList.Add(Convert.ToInt32(s.Split('|')[0]), s.Split('|')[1]);
         }
         foreach (String s in Bank.Split(';'))
         {
             if (String.IsNullOrEmpty(s))
             {
                 continue;
             }
             long id;
             if (!long.TryParse(s, out id))
             {
                 continue;
             }
             InventoryItemModel obj = InventoryItemTable.getItem(id);
             if (obj != null)
             {
                 bankItems.Add(id, obj);
             }
             else
             {
                 obj = InventoryItemTable.Load(id);
                 if (obj != null)
                 {
                     bankItems.Add(id, obj);
                 }
             }
         }
         foreach (String s in Stables.Split(';'))
         {
             if (String.IsNullOrEmpty(s))
             {
                 continue;
             }
             int id;
             if (!int.TryParse(s, out id))
             {
                 continue;
             }
             Mount DD = MountTable.getMount(id);
             if (DD != null)
             {
                 Mounts.Add(id, DD);
             }
         }
     }
     catch (Exception e)
     {
         Logger.Error(e);
     }
     myInitialized = true;
 }
예제 #21
0
        public static void addInBank(Player character, int guid, int qua)
        {
            InventoryItemModel item = InventoryItemTable.getItem(guid);

            if (item == null)
            {
                character.Send(new BasicNoOperationMessage());
                return;
            }
            if (!character.InventoryCache.hasItemGuid(guid))
            {
                Logger.Error("Le joueur " + character.Name + " a tenter d'ajouter un Item en banque qu'il n'avait pas.");
            }
            if (item.Slot != ItemSlotEnum.SLOT_INVENTAIRE)
            {
                character.Send(new BasicNoOperationMessage());
                return;
            }
            InventoryItemModel bankItem = getSimilarBankItem(character, item);
            int newQua = item.Quantity - qua;

            if (bankItem == null)
            {
                if (newQua <= 0)
                {
                    character.InventoryCache.RemoveItem(item);
                    character.Client.Account.Data.bankItems.Add(item.ID, item);
                    String str = "O+" + item.ID + "|" + item.Quantity + "|" + item.TemplateID + "|" + item.GetStats().ToItemStats();
                    character.Send(new BankUpdateMessage(str));
                    character.Send(new ObjectRemoveMessage(guid));
                }

                else
                {
                    item.Quantity = newQua;
                    bankItem      = getCloneItem(item, qua);
                    InventoryItemTable.addItem(bankItem, true);
                    character.Client.Account.Data.bankItems.Add(bankItem.ID, bankItem);
                    String str = "O+" + bankItem.ID + "|" + bankItem.Quantity + "|" + bankItem.TemplateID + "|" + bankItem.GetStats().ToItemStats();
                    character.Send(new BankUpdateMessage(str));
                    character.Send(new ObjectQuantityMessage(item.ID, item.Quantity));
                }
            }
            else
            {
                if (newQua <= 0)
                {
                    character.InventoryCache.RemoveItem(item);
                    InventoryItemTable.removeItem(item.ID);
                    bankItem.Quantity += item.Quantity;
                    String str = "O+" + bankItem.ID + "|" + bankItem.Quantity + "|" + bankItem.TemplateID + "|" + bankItem.GetStats().ToItemStats();
                    character.Send(new BankUpdateMessage(str));
                    character.Send(new ObjectRemoveMessage(guid));
                }
                else
                {
                    item.Quantity      = newQua;
                    bankItem.Quantity += qua;
                    String str = "O+" + bankItem.ID + "|" + bankItem.Quantity + "|" + bankItem.TemplateID + "|" + bankItem.GetStats().ToItemStats();
                    character.Send(new BankUpdateMessage(str));
                    character.Send(new ObjectQuantityMessage(item.ID, item.Quantity));
                }
            }
            //SEND POD MESSAGE ?
            character.GetClient().Account.Data.Save();
        }
예제 #22
0
        public override bool MoveItem(Network.WorldClient Client, Database.Models.InventoryItemModel Item, ushort Quantity, bool Add = false)
        {
            if (Add)
            {
                if (Quantity > Item.Quantity)
                {
                    Quantity = (ushort)Item.Quantity;
                }

                InventoryItemModel ObjectEqualize = getSimilarItem(Item);
                int    newQua = Item.Quantity - Quantity;
                String str;

                if (ObjectEqualize == null)
                {
                    if (newQua <= 0)
                    {
                        Client.Character.InventoryCache.RemoveItem(Item);
                        Mount.Items.Add(Item);
                        str = "O+" + Item.ID + "|" + Item.Quantity + "|" + Item.TemplateID + "|" + Item.GetStats().ToItemStats();
                        Client.Send(new ObjectRemoveMessage(Item.ID));
                    }
                    else
                    {
                        Client.Character.InventoryCache.UpdateObjectquantity(Item, newQua);
                        ObjectEqualize = InventoryItemTable.TryCreateItem(Item.TemplateID, Mount, Quantity, Stats: Item.Effects);
                        str            = "O+" + ObjectEqualize.ID + "|" + ObjectEqualize.Quantity + "|" + ObjectEqualize.TemplateID + "|" + ObjectEqualize.GetStats().ToItemStats();
                    }
                }
                else if (newQua <= 0)
                {
                    Client.Character.InventoryCache.RemoveItem(Item);
                    ObjectEqualize.Quantity += Item.Quantity;
                    InventoryItemTable.removeItem(Item.ID);
                    str = "O+" + ObjectEqualize.ID + "|" + ObjectEqualize.Quantity + "|" + ObjectEqualize.TemplateID + "|" + ObjectEqualize.GetStats().ToItemStats();
                    Client.Send(new ObjectRemoveMessage(Item.ID));
                    InventoryItemTable.Update(ObjectEqualize);
                }
                else
                {
                    Client.Character.InventoryCache.UpdateObjectquantity(Item, newQua);
                    ObjectEqualize.Quantity += Quantity;
                    str = "O+" + ObjectEqualize.ID + "|" + ObjectEqualize.Quantity + "|" + ObjectEqualize.TemplateID + "|" + ObjectEqualize.GetStats().ToItemStats();
                    InventoryItemTable.Update(ObjectEqualize);
                }
                Client.Send(new BankUpdateMessage(str));
                Client.Send(new InventoryWeightMessage(0, 2000)); // TODO PODS
                Client.Send(new MountActualPodMessage(Mount));
                MountTable.Update(Mount);
            }
            else
            {
                if (!Mount.Items.Contains(Item))
                {
                    return(false);
                }
                InventoryItemModel ObjectEqualize = Client.Character.InventoryCache.getSimilarInventoryItem(Item);
                int    newQua = Item.Quantity - Quantity;
                String str;

                if (ObjectEqualize == null)
                {
                    if (newQua <= 0)
                    {
                        Mount.Items.Remove(Item);
                        if (Client.Character.InventoryCache.TryMergeItem(Item.TemplateID, Item.GetStats().ToItemStats(), Item.Slot, Item.Quantity))
                        {
                            InventoryItemTable.removeItem(Item.ID);
                        }
                        else
                        {
                            Client.Character.InventoryCache.Add(Item);
                        }
                        str = "O-" + Item.ID;
                    }
                    else
                    {
                        ObjectEqualize = InventoryItemTable.TryCreateItem(Item.TemplateID, Client.Character, Quantity, Stats: Item.Effects);
                        Item.Quantity  = newQua;
                        str            = "O+" + Item.ID + "|" + Item.Quantity + "|" + Item.TemplateID + "|" + Item.GetStats().ToItemStats();
                    }
                }
                else if (newQua <= 0)
                {
                    Mount.Items.Remove(Item);
                    ObjectEqualize.Quantity += Item.Quantity;
                    Client.Send(new ObjectQuantityMessage(ObjectEqualize.ID, ObjectEqualize.Quantity));
                    InventoryItemTable.removeItem(Item.ID);
                    str = "O-" + Item.ID;
                    InventoryItemTable.Update(ObjectEqualize);
                }
                else
                {
                    Item.Quantity            = newQua;
                    ObjectEqualize.Quantity += Quantity;
                    Client.Send(new ObjectQuantityMessage(ObjectEqualize.ID, ObjectEqualize.Quantity));
                    str = "O+" + Item.ID + "|" + Item.Quantity + "|" + Item.TemplateID + "|" + Item.GetStats().ToItemStats();
                    InventoryItemTable.Update(ObjectEqualize);
                }
                Client.Send(new BankUpdateMessage(str));
                Client.Send(new InventoryWeightMessage(0, 2000)); // TODO PODS
                Client.Send(new MountActualPodMessage(Mount));
                MountTable.Update(Mount);
            }
            return(true);
        }
예제 #23
0
        private static void ProcessExchangeMountParkRequest(WorldClient Client, string Packet)
        {
            MountPark MP = Client.Character.inMountPark;

            if (MP != null)
            {
                char c = Packet[2];
                Packet = Packet.Substring(3);
                int guid = -1;
                try
                {
                    guid = int.Parse(Packet);
                }
                catch (Exception e)
                {
                };
                switch (c)
                {
                case 'C':    //Parcho => Etable (Stocker)
                    if (guid == -1 || !Client.Character.InventoryCache.hasItemGuid(guid))
                    {
                        return;
                    }
                    InventoryItemModel obj = Client.Character.InventoryCache.GetItem(guid);

                    //on prend la DD demandée
                    int   DDid = -1;
                    Mount DD   = null;
                    if (obj.GetStats().HasEffect(EffectEnum.MountOwner))
                    {
                        DDid = obj.GetStats().GetEffect(EffectEnum.MountOwner).Items;
                        DD   = MountTable.getMount(DDid);
                    }
                    //FIXME mettre return au if pour ne pas créer des nouvelles dindes
                    if (DD == null)
                    {
                        int color = StaticMountTable.getMountColorByParchoTemplate(obj.TemplateID);
                        if (color < 1)
                        {
                            return;
                        }
                        DD = new Mount(color);
                    }
                    DD.Intialize();

                    //On enleve l'Item du Monde et du Perso
                    Client.Character.InventoryCache.remove(guid);
                    InventoryItemTable.removeItem(guid);
                    //on ajoute la dinde a l'étable
                    Client.Account.Data.Mounts.Add(DD.ID, DD);
                    Client.Account.Data.Save();

                    //On envoie les Packet
                    Client.Send(new ObjectRemoveMessage(obj.ID));
                    Client.Send(new ExchangeEndMessage('+', DD.parse()));
                    break;

                case 'c':    //Etable => Parcho(Echanger)
                    Mount DD1 = MountTable.getMount(guid);
                    //S'il n'a pas la dinde
                    if (!Client.Account.Data.Mounts.ContainsKey(DD1.ID) || DD1 == null)
                    {
                        return;
                    }
                    //on retire la dinde de l'étable
                    Client.Account.Data.Mounts.Remove(DD1.ID);

                    GenericStats Stat = new GenericStats();
                    Stat.AddItem(EffectEnum.MountOwner, DD1.ID);
                    Stat.AddSpecialEffect(EffectEnum.MountOwnerName, Client.Character.Name);
                    Stat.AddSpecialEffect(EffectEnum.MountName, DD1.Name);

                    var item = InventoryItemTable.TryCreateItem(StaticMountTable.getMountScroll(DD1.get_color()).ID, Client.Character, 1, -1, Stat.ToItemStats());

                    Client.Send(new ExchangeEndMessage('-', DD1.ID + ""));
                    Stat = null;
                    break;

                case 'g':    //Equiper
                    Mount DD3 = MountTable.getMount(guid);
                    //S'il n'a pas la dinde
                    if (DD3 == null || !Client.Account.Data.Mounts.ContainsKey(DD3.ID) || Client.Character.Mount != null)
                    {
                        return;
                    }
                    DD3.Intialize();
                    Client.Account.Data.Mounts.Remove(DD3.ID);
                    Client.Account.Data.Save();
                    Client.Character.Mount = DD3;

                    //Packets
                    Client.Send(new CharacterRideEventMessage("+", DD3));
                    Client.Send(new ExchangeEndMessage('-', DD3.ID + ""));
                    Client.Send(new CharacterMountXpGive(Client.Character.MountXPGive));
                    break;

                case 'p':    //Equipé => Stocker
                    //Si c'est la dinde équipé
                    if (Client.Character.Mount != null ? Client.Character.Mount.ID == guid : false)
                    {
                        //Si le perso est sur la monture on le fait descendre
                        if (Client.Character.isOnMount())
                        {
                            Client.Character.toogleOnMount();
                        }
                        //Si ca n'a pas réussie, on s'arrete là (Items dans le sac ?)
                        if (Client.Character.isOnMount())
                        {
                            return;
                        }

                        Mount DD2 = Client.Character.Mount;
                        DD2.Intialize();
                        Client.Account.Data.Mounts.Add(DD2.ID, DD2);
                        Client.Account.Data.Save();
                        Client.Character.Mount = null;

                        //Packets
                        Client.Send(new ExchangeEndMessage('+', DD2.parse()));
                        Client.Send(new CharacterRideEventMessage("-", null));
                        Client.Send(new CharacterMountXpGive(Client.Character.MountXPGive));
                    }
                    else    //Sinon...
                    {
                    }
                    break;
                }
            }
            else
            {
                Client.Send(new BasicNoOperationMessage());
                return;
            }
        }
예제 #24
0
 public override bool MoveItem(WorldClient Client, Database.Models.InventoryItemModel Item, ushort Quantity, bool Add = false)
 {
     if (Add)
     {
         long Taxe = (long)(Price * (Market.SellTaxe / 100));
         if (myClient.Account.Data.canTaxBidHouseItem(Market.HdvID) >= Market.countItem)
         {
             myClient.Send(new TextInformationMessage(Libs.Enumerations.TextInformationTypeEnum.INFO, 58));
             return(false);
         }
         if (myClient.Character.Kamas < Taxe)
         {
             myClient.Send(new TextInformationMessage(Libs.Enumerations.TextInformationTypeEnum.ERREUR, 76));
             return(false);
         }
         myClient.Character.InventoryCache.SubstractKamas(Taxe);
         int cantReal  = (int)(Math.Pow(10, Quantity) / 10);
         int nuevaCant = Item.Quantity - cantReal;
         if (nuevaCant <= 0)
         {
             myClient.Character.InventoryCache.RemoveItem(Item);
             myClient.Character.Send(new ObjectRemoveMessage(Item.ID));
         }
         else
         {
             Item.Quantity -= cantReal;
             myClient.Send(new ObjectQuantityMessage(Item.ID, Item.Quantity));
             Item = InventoryItemTable.TryCreateItem(Item.TemplateID, quantity: cantReal, Stats: Item.GetStats().ToItemStats());
         }
         var MarketItem = new BidHouseItem()
         {
             Price    = Price,
             Quantity = Quantity,
             Owner    = myClient.Account.ID,
             Item     = Item,
         };
         Market.addObject(MarketItem);
         BidHouseTable.Add(MarketItem);
         myClient.Send(new ExchangeMoveDistantObject('+', "", MarketItem.SerializeAsDisplayEquipmentOnMarket()));
         Client.Send(new AccountStatsMessage(myClient.Character));
     }
     else
     {
         var          MarketID = Market.HdvID;
         BidHouseItem BHI      = null;
         try
         {
             foreach (var BH in myClient.Account.Data.BHI[MarketID])
             {
                 if (BH.LineID == ItemID)
                 {
                     BHI = BH;
                     break;
                 }
             }
         }
         catch (Exception e)
         {
             return(false);
         }
         if (BHI == null)
         {
             return(false);
         }
         myClient.Account.Data.BHI[MarketID].Remove(BHI);
         var Object = BHI.Item;
         myClient.Character.InventoryCache.Add(Object);
         Market.DestroyObject(BHI);
         BidHouseTable.Delete(BHI.ItemID);
         myClient.Send(new ExchangeMoveDistantObject('-', "", ItemID + ""));
     }
     return(true);
 }
예제 #25
0
        public override void Execute(WorldClient Client, CommandParameters parameters)
        {
            if (Settings.AppSettings.GetBoolElement("NpcShop.FmCac"))
            {
                if ((Program.currentTimeMillis() - Client.lastCheckPoint) < 3000)
                {
                    return;
                }

                var Object = Client.Character.InventoryCache.GetItemInSlot(ItemSlotEnum.SLOT_ARME);
                if (Object == null)
                {
                    Client.Send(new ChatGameMessage("Vous ne portez pas d'arme", "682B2B"));
                    return;
                }
                if (Client.GetFight() != null)
                {
                    Client.Send(new ChatGameMessage("Impossible en combat", "682B2B"));
                    return;
                }
                String answer;

                try
                {
                    answer = parameters.GetParameter(0);
                }
                catch (Exception e)
                {
                    Client.Send(new ChatGameMessage("Action impossible : vous n'avez pas spécifié l'élément (air, feu, terre, eau) qui remplacera les dégats/vols de vies neutres", "682B2B"));
                    return;
                }
                if (!answer.Equals("air") && !answer.Equals("terre") && !answer.Equals("feu") && !answer.Equals("eau"))
                {
                    Client.Send(new ChatGameMessage("Action impossible : l'élément " + answer + " n'existe pas ! (dispo : air, feu, terre, eau)", "682B2B"));
                    return;
                }

                if (!Object.GetStats().GetWeaponEffects().ContainsKey(EffectEnum.VolNeutre) && !Object.GetStats().GetWeaponEffects().ContainsKey(EffectEnum.DamageNeutre))
                {
                    Client.Send(new ChatGameMessage("Action impossible : votre arme n'a pas de dégats neutre", "682B2B"));
                    return;
                }
                try
                {
                    var b = Object.GetStats().GetWeaponEffects().ToArray();
                    foreach (var i in b)
                    {
                        if (i.Key == EffectEnum.DamageNeutre)
                        {
                            if (answer.Equals("air"))
                            {
                                i.Value.EffectType = EffectEnum.DamageAir;
                            }
                            if (answer.Equals("feu"))
                            {
                                i.Value.EffectType = EffectEnum.DamageFeu;
                            }
                            if (answer.Equals("terre"))
                            {
                                i.Value.EffectType = EffectEnum.DamageTerre;
                            }
                            if (answer.Equals("eau"))
                            {
                                i.Value.EffectType = EffectEnum.DamageEau;
                            }
                            Object.GetStats().RemoveWeaponEffects(i.Key);
                            Object.GetStats().AdWeaponEffects(i.Value.EffectType, i.Value);
                        }

                        if (i.Key == EffectEnum.VolNeutre)
                        {
                            if (answer.Equals("air"))
                            {
                                i.Value.EffectType = EffectEnum.VolAir;
                            }
                            if (answer.Equals("feu"))
                            {
                                i.Value.EffectType = EffectEnum.VolFeu;
                            }
                            if (answer.Equals("terre"))
                            {
                                i.Value.EffectType = EffectEnum.VolTerre;
                            }
                            if (answer.Equals("eau"))
                            {
                                i.Value.EffectType = EffectEnum.VolEau;
                            }
                            Object.GetStats().RemoveWeaponEffects(i.Key);
                            Object.GetStats().AdWeaponEffects(i.Value.EffectType, i.Value);
                        }
                    }

                    Client.Send(new ObjectRemoveMessage(Object.ID));
                    Client.Send(new ObjectAddInventoryMessage(Object));
                    Client.Send(new FmMoveMessage("KO+" + Object.ID + "|1|" + Object.TemplateID + "|" + Object.GetStats().ToItemStats().Replace(";", "#")));
                    Client.Send(new FmCMessage("K;" + Object.TemplateID));
                    InventoryItemTable.Update(Object);
                    Client.Send(new ChatGameMessage("Votre " + Object.Template.Name + " a été FM avec succès en" + answer + " !", "FF0000"));
                    Client.Send(new AccountStatsMessage(Client.Character));
                    Client.lastCheckPoint = Program.currentTimeMillis();
                }
                catch (Exception e) { Logger.Error(e); return; }
            }
            else
            {
                Client.Send(new ChatGameMessage("Fromagerie d'Armes desactivée", "046380"));
            }
        }
예제 #26
0
        public override void Execute(WorldClient Client, CommandParameters parameters)
        {
            if (Settings.AppSettings.GetBoolElement("NpcShop.Fm"))
            {
                if ((Program.currentTimeMillis() - Client.lastCheckPoint) < 3000)
                {
                    return;
                }
                if (parameters.Lenght < 2)
                {
                    Client.Send(new ChatGameMessage("Syntaxe invalide : .fm coiffe/cape pa/po/pm", "682B2B"));
                    return;
                }
                ItemSlotEnum Slot = ItemSlotEnum.SLOT_ITEMBAR_13;
                if (parameters.GetParameter(0) == "coiffe")
                {
                    Slot = ItemSlotEnum.SLOT_COIFFE;
                }
                else if (parameters.GetParameter(0) == "cape")
                {
                    Slot = ItemSlotEnum.SLOT_CAPE;
                }
                else
                {
                    Client.Send(new ChatGameMessage("Liste disponnible : coiffe/cape", "682B2B"));
                    return;
                }
                var Effect = EffectEnum.AddPods;
                switch (parameters.GetParameter(1))
                {
                case "pa":
                    Effect = EffectEnum.AddPA;
                    break;

                case "pm":
                    Effect = EffectEnum.AddPM;
                    break;

                case "po":
                    Effect = EffectEnum.AddPO;
                    break;

                default:
                    Client.Send(new ChatGameMessage("Liste disponnible : pa/pm/po", "682B2B"));
                    return;
                }
                var Points = AccountTable.getPoints(Client.Account);
                if (Settings.AppSettings.GetIntElement("NpcShop.FmCost") > Points)
                {
                    Client.Send(new ChatGameMessage("Il vous manque " + (Settings.AppSettings.GetIntElement("NpcShop.FmCost") - Points) + " points pour utiliser ce privilege", "682B2B"));
                    return;
                }
                var Object = Client.Character.InventoryCache.GetItemInSlot(Slot);
                if (Object == null)
                {
                    Client.Send(new ChatGameMessage("Vous ne portez pas de " + parameters.GetParameter(0), "682B2B"));
                    return;
                }
                if (Client.GetFight() != null)
                {
                    Client.Send(new ChatGameMessage("Impossible en combat", "682B2B"));
                    return;
                }
                if (Object.GetStats().GetEffectFM(Effect).Total != 0)
                {
                    Client.Send(new ChatGameMessage("Votre " + parameters.GetParameter(0) + " donne déjà un " + parameters.GetParameter(1), "682B2B"));
                    return;
                }
                if (Effect != EffectEnum.AddPO)
                {
                    if (Object.GetStats().GetEffectFM(EffectEnum.AddPM).Total != 0 || Object.GetStats().GetEffectFM(EffectEnum.AddPA).Total != 0)
                    {
                        Client.Send(new ChatGameMessage("Votre " + parameters.GetParameter(0) + " donne déjà un pa ou un pm", "682B2B"));
                        return;
                    }
                }
                AccountTable.SubstractPoints(Client.Account.ID, Settings.AppSettings.GetIntElement("NpcShop.FmCost"));
                Client.Character.GetStats().UnMerge(Object.GetStats());
                Object.GetStats().AddItem(Effect, 1);
                Client.Character.GetStats().Merge(Object.GetStats());

                Client.Send(new ObjectRemoveMessage(Object.ID));
                Client.Send(new ObjectAddInventoryMessage(Object));
                Client.Send(new FmMoveMessage("KO+" + Object.ID + "|1|" + Object.TemplateID + "|" + Object.GetStats().ToItemStats().Replace(";", "#")));
                Client.Send(new FmCMessage("K;" + Object.TemplateID));
                InventoryItemTable.Update(Object);
                Client.Send(new ChatGameMessage("Votre " + Object.Template.Name + " donne désormais +1" + parameters.GetParameter(1).ToUpper() + " en plus de ses jets habituels !", "FF0000"));
                Client.Send(new AccountStatsMessage(Client.Character));
                Client.lastCheckPoint = Program.currentTimeMillis();
                return;
            }
            else
            {
                Client.Send(new ChatGameMessage("Fromagerie desactivée", "046380"));
            }
        }
예제 #27
0
        internal static void EatOrDrinkItem(ActionModel actionModel, Player perso, Player target, int itemID, int cellID)
        {
            InventoryItemModel objPain = InventoryItemTable.getItem(itemID);

            if (objPain == null)
            {
                return;
            }
            if (objPain.GetStats().ContainsEffect(EffectEnum.AddVie))
            {
                if (target != null)
                {
                    if ((target.Life >= target.MaxLife) || (objPain.GetStats().GetEffect(EffectEnum.AddVie).Items <= 0))
                    {
                    }
                    else
                    {
                        target.Life += objPain.GetStats().GetEffect(EffectEnum.AddVie).Items;
                        if (target.Life > target.MaxLife)
                        {
                            target.Life = target.MaxLife;
                        }
                        target.Send(new AccountStatsMessage(target));
                    }
                }
                else
                {
                    if ((perso.Life >= perso.MaxLife) || (objPain.GetStats().GetEffect(EffectEnum.AddVie).Items <= 0))
                    {
                    }
                    else
                    {
                        perso.Life += objPain.GetStats().GetEffect(EffectEnum.AddVie).Items;
                        if (perso.Life > perso.MaxLife)
                        {
                            perso.Life = perso.MaxLife;
                        }
                        perso.Send(new AccountStatsMessage(perso));
                        perso.Send(new TextInformationMessage(TextInformationTypeEnum.INFO, 1, objPain.GetStats().GetEffect(EffectEnum.AddVie).Items.ToString()));
                    }
                }
            }
            if (objPain.GetStats().ContainsEffect(EffectEnum.AddEnergy))
            {
                int val = objPain.GetStats().GetEffect(EffectEnum.AddEnergy).Items;
                if (target != null)
                {
                    if (/*target.isDead()) || */ (target.Energy >= 10000) || (val <= 0))
                    {
                    }
                    else
                    {
                        target.Energy += val;
                        if (target.Energy > 10000)
                        {
                            target.Energy = 10000;
                        }
                        target.Send(new AccountStatsMessage(target));
                    }
                }
                else
                {
                    if ((perso.Energy >= 10000) || (val <= 0))
                    {
                    }
                    else
                    {
                        perso.Energy += val;
                        if (perso.Energy > 10000)
                        {
                            target.Energy = 10000;
                        }
                        perso.Send(new AccountStatsMessage(perso));
                    }
                }
            }

            if (target == null)
            {
                perso.setEmoteActive(0);
                perso.myMap.SendToMap(new MapEatOrDrinkMessage(perso.ActorId));
            }
            else
            {
                if (target.isSitted())
                {
                    return;
                }
                target.myMap.SendToMap(new MapEatOrDrinkMessage(target.ActorId));
                if (target.Orientation != 2)
                {
                    return;
                }
                target.Orientation = 3;
            }
        }
예제 #28
0
        public override bool MoveItem(Network.WorldClient Client, Database.Models.InventoryItemModel Item, ushort Quantity, bool Add = false)
        {
            if (!Add)
            {
                if (!Npc.Items.ContainsKey(Item.ID))
                {
                    return(false);
                }
                InventoryItemModel ObjectEqualize = Client.Character.InventoryCache.getSimilarInventoryItem(Item);
                int    newQua = Item.Quantity - Quantity;
                String str;

                if (ObjectEqualize == null)
                {
                    if (newQua <= 0)
                    {
                        Npc.Items.Remove(Item.ID);
                        if (Client.Character.InventoryCache.TryMergeItem(Item.TemplateID, Item.GetStats().ToItemStats(), Item.Slot, Item.Quantity))
                        {
                            InventoryItemTable.removeItem(Item.ID);
                        }
                        else
                        {
                            Client.Character.InventoryCache.Add(Item);
                        }
                        str = "O-" + Item.ID;
                    }
                    else
                    {
                        ObjectEqualize = InventoryItemTable.TryCreateItem(Item.TemplateID, Client.Character, Quantity, Stats: Item.Effects);
                        Item.Quantity  = newQua;
                        str            = "O+" + Item.ID + "|" + Item.Quantity + "|" + Item.TemplateID + "|" + Item.GetStats().ToItemStats();
                    }
                }
                else if (newQua <= 0)
                {
                    Npc.Items.Remove(Item.ID);
                    ObjectEqualize.Quantity += Item.Quantity;
                    Client.Send(new ObjectQuantityMessage(ObjectEqualize.ID, ObjectEqualize.Quantity));
                    InventoryItemTable.removeItem(Item.ID);
                    str = "O-" + Item.ID;
                    InventoryItemTable.Update(ObjectEqualize);
                }
                else
                {
                    Item.Quantity            = newQua;
                    ObjectEqualize.Quantity += Quantity;
                    Client.Send(new ObjectQuantityMessage(ObjectEqualize.ID, ObjectEqualize.Quantity));
                    str = "O+" + Item.ID + "|" + Item.Quantity + "|" + Item.TemplateID + "|" + Item.GetStats().ToItemStats();
                    InventoryItemTable.Update(ObjectEqualize);
                }
                Client.Send(new BankUpdateMessage(str));
                Client.Send(new InventoryWeightMessage(0, 2000)); // TODO PODS
                TaxCollectorTable.Update(Npc);

                Npc.LogItems.Add(Item.ID, Item);
            }
            Client.GetCharacter().AddExperience(Npc.XP);
            Npc.LogXP += Npc.XP;
            Npc.XP     = 0;
            TaxCollectorTable.Update(Npc);

            return(true);
        }
예제 #29
0
        public override void OverridableEndFight(FightTeam Winners, FightTeam Loosers)
        {
            /*foreach (var Chal in Challanges)
             * {
             *  if (Chal.State && !Chal.Signaled)
             *      Chal.Ok();
             * }*/

            var WinChallenges      = Challanges.Where(c => c.State).ToList();
            var ChallengeXpBonus   = 1;
            var ChallengeDropBonus = 1;

            if (WinChallenges.Count > 0)
            {
                ChallengeXpBonus   = (int)Math.Round(Convert.ToDouble((100 + WinChallenges.Sum(c => c.BasicXpBonus + c.TeamXpBonus)) / 100));
                ChallengeDropBonus = (int)Math.Round(Convert.ToDouble((100 + WinChallenges.Sum(c => c.BasicDropBonus + c.TeamDropBonus)) / 100));
            }


            var WinnersCount       = Winners.GetFighters().Count;
            var LoosersCount       = Loosers.GetFighters().Count;
            var WinnersLevel       = Winners.GetFighters().Sum(x => x.Level);
            var LoosersLevel       = Loosers.GetFighters().Sum(x => x.Level);
            var WinnersProspection = Winners.GetFighters().Sum(x => x.Stats.GetTotal(EffectEnum.AddProspection));
            var MonsterWon         = Winners.Leader.ActorType == GameActorTypeEnum.TYPE_MONSTER;

            var  PossibleItemLoot  = new List <ItemLoot>();
            long PossibleKamasLoot = 0;
            var  PossibleDrops     = new Dictionary <Drop, int>();
            var  MinKamas          = 0;
            var  MaxKamas          = 0;
            long BaseXp            = 0;

            // Les monstres perdent ?
            if (!MonsterWon)
            {
                PossibleItemLoot.AddRange(this.MonsterGroup.ItemLoot);
                PossibleKamasLoot = this.MonsterGroup.KamasLoot;
            }

            foreach (var Fighter in Loosers.GetFighters())
            {
                switch (Fighter.ActorType)
                {
                case GameActorTypeEnum.TYPE_MONSTER:
                    var Monster = Fighter as MonsterFighter;

                    // Ajout des drops et kamas
                    MinKamas += Monster.Grade.Monster.MinKamas;
                    MaxKamas += Monster.Grade.Monster.MaxKamas;
                    BaseXp   += Monster.Grade.BaseXP;

                    // On augmente le Taux si possible
                    foreach (var Drop in Monster.Grade.Monster.DropsCache)
                    {
                        if (Drop.ItemTemplateCache != null)
                        {
                            if (!PossibleDrops.ContainsKey(Drop))
                            {
                                if (Drop.Seuil <= WinnersProspection)
                                {
                                    var Taux = (int)((WinnersProspection * Drop.Taux * Settings.AppSettings.GetIntElement("Rate.Drop") * ChallengeDropBonus / 100));

                                    PossibleDrops.Add(Drop, Taux);
                                }
                                else
                                {
                                    PossibleDrops.Add(Drop, (int)Drop.Taux);
                                }
                            }
                        }
                    }
                    break;
                }

                this.myResult.AddResult(Fighter, false);
            }

            var WinnersOrderedByProspect = Winners.GetFighters().OrderByDescending(x => x.Stats.GetTotal(EffectEnum.AddProspection));
            var AlreadyDropItems         = new Dictionary <int, int>();
            var ItemLootPerFighter       = PossibleItemLoot.Count / WinnersCount;
            var KamasLootPerFighter      = PossibleKamasLoot / WinnersCount;
            var Modulo = PossibleItemLoot.Count % (this.Map.GetActors().Where(x => x.ActorType == GameActorTypeEnum.TYPE_TAX_COLLECTOR).Count() > 0  ? WinnersCount + 1 : WinnersCount);

            foreach (var Drop in PossibleDrops)
            {
                if (!AlreadyDropItems.ContainsKey(Drop.Key.ItemTemplateCache.ID))
                {
                    AlreadyDropItems.Add(Drop.Key.ItemTemplateCache.ID, 0);
                }
            }

            foreach (var Fighter in WinnersOrderedByProspect)
            {
                long WinXp    = 0;
                long WinKamas = 0;
                var  Drops    = new Dictionary <int, int>();

                if (!Fighter.Left)
                {
                    switch (Fighter.ActorType)
                    {
                    case GameActorTypeEnum.TYPE_CHARACTER:
                        var Character = Fighter as CharacterFighter;

                        WinXp     = Algo.CalculatePVMXp(Character, Winners.GetFighters(), Loosers.GetFighters(), LoosersLevel, WinnersLevel, BaseXp);
                        WinXp    *= ChallengeXpBonus;
                        WinKamas  = Algo.CalculatePVMKamas(MaxKamas, MinKamas);
                        WinKamas += KamasLootPerFighter;
                        WinKamas *= ChallengeDropBonus;

                        try
                        {
                            Character.Character.BeginCachedBuffer();

                            Character.Character.InventoryCache.AddKamas(WinKamas);
                            Character.Character.AddExperience(WinXp);

                            foreach (var Drop in PossibleDrops)
                            {
                                var Taux = Drop.Value * 100;
                                var Jet  = Algo.Random(0, 100 * 100);

                                if (Jet < Taux)
                                {
                                    if (AlreadyDropItems[Drop.Key.TemplateId] < Drop.Key.Max)
                                    {
                                        if (Drops.ContainsKey(Drop.Key.TemplateId))
                                        {
                                            Drops[Drop.Key.TemplateId]++;
                                        }
                                        else
                                        {
                                            Drops.Add(Drop.Key.TemplateId, 1);
                                        }
                                    }
                                }
                            }

                            foreach (var Drop in Drops)
                            {
                                InventoryItemTable.TryCreateItem(Drop.Key, Character.Character, Drop.Value);
                            }

                            for (int i = 0; i < ItemLootPerFighter; i++)
                            {
                                if (Drops.ContainsKey(PossibleItemLoot[i].TemplateId))
                                {
                                    Drops[PossibleItemLoot[i].TemplateId]++;
                                }
                                else
                                {
                                    Drops.Add(PossibleItemLoot[i].TemplateId, PossibleItemLoot[i].Quantity);
                                }

                                InventoryItemTable.TryCreateItem(PossibleItemLoot[i].TemplateId, Character.Character, PossibleItemLoot[i].Quantity, Stats: PossibleItemLoot[i].ItemStats.ToItemStats());
                            }

                            if (ItemLootPerFighter > 0)
                            {
                                PossibleItemLoot.RemoveRange(0, ItemLootPerFighter);
                            }

                            if (Modulo > 0)
                            {
                                if (Drops.ContainsKey(PossibleItemLoot[0].TemplateId))
                                {
                                    Drops[PossibleItemLoot[0].TemplateId]++;
                                }
                                else
                                {
                                    Drops.Add(PossibleItemLoot[0].TemplateId, PossibleItemLoot[0].Quantity);
                                }

                                InventoryItemTable.TryCreateItem(PossibleItemLoot[0].TemplateId, Character.Character, PossibleItemLoot[0].Quantity, Stats: PossibleItemLoot[0].ItemStats.ToItemStats());

                                PossibleItemLoot.RemoveAt(0);
                                Modulo--;
                            }

                            // Fin de la mise en cache
                            Character.Character.EndCachedBuffer();
                        }
                        catch (Exception exc)
                        {
                            Logger.Error("MonsterFight::EndFight() " + exc.ToString());
                        }

                        // Ajout du resultat
                        this.myResult.AddResult(Fighter, true, WinKamas, WinXp, WinItems: Drops);

                        break;

                    case GameActorTypeEnum.TYPE_MONSTER:
                        var Monster = Fighter as MonsterFighter;

                        WinKamas += KamasLootPerFighter;

                        for (int i = 0; i < ItemLootPerFighter; i++)
                        {
                            if (Drops.ContainsKey(PossibleItemLoot[i].TemplateId))
                            {
                                Drops[PossibleItemLoot[i].TemplateId]++;
                            }
                            else
                            {
                                Drops.Add(PossibleItemLoot[i].TemplateId, PossibleItemLoot[i].Quantity);
                            }
                        }

                        if (ItemLootPerFighter > 0)
                        {
                            PossibleItemLoot.RemoveRange(0, ItemLootPerFighter);
                        }

                        if (Modulo > 0)
                        {
                            if (Drops.ContainsKey(PossibleItemLoot[0].TemplateId))
                            {
                                Drops[PossibleItemLoot[0].TemplateId]++;
                            }
                            else
                            {
                                Drops.Add(PossibleItemLoot[0].TemplateId, PossibleItemLoot[0].Quantity);
                            }

                            PossibleItemLoot.RemoveAt(0);
                            Modulo--;
                        }

                        this.myResult.AddResult(Fighter, true, WinKamas, WinXp, WinItems: Drops);

                        break;
                    }
                }
            }


            if (!MonsterWon && this.Map.GetActors().Where(x => x.ActorType == GameActorTypeEnum.TYPE_TAX_COLLECTOR).Count() > 0)
            {
                var  TCollector = this.Map.GetActors().Where(x => x.ActorType == GameActorTypeEnum.TYPE_TAX_COLLECTOR).First() as TaxCollector;
                long winxp      = (int)Math.Floor((double)Algo.CalculateXpWinPerco(TCollector, Winners.GetFighters(), Loosers.GetFighters(), BaseXp) / 100);
                long winkamas   = (int)Math.Floor((double)Algo.CalculatePVMKamas(MinKamas, MaxKamas) / 100);
                TCollector.XP    += winxp;
                TCollector.Kamas += winkamas;
                var Drops = new Dictionary <int, int>();

                foreach (var Drop in PossibleDrops)
                {
                    var Taux = Drop.Value * 100;
                    var Jet  = Algo.Random(0, 100 * 100);

                    if (Jet < Taux)
                    {
                        if (AlreadyDropItems[Drop.Key.TemplateId] < Drop.Key.Max)
                        {
                            if (Drops.ContainsKey(Drop.Key.TemplateId))
                            {
                                Drops[Drop.Key.TemplateId]++;
                            }
                            else
                            {
                                Drops.Add(Drop.Key.TemplateId, 1);
                            }
                        }
                    }
                }

                foreach (var Drop in Drops)
                {
                    InventoryItemTable.TryCreateItem(Drop.Key, TCollector, Drop.Value);
                }

                for (int i = 0; i < ItemLootPerFighter; i++)
                {
                    if (Drops.ContainsKey(PossibleItemLoot[i].TemplateId))
                    {
                        Drops[PossibleItemLoot[i].TemplateId]++;
                    }
                    else
                    {
                        Drops.Add(PossibleItemLoot[i].TemplateId, PossibleItemLoot[i].Quantity);
                    }

                    InventoryItemTable.TryCreateItem(PossibleItemLoot[i].TemplateId, TCollector, PossibleItemLoot[i].Quantity, Stats: PossibleItemLoot[i].ItemStats.ToItemStats());
                }

                if (ItemLootPerFighter > 0)
                {
                    PossibleItemLoot.RemoveRange(0, ItemLootPerFighter);
                }

                if (Modulo > 0)
                {
                    if (Drops.ContainsKey(PossibleItemLoot[0].TemplateId))
                    {
                        Drops[PossibleItemLoot[0].TemplateId]++;
                    }
                    else
                    {
                        Drops.Add(PossibleItemLoot[0].TemplateId, PossibleItemLoot[0].Quantity);
                    }

                    InventoryItemTable.TryCreateItem(PossibleItemLoot[0].TemplateId, TCollector, PossibleItemLoot[0].Quantity, Stats: PossibleItemLoot[0].ItemStats.ToItemStats());

                    PossibleItemLoot.RemoveAt(0);
                    Modulo--;
                }

                this.myResult.TCollectorResult = new Tera.WorldServer.World.Fights.GameFightEndResult.TaxCollectorResult()
                {
                    TaxCollector = TCollector,
                    WinExp       = winxp,
                    WinKamas     = winkamas,
                    WinItems     = Drops
                };

                TaxCollectorTable.Update(TCollector);
            }

            if (!MonsterWon)
            {
                this.Map.SpawnMonsterGroup(1);
            }
            else if (!MonsterGroup.IsFix)
            {
                this.Map.SpawnActor(this.MonsterGroup);
            }

            base.EndFight();
        }
예제 #30
0
        public override bool Finish()
        {
            if (this.myEnd)
            {
                return(false);
            }

            Logger.Debug("PlayerExchange(" + this.myClient1.Account.Username + " - " + this.myClient2.Account.Username + ")::Finish()" +
                         "\n          -- P1(Items=" + string.Join(",", this.myItemsToTrade[this.myClient1].Select(x => x.Key)) + " Kamas=" + this.myKamasToTrade[this.myClient1] + ")" +
                         "\n          -- P2(Items=" + string.Join(",", this.myItemsToTrade[this.myClient2].Select(x => x.Key)) + " Kamas=" + this.myKamasToTrade[this.myClient2] + ")");


            foreach (var ItemData in this.myItemsToTrade[this.myClient1])
            {
                var Item = this.myClient1.Character.InventoryCache.GetItem(ItemData.Key);
                Item.Quantity -= ItemData.Value;

                if (Item.Quantity == 0)
                {
                    InventoryItemTable.removeItem(Item.ID);
                    this.myClient1.Character.InventoryCache.RemoveItem(Item);
                    this.myClient1.Send(new ObjectRemoveMessage(Item.ID));
                }
                else if (Item.Quantity < 0)
                {
                    Logger.Debug("PlayerExchange::Finish() item quantity < 0 : " + myClient1.Character.Name);
                    InventoryItemTable.removeItem(Item.ID);
                    this.myClient1.Character.InventoryCache.RemoveItem(Item);
                }
                else
                {
                    this.myClient1.Character.InventoryCache.UpdateObjectquantity(Item, Item.Quantity);
                }

                InventoryItemTable.TryCreateItem(Item.TemplateID, this.myClient2.Character, ItemData.Value, Stats: Item.Effects);
            }

            foreach (var ItemData in this.myItemsToTrade[this.myClient2])
            {
                var Item = this.myClient2.Character.InventoryCache.GetItem(ItemData.Key);
                Item.Quantity -= ItemData.Value;

                if (Item.Quantity == 0)
                {
                    InventoryItemTable.removeItem(Item.ID);
                    this.myClient2.Character.InventoryCache.RemoveItem(Item);
                    this.myClient2.Send(new ObjectRemoveMessage(Item.ID));
                }
                else if (Item.Quantity < 0)
                {
                    Logger.Debug("PlayerExchange::Finish() item quantity < 0 : " + myClient2.Character.Name);
                    InventoryItemTable.removeItem(Item.ID);
                    this.myClient2.Character.InventoryCache.RemoveItem(Item);
                }
                else
                {
                    this.myClient2.Character.InventoryCache.UpdateObjectquantity(Item, Item.Quantity);
                }

                InventoryItemTable.TryCreateItem(Item.TemplateID, this.myClient1.Character, ItemData.Value, Stats: Item.Effects);
            }

            this.myClient1.Character.InventoryCache.SubstractKamas(this.myKamasToTrade[this.myClient1]);
            this.myClient2.Character.InventoryCache.SubstractKamas(this.myKamasToTrade[this.myClient2]);

            this.myClient1.Character.InventoryCache.AddKamas(this.myKamasToTrade[this.myClient2]);
            this.myClient2.Character.InventoryCache.AddKamas(this.myKamasToTrade[this.myClient1]);

            this.myClient1.Send(new AccountStatsMessage(myClient1.Character));
            this.myClient2.Send(new AccountStatsMessage(myClient2.Character));

            return(true);
        }