public override void SendNPCCreate(GameNPC npc)
		{

			if (m_gameClient.Player == null || npc.IsVisibleTo(m_gameClient.Player) == false)
				return;

			//Added by Suncheck - Mines are not shown to enemy players
			if (npc is GameMine)
			{
				if (GameServer.ServerRules.IsAllowedToAttack((npc as GameMine).Owner, m_gameClient.Player, true))
				{
					return;
				}
			}

			if (npc is GameMovingObject)
			{
				SendMovingObjectCreate(npc as GameMovingObject);
				return;
			}

			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.NPCCreate)))
			{
				int speed = 0;
				ushort speedZ = 0;
				if (npc == null)
					return;
				if (!npc.IsAtTargetPosition)
				{
					speed = npc.CurrentSpeed;
					speedZ = (ushort)npc.TickSpeedZ;
				}
				pak.WriteShort((ushort)npc.ObjectID);
				pak.WriteShort((ushort)(speed));
				pak.WriteShort(npc.Heading);
				pak.WriteShort((ushort)npc.Z);
				pak.WriteInt((uint)npc.X);
				pak.WriteInt((uint)npc.Y);
				pak.WriteShort(speedZ);
				pak.WriteShort(npc.Model);
				pak.WriteByte(npc.Size);
				byte level = npc.GetDisplayLevel(m_gameClient.Player);
				if((npc.Flags&GameNPC.eFlags.STATUE)!=0)
				{
					level |= 0x80;
				}
				pak.WriteByte(level);
	
				byte flags = (byte)(GameServer.ServerRules.GetLivingRealm(m_gameClient.Player, npc) << 6);
				if ((npc.Flags & GameNPC.eFlags.GHOST) != 0) flags |= 0x01;
				if (npc.Inventory != null) flags |= 0x02; //If mob has equipment, then only show it after the client gets the 0xBD packet
				if ((npc.Flags & GameNPC.eFlags.PEACE) != 0) flags |= 0x10;
				if ((npc.Flags & GameNPC.eFlags.FLYING) != 0) flags |= 0x20;
				if((npc.Flags & GameNPC.eFlags.TORCH) != 0) flags |= 0x04;
				
				pak.WriteByte(flags);
				pak.WriteByte(0x20); //TODO this is the default maxstick distance
	
				string add = "";
				byte flags2 = 0x00;
				IControlledBrain brain = npc.Brain as IControlledBrain;
				if (m_gameClient.Version >= GameClient.eClientVersion.Version187)
				{
					if (brain != null)
					{
						flags2 |= 0x80; // have Owner
					}
				}
				if ((npc.Flags & GameNPC.eFlags.CANTTARGET) != 0)
					if (m_gameClient.Account.PrivLevel > 1) add += "-DOR"; // indicates DOR flag for GMs
				else flags2 |= 0x01;
				if ((npc.Flags & GameNPC.eFlags.DONTSHOWNAME) != 0)
					if (m_gameClient.Account.PrivLevel > 1) add += "-NON"; // indicates NON flag for GMs
				else flags2 |= 0x02;
	
				if( ( npc.Flags & GameNPC.eFlags.STEALTH ) > 0 )
					flags2 |= 0x04;
	
				eQuestIndicator questIndicator = npc.GetQuestIndicator(m_gameClient.Player);
	
				if (questIndicator == eQuestIndicator.Available)
					flags2 |= 0x08;//hex 8 - quest available
				if (questIndicator == eQuestIndicator.Finish)
					flags2 |= 0x10;//hex 16 - quest finish
				//flags2 |= 0x20;//hex 32 - water mob?
				//flags2 |= 0x40;//hex 64 - unknown
				//flags2 |= 0x80;//hex 128 - has owner
				
	
				pak.WriteByte(flags2); // flags 2
	
				byte flags3 = 0x00;
				if (questIndicator == eQuestIndicator.Lesson)
					flags3 |= 0x01;
				if (questIndicator == eQuestIndicator.Lore)
					flags3 |= 0x02;
				pak.WriteByte(flags3); // new in 1.71 (region instance ID from StoC_0x20) OR flags 3?
				pak.WriteShort(0x00); // new in 1.71 unknown
	
				string name = npc.Name;
				string guildName = npc.GuildName;
	
				LanguageDataObject translation = LanguageMgr.GetTranslation(m_gameClient, npc);
				if (translation != null)
				{
					if (!Util.IsEmpty(((DBLanguageNPC)translation).Name))
						name = ((DBLanguageNPC)translation).Name;
	
					if (!Util.IsEmpty(((DBLanguageNPC)translation).GuildName))
						guildName = ((DBLanguageNPC)translation).GuildName;
				}
	
				if (name.Length + add.Length + 2 > 47) // clients crash with too long names
					name = name.Substring(0, 47 - add.Length - 2);
				if (add.Length > 0)
					name = string.Format("[{0}]{1}", name, add);
	
				pak.WritePascalString(name);
	
				if (guildName.Length > 47)
					pak.WritePascalString(guildName.Substring(0, 47));
				else pak.WritePascalString(guildName);
	
				pak.WriteByte(0x00);
				SendTCP(pak);
			}
			
			// Update Cache
			m_gameClient.GameObjectUpdateArray[new Tuple<ushort, ushort>(npc.CurrentRegionID, (ushort)npc.ObjectID)] = 0;
		}
        public override void SendNPCCreate(GameNPC npc)
        {
            if (m_gameClient.Player == null || npc.IsVisibleTo(m_gameClient.Player) == false)
            {
                return;
            }

            //Added by Suncheck - Mines are not shown to enemy players
            if (npc is GameMine)
            {
                if (GameServer.ServerRules.IsAllowedToAttack((npc as GameMine).Owner, m_gameClient.Player, true))
                {
                    return;
                }
            }

            if (npc is GameMovingObject)
            {
                SendMovingObjectCreate(npc as GameMovingObject);
                return;
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.NPCCreate)))
            {
                int    speed  = 0;
                ushort speedZ = 0;
                if (npc == null)
                {
                    return;
                }
                if (!npc.IsAtTargetPosition)
                {
                    speed  = npc.CurrentSpeed;
                    speedZ = (ushort)npc.TickSpeedZ;
                }
                pak.WriteShort((ushort)npc.ObjectID);
                pak.WriteShort((ushort)(speed));
                pak.WriteShort(npc.Heading);
                pak.WriteShort((ushort)npc.Z);
                pak.WriteInt((uint)npc.X);
                pak.WriteInt((uint)npc.Y);
                pak.WriteShort(speedZ);
                pak.WriteShort(npc.Model);
                pak.WriteByte(npc.Size);
                byte level = npc.GetDisplayLevel(m_gameClient.Player);
                if ((npc.Flags & GameNPC.eFlags.STATUE) != 0)
                {
                    level |= 0x80;
                }
                pak.WriteByte(level);

                byte flags = (byte)(GameServer.ServerRules.GetLivingRealm(m_gameClient.Player, npc) << 6);
                if ((npc.Flags & GameNPC.eFlags.GHOST) != 0)
                {
                    flags |= 0x01;
                }
                if (npc.Inventory != null)
                {
                    flags |= 0x02;                                        //If mob has equipment, then only show it after the client gets the 0xBD packet
                }
                if ((npc.Flags & GameNPC.eFlags.PEACE) != 0)
                {
                    flags |= 0x10;
                }
                if ((npc.Flags & GameNPC.eFlags.FLYING) != 0)
                {
                    flags |= 0x20;
                }
                if ((npc.Flags & GameNPC.eFlags.TORCH) != 0)
                {
                    flags |= 0x04;
                }

                pak.WriteByte(flags);
                pak.WriteByte(0x20);                 //TODO this is the default maxstick distance

                string           add    = "";
                byte             flags2 = 0x00;
                IControlledBrain brain  = npc.Brain as IControlledBrain;
                if (m_gameClient.Version >= GameClient.eClientVersion.Version187)
                {
                    if (brain != null)
                    {
                        flags2 |= 0x80;                         // have Owner
                    }
                }
                if ((npc.Flags & GameNPC.eFlags.CANTTARGET) != 0)
                {
                    if (m_gameClient.Account.PrivLevel > 1)
                    {
                        add += "-DOR";                                                         // indicates DOR flag for GMs
                    }
                    else
                    {
                        flags2 |= 0x01;
                    }
                }
                if ((npc.Flags & GameNPC.eFlags.DONTSHOWNAME) != 0)
                {
                    if (m_gameClient.Account.PrivLevel > 1)
                    {
                        add += "-NON";                                                         // indicates NON flag for GMs
                    }
                    else
                    {
                        flags2 |= 0x02;
                    }
                }

                if ((npc.Flags & GameNPC.eFlags.STEALTH) > 0)
                {
                    flags2 |= 0x04;
                }

                eQuestIndicator questIndicator = npc.GetQuestIndicator(m_gameClient.Player);

                if (questIndicator == eQuestIndicator.Available)
                {
                    flags2 |= 0x08;                    //hex 8 - quest available
                }
                if (questIndicator == eQuestIndicator.Finish)
                {
                    flags2 |= 0x10;                    //hex 16 - quest finish
                }
                //flags2 |= 0x20;//hex 32 - water mob?
                //flags2 |= 0x40;//hex 64 - unknown
                //flags2 |= 0x80;//hex 128 - has owner


                pak.WriteByte(flags2);                 // flags 2

                byte flags3 = 0x00;
                if (questIndicator == eQuestIndicator.Lesson)
                {
                    flags3 |= 0x01;
                }
                if (questIndicator == eQuestIndicator.Lore)
                {
                    flags3 |= 0x02;
                }
                pak.WriteByte(flags3);                // new in 1.71 (region instance ID from StoC_0x20) OR flags 3?
                pak.WriteShort(0x00);                 // new in 1.71 unknown

                string name      = npc.Name;
                string guildName = npc.GuildName;

                LanguageDataObject translation = LanguageMgr.GetTranslation(m_gameClient, npc);
                if (translation != null)
                {
                    if (!Util.IsEmpty(((DBLanguageNPC)translation).Name))
                    {
                        name = ((DBLanguageNPC)translation).Name;
                    }

                    if (!Util.IsEmpty(((DBLanguageNPC)translation).GuildName))
                    {
                        guildName = ((DBLanguageNPC)translation).GuildName;
                    }
                }

                if (name.Length + add.Length + 2 > 47)                 // clients crash with too long names
                {
                    name = name.Substring(0, 47 - add.Length - 2);
                }
                if (add.Length > 0)
                {
                    name = string.Format("[{0}]{1}", name, add);
                }

                pak.WritePascalString(name);

                if (guildName.Length > 47)
                {
                    pak.WritePascalString(guildName.Substring(0, 47));
                }
                else
                {
                    pak.WritePascalString(guildName);
                }

                pak.WriteByte(0x00);
                SendTCP(pak);
            }

            // Update Cache
            m_gameClient.GameObjectUpdateArray[new Tuple <ushort, ushort>(npc.CurrentRegionID, (ushort)npc.ObjectID)] = 0;
        }
		public virtual void SendNPCCreate(GameNPC npc)
		{
			if (m_gameClient.Player == null || npc.IsVisibleTo(m_gameClient.Player) == false)
				return;

			if (npc is GameMovingObject)
			{
				SendMovingObjectCreate(npc as GameMovingObject);
				return;
			}

			using (var pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.NPCCreate)))
			{
				int speed = 0;
				ushort speedZ = 0;
				if (npc.IsMoving && !npc.IsAtTargetPosition)
				{
					speed = npc.CurrentSpeed;
					speedZ = (ushort) npc.TickSpeedZ;
				}
				pak.WriteShort((ushort) npc.ObjectID);
				pak.WriteShort((ushort) speed);
				pak.WriteShort(npc.Heading);
				pak.WriteShort((ushort) npc.Z);
				pak.WriteInt((uint) npc.X);
				pak.WriteInt((uint) npc.Y);
				pak.WriteShort(speedZ);
				pak.WriteShort(npc.Model);
				pak.WriteByte(npc.Size);
				pak.WriteByte(npc.GetDisplayLevel(m_gameClient.Player));

				var flags = (byte) (GameServer.ServerRules.GetLivingRealm(m_gameClient.Player, npc) << 6);
				if ((npc.Flags & GameNPC.eFlags.GHOST) != 0) flags |= 0x01;
				if (npc.Inventory != null)
					flags |= 0x02; //If mob has equipment, then only show it after the client gets the 0xBD packet
				if ((npc.Flags & GameNPC.eFlags.PEACE) != 0) flags |= 0x10;
				if ((npc.Flags & GameNPC.eFlags.FLYING) != 0) flags |= 0x20;

				pak.WriteByte(flags);
				pak.WriteByte(0x20); //TODO this is the default maxstick distance

				string add = "";
				if (m_gameClient.Account.PrivLevel > 1)
				{
					if ((npc.Flags & GameNPC.eFlags.CANTTARGET) != 0)
						add += "-DOR"; // indicates DOR flag for GMs
					if ((npc.Flags & GameNPC.eFlags.DONTSHOWNAME) != 0)
						add += "-NON"; // indicates NON flag for GMs
				}

                DBLanguageNPC translation = npc.GetTranslation(m_gameClient);

                string name = translation.Name;/*npc.Name;*/
				if (name.Length + add.Length + 2 > 47) // clients crash with too long names
					name = name.Substring(0, 47 - add.Length - 2);
				if (add.Length > 0)
					name = string.Format("[{0}]{1}", name, add);

				pak.WritePascalString(name);

                //if (npc.GuildName.Length > 47)
                //    pak.WritePascalString(npc.GuildName.Substring(0, 47));
                //else pak.WritePascalString(npc.GuildName);

                string guildName = translation.GuildName;
                if (guildName.Length > 47)
                    guildName = guildName.Substring(0, 47);

                pak.WritePascalString(guildName);
				pak.WriteByte(0x00);

				SendTCP(pak);
			}
		}
示例#4
0
		public override void SendNPCCreate(GameNPC npc)
		{

			if (m_gameClient.Player == null || npc.IsVisibleTo(m_gameClient.Player) == false)
				return;

			//Added by Suncheck - Mines are not shown to enemy players
			if (npc is GameMine)
			{
				if (GameServer.ServerRules.IsAllowedToAttack((npc as GameMine).Owner, m_gameClient.Player, true))
				{
					return;
				}
			}

			if (npc is GameMovingObject)
			{
				SendMovingObjectCreate(npc as GameMovingObject);
				return;
			}

			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.NPCCreate));
			int speed = 0;
			ushort speedZ = 0;
			if (npc == null)
				return;
			if (!npc.IsAtTargetPosition)
			{
				speed = npc.CurrentSpeed;
				speedZ = (ushort)npc.TickSpeedZ;
			}
			pak.WriteShort((ushort)npc.ObjectID);
			pak.WriteShort((ushort)(speed));
			pak.WriteShort(npc.Heading);
			pak.WriteShort((ushort)npc.Z);
			pak.WriteInt((uint)npc.X);
			pak.WriteInt((uint)npc.Y);
			pak.WriteShort(speedZ);
			pak.WriteShort(npc.Model);
			pak.WriteByte(npc.Size);
			byte level = npc.GetDisplayLevel(m_gameClient.Player);
			if((npc.Flags&GameNPC.eFlags.STATUE)!=0)
			{
				level |= 0x80;
			}
			pak.WriteByte(level);

			byte flags = (byte)(GameServer.ServerRules.GetLivingRealm(m_gameClient.Player, npc) << 6);
			if ((npc.Flags & GameNPC.eFlags.GHOST) != 0) flags |= 0x01;
			if (npc.Inventory != null) flags |= 0x02; //If mob has equipment, then only show it after the client gets the 0xBD packet
			if ((npc.Flags & GameNPC.eFlags.PEACE) != 0) flags |= 0x10;
			if ((npc.Flags & GameNPC.eFlags.FLYING) != 0) flags |= 0x20;
			if((npc.Flags & GameNPC.eFlags.TORCH) != 0) flags |= 0x04;
			
			pak.WriteByte(flags);
			pak.WriteByte(0x20); //TODO this is the default maxstick distance

			string add = "";
			byte flags2 = 0x00;
			IControlledBrain brain = npc.Brain as IControlledBrain;
			if (m_gameClient.Version >= GameClient.eClientVersion.Version187)
			{
				if (brain != null)
				{
					flags2 |= 0x80; // have Owner
				}
			}
			if ((npc.Flags & GameNPC.eFlags.CANTTARGET) != 0)
				if (m_gameClient.Account.PrivLevel > 1) add += "-DOR"; // indicates DOR flag for GMs
			else flags2 |= 0x01;
			if ((npc.Flags & GameNPC.eFlags.DONTSHOWNAME) != 0)
				if (m_gameClient.Account.PrivLevel > 1) add += "-NON"; // indicates NON flag for GMs
			else flags2 |= 0x02;

			if( ( npc.Flags & GameNPC.eFlags.STEALTH ) > 0 )
				flags2 |= 0x04;

			if( npc.ShowQuestIndicator( m_gameClient.Player ) )
				flags2 |= 0x08;

			pak.WriteByte(flags2); // 4 high bits seems unused (new in 1.71)
			pak.WriteShort(0x00); // new in 1.71
			pak.WriteByte(0x00); // new in 1.71 (region instance ID from StoC_0x20)

            DBLanguageNPC translation = npc.GetTranslation(m_gameClient);

            string name = translation.Name;/*GameServer.ServerRules.GetNPCName(m_gameClient.Player, npc);*/
			if (name.Length + add.Length + 2 > 47) // clients crash with too long names
				name = name.Substring(0, 47 - add.Length - 2);
			if (add.Length > 0)
				name = string.Format("[{0}]{1}", name, add);

			pak.WritePascalString(name);

            string l_npcGuildname = translation.GuildName;/*GameServer.ServerRules.GetNPCGuildName(m_gameClient.Player, npc);;*/
			if (l_npcGuildname.Length > 47)
				pak.WritePascalString(l_npcGuildname.Substring(0, 47));
			else pak.WritePascalString(l_npcGuildname);

			pak.WriteByte(0x00);
			SendTCP(pak);
		}