예제 #1
0
        public ItemsContainer GetContainer(ItemsContainerId id, int containerId)
        {
            if (inventoryContainers.ContainsKey(containerId))
            {
                return(inventoryContainers[containerId][id]);
            }

            return(null);
        }
예제 #2
0
        private static void EnterCharacterToGameWorld(Client client, int accountId)
        {
            DataTable characterTable = DatabaseManager.ReturnQuery(string.Format("SELECT * FROM characters WHERE account_id='{0}'", accountId));

            if (characterTable.Rows.Count > 0)
            {
                DataRow characterData = characterTable.Rows[0];
                int     characterId   = (int)characterData["id"];
                Player  character     = CharactersManager.CreatePlayer();
                character.DatabaseId = characterId;

                client.SelectedCharacter = character;

                if (ServerManager.Instance.StatsManager.GetContainerForCharacter(client.SelectedCharacter.Id, out StatsContainer container))
                {
                    container.SetStat(StatType.NAME, (string)characterData["name"]);
                    container.SetStat(StatType.LEVEL, (short)characterData["lvl"]);
                    container.SetStat(StatType.RACE, (byte)characterData["race"]);
                    container.SetStat(StatType.CLASS, (byte)characterData["ch_class"]);
                    container.SetStat(StatType.POS_X, (short)characterData["pos_x"]);
                    container.SetStat(StatType.POS_Z, (short)characterData["pos_z"]);
                    container.SetStat(StatType.EXPERIENCE, (int)characterData["exp"]);
                    container.SetStat(StatType.KINGDOM, (byte)characterData["kingdom"]);
                    container.SetStat(StatType.GOLD, (int)characterData["gold"]);
                }

                Dictionary <ItemsContainerId, ItemsContainer> containers = ServerManager.Instance.ItemsManager.GetContainers(character.Id);
                DataTable itemsTable = DatabaseManager.ReturnQuery(string.Format("SELECT * FROM items WHERE owner_id='{0}'", character.DatabaseId));
                for (int i = 0; i < itemsTable.Rows.Count; i++)
                {
                    DataRow          itemRow     = itemsTable.Rows[i];
                    ItemsContainerId inventoryId = (ItemsContainerId)(byte)itemRow["inventory_id"];

                    containers[inventoryId].AddItem((int)itemRow["slot"], new ItemData()
                    {
                        uniqueId = (int)itemRow["id"],
                        baseId   = (int)itemRow["base_id"],
                        amount   = (int)itemRow["amount"],
                    });
                }

                client.BindEvents();

                ServerManager.Instance.CharactersManager.AddCharacter(character);
                ServerManager.Instance.CharactersManager.clients.Add(character.Id, client);

                var       questContainer  = ServerManager.Instance.QuestFlags.GetContainer(character.Id);
                DataTable questFlagsTable = DatabaseManager.ReturnQuery(string.Format("SELECT * FROM quest_flags WHERE player_id='{0}'", character.DatabaseId));
                for (int i = 0; i < questFlagsTable.Rows.Count; i++)
                {
                    DataRow itemRow = questFlagsTable.Rows[i];

                    QuestFlag flag = new QuestFlag()
                    {
                        questName = (string)itemRow["quest_name"],
                        flag      = (string)itemRow["flag"],
                        value     = (int)itemRow["flag_val"],
                    };

                    questContainer.SetQuestFlagInt(flag.questName, flag);
                }

                Dictionary <int, Character> table = ServerManager.Instance.CharactersManager.GetCharactersInRange <Character>(client.SelectedCharacter.Position, 50);
                //Send all characters
                foreach (var item in table)
                {
                    Server.Instance.SendData(client.ip, new SpawnCharacterPacket(item.Value));
                }

                //Acknowledge other clients
                foreach (var item in ServerManager.Instance.CharactersManager.GetClientsInRange(client.SelectedCharacter.Position, 50))
                {
                    Server.Instance.SendData(item.Value.ip, new SpawnCharacterPacket(client.SelectedCharacter));
                }

                Packet packet = new Packet();
                packet.writer.Write((byte)1);
                packet.writer.Write((int)client.SelectedCharacter.Id);
                packet.writer.Write((short)characterData["pos_x"]);
                packet.writer.Write((short)characterData["pos_z"]);
                packet.writer.Write((short)characterData["lvl"]);
                packet.writer.Write((int)characterData["exp"]);
                packet.writer.Write((int)characterData["gold"]);

                Server.Instance.SendData(client.ip, packet);
                foreach (var ic in containers)
                {
                    Server.Instance.SendData(client.ip, new SyncInventoryPacket(ic.Value));
                }
            }
            else
            {
                Server.Instance.SendData(client.ip, new CharacterSelectionPacket());
            }
        }
예제 #3
0
        private static void RequestItemActionImpl(Client arg1, BinaryReader reader)
        {
            ItemAction action = (ItemAction)reader.ReadByte();

            ItemsContainerId sourceContainerId = (ItemsContainerId)reader.ReadByte();
            ItemsContainerId targetContainerId = (ItemsContainerId)reader.ReadByte();

            int sourceSlot = reader.ReadInt32();
            int targetSlot = reader.ReadInt32();

            var containers = ServerManager.Instance.ItemsManager.GetContainers(arg1.SelectedCharacter.Id);

            switch (action)
            {
            case ItemAction.MOVE:
                var sourceContainer = containers[sourceContainerId];
                var targetContainer = containers[targetContainerId];

                if (targetContainerId == ItemsContainerId.SHOP)
                {
                    if (sourceContainerId == ItemsContainerId.INVENTORY)
                    {
                        SellItem(arg1, sourceSlot, sourceContainer);
                    }


                    return;
                }

                if (sourceContainerId == ItemsContainerId.SHOP)
                {
                    if (targetContainerId == ItemsContainerId.INVENTORY)
                    {
                        BuyItem(arg1, sourceSlot);
                    }
                    return;
                }

                if (sourceContainer.Items.ContainsKey(sourceSlot))
                {
                    var sourceItem = sourceContainer.Items[sourceSlot];

                    if (targetContainerId == ItemsContainerId.EQUIPMENT)
                    {
                        //EQUIP ITEM
                        if (ServerManager.Instance.ItemsManager.GetItemPrototype(sourceItem.baseId, out var prototype))
                        {
                            if ((short)arg1.SelectedCharacter.GetStat(StatType.LEVEL) < prototype.reqLvl)
                            {
                                return;
                            }
                        }
                    }

                    ItemData targetItem = null;

                    if (targetContainer.Items.ContainsKey(targetSlot))
                    {
                        targetItem = targetContainer.Items[targetSlot];
                    }

                    sourceContainer.RemoveItem(sourceSlot, true);

                    if (targetItem != null)
                    {
                        targetContainer.RemoveItem(targetSlot, true);
                    }

                    targetContainer.AddItem(targetSlot, sourceItem, true);

                    if (targetItem != null)
                    {
                        sourceContainer.AddItem(sourceSlot, targetItem, true);
                    }

                    containers[sourceContainerId].Refresh();
                    containers[targetContainerId].Refresh();
                }
                break;
            }
        }
예제 #4
0
 public ItemsContainer GetItemsContainer(ItemsContainerId id)
 {
     return(ServerManager.Instance.ItemsManager.GetContainer(id, Id));
 }
예제 #5
0
 public void SetContainerId(ItemsContainerId id)
 {
     this.ContainerId = id;
 }
예제 #6
0
 public ItemsContainer(ItemsContainerId containerId, int id)
 {
     this.InventoryId = containerId;
     Id = id;
 }