Ejemplo n.º 1
0
        private static Dictionary <int, List <UpdateField> > ReadDynamicValuesUpdateBlock(Packet packet, ObjectType type, object index, bool isCreating)
        {
            var dict = new Dictionary <int, List <UpdateField> >();

            if (!ClientVersion.AddedInVersion(ClientVersionBuild.V5_0_4_16016))
            {
                return(dict);
            }

            int objectEnd  = UpdateFields.GetUpdateField(ObjectDynamicField.OBJECT_DYNAMIC_END);
            var maskSize   = packet.ReadByte();
            var updateMask = new int[maskSize];

            for (var i = 0; i < maskSize; i++)
            {
                updateMask[i] = packet.ReadInt32();
            }

            var mask = new BitArray(updateMask);

            for (var i = 0; i < mask.Count; ++i)
            {
                if (!mask[i])
                {
                    continue;
                }

                string key = "Dynamic Block Value " + i;
                if (i < objectEnd)
                {
                    key = UpdateFields.GetUpdateFieldName <ObjectDynamicField>(i);
                }
                else
                {
                    switch (type)
                    {
                    case ObjectType.Container:
                    {
                        if (i < UpdateFields.GetUpdateField(ItemDynamicField.ITEM_DYNAMIC_END))
                        {
                            goto case ObjectType.Item;
                        }

                        key = UpdateFields.GetUpdateFieldName <ContainerDynamicField>(i);
                        break;
                    }

                    case ObjectType.Item:
                    {
                        key = UpdateFields.GetUpdateFieldName <ItemDynamicField>(i);
                        break;
                    }

                    case ObjectType.Player:
                    {
                        if (i < UpdateFields.GetUpdateField(UnitDynamicField.UNIT_DYNAMIC_END))
                        {
                            goto case ObjectType.Unit;
                        }

                        key = UpdateFields.GetUpdateFieldName <PlayerDynamicField>(i);
                        break;
                    }

                    case ObjectType.Unit:
                    {
                        key = UpdateFields.GetUpdateFieldName <UnitDynamicField>(i);
                        break;
                    }

                    case ObjectType.GameObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <GameObjectDynamicField>(i);
                        break;
                    }

                    case ObjectType.DynamicObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <DynamicObjectDynamicField>(i);
                        break;
                    }

                    case ObjectType.Corpse:
                    {
                        key = UpdateFields.GetUpdateFieldName <CorpseDynamicField>(i);
                        break;
                    }

                    case ObjectType.AreaTrigger:
                    {
                        key = UpdateFields.GetUpdateFieldName <AreaTriggerDynamicField>(i);
                        break;
                    }

                    case ObjectType.SceneObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <SceneObjectDynamicField>(i);
                        break;
                    }

                    case ObjectType.Conversation:
                    {
                        key = UpdateFields.GetUpdateFieldName <ConversationDynamicField>(i);
                        break;
                    }
                    }
                }

                var flag = packet.ReadUInt16();
                var cnt  = flag & 0x7FFF;
                if ((flag & 0x8000) != 0)
                {
                    packet.ReadUInt32(key + " Size", index);
                }

                var vals = new int[cnt];
                for (var j = 0; j < cnt; ++j)
                {
                    vals[j] = packet.ReadInt32();
                }

                var values    = new List <UpdateField>();
                var fieldMask = new BitArray(vals);
                for (var j = 0; j < fieldMask.Count; ++j)
                {
                    if (!fieldMask[j])
                    {
                        continue;
                    }

                    var    blockVal = packet.ReadUpdateField();
                    string value    = blockVal.UInt32Value + "/" + blockVal.SingleValue;
                    packet.AddValue(key, value, index, j);

                    values.Add(blockVal);
                }

                dict.Add(i, values);
            }

            return(dict);
        }
Ejemplo n.º 2
0
        private static Dictionary <int, UpdateField> ReadValuesUpdateBlock(Packet packet, ObjectType type, object index, bool isCreating)
        {
            var maskSize = packet.ReadByte();

            var updateMask = new int[maskSize];

            for (var i = 0; i < maskSize; i++)
            {
                updateMask[i] = packet.ReadInt32();
            }

            var mask = new BitArray(updateMask);
            var dict = new Dictionary <int, UpdateField>();

            int objectEnd = UpdateFields.GetUpdateField(ObjectField.OBJECT_END);

            for (var i = 0; i < mask.Count; ++i)
            {
                if (!mask[i])
                {
                    continue;
                }

                var blockVal = packet.ReadUpdateField();

                // Don't spam 0 values at create
                if (isCreating && blockVal.UInt32Value == 0)
                {
                    continue;
                }

                string key   = "Block Value " + i;
                string value = blockVal.UInt32Value + "/" + blockVal.SingleValue;

                if (i < objectEnd)
                {
                    key = UpdateFields.GetUpdateFieldName <ObjectField>(i);
                }
                else
                {
                    switch (type)
                    {
                    case ObjectType.Container:
                    {
                        if (i < UpdateFields.GetUpdateField(ItemField.ITEM_END))
                        {
                            goto case ObjectType.Item;
                        }

                        key = UpdateFields.GetUpdateFieldName <ContainerField>(i);
                        break;
                    }

                    case ObjectType.Item:
                    {
                        key = UpdateFields.GetUpdateFieldName <ItemField>(i);
                        break;
                    }

                    case ObjectType.Player:
                    {
                        if (i < UpdateFields.GetUpdateField(UnitField.UNIT_END) || i < UpdateFields.GetUpdateField(UnitField.UNIT_FIELD_END))
                        {
                            goto case ObjectType.Unit;
                        }

                        key = UpdateFields.GetUpdateFieldName <PlayerField>(i);
                        break;
                    }

                    case ObjectType.Unit:
                    {
                        key = UpdateFields.GetUpdateFieldName <UnitField>(i);
                        break;
                    }

                    case ObjectType.GameObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <GameObjectField>(i);
                        break;
                    }

                    case ObjectType.DynamicObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <DynamicObjectField>(i);
                        break;
                    }

                    case ObjectType.Corpse:
                    {
                        key = UpdateFields.GetUpdateFieldName <CorpseField>(i);
                        break;
                    }

                    case ObjectType.AreaTrigger:
                    {
                        key = UpdateFields.GetUpdateFieldName <AreaTriggerField>(i);
                        break;
                    }

                    case ObjectType.SceneObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <SceneObjectField>(i);
                        break;
                    }

                    case ObjectType.Conversation:
                    {
                        key = UpdateFields.GetUpdateFieldName <ConversationField>(i);
                        break;
                    }
                    }
                }

                // HACK...
                if (key == UnitField.UNIT_FIELD_FACTIONTEMPLATE.ToString())
                {
                    packet.AddValue(key, value + $" ({ StoreGetters.GetName(StoreNameType.Faction, (int)blockVal.UInt32Value, false) })", index);
                }
                else
                {
                    packet.AddValue(key, value, index);
                }

                dict.Add(i, blockVal);
            }

            objectEnd = UpdateFields.GetUpdateField(ObjectDynamicField.OBJECT_DYNAMIC_END);
            if (ClientVersion.AddedInVersion(ClientVersionBuild.V5_0_4_16016))
            {
                maskSize   = packet.ReadByte();
                updateMask = new int[maskSize];
                for (var i = 0; i < maskSize; i++)
                {
                    updateMask[i] = packet.ReadInt32();
                }

                mask = new BitArray(updateMask);
                for (var i = 0; i < mask.Count; ++i)
                {
                    if (!mask[i])
                    {
                        continue;
                    }

                    string key = "Dynamic Block Value " + i;
                    if (i < objectEnd)
                    {
                        key = UpdateFields.GetUpdateFieldName <ObjectDynamicField>(i);
                    }
                    else
                    {
                        switch (type)
                        {
                        case ObjectType.Container:
                        {
                            if (i < UpdateFields.GetUpdateField(ItemDynamicField.ITEM_DYNAMIC_END))
                            {
                                goto case ObjectType.Item;
                            }

                            key = UpdateFields.GetUpdateFieldName <ContainerDynamicField>(i);
                            break;
                        }

                        case ObjectType.Item:
                        {
                            key = UpdateFields.GetUpdateFieldName <ItemDynamicField>(i);
                            break;
                        }

                        case ObjectType.Player:
                        {
                            if (i < UpdateFields.GetUpdateField(UnitDynamicField.UNIT_DYNAMIC_END))
                            {
                                goto case ObjectType.Unit;
                            }

                            key = UpdateFields.GetUpdateFieldName <PlayerDynamicField>(i);
                            break;
                        }

                        case ObjectType.Unit:
                        {
                            key = UpdateFields.GetUpdateFieldName <UnitDynamicField>(i);
                            break;
                        }

                        case ObjectType.GameObject:
                        {
                            key = UpdateFields.GetUpdateFieldName <GameObjectDynamicField>(i);
                            break;
                        }

                        case ObjectType.DynamicObject:
                        {
                            key = UpdateFields.GetUpdateFieldName <DynamicObjectDynamicField>(i);
                            break;
                        }

                        case ObjectType.Corpse:
                        {
                            key = UpdateFields.GetUpdateFieldName <CorpseDynamicField>(i);
                            break;
                        }

                        case ObjectType.AreaTrigger:
                        {
                            key = UpdateFields.GetUpdateFieldName <AreaTriggerDynamicField>(i);
                            break;
                        }

                        case ObjectType.SceneObject:
                        {
                            key = UpdateFields.GetUpdateFieldName <SceneObjectDynamicField>(i);
                            break;
                        }

                        case ObjectType.Conversation:
                        {
                            key = UpdateFields.GetUpdateFieldName <ConversationDynamicField>(i);
                            break;
                        }
                        }
                    }

                    var flag = packet.ReadUInt16();
                    var cnt  = flag & 0x7FFF;
                    if ((flag & 0x8000) != 0)
                    {
                        packet.ReadUInt32(key + " Size", index);
                    }

                    var vals = new int[cnt];
                    for (var j = 0; j < cnt; ++j)
                    {
                        vals[j] = packet.ReadInt32();
                    }

                    var fieldMask = new BitArray(vals);
                    for (var j = 0; j < fieldMask.Count; ++j)
                    {
                        if (!fieldMask[j])
                        {
                            continue;
                        }

                        var    blockVal = packet.ReadUpdateField();
                        string value    = blockVal.UInt32Value + "/" + blockVal.SingleValue;
                        packet.AddValue(key, value, index, j);
                    }
                }
            }

            return(dict);
        }
Ejemplo n.º 3
0
        private static Dictionary <int, UpdateField> ReadValuesUpdateBlock(Packet packet, ObjectType type, object index, bool isCreating)
        {
            var maskSize = packet.ReadByte();

            var updateMask = new int[maskSize];

            for (var i = 0; i < maskSize; i++)
            {
                updateMask[i] = packet.ReadInt32();
            }

            var mask = new BitArray(updateMask);
            var dict = new Dictionary <int, UpdateField>();

            int objectEnd = UpdateFields.GetUpdateField(ObjectField.OBJECT_END);

            for (var i = 0; i < mask.Count; ++i)
            {
                if (!mask[i])
                {
                    continue;
                }

                var blockVal = packet.ReadUpdateField();

                // Don't spam 0 values at create
                if (isCreating && blockVal.UInt32Value == 0)
                {
                    continue;
                }

                string key   = "Block Value " + i;
                string value = blockVal.UInt32Value + "/" + blockVal.SingleValue;

                if (i < objectEnd)
                {
                    key = UpdateFields.GetUpdateFieldName <ObjectField>(i);
                }
                else
                {
                    switch (type)
                    {
                    case ObjectType.Container:
                    {
                        if (i < UpdateFields.GetUpdateField(ItemField.ITEM_END))
                        {
                            goto case ObjectType.Item;
                        }

                        key = UpdateFields.GetUpdateFieldName <ContainerField>(i);
                        break;
                    }

                    case ObjectType.Item:
                    {
                        key = UpdateFields.GetUpdateFieldName <ItemField>(i);
                        break;
                    }

                    case ObjectType.Player:
                    {
                        if (i < UpdateFields.GetUpdateField(UnitField.UNIT_END) || i < UpdateFields.GetUpdateField(UnitField.UNIT_FIELD_END))
                        {
                            goto case ObjectType.Unit;
                        }

                        key = UpdateFields.GetUpdateFieldName <PlayerField>(i);
                        break;
                    }

                    case ObjectType.Unit:
                    {
                        key = UpdateFields.GetUpdateFieldName <UnitField>(i);
                        break;
                    }

                    case ObjectType.GameObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <GameObjectField>(i);
                        break;
                    }

                    case ObjectType.DynamicObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <DynamicObjectField>(i);
                        break;
                    }

                    case ObjectType.Corpse:
                    {
                        key = UpdateFields.GetUpdateFieldName <CorpseField>(i);
                        break;
                    }

                    case ObjectType.AreaTrigger:
                    {
                        key = UpdateFields.GetUpdateFieldName <AreaTriggerField>(i);
                        break;
                    }

                    case ObjectType.SceneObject:
                    {
                        key = UpdateFields.GetUpdateFieldName <SceneObjectField>(i);
                        break;
                    }

                    case ObjectType.Conversation:
                    {
                        key = UpdateFields.GetUpdateFieldName <ConversationField>(i);
                        break;
                    }
                    }
                }

                // HACK...
                if (key == UnitField.UNIT_FIELD_SCALING_LEVEL_DELTA.ToString())
                {
                    value = (int)blockVal.UInt32Value + "/" + blockVal.SingleValue;
                }

                if (key == UnitField.UNIT_FIELD_FACTIONTEMPLATE.ToString())
                {
                    packet.AddValue(key, value + $" ({ StoreGetters.GetName(StoreNameType.Faction, (int)blockVal.UInt32Value, false) })", index);
                }
                else
                {
                    packet.AddValue(key, value, index);
                }

                dict.Add(i, blockVal);
            }

            return(dict);
        }
Ejemplo n.º 4
0
        public static Dictionary <int, UpdateField> ReadValuesUpdateBlock(ref Packet packet, ObjectType type, int index)
        {
            var maskSize = packet.ReadByte();

            var updateMask = new int[maskSize];

            for (var i = 0; i < maskSize; i++)
            {
                updateMask[i] = packet.ReadInt32();
            }

            var mask = new BitArray(updateMask);
            var dict = new Dictionary <int, UpdateField>();

            int objectEnd = UpdateFields.GetUpdateField(ObjectField.OBJECT_END);

            for (var i = 0; i < mask.Count; i++)
            {
                if (!mask[i])
                {
                    continue;
                }

                var    blockVal = packet.ReadUpdateField();
                string key      = "Block Value " + i;
                string value    = blockVal.Int32Value + "/" + blockVal.SingleValue;
                if (i < objectEnd)
                {
                    key = UpdateFields.GetUpdateFieldName(i, "ObjectField");
                }
                else
                {
                    switch (type)
                    {
                    case ObjectType.Container:
                    {
                        if (i < UpdateFields.GetUpdateField(ItemField.ITEM_END))
                        {
                            goto case ObjectType.Item;
                        }

                        key = UpdateFields.GetUpdateFieldName(i, "ContainerField");
                        break;
                    }

                    case ObjectType.Item:
                    {
                        key = UpdateFields.GetUpdateFieldName(i, "ItemField");
                        break;
                    }

                    case ObjectType.Player:
                    {
                        if (i < UpdateFields.GetUpdateField(UnitField.UNIT_END))
                        {
                            goto case ObjectType.Unit;
                        }

                        key = UpdateFields.GetUpdateFieldName(i, "PlayerField");
                        break;
                    }

                    case ObjectType.Unit:
                    {
                        key = UpdateFields.GetUpdateFieldName(i, "UnitField");
                        break;
                    }

                    case ObjectType.GameObject:
                    {
                        key = UpdateFields.GetUpdateFieldName(i, "GameObjectField");
                        break;
                    }

                    case ObjectType.DynamicObject:
                    {
                        key = UpdateFields.GetUpdateFieldName(i, "DynamicObjectField");
                        break;
                    }

                    case ObjectType.Corpse:
                    {
                        key = UpdateFields.GetUpdateFieldName(i, "CorpseField");
                        break;
                    }
                    }
                }
                packet.Writer.WriteLine("[" + index + "] " + key + ": " + value);
                dict.Add(i, blockVal);
            }

            return(dict);
        }