Пример #1
0
        public void OnGotInventoryItem(Common.Item.Item item, bool end)
        {
            if (item != null)
            {
                List <ActorPC> list = chars.Values.ToList();
                if (list.Count > currentCharIndex)
                {
                    if (item.SlotID == 255)
                    {
                        lock (list[currentCharIndex].Inventory.SoldItems)
                        {
                            list[currentCharIndex].Inventory.SoldItems.Add(item);
                        }
                    }
                    else
                    {
                        list[currentCharIndex].Inventory.Container[item.Container][item.SlotID] = item;

                        /*if (item.InventoryEquipSlot != Common.Inventory.InventoryEquipSlot.None)
                         *  list[currentCharIndex].Inventory.Equipments[item.InventoryEquipSlot] = item;*/
                    }
                }
            }
            if (end)
            {
                currentCharIndex++;
                LoadInventory();
            }
        }
Пример #2
0
 public void OnItemBuy(CM_ITEM_BUY p)
 {
     if (map.GetActor(p.ActorID) is ActorNPC npc)
     {
         if (NPC.NPCStoreFactory.Instance.Stores.ContainsKey(npc.BaseData.StoreID))
         {
             NPC.NPCStore store = NPC.NPCStoreFactory.Instance[npc.BaseData.StoreID];
             foreach (KeyValuePair <byte, ushort> i in p.Items)
             {
                 if (i.Key < store.Items.Length)
                 {
                     Common.Item.Item item = ItemFactory.Instance.CreateNewItem(store.Items[i.Key]);
                     if (item != null)
                     {
                         int price = (int)(item.BaseData.Price * store.BuyRate) * i.Value;
                         if (chara.Gold > price)
                         {
                             Interlocked.Add(ref chara.Gold, -price);
                             item.Count = i.Value;
                             AddItem(item);
                             SendPlayerGold();
                         }
                     }
                 }
             }
         }
     }
 }
Пример #3
0
        public void AddItem(Common.Item.Item item, Containers container = Containers.Inventory)
        {
            item.CharID = chara.CharID;
            OperationResults res = chara.Inventory.AddItem(container, item, out List <Common.Item.Item> affected);

            if (affected.Count > 0)
            {
                CharacterSession.Instance.SaveItem(affected);
            }

            if (res != OperationResults.FAILED)
            {
                if (item.Count > 0)
                {
                    affected.Add(item);
                }

                switch (res)
                {
                case OperationResults.NEW_INDEX:
                    SendItemUpdate(ItemUpdateMethod.Add, affected);
                    break;

                case OperationResults.STACK_UPDATE:
                    SendItemUpdate(ItemUpdateMethod.Update, affected);
                    break;
                }
                if (res == OperationResults.NEW_INDEX && item.Count > 0)
                {
                    CharacterSession.Instance.CreateItem(item);
                }
            }
        }
Пример #4
0
        public void SendPlayerEquiptStats(Common.Item.Item item, Stats extra2 = Stats.None, bool all = false)
        {
            UpdateEvent evt   = new UpdateEvent();
            Stats       extra = Utils.FindStat(item.Synthesis);

            /*
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.MinAtk))
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.EquiptMinAtk, chara.Status.AtkMinExt);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.MaxAtk))
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.EquiptMaxAtk, chara.Status.AtkMaxExt);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.HitB) || Stats.HitB == extra || Stats.HitB == extra2 || all)
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.HitBase, chara.Status.Hit);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.AvoidB) || Stats.AvoidB == extra || Stats.AvoidB == extra2 || all)
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.AvoidBase, chara.Status.Avoid);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.CritB) || Stats.CritB == extra || Stats.CritB == extra2 || all)
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.CriticalBase, chara.Status.Critical);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.DefCritB) || Stats.DefCritB == extra || Stats.DefCritB == extra2 || all)
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.CriticalResist, chara.Status.CriticalResist);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.ParryB) || Stats.ParryB == extra || Stats.ParryB == extra2 || all)
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.ParryBase, chara.Status.Parry);
             * if (item.BaseData.PrimaryStats.ContainsKey(Stats.PrcB) || Stats.PrcB == extra || Stats.PrcB == extra2 || all)
             *  evt.AddActorPara(Common.Packets.GameServer.PacketParameter.PierceBase, chara.Status.Pierce);
             */
            if (item.BaseData.PrimaryStats.ContainsKey(Stats.MaxHp) || Stats.MaxHp == extra || Stats.MaxHp == extra2 || all)
            {
                SendPlayerHP(true);
            }

            SM_PLAYER_UPDATE_LIST p = new SM_PLAYER_UPDATE_LIST()
            {
                Parameters = evt
            };

            Network.SendPacket(p);
        }
Пример #5
0
        public void OnItemBuyBack(CM_ITEM_BUYBACK p)
        {
            if (map.GetActor(p.ActorID) is ActorNPC npc)
            {
                if (NPC.NPCStoreFactory.Instance.Stores.ContainsKey(npc.BaseData.StoreID))
                {
                    NPC.NPCStore store = NPC.NPCStoreFactory.Instance[npc.BaseData.StoreID];
                    if (p.Slot < chara.Inventory.SoldItems.Count)
                    {
                        Common.Item.Item item = chara.Inventory.SoldItems[p.Slot];
                        if (item != null)
                        {
                            int price = (int)(item.BaseData.Price * store.BuyBackRate) * item.Count;
                            if (chara.Gold > price)
                            {
                                Interlocked.Add(ref chara.Gold, -price);
                                chara.Inventory.SoldItems.RemoveAt(p.Slot);
                                OperationResults res = chara.Inventory.AddItem(Containers.Inventory, item, out List <Common.Item.Item> affected);
                                if (affected.Count > 0)
                                {
                                    CharacterSession.Instance.SaveItem(affected);
                                }

                                if (res != OperationResults.FAILED)
                                {
                                    if (item.Count > 0)
                                    {
                                        affected.Add(item);
                                    }

                                    switch (res)
                                    {
                                    case OperationResults.NEW_INDEX:
                                        SendItemUpdate(ItemUpdateMethod.Add, affected);
                                        break;

                                    case OperationResults.STACK_UPDATE:
                                        SendItemUpdate(ItemUpdateMethod.Update, affected);
                                        break;
                                    }
                                    if (res == OperationResults.NEW_INDEX && item.Count > 0)
                                    {
                                        CharacterSession.Instance.SaveItem(item);
                                    }
                                    if (item.Count == 0)
                                    {
                                        List <Common.Item.Item> remove = new List <Common.Item.Item>();
                                        remove.Add(item);
                                        CharacterSession.Instance.DeleteItem(remove);
                                    }
                                }
                                SendPlayerGold();
                                SendItemBuyBackList();
                            }
                        }
                    }
                }
            }
        }
Пример #6
0
        public void SaveItem(Common.Item.Item item)
        {
            CM_ITEM_SAVE p = new CM_ITEM_SAVE()
            {
                Item = item
            };

            Network.SendPacket(p);
        }
Пример #7
0
        public void SendItemUpdate(Item.ItemUpdateMethod reason, Common.Item.Item item)
        {
            SM_ITEM_INFO            p    = new SM_ITEM_INFO();
            List <Common.Item.Item> list = new List <Common.Item.Item>();

            list.Add(item);
            p.Reason = reason;
            p.Items  = list;

            Network.SendPacket(p);
        }
Пример #8
0
 public void OnGotInventoryItem(Common.Item.Item item, bool end)
 {
     if (item != null && chara != null)
     {
         Common.Item.Item newItem = ItemFactory.Instance.CreateNewItem(item.ItemID);
         if (newItem == null || newItem.BaseData == null)
         {
             Logger.Log.Warn("Item or BaseData == null for ID:" + item.ID + ",ItemID:" + item.ItemID);
         }
         else
         {
             newItem.CharID = item.CharID;
             newItem.ID     = item.ID;
             newItem.SlotID = item.SlotID;
             //newItem.InventoryEquipSlot = item.InventoryEquipSlot;
             newItem.Count     = item.Count;
             newItem.Synthesis = item.Synthesis;
             if (newItem.SlotID == 255)
             {
                 lock (chara.Inventory.SoldItems)
                 {
                     chara.Inventory.SoldItems.Add(newItem);
                 }
             }
             else
             {
                 /*chara.Inventory.Container[newItem.SlotID] = newItem;
                  * if (item.InventoryEquipSlot != InventoryEquipSlot.None)
                  * {
                  *  if (chara.Inventory.Equipments[newItem.InventoryEquipSlot] != null)
                  *  {
                  *      newItem.InventoryEquipSlot = InventoryEquipSlot.None;
                  *      duplicateEquipSlots.Add(newItem);
                  *  }
                  *  else
                  *  {
                  *      chara.Inventory.Equipments[newItem.InventoryEquipSlot] = newItem;
                  *      PC.Status.EquipItem(chara, newItem,true);
                  *  }
                  * }*/
             }
         }
     }
     if (end)
     {
         CharacterSession.Instance.SaveItem(duplicateEquipSlots);
         duplicateEquipSlots = chara.Inventory.CheckDuplicateSlot();
         CharacterSession.Instance.DeleteItem(duplicateEquipSlots);
         duplicateEquipSlots = null;
         CharacterSession.Instance.GetQuests(chara.CharID, this);
     }
 }
Пример #9
0
        private bool BaGuaSuccess(Common.Item.Item p, Common.Item.Item s)
        {
            Random r       = new Random();
            int    percent = r.Next(1, 100);

            switch (Math.Abs(p.BaseData.ItemLevel - s.BaseData.ItemLevel))
            {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
                if (percent <= 90)
                {
                    return(true);
                }

                break;

            case 5:
            case 6:
            case 7:
                if (percent <= 60)
                {
                    return(true);
                }

                break;

            case 8:
                if (percent <= 30)
                {
                    return(true);
                }

                break;

            case 9:
                if (percent <= 10)
                {
                    return(true);
                }

                break;

            default:
                break;
            }
            return(false);
        }
Пример #10
0
        public void CreateItem(Common.Item.Item item)
        {
            long session = Global.PacketSession;

            createItems[session] = item;

            CM_ITEM_CREATE p = new CM_ITEM_CREATE()
            {
                SessionID = session,
                Item      = item
            };

            Network.SendPacket(p);
        }
Пример #11
0
        public void ChangeBaGua(CM_BAGUA_SET_CHANGE p)
        {
            chara.SendRemove = false;
            while (chara.StillProcess)
            {
            }
            foreach (KeyValuePair <ushort, byte> i in p.EquipItems)
            {
                Common.Item.Item bagua = chara.Inventory.Container[Containers.Inventory][i.Key];

                if (bagua?.BaseData.ItemType == ItemType.Bagua)
                {
                    OperationResults res = chara.Inventory.EquipItem(bagua, out Common.Item.Item oldItem);
                    if (res != OperationResults.FAILED)
                    {
                        if (oldItem != null)
                        {
                            PC.Status.EquipItem(chara, oldItem, false);
                            List <Common.Item.Item> list = new List <Common.Item.Item>();
                            list.Add(bagua);
                            list.Add(oldItem);
                            SendItemUpdate(ItemUpdateMethod.Move, list);
                            PC.Status.EquipItem(chara, bagua, true);
                        }
                        else
                        {
                            SendItemUpdate(ItemUpdateMethod.Move, bagua);
                            PC.Status.EquipItem(chara, bagua, true);
                        }
                    }
                }
            }

            SM_BAGUA_SET_CHANGE r = new SM_BAGUA_SET_CHANGE();

            Network.SendPacket(r);
            PC.Status.CalcStatus(chara);
            SendPlayerStats();
            UpdateEvent evt = new UpdateEvent()
            {
                Actor      = chara,
                Target     = chara,
                UpdateType = UpdateTypes.Actor
            };

            evt.AddActorPara(Common.Packets.GameServer.PacketParameter.HP, chara.HP);
            //evt.AddActorPara(Common.Packets.GameServer.PacketParameter.MaxHP, chara.MaxHP);
            map.SendEventToAllActorsWhoCanSeeActor(MapEvents.EVENT_BROADCAST, evt, chara, true);
        }
Пример #12
0
 public Common.Item.Item CreateNewItem(uint itemID)
 {
     if (items.ContainsKey(itemID))
     {
         Common.Item.Item item = new Common.Item.Item(this[itemID])
         {
             Count = 1
         };
         return(item);
     }
     else
     {
         return(null);
     }
 }
Пример #13
0
        public static void FindSynthesisStat(Common.Item.Item item, ActorPC pc, bool add)
        {
            switch (item.Synthesis)
            {
            case 0x05:
                Interlocked.Add(ref pc.Status.HitExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.HitB]);
                break;

            case 0x07:
                Interlocked.Add(ref pc.Status.CriticalExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.CritB]);
                break;

            case 0x09:
                Interlocked.Add(ref pc.Status.CriticalResistExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.DefCritB]);
                break;

            case 0x0B:
                Interlocked.Add(ref pc.Status.AvoidExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.AvoidB]);
                break;

            case 0x0D:
                Interlocked.Add(ref pc.Status.ParryExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.ParryB]);
                break;

            case 0x1A:
                Interlocked.Add(ref pc.Status.MaxHPExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.MaxHp]);
                break;

            case 0x20:
                Interlocked.Add(ref pc.Status.PierceExt, (add ? 1 : -1) * item.BaseData.SecondaryStats[Stats.PrcB]);
                break;

            default:
                break;     //Shouldn't be reachable

                /*
                 * case 0x01:
                 * return Stats.MaxAtk;
                 * case 0x02:
                 * return Stats.Defense;
                 * case 0x03:
                 * return Stats.Resist;
                 * case 0x13:
                 * return Stats.CastTimeB;
                 */
            }
        }
Пример #14
0
        public void OnItemBuy(CM_ITEM_EXCHANGE p)
        {
            if (map.GetActor(p.ActorID) is ActorNPC npc)
            {
                if (NPC.NPCStoreFactory.Instance.StoresByItem.ContainsKey(npc.BaseData.StoreByItemID))
                {
                    NPC.NPCStore store = NPC.NPCStoreFactory.Instance.StoresByItem[npc.BaseData.StoreByItemID];
                    if (store != null)
                    {
                        Common.Item.Item item = ItemFactory.Instance.CreateNewItem(store.Items[p.BuySlot]);
                        Dictionary <Common.Item.Item, ushort> items = new Dictionary <Common.Item.Item, ushort>();
                        ushort total = 0;
                        if (item != null)
                        {
                            Common.Item.Item add;
                            foreach (KeyValuePair <ushort, ushort> i in p.ExchangeItems)
                            {
                                add = Character.Inventory.Container[Containers.Inventory][i.Key];
                                if (add != null)
                                {
                                    if (add.Count >= i.Value && add.ItemID == store.Materials[p.BuySlot])
                                    {
                                        items.Add(add, i.Value);
                                        total += add.Count;
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }

                            if (total >= p.BuyCount * store.MaterialCounts[p.BuySlot])
                            {
                                foreach (KeyValuePair <Common.Item.Item, ushort> i in items)
                                {
                                    RemoveItemSlot(i.Key.SlotID, i.Value);
                                }
                                AddItem(item);
                            }
                        }
                    }
                }
            }
        }
Пример #15
0
 public static void EquipItem(ActorPC pc, Common.Item.Item item, bool add)
 {
     Interlocked.Add(ref pc.Status.AtkMinExt, item.BaseData.PrimaryStats.ContainsKey(Stats.MinAtk) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.MinAtk] : 0);
     Interlocked.Add(ref pc.Status.AtkMaxExt, item.BaseData.PrimaryStats.ContainsKey(Stats.MaxAtk) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.MaxAtk] : 0);
     Interlocked.Add(ref pc.Status.HitExt, item.BaseData.PrimaryStats.ContainsKey(Stats.HitB) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.HitB] : 0);
     Interlocked.Add(ref pc.Status.AvoidExt, item.BaseData.PrimaryStats.ContainsKey(Stats.AvoidB) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.AvoidB] : 0);
     Interlocked.Add(ref pc.Status.ParryExt, item.BaseData.PrimaryStats.ContainsKey(Stats.ParryB) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.ParryB] : 0);
     Interlocked.Add(ref pc.Status.CriticalExt, item.BaseData.PrimaryStats.ContainsKey(Stats.CritB) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.CritB] : 0);
     Interlocked.Add(ref pc.Status.CriticalResistExt, item.BaseData.PrimaryStats.ContainsKey(Stats.DefCritB) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.DefCritB] : 0);
     Interlocked.Add(ref pc.Status.PierceExt, item.BaseData.PrimaryStats.ContainsKey(Stats.PrcB) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.PrcB] : 0);
     Interlocked.Add(ref pc.Status.MaxHPExt, item.BaseData.PrimaryStats.ContainsKey(Stats.MaxHp) ? (add ? 1 : -1) * item.BaseData.PrimaryStats[Stats.MaxHp] : 0);
     if (Utils.FindStat(item.Synthesis) != Stats.None &&
         Utils.FindStat(item.Synthesis) != Stats.CastTimeB &&
         Utils.FindStat(item.Synthesis) != Stats.Defense &&
         Utils.FindStat(item.Synthesis) != Stats.MaxAtk &&
         Utils.FindStat(item.Synthesis) != Stats.Resist)
     {
         FindSynthesisStat(item, pc, add);
     }
 }
Пример #16
0
 public void DecomposeBaGua(CM_DECOMPOSE_BAGUA p)
 {
     Common.Item.Item item = chara.Inventory.Container[Containers.Inventory][p.ItemSlot];
     if (item != null)
     {
         if ((item.BaseData.ItemType == ItemType.Weapon_AB ||
              item.BaseData.ItemType == ItemType.Weapon_DG ||
              item.BaseData.ItemType == ItemType.Weapon_GT ||
              item.BaseData.ItemType == ItemType.Weapon_ST ||
              item.BaseData.ItemType == ItemType.Weapon_SW ||
              item.BaseData.ItemType == ItemType.Weapon_TA) &&
             item.BaseData.BaGuaPowderCountWep > 0)
         {
             RemoveItemSlot((byte)p.ItemSlot, 1);
             AddItem(item.BaseData.BaGuaPowderIdWep, (ushort)item.BaseData.BaGuaPowderCountWep);
         }
         else if (item.BaseData.ItemType == ItemType.Bagua && item.BaseData.BaGuaPowderCount > 0)
         {
             RemoveItemSlot((byte)p.ItemSlot, 1);
             AddItem(item.BaseData.BaGuaPowderId, (ushort)item.BaseData.BaGuaPowderCount);
         }
     }
 }
Пример #17
0
        public Common.Item.Item AddItem(uint itemID, ushort count = 1, Containers container = Containers.Inventory)
        {
            Common.Item.Item item = ItemFactory.Instance.CreateNewItem(itemID);
            item.CharID    = chara.CharID;
            item.Container = container;
            item.Count     = count;
            OperationResults res = chara.Inventory.AddItem(container, item, out List <Common.Item.Item> affected);

            if (affected.Count > 0)
            {
                CharacterSession.Instance.SaveItem(affected);
            }

            if (res != OperationResults.FAILED)
            {
                if (item.Count > 0)
                {
                    affected.Add(item);
                }

                switch (res)
                {
                case OperationResults.NEW_INDEX:
                    SendItemUpdate(ItemUpdateMethod.Add, affected);
                    break;

                case OperationResults.STACK_UPDATE:
                    SendItemUpdate(ItemUpdateMethod.Update, affected);
                    break;
                }
                if (res == OperationResults.NEW_INDEX && item.Count > 0)
                {
                    CharacterSession.Instance.CreateItem(item);
                }
            }
            return(item);
        }
Пример #18
0
 protected override void OnGotInventoryItem(GameSession client, Common.Item.Item item, bool end)
 {
     client.OnGotInventoryItem(item, end);
 }
Пример #19
0
        public override void OnDie(ActorExt killedBy)
        {
            if (npc.Tasks.TryGetValue("ActorCatch", out Task removed))
            {
                removed.Deactivate();
            }

            if (firstAttacker != null && npc.BaseData.QuestIDs.Count > 0)
            {
                ActorPC       pc      = firstAttacker;
                List <ushort> already = new List <ushort>();
                foreach (ushort i in npc.BaseData.QuestIDs)
                {
                    if (!already.Contains(i))
                    {
                        already.Add(i);
                    }
                    else
                    {
                        continue;
                    }

                    if (pc.Quests.TryGetValue(i, out Common.Quests.Quest q))
                    {
                        try
                        {
                            Quests.QuestManager.Instance.ProcessQuest(pc, i, q.NextStep, q, npc, false, true);
                        }
                        catch (Exception ex)
                        {
                            Logger.Log.Error(ex);
                        }
                    }
                }
            }
            if (ShouldRespawn != null)
            {
                ShouldRespawn();
            }

            AI.Deactivate();
            Map.Map     map    = MapManager.Instance.GetMap(npc.MapInstanceID);
            ActorCorpse corpse = new ActorCorpse(npc);

            if (firstAttacker != null)
            {
                corpse.Owner = Party.PartyManager.Instance.GetPartyLootOwner(firstAttacker);
            }

            corpse.MapID        = npc.MapID;
            corpse.X            = npc.X;
            corpse.Y            = npc.Y;
            corpse.Z            = npc.Z;
            corpse.EventHandler = new DummyEventHandler();

            if (firstAttacker != null)
            {
                uint exp = (uint)(npc.Level / 2 + 10);
                Manager.ExperienceManager.Instance.ApplyExp(firstAttacker, exp);
                List <Common.Item.Item> items = new List <Common.Item.Item>();
                foreach (uint i in npc.BaseData.Items.Keys)
                {
                    int rate = npc.BaseData.Items[i];
                    if (Global.Random.Next(0, 99) < rate)
                    {
                        Common.Item.Item item = Item.ItemFactory.Instance.CreateNewItem(i);
                        item.Count = npc.BaseData.ItemCounts[i];
                        items.Add(item);
                    }
                }
                //corpse.Gold = 200;
                corpse.Items = items.ToArray();
            }
            map.RegisterActor(corpse);
            npc.Status.CorpseActorID = corpse.ActorID;

            Tasks.Actor.CorpseDeleteTask task = new Tasks.Actor.CorpseDeleteTask(npc.BaseData.CorpseItemID > 0 ? 20000 : 10000, corpse);
            task.Activate();

            foreach (NPCDeathSpawn i in npc.BaseData.DeathSpawns)
            {
                for (int j = 0; j < i.Count; j++)
                {
                    short x = (short)Global.Random.Next(npc.X - 15, npc.X + 15);
                    short y = (short)Global.Random.Next(npc.Y - 15, npc.Y + 15);
                    short z = (short)npc.Z;
                    Scripting.Utils.SpawnNPC(map, i.NPCID, i.AppearEffect, x, y, z, 0, i.Motion);
                }
            }
            firstAttacker = null;
        }
Пример #20
0
        public void ComposeBaGua(CM_COMPOSE_BAGUA p)
        {
            Common.Item.Item primary   = chara.Inventory.Container[Containers.Inventory][p.PrimarySlot];
            Common.Item.Item secondary = chara.Inventory.Container[Containers.Inventory][p.SecondarySlot];
            Stats            stat      = Utils.FindStat(p.Stat);

            if (primary != null && secondary != null)
            {
                if (primary.BaseData.ItemType == ItemType.Bagua && secondary.BaseData.ItemType == ItemType.Bagua)
                {
                    if (primary.BaseData.SecondaryStats.ContainsKey(stat) && secondary.BaseData.PrimaryStats.ContainsKey(stat))
                    {
                        Dictionary <Common.Item.Item, ushort> update = new Dictionary <Common.Item.Item, ushort>();
                        Common.Item.Item add;
                        ushort           total = 0;
                        bool             pass;

                        foreach (KeyValuePair <ushort, ushort> i in p.ExchangeItems)
                        {
                            add = Character.Inventory.Container[Containers.Inventory][i.Key];
                            if (add != null)
                            {
                                if (add.Count >= i.Value && add.ItemID == primary.BaseData.BaGuaPowderId)
                                {
                                    update.Add(add, i.Value);
                                    total += i.Value;
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }

                        if (total == primary.BaseData.BaGuaPowderCount)
                        {
                            pass = BaGuaSuccess(primary, secondary);
                            update.Add(secondary, secondary.Count);
                            RemoveItemsBySlot(update);
                            if (pass)
                            {
                                Common.Item.Item remove = new Common.Item.Item(primary.BaseData)
                                {
                                    Synthesis = primary.Synthesis
                                };
                                primary.Synthesis = p.Stat;
                                List <Common.Item.Item> items = new List <Common.Item.Item>();
                                items.Add(primary);
                                CharacterSession.Instance.SaveItem(primary);
                                SM_ITEM_INFO r = new SM_ITEM_INFO()
                                {
                                    Reason = Item.ItemUpdateMethod.Synthesis,
                                    Items  = items
                                };
                                Network.SendPacket(r);

                                /*if (primary.InventoryEquipSlot != InventoryEquipSlot.None)
                                 * {
                                 *  PC.Status.EquipItem(chara, remove,false);
                                 *  PC.Status.EquipItem(chara, primary,true);
                                 *  PC.Status.CalcStatus(chara);
                                 *  SendPlayerEquiptStats(primary, Utils.FindStat(remove.Synthesis));
                                 * }*/
                            }
                            else
                            {
                                SM_COMPOSE_BAGUA_FAIL r = new SM_COMPOSE_BAGUA_FAIL()
                                {
                                    Code = 0x148
                                };
                                Network.SendPacket(r);
                            }
                        }
                    }
                }
            }
        }
Пример #21
0
        public void OnItemSell(CM_ITEM_SELL p)
        {
            Dictionary <ushort, ushort> items        = p.Items;
            List <Common.Item.Item>     shouldRemove = new List <Common.Item.Item>();

            foreach (ushort i in items.Keys)
            {
                Common.Item.Item review = chara.Inventory.Container[Containers.Inventory][i];
                if (review != null)
                {
                    if (review.Count >= items[i] && items[i] > 0 && review.Container == Containers.Inventory)
                    {
                        chara.Inventory.RemoveItemSlot(Containers.Inventory, i, items[i], out List <Common.Item.Item> updated, out List <Common.Item.Item> removed);
                        if (removed.Count > 0)
                        {
                            SendItemUpdate(ItemUpdateMethod.Sold, removed);
                        }

                        if (updated.Count > 0)
                        {
                            SendItemUpdate(ItemUpdateMethod.Sold, updated);
                        }

                        uint price = 0;
                        foreach (Common.Item.Item item in removed)
                        {
                            price       = item.BaseData.Price;
                            item.SlotID = 255;
                        }
                        CharacterSession.Instance.SaveItem(removed);
                        foreach (Common.Item.Item item in updated)
                        {
                            Common.Item.Item newItem = ItemFactory.Instance.CreateNewItem(item.ItemID);
                            newItem.CharID = chara.CharID;
                            newItem.Count  = items[i];
                            newItem.SlotID = 255;
                            CharacterSession.Instance.CreateItem(newItem);
                            removed.Add(newItem);
                            price = newItem.BaseData.Price;
                        }
                        price *= items[i];
                        Interlocked.Add(ref chara.Gold, (int)price);
                        SendPlayerGold();
                        foreach (Common.Item.Item item in removed)
                        {
                            item.Count = items[i];
                            lock (chara.Inventory.SoldItems)
                            {
                                while (chara.Inventory.SoldItems.Count >= 14)
                                {
                                    shouldRemove.Add(chara.Inventory.SoldItems[0]);
                                    chara.Inventory.SoldItems.RemoveAt(0);
                                }
                                chara.Inventory.SoldItems.Add(item);
                            }
                        }
                    }
                    else
                    {
                        SM_SERVER_MESSAGE r = new SM_SERVER_MESSAGE()
                        {
                            MessagePosition = SM_SERVER_MESSAGE.Positions.ChatWindow,
                            Message         = "Bug fixed, better luck next time."
                        };
                        Network.SendPacket(r);
                    }
                }
            }
            if (shouldRemove.Count > 0)
            {
                CharacterSession.Instance.DeleteItem(shouldRemove);
            }

            SendItemBuyBackList();
        }
Пример #22
0
 public void OnItemSave(Packets.Client.CM_ITEM_SAVE p)
 {
     Common.Item.Item item = p.Item;
     ItemCache.Instance.Save(item.ID, item);
 }