示例#1
0
文件: Unit.cs 项目: soulson/whisper
        protected override void AppendMovementUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags)
        {
            if ((updateFlags & ObjectUpdateFlags.Living) != 0)
            {
                log.DebugFormat("appending movement update with movementflags = {0}", MovementFlags);

                buffer.Append((int)MovementFlags);
                buffer.Append(MovementTime); // time
                buffer.Append(Position);
                buffer.Append(0);            // fallingTime

                buffer.Append(MovementSpeed.Walking);
                buffer.Append(MovementSpeed.Running);
                buffer.Append(MovementSpeed.RunningBack);
                buffer.Append(MovementSpeed.Swimming);
                buffer.Append(MovementSpeed.SwimmingBack);
                buffer.Append(MovementSpeed.Turning);

                // remove HasPosition from the updateFlags when passing to GameObject, since we already wrote the position
                base.AppendMovementUpdate(buffer, updateType, updateFlags & ~ObjectUpdateFlags.HasPosition);
            }
            else
            {
                base.AppendMovementUpdate(buffer, updateType, updateFlags);
            }
        }
示例#2
0
 protected virtual void AppendCreationUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags)
 {
     buffer.Append((byte)updateType);
     buffer.Append(ID.GetPacked());
     buffer.Append((byte)TypeID);
     buffer.Append((byte)updateFlags);
 }
示例#3
0
        public void BuildTargetedCreationUpdate(UpdateData data, Character character)
        {
            ObjectUpdateType  updateType  = ObjectUpdateType.CreateObject;
            ObjectUpdateFlags updateFlags = UpdateFlags;

            if (ID.ObjectType == ObjectID.Type.Corpse ||
                ID.ObjectType == ObjectID.Type.DynamicObject ||
                ID.ObjectType == ObjectID.Type.GameObject ||
                ID.ObjectType == ObjectID.Type.Player ||
                ID.ObjectType == ObjectID.Type.Unit)
            {
                updateType = ObjectUpdateType.CreateObject2;
            }

            if (character == this)
            {
                updateFlags |= ObjectUpdateFlags.Self;
            }

            using (ByteBuffer buffer = new ByteBuffer())
            {
                // creation update
                AppendCreationUpdate(buffer, updateType, updateFlags);

                // movement update
                AppendMovementUpdate(buffer, updateType, updateFlags);

                // values update
                UpdateMask updateMask = GetCreationUpdateMask();
                AppendValuesUpdate(buffer, updateType, updateFlags, updateMask);

                // append the update
                data.AddUpdateBlock(buffer);
            }
        }
示例#4
0
        public Task <PacketOut> BuildCreateUpdateFor(IPlayer plr)
        {
            ObjectUpdateType updateType = ObjectUpdateType.UPDATETYPE_CREATE_OBJECT;

            ObjectUpdateFlags updateFlags = State.UpdateFlags;

            if (plr.GetPrimaryKeyLong() == this.GetPrimaryKeyLong())
            {
                updateFlags |= ObjectUpdateFlags.UPDATEFLAG_SELF;
            }

            if ((updateFlags & ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION) != 0)
            {
                if (_IsPlayer())
                {
                    updateType = ObjectUpdateType.UPDATETYPE_CREATE_OBJECT2;
                }
            }

            PacketOut p = new PacketOut();

            p.Write((byte)updateType);
            p.Write(pGUID);
            p.Write((byte)State.MyType);
            _BuildMovementUpdate(updateType, updateFlags, ref p);
            _BuildValuesUpdate(updateType, updateFlags, ref p, plr);
            return(Task.FromResult(p));
        }
示例#5
0
        private void _BuildValuesUpdate(ObjectUpdateType type, ObjectUpdateFlags flags, ref PacketOut pkt, IPlayer plr)
        {
            UpdateMask mask = new UpdateMask(State.UpdateFields.Length);
            PacketOut  tmp  = new PacketOut();


            UpdatefieldFlags visibilityFlags = UpdatefieldFlags.UF_FLAG_PUBLIC;

            if (plr.GetPrimaryKeyLong() == this.GetPrimaryKeyLong())
            {
                visibilityFlags |= UpdatefieldFlags.UF_FLAG_PRIVATE;
            }

            var fieldFlags = GetFlagVisibility();

            for (var i = 0; i < State.UpdateFields.Length; ++i)
            {
                //if ((fieldFlags[i] & visibilityFlags) == 0)
                //    continue;
                tmp.Write(State.UpdateFields[i].data);
                mask.SetBit(i);
            }

            pkt.Write((byte)mask.GetMaxBlockCount());
            for (var i = 0; i < mask.GetMaxBlockCount(); ++i)
            {
                pkt.Write(mask.m_blocks[i]);
            }

            pkt.Write(tmp);
        }
 public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref ItemObject updateObject)
 {
     checked
     {
         packet.AddInt8((byte)updateType);
         packet.AddPackGUID(updateObject.GUID);
         if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT)
         {
             if (WorldServiceLocator._WorldServer.ITEMDatabase[updateObject.ItemEntry].ContainerSlots > 0)
             {
                 packet.AddInt8(2);
             }
             else
             {
                 packet.AddInt8(1);
             }
             packet.AddInt8(24);
             packet.AddUInt64(updateObject.GUID);
         }
         if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_VALUES)
         {
             var updateCount = 0;
             var num         = UpdateMask.Count - 1;
             for (var j = 0; j <= num; j++)
             {
                 if (UpdateMask.Get(j))
                 {
                     updateCount = j;
                 }
             }
             packet.AddInt8((byte)(checked (updateCount + 32) / 32));
             packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4);
             var num2 = UpdateMask.Count - 1;
             for (var i = 0; i <= num2; i++)
             {
                 if (UpdateMask.Get(i))
                 {
                     if (UpdateData[i] is uint)
                     {
                         packet.AddUInt32(Conversions.ToUInteger(UpdateData[i]));
                     }
                     else if (UpdateData[i] is float)
                     {
                         packet.AddSingle(Conversions.ToSingle(UpdateData[i]));
                     }
                     else
                     {
                         packet.AddInt32(Conversions.ToInteger(UpdateData[i]));
                     }
                 }
             }
             UpdateMask.SetAll(value: false);
         }
         if (packet is UpdatePacketClass @class)
         {
             @class.UpdatesCount++;
         }
     }
 }
示例#7
0
 public void HandleMovementPacket(InPacket packet)
 {
     ResetData();
     updateType = ObjectUpdateType.UPDATETYPE_MOVEMENT;
     guid       = packet.ReadPackedGuid();
     ReadMovementInfo(packet);
     HandleUpdateData();
 }
示例#8
0
 public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_Corpses.CorpseObject updateObject)
 {
     checked
     {
         packet.AddInt8((byte)updateType);
         packet.AddPackGUID(updateObject.GUID);
         if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT)
         {
             packet.AddInt8(7);
             packet.AddInt8(88);
             packet.AddSingle(updateObject.positionX);
             packet.AddSingle(updateObject.positionY);
             packet.AddSingle(updateObject.positionZ);
             packet.AddSingle(updateObject.orientation);
             packet.AddUInt64(updateObject.GUID);
         }
         if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT || updateType == ObjectUpdateType.UPDATETYPE_VALUES)
         {
             int updateCount = 0;
             int num         = UpdateMask.Count - 1;
             for (int j = 0; j <= num; j++)
             {
                 if (UpdateMask.Get(j))
                 {
                     updateCount = j;
                 }
             }
             packet.AddInt8((byte)(checked (updateCount + 32) / 32));
             packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4);
             int num2 = UpdateMask.Count - 1;
             for (int i = 0; i <= num2; i++)
             {
                 if (UpdateMask.Get(i))
                 {
                     if (UpdateData[i] is uint)
                     {
                         packet.AddUInt32(Conversions.ToUInteger(UpdateData[i]));
                     }
                     else if (UpdateData[i] is float)
                     {
                         packet.AddSingle(Conversions.ToSingle(UpdateData[i]));
                     }
                     else
                     {
                         packet.AddInt32(Conversions.ToInteger(UpdateData[i]));
                     }
                 }
             }
             UpdateMask.SetAll(value: false);
         }
         if (packet is UpdatePacketClass @class)
         {
             @class.UpdatesCount++;
         }
     }
 }
示例#9
0
            public void HandleMonsterMovementPacket(InPacket packet)
            {
                ResetData();
                updateType = ObjectUpdateType.UPDATETYPE_MOVEMENT;
                guid       = packet.ReadPackedGuid();
                byte        unk         = packet.ReadByte();
                WorldObject worldObject = game.Objects[guid];

                worldObject.Set(packet.ReadVector3());
            }
示例#10
0
 void ResetData()
 {
     updateType = ObjectUpdateType.UPDATETYPE_VALUES;
     guid       = 0;
     lowGuid    = 0;
     movementSpeeds.Clear();
     splinePoints.Clear();
     updateFields.Clear();
     outOfRangeGuids.Clear();
     movementInfo = null;
 }
示例#11
0
        protected virtual void AppendValuesUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags, UpdateMask updateMask)
        {
            buffer.Append(updateMask.BlockCount);
            buffer.Append(updateMask.Data);

            // write the value set
            for (ushort i = 0; i < FieldCount; ++i)
            {
                if (updateMask.GetBit(i))
                {
                    buffer.Append(GetFieldUnsigned(i));
                }
            }
        }
示例#12
0
        protected virtual void AppendMovementUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags)
        {
            if ((updateFlags & ObjectUpdateFlags.HasPosition) != 0)
            {
                buffer.Append(Position);
            }

            if ((updateFlags & ObjectUpdateFlags.MaskID) != 0)
            {
                buffer.Append(ID.MaskID);
            }

            if ((updateFlags & ObjectUpdateFlags.All) != 0)
            {
                buffer.Append(1); // ?
            }
        }
示例#13
0
            public void HandleUpdatePacket(InPacket packet)
            {
                blockCount = packet.ReadUInt32();
                for (int blockIndex = 0; blockIndex < blockCount; blockIndex++)
                {
                    ResetData();

                    updateType = (ObjectUpdateType)packet.ReadByte();

                    switch (updateType)
                    {
                    case ObjectUpdateType.UPDATETYPE_VALUES:
                        guid = packet.ReadPackedGuid();
                        ReadValuesUpdateData(packet);
                        break;

                    case ObjectUpdateType.UPDATETYPE_MOVEMENT:
                        guid = packet.ReadPackedGuid();
                        ReadMovementUpdateData(packet);
                        break;

                    case ObjectUpdateType.UPDATETYPE_CREATE_OBJECT:
                    case ObjectUpdateType.UPDATETYPE_CREATE_OBJECT2:
                        guid       = packet.ReadPackedGuid();
                        objectType = (TypeID)packet.ReadByte();
                        ReadMovementUpdateData(packet);
                        ReadValuesUpdateData(packet);
                        break;

                    case ObjectUpdateType.UPDATETYPE_OUT_OF_RANGE_OBJECTS:
                        var guidCount = packet.ReadUInt32();
                        for (var guidIndex = 0; guidIndex < guidCount; guidIndex++)
                        {
                            outOfRangeGuids.Add(packet.ReadPackedGuid());
                        }
                        break;

                    case ObjectUpdateType.UPDATETYPE_NEAR_OBJECTS:
                        break;
                    }

                    HandleUpdateData();
                }
            }
示例#14
0
 public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_GameObjects.GameObject updateObject)
 {
     checked
     {
         packet.AddInt8((byte)updateType);
         packet.AddPackGUID(updateObject.GUID);
         switch (updateObject.Type)
         {
         case GameObjectType.GAMEOBJECT_TYPE_TRAP:
         case GameObjectType.GAMEOBJECT_TYPE_DUEL_ARBITER:
         case GameObjectType.GAMEOBJECT_TYPE_FLAGSTAND:
         case GameObjectType.GAMEOBJECT_TYPE_FLAGDROP:
             updateType = ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF;
             break;
         }
         if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF)
         {
             packet.AddInt8(5);
             if (updateObject.Type is GameObjectType.GAMEOBJECT_TYPE_TRANSPORT or GameObjectType.GAMEOBJECT_TYPE_MO_TRANSPORT)
             {
                 packet.AddInt8(82);
             }
示例#15
0
 void ResetData()
 {
     updateType = ObjectUpdateType.UPDATETYPE_VALUES;
     guid = 0;
     lowGuid = 0;
     movementSpeeds.Clear();
     splinePoints.Clear();
     updateFields.Clear();
     outOfRangeGuids.Clear();
     movementInfo = null;
 }
示例#16
0
 public void HandleMonsterMovementPacket(InPacket packet)
 {
     ResetData();
     updateType = ObjectUpdateType.UPDATETYPE_MOVEMENT;
     guid = packet.ReadPackedGuid();
     byte unk = packet.ReadByte();
     WorldObject worldObject = game.Objects[guid];
     worldObject.Set(packet.ReadVector3());
 }
示例#17
0
 public void HandleMovementPacket(InPacket packet)
 {
     ResetData();
     updateType = ObjectUpdateType.UPDATETYPE_MOVEMENT;
     guid = packet.ReadPackedGuid();
     ReadMovementInfo(packet);
     HandleUpdateData();
 }
示例#18
0
            public void HandleUpdatePacket(InPacket packet)
            {
                blockCount = packet.ReadUInt32();
                for (int blockIndex = 0; blockIndex < blockCount; blockIndex++)
                {
                    ResetData();

                    updateType = (ObjectUpdateType)packet.ReadByte();

                    switch (updateType)
                    {
                        case ObjectUpdateType.UPDATETYPE_VALUES:
                            guid = packet.ReadPackedGuid();
                            ReadValuesUpdateData(packet);
                            break;
                        case ObjectUpdateType.UPDATETYPE_MOVEMENT:
                            guid = packet.ReadPackedGuid();
                            ReadMovementUpdateData(packet);
                            break;
                        case ObjectUpdateType.UPDATETYPE_CREATE_OBJECT:
                        case ObjectUpdateType.UPDATETYPE_CREATE_OBJECT2:
                            guid = packet.ReadPackedGuid();
                            objectType = (TypeID)packet.ReadByte();
                            ReadMovementUpdateData(packet);
                            ReadValuesUpdateData(packet);
                            break;
                        case ObjectUpdateType.UPDATETYPE_OUT_OF_RANGE_OBJECTS:
                            var guidCount = packet.ReadUInt32();
                            for (var guidIndex = 0; guidIndex < guidCount; guidIndex++)
                                outOfRangeGuids.Add(packet.ReadPackedGuid());
                            break;
                        case ObjectUpdateType.UPDATETYPE_NEAR_OBJECTS:
                            break;
                    }

                    HandleUpdateData();
                }
            }
示例#19
0
 public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_Creatures.CreatureObject updateObject)
 {
     checked
     {
         packet.AddInt8((byte)updateType);
         packet.AddPackGUID(updateObject.GUID);
         if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT)
         {
             packet.AddInt8(3);
         }
         if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_MOVEMENT)
         {
             packet.AddInt8(112);
             packet.AddInt32(8388608);
             packet.AddInt32(WorldServiceLocator._WS_Network.MsTime());
             packet.AddSingle(updateObject.positionX);
             packet.AddSingle(updateObject.positionY);
             packet.AddSingle(updateObject.positionZ);
             packet.AddSingle(updateObject.orientation);
             packet.AddSingle(0f);
             packet.AddSingle(WorldServiceLocator._WorldServer.CREATURESDatabase[updateObject.ID].WalkSpeed);
             packet.AddSingle(WorldServiceLocator._WorldServer.CREATURESDatabase[updateObject.ID].RunSpeed);
             packet.AddSingle(WorldServiceLocator._Global_Constants.UNIT_NORMAL_SWIM_BACK_SPEED);
             packet.AddSingle(WorldServiceLocator._Global_Constants.UNIT_NORMAL_SWIM_SPEED);
             packet.AddSingle(WorldServiceLocator._Global_Constants.UNIT_NORMAL_WALK_BACK_SPEED);
             packet.AddSingle(WorldServiceLocator._Global_Constants.UNIT_NORMAL_TURN_RATE);
             packet.AddUInt32(1u);
         }
         if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_VALUES)
         {
             var updateCount = 0;
             var num         = UpdateMask.Count - 1;
             for (var i = 0; i <= num; i++)
             {
                 if (UpdateMask.Get(i))
                 {
                     updateCount = i;
                 }
             }
             packet.AddInt8((byte)(checked (updateCount + 32) / 32));
             packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4);
             var num2 = UpdateMask.Count - 1;
             for (var j = 0; j <= num2; j++)
             {
                 if (UpdateMask.Get(j))
                 {
                     if (UpdateData[j] is uint)
                     {
                         packet.AddUInt32(Conversions.ToUInteger(UpdateData[j]));
                     }
                     else if (UpdateData[j] is float)
                     {
                         packet.AddSingle(Conversions.ToSingle(UpdateData[j]));
                     }
                     else
                     {
                         packet.AddInt32(Conversions.ToInteger(UpdateData[j]));
                     }
                 }
             }
             UpdateMask.SetAll(value: false);
         }
         if (packet is UpdatePacketClass @class)
         {
             @class.UpdatesCount++;
         }
     }
 }
示例#20
0
        private void _BuildMovementUpdate(ObjectUpdateType type, ObjectUpdateFlags flags, ref PacketOut pkt)
        {
            var asUnit = ToRef() as IUnitImpl;

            pkt.Write((UInt16)flags);

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_LIVING) != 0)
            {
                UInt32 moveflags   = 0;
                UInt16 moveflagsex = 0;

                pkt.Write(moveflags);
                pkt.Write(moveflagsex);
                pkt.Write(Time.GetMSTime());
                pkt.Write(State.PositionX);
                pkt.Write(State.PositionY);
                pkt.Write(State.PositionZ);
                pkt.Write(State.Orientation);

                pkt.Write((UInt32)0);   //fall time

                pkt.Write((float)14.0); //walk speed
                pkt.Write((float)14.0); //run speed
                pkt.Write((float)14.0); //runback speed
                pkt.Write((float)14.0); //swim speed
                pkt.Write((float)14.0); //swimback speed
                pkt.Write((float)14.0); //flight speed
                pkt.Write((float)14.0); //flightback speed
                pkt.Write((float)14.0); //turn rate
                pkt.Write((float)14.0); //pitch rate
            }
            else
            {
                if ((flags & ObjectUpdateFlags.UPDATEFLAG_POSITION) != 0)
                {
                    pkt.Write((byte)0);  //packed guid of transport
                    pkt.Write(State.PositionX);
                    pkt.Write(State.PositionY);
                    pkt.Write(State.PositionZ);

                    pkt.Write((float)0);  //transport offset x
                    pkt.Write((float)0);  //transport offset y
                    pkt.Write((float)0);  //transport offset z

                    pkt.Write(State.Orientation);
                }
                else
                {
                    if ((flags & ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION) != 0)
                    {
                        pkt.Write(State.PositionX);
                        pkt.Write(State.PositionY);
                        pkt.Write(State.PositionZ);
                        pkt.Write(State.Orientation);
                    }
                }
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_UNKNOWN) != 0)
            {
                pkt.Write((UInt32)0);
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_LOWGUID) != 0)
            {
                //lowguid of some items 2F or 8 for players
                TypeID myType = State.MyType;

                switch (myType)
                {
                case TypeID.TYPEID_OBJECT:
                case TypeID.TYPEID_ITEM:
                case TypeID.TYPEID_CONTAINER:
                case TypeID.TYPEID_GAMEOBJECT:
                case TypeID.TYPEID_DYNAMICOBJECT:
                case TypeID.TYPEID_CORPSE:
                {
                    pkt.Write((UInt32)_GetUInt64(EObjectFields.OBJECT_FIELD_GUID));
                }
                break;

                case TypeID.TYPEID_UNIT:
                    pkt.Write((UInt32)0xB);
                    break;

                case TypeID.TYPEID_PLAYER:
                {
                    if ((flags & ObjectUpdateFlags.UPDATEFLAG_SELF) != 0)
                    {
                        pkt.Write((UInt32)0x2F);
                    }
                    else
                    {
                        pkt.Write((UInt32)0x8);
                    }
                }
                break;

                default:
                    pkt.Write((UInt32)0);
                    break;
                }
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_HAS_TARGET) != 0)
            {
                pkt.Write((byte)0);  //packed guid of target
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_TRANSPORT) != 0)
            {
                pkt.Write(Time.GetMSTime()); //fk knows
            }
            if ((flags & ObjectUpdateFlags.UPDATEFLAG_VEHICLE) != 0)
            {
                pkt.Write((UInt32)0); //vehicle id
                pkt.Write((float)0);  //orientation
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_ROTATION) != 0)
            {
                //this is the packed quart :(
                pkt.Write((UInt64)0);
            }
        }
示例#21
0
 public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_PlayerData.CharacterObject updateObject)
 {
     packet.AddInt8(checked ((byte)updateType));
     packet.AddPackGUID(updateObject.GUID);
     if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF)
     {
         packet.AddInt8(4);
     }
     if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF or ObjectUpdateType.UPDATETYPE_MOVEMENT)
     {
         var flags2 = updateObject.charMovementFlags & 0xFF;
         if (updateObject.OnTransport != null)
         {
             flags2 |= 0x2000000;
         }
         packet.AddInt8(112);
         packet.AddInt32(flags2);
         packet.AddInt32(WorldServiceLocator._WS_Network.MsTime());
         packet.AddSingle(updateObject.positionX);
         packet.AddSingle(updateObject.positionY);
         packet.AddSingle(updateObject.positionZ);
         packet.AddSingle(updateObject.orientation);
         if (((uint)flags2 & 0x2000000u) != 0)
         {
             packet.AddUInt64(updateObject.OnTransport.GUID);
             packet.AddSingle(updateObject.transportX);
             packet.AddSingle(updateObject.transportY);
             packet.AddSingle(updateObject.transportZ);
             packet.AddSingle(updateObject.orientation);
         }
         packet.AddInt32(0);
         packet.AddSingle(updateObject.WalkSpeed);
         packet.AddSingle(updateObject.RunSpeed);
         packet.AddSingle(updateObject.RunBackSpeed);
         packet.AddSingle(updateObject.SwimSpeed);
         packet.AddSingle(updateObject.SwimBackSpeed);
         packet.AddSingle(updateObject.TurnRate);
         packet.AddUInt32(WorldServiceLocator._CommonGlobalFunctions.GuidLow(updateObject.GUID));
     }
     checked
     {
         if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_VALUES or ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF)
         {
             var updateCount = 0;
             var num         = UpdateMask.Count - 1;
             for (var i = 0; i <= num; i++)
             {
                 if (UpdateMask.Get(i))
                 {
                     updateCount = i;
                 }
             }
             packet.AddInt8((byte)(checked (updateCount + 32) / 32));
             packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4);
             var num2 = UpdateMask.Count - 1;
             for (var j = 0; j <= num2; j++)
             {
                 if (UpdateMask.Get(j))
                 {
                     if (UpdateData[j] is uint)
                     {
                         packet.AddUInt32(Conversions.ToUInteger(UpdateData[j]));
                     }
                     else if (UpdateData[j] is float)
                     {
                         packet.AddSingle(Conversions.ToSingle(UpdateData[j]));
                     }
                     else
                     {
                         packet.AddInt32(Conversions.ToInteger(UpdateData[j]));
                     }
                 }
             }
             UpdateMask.SetAll(value: false);
         }
         if (packet is UpdatePacketClass @class)
         {
             @class.UpdatesCount++;
         }
     }
 }
示例#22
0
 public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_GameObjects.GameObjectObject updateObject)
 {
     checked
     {
         packet.AddInt8((byte)updateType);
         packet.AddPackGUID(updateObject.GUID);
         switch (updateObject.Type)
         {
         case GameObjectType.GAMEOBJECT_TYPE_TRAP:
         case GameObjectType.GAMEOBJECT_TYPE_DUEL_ARBITER:
         case GameObjectType.GAMEOBJECT_TYPE_FLAGSTAND:
         case GameObjectType.GAMEOBJECT_TYPE_FLAGDROP:
             updateType = ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF;
             break;
         }
         if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT || updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF)
         {
             packet.AddInt8(5);
             if (updateObject.Type == GameObjectType.GAMEOBJECT_TYPE_TRANSPORT || updateObject.Type == GameObjectType.GAMEOBJECT_TYPE_MO_TRANSPORT)
             {
                 packet.AddInt8(82);
             }
             else
             {
                 packet.AddInt8(80);
             }
             if (updateObject.Type == GameObjectType.GAMEOBJECT_TYPE_MO_TRANSPORT)
             {
                 packet.AddSingle(0f);
                 packet.AddSingle(0f);
                 packet.AddSingle(0f);
                 packet.AddSingle(updateObject.orientation);
             }
             else
             {
                 packet.AddSingle(updateObject.positionX);
                 packet.AddSingle(updateObject.positionY);
                 packet.AddSingle(updateObject.positionZ);
                 packet.AddSingle(updateObject.orientation);
             }
             packet.AddUInt32(WorldServiceLocator._CommonGlobalFunctions.GuidHigh(updateObject.GUID));
             if (updateObject.Type == GameObjectType.GAMEOBJECT_TYPE_TRANSPORT || updateObject.Type == GameObjectType.GAMEOBJECT_TYPE_MO_TRANSPORT)
             {
                 packet.AddInt32(WorldServiceLocator._WS_Network.MsTime());
             }
         }
         if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT || updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT_SELF || updateType == ObjectUpdateType.UPDATETYPE_VALUES)
         {
             int updateCount = 0;
             int num         = UpdateMask.Count - 1;
             for (int i = 0; i <= num; i++)
             {
                 if (UpdateMask.Get(i))
                 {
                     updateCount = i;
                 }
             }
             packet.AddInt8((byte)(checked (updateCount + 32) / 32));
             packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4);
             int num2 = UpdateMask.Count - 1;
             for (int j = 0; j <= num2; j++)
             {
                 if (UpdateMask.Get(j))
                 {
                     if (UpdateData[j] is uint)
                     {
                         packet.AddUInt32(Conversions.ToUInteger(UpdateData[j]));
                     }
                     else if (UpdateData[j] is float)
                     {
                         packet.AddSingle(Conversions.ToSingle(UpdateData[j]));
                     }
                     else
                     {
                         packet.AddInt32(Conversions.ToInteger(UpdateData[j]));
                     }
                 }
             }
             UpdateMask.SetAll(value: false);
         }
         if (packet is UpdatePacketClass @class)
         {
             @class.UpdatesCount++;
         }
     }
 }