예제 #1
0
        public void UpdateValue <T>(UnitFields pos, T value, int increment = 0)
        {
            m_touched[OBJECT_TYPES.TYPE_UNIT] = true;

            m_unitfields.Set((int)pos + increment, true);
            if (value is long || value is ulong)
            {
                m_unitfields.Set((int)pos + 1 + increment, true);
                m_unitvalues[(int)pos + increment]     = Convert.ToInt32(Convert.ToInt64(value) & uint.MaxValue);
                m_unitvalues[(int)pos + 1 + increment] = Convert.ToInt32((Convert.ToInt64(value) >> 32) & uint.MaxValue);
            }
            else
            {
                m_unitvalues[(int)pos + increment] = value;
            }
        }
예제 #2
0
        private static void HandleValuesUpdate(uint blockId, UpdateType updateType, ObjectType objectType, Packet packet)
        {
            var  maskSizeBlocks = packet.ReadByte("{0}. MaskSize", blockId);
            var  maskSizeBytes  = maskSizeBlocks * 4;
            var  maskSizeBits   = maskSizeBytes * 8;
            var  bits           = new BitArray(maskSizeBits);
            var  fields         = new Hashtable();
            byte dynamicUpdateCount;

            for (int i = 0, b = 0; i < maskSizeBlocks; i++)
            {
                uint mask = packet.ReadUInt32("{0}. Mask[{1}]", blockId, i);
                packet.SetLastDataField("{0:X8}", mask);

                var bytes     = BitConverter.GetBytes(mask);
                var blockBits = new BitArray(bytes);

                for (int x = 0; x < 32; x++)
                {
                    bits[b++] = blockBits[x];
                }
            }

            for (int i = 0; i < maskSizeBits; i++)
            {
                if (!bits.Get(i))
                {
                    continue;
                }

                ObjectFields objectField = (ObjectFields)i;
                UnitFields   unitField   = (UnitFields)i;
                PlayerFields playerField = (PlayerFields)i;

                if (Enum.IsDefined(typeof(ObjectFields), i))
                {
                    Debug.Print(objectField.GetFullName());
                }
                else if (Enum.IsDefined(typeof(UnitFields), i))
                {
                    Debug.Print(unitField.GetFullName());
                }
                else if (Enum.IsDefined(typeof(PlayerFields), i))
                {
                    Debug.Print(playerField.GetFullName());
                }
                else
                {
                    Debug.Print("Unknown: {0}", i);
                }

                if (i < (int)ObjectFields.End)
                {
                    switch (objectField)
                    {
                    case ObjectFields.Scale:
                        fields[i] = packet.ReadSingle(objectField.GetFullName());
                        break;

                    default:
                        fields[i] = packet.ReadUInt32(objectField.GetFullName());
                        break;
                    }
                }
                else
                {
                    // NOTE: This assumes a unit or player of some kind.
                    // It does not allow for game objects or such (yet).
                    switch (objectType)
                    {
                    case ObjectType.Player:
                    case ObjectType.Unit:
                        switch (i)
                        {
                        case (int)UnitFields.BoundingRadius:
                        case (int)UnitFields.CombatReach:
                        case (int)UnitFields.MinDamage:
                        case (int)UnitFields.MaxDamage:
                        case (int)UnitFields.MinOffHandDamage:
                        case (int)UnitFields.MaxOffHandDamage:
                        case (int)UnitFields.ModCastingSpeed:
                        case (int)UnitFields.ModHaste:
                        case (int)UnitFields.ModRangedHaste:
                        case (int)UnitFields.AttackPowerMultiplier:
                        case (int)UnitFields.RangedAttackPowerMultiplier:
                        case (int)UnitFields.MinRangedDamage:
                        case (int)UnitFields.MaxRangedDamage:
                        case (int)UnitFields.PowerCostMultiplier:
                        case (int)PlayerFields.BlockPercentage:
                        case (int)PlayerFields.DodgePercentage:
                        case (int)PlayerFields.ParryPercentage:
                        case (int)PlayerFields.CritPercentage:
                        case (int)PlayerFields.RangedCritPercentage:
                        case (int)PlayerFields.OffhandCritPercentage:
                        case (int)PlayerFields.Mastery:
                        case (int)PlayerFields.ModHealingPercent:
                        case (int)PlayerFields.ModHealingDonePercent:
                        case (int)PlayerFields.WeaponDmgMultipliers:
                        case (int)PlayerFields.ModSpellPowerPercent:
                        case (int)PlayerFields.ModResiliencePercent:
                        case (int)PlayerFields.OverrideSpellPowerByAPPercent:
                        case (int)PlayerFields.OverrideAPBySpellPowerPercent:
                        case (int)PlayerFields.RuneRegen:
                        case (int)PlayerFields.RuneRegen1:
                        case (int)PlayerFields.RuneRegen2:
                        case (int)PlayerFields.RuneRegen3:
                        case (int)PlayerFields.UiHitModifier:
                        case (int)PlayerFields.UiSpellHitModifier:
                        case (int)PlayerFields.HomeRealmTimeOffset:
                        case (int)PlayerFields.ModPetHaste:
                            fields[i] = packet.ReadSingle(i < (int)UnitFields.End ? unitField.GetFullName() : playerField.GetFullName());
                            break;

                        default:
                            fields[i] = packet.ReadUInt32(i < (int)UnitFields.End ? unitField.GetFullName() : playerField.GetFullName());
                            break;
                        }
                        break;

                    default:
                        break;
                    }
                }
            }

            dynamicUpdateCount = packet.ReadByte("Dynamic update count");
        }
예제 #3
0
		public ExtendedUpdateFieldId(UnitFields val)
		{
			RawId = (int)val;
			ObjectType = ObjectTypeId.Unit;
		}
예제 #4
0
 public int GetInt32(UnitFields field)
 {
     return m_updateValues[(int)field].Int32;
 }
예제 #5
0
 public ExtendedUpdateFieldId(UnitFields val)
 {
     RawId      = (int)val;
     ObjectType = ObjectTypeId.Unit;
 }
예제 #6
0
 public int GetInt32(UnitFields field)
 {
     return(this.m_updateValues[(int)field].Int32);
 }
예제 #7
0
파일: Unit.cs 프로젝트: soulson/whisper
 public void SetField(UnitFields field, float value)
 {
     SetField((ushort)field, value);
 }
예제 #8
0
파일: Unit.cs 프로젝트: soulson/whisper
 public float GetFieldFloat(UnitFields field)
 {
     return(GetFieldFloat((ushort)field));
 }
예제 #9
0
파일: Unit.cs 프로젝트: soulson/whisper
 public int GetFieldSigned(UnitFields field)
 {
     return(GetFieldSigned((ushort)field));
 }
예제 #10
0
파일: Unit.cs 프로젝트: soulson/whisper
 public uint GetFieldUnsigned(UnitFields field)
 {
     return(GetFieldUnsigned((ushort)field));
 }
예제 #11
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="val"></param>
 public UpdateFieldId(UnitFields value)
 {
     m_RawId = (int)value;
 }
예제 #12
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="val"></param>
 public UpdateFieldId( UnitFields value )
 {
     m_RawId = (int)value;
 }
예제 #13
0
 public uint GetUInt32(UnitFields field)
 {
     return(m_updateValues[(int)field].UInt32);
 }