コード例 #1
0
        public void Initialize(ref WS_PlayerData.CharacterObject objCharacter)
        {
            if (ObjectivesDeliver > 0)
            {
                ItemObject tmpItem = new(ObjectivesDeliver, objCharacter.GUID);
                if (!objCharacter.ItemADD(ref tmpItem))
                {
                    tmpItem.Delete();
                    Packets.PacketClass response = new(Opcodes.SMSG_QUESTGIVER_QUEST_FAILED);
                    response.AddInt32(ID);
                    response.AddInt32(4);
                    objCharacter.client.Send(ref response);
                    response.Dispose();
                    return;
                }
                objCharacter.LogLootItem(tmpItem, 1, Recieved: true, Created: false);
            }
            byte i = 0;

            do
            {
                checked
                {
                    if (ObjectivesItem[i] != 0)
                    {
                        ProgressItem[i] = (byte)objCharacter.ItemCOUNT(ObjectivesItem[i]);
                    }
                    i = (byte)unchecked ((uint)(i + 1));
                }
            }while (i <= 3u);
            if (((uint)ObjectiveFlags & 2u) != 0)
            {
                Explored = false;
            }
            IsCompleted();
        }
コード例 #2
0
        private void DoTrade()
        {
            byte TargetReqItems = 0;
            byte TraderReqItems = 0;
            byte i = 0;

            do
            {
                checked
                {
                    if (TraderSlots[i] > 0)
                    {
                        TargetReqItems = (byte)(TargetReqItems + 1);
                    }
                    if (TargetSlots[i] > 0)
                    {
                        TraderReqItems = (byte)(TraderReqItems + 1);
                    }
                    i = (byte)unchecked ((uint)(i + 1));
                }
            }while (i <= 5u);
            try
            {
                if (Target.ItemFREESLOTS() < TargetReqItems)
                {
                    Packets.PacketClass responseUnAccept2 = new(Opcodes.SMSG_TRADE_STATUS);
                    try
                    {
                        responseUnAccept2.AddInt32(7);
                        Target.client.SendMultiplyPackets(ref responseUnAccept2);
                        TraderAccept = false;
                        Trader.client.SendMultiplyPackets(ref responseUnAccept2);
                        TraderAccept = false;
                    }
                    finally
                    {
                        responseUnAccept2.Dispose();
                    }
                    Packets.PacketClass responseNoSlot2 = new(Opcodes.SMSG_INVENTORY_CHANGE_FAILURE);
                    try
                    {
                        responseNoSlot2.AddInt8(50);
                        responseNoSlot2.AddUInt64(0uL);
                        responseNoSlot2.AddUInt64(0uL);
                        responseNoSlot2.AddInt8(0);
                        Target.client.Send(ref responseNoSlot2);
                    }
                    finally
                    {
                        responseNoSlot2.Dispose();
                    }
                    return;
                }
                if (Trader.ItemFREESLOTS() < TraderReqItems)
                {
                    Packets.PacketClass responseUnAccept = new(Opcodes.SMSG_TRADE_STATUS);
                    try
                    {
                        responseUnAccept.AddInt32(7);
                        Target.client.SendMultiplyPackets(ref responseUnAccept);
                        TraderAccept = false;
                        Trader.client.SendMultiplyPackets(ref responseUnAccept);
                        TargetAccept = false;
                    }
                    finally
                    {
                        responseUnAccept.Dispose();
                    }
                    Packets.PacketClass responseNoSlot = new(Opcodes.SMSG_INVENTORY_CHANGE_FAILURE);
                    try
                    {
                        responseNoSlot.AddInt8(50);
                        responseNoSlot.AddUInt64(0uL);
                        responseNoSlot.AddUInt64(0uL);
                        responseNoSlot.AddInt8(0);
                        Trader.client.Send(ref responseNoSlot);
                    }
                    finally
                    {
                        responseNoSlot.Dispose();
                    }
                    return;
                }
                if ((TargetGold > 0L) || (TraderGold > 0L))
                {
                    checked
                    {
                        Trader.Copper = Trader.Copper - TraderGold + TargetGold;
                        Target.Copper = Target.Copper + TraderGold - TargetGold;
                        Trader.SetUpdateFlag(1176, Trader.Copper);
                        Target.SetUpdateFlag(1176, Target.Copper);
                    }
                }
                if (TargetReqItems > 0 || TraderReqItems > 0)
                {
                    byte j = 0;
                    do
                    {
                        checked
                        {
                            if (TraderSlots[j] > 0)
                            {
                                var        mySlot2 = (byte)(TraderSlots[j] & 0xFF);
                                var        myBag2  = (byte)(TraderSlots[j] >> 8);
                                ItemObject myItem2 = null;
                                myItem2 = (myBag2 != 0) ? Trader.Items[myBag2].Items[mySlot2] : Trader.Items[mySlot2];
                                if (myItem2.ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_QUEST)
                                {
                                    myItem2.OwnerGUID = Target.GUID;
                                    if (Target.ItemADD(ref myItem2))
                                    {
                                        Trader.ItemREMOVE(myBag2, mySlot2, Destroy: false, Update: false);
                                    }
                                }
                            }
                            if (TargetSlots[j] > 0)
                            {
                                var        mySlot = (byte)(TargetSlots[j] & 0xFF);
                                var        myBag  = (byte)(TargetSlots[j] >> 8);
                                ItemObject myItem = null;
                                myItem = (myBag != 0) ? Target.Items[myBag].Items[mySlot] : Target.Items[mySlot];
                                if (myItem.ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_QUEST)
                                {
                                    myItem.OwnerGUID = Trader.GUID;
                                    if (Trader.ItemADD(ref myItem))
                                    {
                                        Target.ItemREMOVE(myBag, mySlot, Destroy: false, Update: false);
                                    }
                                }
                            }
                            j = (byte)unchecked ((uint)(j + 1));
                        }
                    }while (j <= 5u);
                }
                Trader.SendCharacterUpdate();
                Target.SendCharacterUpdate();
                Packets.PacketClass response = new(Opcodes.SMSG_TRADE_STATUS);
                try
                {
                    response.AddInt32(8);
                    Target.client.SendMultiplyPackets(ref response);
                    Trader.client.SendMultiplyPackets(ref response);
                }
                finally
                {
                    response.Dispose();
                    Dispose();
                }
            }
            catch (Exception e)
            {
                WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "Error doing trade: {0}{1}", Environment.NewLine, e.ToString());
            }
        }
コード例 #3
0
            public void Check()
            {
                if (Looters.Count != Rolls.Count)
                {
                    return;
                }
                byte maxRollType = 0;

                foreach (KeyValuePair <WS_PlayerData.CharacterObject, int> looter2 in Looters)
                {
                    if (looter2.Value == 1)
                    {
                        maxRollType = 1;
                    }
                    if (looter2.Value == 2 && maxRollType != 1)
                    {
                        maxRollType = 2;
                    }
                }
                if (maxRollType == 0)
                {
                    LootObject.GroupLootInfo.Remove(LootSlot);
                    Packets.PacketClass response2 = new(Opcodes.SMSG_LOOT_ALL_PASSED);
                    response2.AddUInt64(LootObject.GUID);
                    response2.AddInt32(LootSlot);
                    response2.AddInt32(Item.ItemID);
                    response2.AddInt32(0);
                    response2.AddInt32(0);
                    Broadcast(ref response2);
                    response2.Dispose();
                    return;
                }
                WS_PlayerData.CharacterObject looterCharacter = null;
                checked
                {
                    int maxRoll = -1;
                    foreach (KeyValuePair <WS_PlayerData.CharacterObject, int> looter in Looters)
                    {
                        if (looter.Value == maxRollType)
                        {
                            byte rollValue = (byte)WorldServiceLocator._WorldServer.Rnd.Next(0, 100);
                            if (rollValue > maxRoll)
                            {
                                maxRoll         = rollValue;
                                looterCharacter = looter.Key;
                            }
                            Packets.PacketClass response = new(Opcodes.SMSG_LOOT_ROLL);
                            response.AddUInt64(LootObject.GUID);
                            response.AddInt32(LootSlot);
                            response.AddUInt64(looter.Key.GUID);
                            response.AddInt32(Item.ItemID);
                            response.AddInt32(0);
                            response.AddInt32(0);
                            response.AddInt8(rollValue);
                            response.AddInt8((byte)looter.Value);
                            Broadcast(ref response);
                            response.Dispose();
                        }
                    }
                    ItemObject itemObject = new(Item.ItemID, looterCharacter.GUID)
                    {
                        StackCount = Item.ItemCount
                    };
                    ItemObject          tmpItem = itemObject;
                    Packets.PacketClass wonItem = new(Opcodes.SMSG_LOOT_ROLL_WON);
                    wonItem.AddUInt64(LootObject.GUID);
                    wonItem.AddInt32(LootSlot);
                    wonItem.AddInt32(Item.ItemID);
                    wonItem.AddInt32(0);
                    wonItem.AddInt32(0);
                    wonItem.AddUInt64(looterCharacter.GUID);
                    wonItem.AddInt8((byte)maxRoll);
                    wonItem.AddInt8(maxRollType);
                    Broadcast(ref wonItem);
                    if (looterCharacter.ItemADD(ref tmpItem))
                    {
                        looterCharacter.LogLootItem(tmpItem, Item.ItemCount, Recieved: false, Created: false);
                        LootObject.GroupLootInfo.Remove(LootSlot);
                        LootObject.Items[LootSlot] = null;
                    }
                    else
                    {
                        tmpItem.Delete();
                        LootObject.GroupLootInfo.Remove(LootSlot);
                    }
                }
            }
コード例 #4
0
    public void CreateCharacterItems(ref WS_PlayerData.CharacterObject objCharacter)
    {
        DataTable CreateInfoItems = new();

        WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM playercreateinfo_item WHERE race = {(int)objCharacter.Race} AND class = {(int)objCharacter.Classe};", ref CreateInfoItems);
        if (CreateInfoItems.Rows.Count <= 0)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in playercreateinfo_item table for Race: {0}, Class: {1}", objCharacter.Race, objCharacter.Classe);
        }
        Dictionary <int, int> Items      = new();
        List <int>            Used       = new();
        IEnumerator           enumerator = default;

        try
        {
            enumerator = CreateInfoItems.Rows.GetEnumerator();
            while (enumerator.MoveNext())
            {
                DataRow row = (DataRow)enumerator.Current;
                Items.Add(row.As <int>("itemid"), row.As <int>("amount"));
            }
        }
        finally
        {
            if (enumerator is IDisposable)
            {
                (enumerator as IDisposable).Dispose();
            }
        }
        foreach (var Item2 in Items)
        {
            if (!WorldServiceLocator._WorldServer.ITEMDatabase.ContainsKey(Item2.Key))
            {
                WS_Items.ItemInfo newItem = new(Item2.Key);
            }
            if (WorldServiceLocator._WorldServer.ITEMDatabase[Item2.Key].ContainerSlots <= 0)
            {
                continue;
            }
            var Slots2 = WorldServiceLocator._WorldServer.ITEMDatabase[Item2.Key].GetSlots;
            var array  = Slots2;
            foreach (var tmpSlot2 in array)
            {
                if (!objCharacter.Items.ContainsKey(tmpSlot2))
                {
                    objCharacter.ItemADD(Item2.Key, 0, tmpSlot2, Item2.Value);
                    Used.Add(Item2.Key);
                    break;
                }
            }
        }
        foreach (var Item in Items)
        {
            if (Used.Contains(Item.Key))
            {
                continue;
            }
            var Slots  = WorldServiceLocator._WorldServer.ITEMDatabase[Item.Key].GetSlots;
            var array2 = Slots;
            var num    = 0;
            while (true)
            {
                if (num < array2.Length)
                {
                    var tmpSlot = array2[num];
                    if (!objCharacter.Items.ContainsKey(tmpSlot))
                    {
                        objCharacter.ItemADD(Item.Key, 0, tmpSlot, Item.Value);
                        break;
                    }
                    num = checked (num + 1);
                    continue;
                }
                objCharacter.ItemADD(Item.Key, byte.MaxValue, byte.MaxValue, Item.Value);
                break;
            }
        }
    }