コード例 #1
0
        private static void WriteUnitDynFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
        {
            Unit             unit         = (Unit)obj;
            UnitDynamicFlags dynamicFlags = unit.DynamicFlags;
            Asda2Loot        loot         = obj.Loot;

            if (loot != null && receiver.LooterEntry.MayLoot(loot) && !unit.IsAlive)
            {
                dynamicFlags |= UnitDynamicFlags.Lootable;
            }
            else
            {
                Unit firstAttacker = unit.FirstAttacker;
                if (firstAttacker != null)
                {
                    if ((firstAttacker == receiver || firstAttacker.IsAlliedWith(receiver)) &&
                        unit.IsAlive)
                    {
                        dynamicFlags |= UnitDynamicFlags.TaggedByMe;
                    }
                    else
                    {
                        dynamicFlags |= UnitDynamicFlags.TaggedByOther;
                    }
                }
            }

            packet.Write((uint)dynamicFlags);
        }
コード例 #2
0
        private static void WriteUnitDynFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
        {
            var unit = (Unit)obj;
            //var flags = UnitDynamicFlags.None;
            var flags = unit.DynamicFlags;

            var loot = obj.Loot;

            if (loot != null && receiver.LooterEntry.MayLoot(loot) && !unit.IsAlive)
            {
                flags |= UnitDynamicFlags.Lootable;
            }
            else
            {
                var firstAttacker = unit.FirstAttacker;
                if (firstAttacker != null)
                {
                    if ((firstAttacker == receiver ||
                         firstAttacker.IsAlliedWith(receiver)) &&
                        unit.IsAlive)
                    {
                        flags |= UnitDynamicFlags.TaggedByMe;
                    }
                    else
                    {
                        flags |= UnitDynamicFlags.TaggedByOther;
                    }
                }
            }

            // TODO: TrackUnit, SpecialInfo
            packet.Write((uint)flags);
        }
コード例 #3
0
 private static void WriteCorpseDynFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
 {
     if (((Corpse)obj).Owner == receiver)
     {
         packet.Write(1U);
     }
     else
     {
         packet.Write(0U);
     }
 }
コード例 #4
0
 private static void WriteCorpseDynFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
 {
     if (((Corpse)obj).Owner == receiver)
     {
         packet.Write((uint)CorpseDynamicFlags.PlayerLootable);
     }
     else
     {
         packet.Write((uint)CorpseDynamicFlags.None);
     }
 }
コード例 #5
0
        private static void WriteAuraStateFlags(ObjectBase obj, Character reciever, UpdatePacket packet)
        {
            Unit  unit = (Unit)obj;
            Spell strongestImmolate = unit.GetStrongestImmolate();

            if (strongestImmolate != null && unit.Auras[strongestImmolate].SpellCast.CasterChar == reciever)
            {
                packet.Write((uint)(unit.AuraState | AuraStateMask.Immolate));
            }
            else
            {
                packet.Write((uint)(unit.AuraState & ~AuraStateMask.Immolate));
            }
        }
コード例 #6
0
        private static void WriteAuraStateFlags(ObjectBase obj, Character reciever, UpdatePacket packet)
        {
            var   unit         = (Unit)obj;
            Spell immolateAura = unit.GetStrongestImmolate();

            //if there is a immolate aura on this object and the reciver casted it we can send that aurastate to him
            if (immolateAura != null && unit.Auras[immolateAura].SpellCast.CasterChar == reciever)
            {
                packet.Write((uint)(unit.AuraState | AuraStateMask.Immolate));
            }
            else
            {
                packet.Write((uint)(unit.AuraState & ~AuraStateMask.Immolate));
            }
        }
コード例 #7
0
        private static void WriteNPCFlags(ObjectBase obj, Character chr, UpdatePacket packet)
        {
            var flags = (NPCFlags)obj.GetUInt32(UnitFields.NPC_FLAGS);

            if (obj is NPC)
            {
                var npc = (NPC)obj;
                if (npc.IsTrainer && !npc.TrainerEntry.CanTrain(chr))
                {
                    // Cannot talk to this Guy
                    flags = 0;
                }
            }
            packet.Write((uint)flags);
        }
コード例 #8
0
        private static void WriteNPCFlags(ObjectBase obj, Character chr, UpdatePacket packet)
        {
            NPCFlags npcFlags = (NPCFlags)obj.GetUInt32(UnitFields.NPC_FLAGS);

            if (obj is NPC)
            {
                NPC npc = (NPC)obj;
                if (npc.IsTrainer && !npc.TrainerEntry.CanTrain(chr))
                {
                    npcFlags = NPCFlags.None;
                }
            }

            packet.Write((uint)npcFlags);
        }
コード例 #9
0
        private static void WriteGODynamic(ObjectBase obj, Character receiver, UpdatePacket packet)
        {
            GameObject gameObject = (GameObject)obj;

            if (gameObject is Transport || !gameObject.Flags.HasAnyFlag(GameObjectFlags.ConditionalInteraction))
            {
                packet.Write(obj.GetUInt32(GameObjectFields.DYNAMIC));
            }
            else
            {
                GODynamicLowFlags goDynamicLowFlags = !gameObject.CanBeUsedBy(receiver)
          ? GODynamicLowFlags.None
          : GODynamicLowFlags.Clickable | GODynamicLowFlags.Sparkle;
                packet.Write((ushort)goDynamicLowFlags);
                packet.Write(ushort.MaxValue);
            }
        }
コード例 #10
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
		protected void WriteSpontaneousUpdate(UpdateMask mask, UpdatePacket packet, Character receiver, UpdateFieldId[] indices, bool visible)
		{
			// create mask
            for (var i = 0; i < indices.Length; i++)
            {
            	var index = indices[i].RawId;
            	var field = UpdateFieldMgr.Get(ObjectTypeId).Fields[index];
				for (var j = 0; j < field.Size; j++)
				{
					mask.SetBit(index + j);
				}
            }

			// write mask
			mask.WriteTo(packet);

			// write values
			for (var i = mask.m_lowestIndex; i <= mask.m_highestIndex; i++)
			{
				if (mask.GetBit(i))
				{
					if (visible)
					{
						WriteUpdateValue(packet, receiver, i);
					}
					else
					{
						packet.Write(0);
					}
				}
			}
		}
コード例 #11
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
		public void SendSpontaneousUpdate(Character receiver, bool visible, params UpdateFieldId[] indices)
		{
			var highestIndex = 0;
			foreach (var index in indices)
			{
				if (index.RawId > highestIndex)
				{
					highestIndex = index.RawId;
				}
			}

			var mask = new UpdateMask(highestIndex);
			using (var packet = new UpdatePacket(1024))
			{
				packet.Position = 4;						// jump over header
				packet.Write(1);							// Update Count
				packet.Write((byte)UpdateType.Values);
				EntityId.WritePacked(packet);
				WriteSpontaneousUpdate(mask, packet, receiver, indices, visible);

				receiver.Send(packet);
			}
		}
コード例 #12
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
		protected void WriteUpdateValue(UpdatePacket packet, Character receiver, int index)
		{
			if (_UpdateFieldInfos.FieldFlags[index].HasAnyFlag(UpdateFieldFlags.Dynamic))
			{
				DynamicUpdateFieldHandlers[index](this, receiver, packet);
			}
			else
			{
				packet.Write(m_updateValues[index].UInt32);
			}
		}
コード例 #13
0
ファイル: UpdateFieldHandler.cs プロジェクト: MeaNone/WCell
		private static void WriteCorpseDynFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
		{
			if (((Corpse)obj).Owner == receiver)
			{
				packet.Write((uint)CorpseDynamicFlags.PlayerLootable);
			}
			else
			{
				packet.Write((uint)CorpseDynamicFlags.None);
			}
		}
コード例 #14
0
ファイル: UpdateFieldHandler.cs プロジェクト: MeaNone/WCell
		private static void WriteUnitDynFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
		{
			var unit = (Unit)obj;
			//var flags = UnitDynamicFlags.None;
			var flags = unit.DynamicFlags;

			var loot = obj.Loot;
			if (loot != null && receiver.LooterEntry.MayLoot(loot) && !unit.IsAlive)
			{
				flags |= UnitDynamicFlags.Lootable;
			}
			else
			{
				var firstAttacker = unit.FirstAttacker;
				if (firstAttacker != null)
				{
					if ((firstAttacker == receiver ||
						 firstAttacker.IsAlliedWith(receiver)) &&
						unit.IsAlive)
					{
						flags |= UnitDynamicFlags.TaggedByMe;
					}
					else
					{
						flags |= UnitDynamicFlags.TaggedByOther;
					}
				}
			}

			// TODO: TrackUnit, SpecialInfo
			packet.Write((uint)flags);
		}
コード例 #15
0
ファイル: UpdateFieldHandler.cs プロジェクト: MeaNone/WCell
		private static void WriteGODynamic(ObjectBase obj, Character receiver, UpdatePacket packet)
		{
			packet.Write(obj.GetUInt32(GameObjectFields.DYNAMIC));
		}
コード例 #16
0
ファイル: UpdateFieldHandler.cs プロジェクト: MeaNone/WCell
		private static void WriteNPCFlags(ObjectBase obj, Character chr, UpdatePacket packet)
		{
			var flags = (NPCFlags)obj.GetUInt32(UnitFields.NPC_FLAGS);
			if (obj is NPC)
			{
				var npc = (NPC)obj;
				if (npc.IsTrainer && !npc.TrainerEntry.CanTrain(chr))
				{
					// Cannot talk to this Guy
					flags = 0;
				}
			}
			packet.Write((uint)flags);
		}
コード例 #17
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
		protected UpdatePacket GetFieldUpdatePacket(UpdateFieldId field, EntityId value)
		{
			//UpdatePacket packet = new UpdatePacket(BufferManager.Small.CheckOut());
			var packet = new UpdatePacket(128) { Position = 4 };

			packet.Write(1); // Update Count
			packet.Write((byte)UpdateType.Values);

			EntityId.WritePacked(packet);

			var blocks = (byte)((field.RawId + 1) / 32 + 2);
			packet.Write(blocks);

			if (blocks > 1)
			{
				packet.Zero((blocks - 2) * 4);

				var updateBlocks = new int[blocks];

				updateBlocks[field.RawId << 5] = (1 << (field.RawId & 31));
				updateBlocks[field.RawId + 1 << 5] = (1 << (field.RawId + 1 & 31));

				packet.Write(updateBlocks[0]);
				packet.Write(updateBlocks[1]);
			}
			else
			{
				packet.Zero((blocks - 1) * 4);
				packet.Write((1 << (field.RawId & 31) | 1 << (field.RawId + 1 & 31)));
			}

			packet.Write(value);

			return packet;
		}
コード例 #18
0
		private static void WriteAuraStateFlags(ObjectBase obj, Character reciever, UpdatePacket packet)
		{
			var unit = (Unit)obj;
			Spell immolateAura = unit.GetStrongestImmolate();
			//if there is a immolate aura on this object and the reciver casted it we can send that aurastate to him
			if (immolateAura != null && unit.Auras[immolateAura].SpellCast.CasterChar == reciever)
			{
				packet.Write((uint)(unit.AuraState | AuraStateMask.Immolate));
			}
			else
				packet.Write((uint)(unit.AuraState & ~AuraStateMask.Immolate));
		}
コード例 #19
0
		private static void WriteGODynamic(ObjectBase obj, Character receiver, UpdatePacket packet)
		{
			var go = (GameObject)obj;
			if (go is Transport || !go.Flags.HasAnyFlag(GameObjectFlags.ConditionalInteraction))
			{
				packet.Write(obj.GetUInt32(GameObjectFields.DYNAMIC));
			}
			else
			{
				GODynamicLowFlags lowFlags;
				if (go.CanBeUsedBy(receiver))
				{
					lowFlags = GODynamicLowFlags.Clickable | GODynamicLowFlags.Sparkle;
				}
				else
				{
					lowFlags = GODynamicLowFlags.None;
				}
				packet.Write((ushort)lowFlags);
				packet.Write(ushort.MaxValue);
			}
		}
コード例 #20
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
		public void SendOutOfRangeUpdate(Character receiver, HashSet<WorldObject> worldObjects)
		{
			using (var packet = new UpdatePacket(1024))
			{
				packet.Position = 4;						// jump over header
				packet.Write(1);							// Update Count
				packet.Write((byte)UpdateType.OutOfRange);
				packet.Write(worldObjects.Count);
				foreach (var worldObject in worldObjects)
				{
					worldObject.EntityId.WritePacked(packet);
				}

				receiver.Send(packet);
			}
		}
コード例 #21
0
ファイル: UpdateFieldHandler.cs プロジェクト: MeaNone/WCell
		private static void WriteGOFlags(ObjectBase obj, Character receiver, UpdatePacket packet)
		{
			var go = (GameObject)obj;
			if (go.Flags.HasFlag(GameObjectFlags.ConditionalInteraction))
			{
				if (go.CanInteractWith(receiver))
				{
					// remove conditional flag, if receiver may use the GO
					packet.Write((uint) (go.Flags ^ GameObjectFlags.ConditionalInteraction));
				}
				else
				{
					packet.Write((uint)go.Flags);
				}
			}
			else
			{
				packet.Write((uint)go.Flags);	
			}
		}
コード例 #22
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
		protected UpdatePacket GetFieldUpdatePacket(UpdateFieldId field, byte[] value)
		{
			var blocks = (field.RawId >> 5) + 1;
			var emptyBlockSize = (blocks - 1) * 4;

			//UpdatePacket packet = new UpdatePacket(BufferManager.Small.CheckOut());
			var packet = new UpdatePacket { Position = 4 };

			packet.Write(1); // Update Count
			packet.Write((byte)UpdateType.Values);

			EntityId.WritePacked(packet);

			packet.Write((byte)blocks);

			//packet.TotalLength += emptyBlockSize;
			packet.Zero(emptyBlockSize);

			packet.Write(1 << (field.RawId & 31));
			packet.Write(value);

			return packet;
		}
コード例 #23
0
ファイル: BufferTest.cs プロジェクト: pallmall/WCell
		public void TestUpdatePacket()
		{
			var mgr = new BufferManager(2, 128);

			var segment1 = mgr.CheckOut();	// 1st buffer
			Assert.AreEqual(1, mgr.AvailableSegmentsCount);

			var segment2 = mgr.CheckOut();	// 1st buffer
			Assert.AreEqual(1, mgr.TotalBufferCount);
			Assert.AreEqual(0, mgr.AvailableSegmentsCount);
			//Assert.AreEqual(2, segment2.Buffer.UsedSegmentCount);

			var segment3 = mgr.CheckOut(); // 2nd buffer
			Assert.AreEqual(2, mgr.TotalBufferCount);
			Assert.AreEqual(1, mgr.AvailableSegmentsCount);
			//Assert.AreEqual(1, segment3.Buffer.UsedSegmentCount);

			segment3.DecrementUsage();
			Assert.AreEqual(2, mgr.AvailableSegmentsCount);
			//Assert.AreEqual(0, segment3.Buffer.UsedSegmentCount);

			//using (var outPacket = new UpdatePacket(segment2))
			using (var outPacket = new UpdatePacket(128))
			{
				Assert.AreEqual(outPacket.PacketId, (PacketId)RealmServerOpCode.SMSG_UPDATE_OBJECT);

				outPacket.Write(15);
				outPacket.WriteCString("abc");

				using (var inPacket = DisposableRealmPacketIn.CreateFromOutPacket(segment1, outPacket))
				{
					Assert.AreEqual(0, inPacket.ReadInt32());			//update count

					Assert.AreEqual(15, inPacket.ReadInt32());
					Assert.AreEqual("abc", inPacket.ReadCString());
				}

				outPacket.Reset();
				Assert.AreEqual(outPacket.PacketId, (PacketId)RealmServerOpCode.SMSG_UPDATE_OBJECT);

				outPacket.WriteCString("def");
				outPacket.WriteUShortBE(300);


				using (var inPacket = DisposableRealmPacketIn.CreateFromOutPacket(segment1, outPacket))
				{
					Assert.AreEqual(0, inPacket.ReadInt32());			//update count
					Assert.AreEqual((byte)0, inPacket.ReadByte());			//block count

					Assert.AreEqual("def", inPacket.ReadCString());
					Assert.AreEqual((ushort)300, inPacket.ReadUInt16BE());
				}
			}
		}
コード例 #24
0
ファイル: ObjectBase.Update.cs プロジェクト: KroneckerX/WCell
	    protected static void SendUpdatePacket(Character character, UpdatePacket packet)
		{
			packet.SendTo(character.Client);
		}
コード例 #25
0
ファイル: Character.Update.cs プロジェクト: WCellFR/WCellFR
		//protected override void WriteMovementUpdate(PrimitiveWriter packet, UpdateFieldFlags relation)
		//{
		//    base.WriteMovementUpdate(packet, relation);
		//}

		void SendOwnUpdates()
		{
			m_updatePacket.Position = m_updatePacket.HeaderSize;

			m_updatePacket.Write(UpdateCount);
			SendUpdatePacket(this, m_updatePacket);

			//m_updatePacket.Reset();
			m_updatePacket.Close();
			m_updatePacket = new UpdatePacket();
			UpdateCount = 0;
		}