diff --git a/Scripts/Misc/MapUO.cs b/Scripts/Misc/MapUO.cs new file mode 100644 index 000000000..0b342ee3d --- /dev/null +++ b/Scripts/Misc/MapUO.cs @@ -0,0 +1,130 @@ +using System; +using Server; +using Server.Network; +using Server.Mobiles; +using Server.Engines.PartySystem; +using Server.Guilds; + +namespace Server.Misc +{ + public static partial class MapUO + { + private static class Settings + { + public const bool PartyTrack = true; + public const bool GuildTrack = true; + public const bool GuildHitsPercent = true; + } + + public static void Initialize() + { + if ( Settings.PartyTrack ) + ProtocolExtensions.Register( 0x00, true, new OnPacketReceive( OnPartyTrack ) ); + + if ( Settings.GuildTrack ) + ProtocolExtensions.Register( 0x01, true, new OnPacketReceive( OnGuildTrack ) ); + } + + private static void OnPartyTrack( NetState state, PacketReader pvSrc ) + { + Mobile from = state.Mobile; + Party party = Party.Get( from ); + + if ( party != null ) + { + Packets.PartyTrack packet = new Packets.PartyTrack( from, party ); + + if ( packet.UnderlyingStream.Length > 8 ) + state.Send( packet ); + } + } + + private static void OnGuildTrack( NetState state, PacketReader pvSrc ) + { + Mobile from = state.Mobile; + Guild guild = from.Guild as Guild; + + if ( guild != null ) + { + bool locations = pvSrc.ReadByte() != 0; + + Packets.GuildTrack packet = new Packets.GuildTrack( from, guild, locations ); + + if ( packet.UnderlyingStream.Length > ( locations ? 9 : 5 ) ) + state.Send( packet ); + } + else + state.Send( new Packets.GuildTrack() ); + } + + private static class Packets + { + public sealed class PartyTrack : ProtocolExtension + { + public PartyTrack( Mobile from, Party party ) : base( 0x01, ( ( party.Members.Count - 1 ) * 9 ) + 4 ) + { + for ( int i = 0; i < party.Members.Count; ++i ) + { + PartyMemberInfo pmi = (PartyMemberInfo)party.Members[i]; + + if ( pmi == null || pmi.Mobile == from ) + continue; + + Mobile mob = pmi.Mobile; + + if ( Utility.InUpdateRange( from, mob ) && from.CanSee( mob ) ) + continue; + + m_Stream.Write( (int) mob.Serial ); + m_Stream.Write( (short) mob.X ); + m_Stream.Write( (short) mob.Y ); + m_Stream.Write( (byte) ( mob.Map == null ? 0 : mob.Map.MapID ) ); + } + + m_Stream.Write( (int) 0 ); + } + } + + public sealed class GuildTrack : ProtocolExtension + { + public GuildTrack() : base( 0x02, 5 ) + { + m_Stream.Write( (byte) 0 ); + m_Stream.Write( (int) 0 ); + } + + public GuildTrack( Mobile from, Guild guild, bool locations ) : base( 0x02, ( ( guild.Members.Count - 1 ) * ( locations ? 10 : 4 ) ) + 5 ) + { + m_Stream.Write( (byte) ( locations ? 1 : 0 ) ); + + for ( int i = 0; i < guild.Members.Count; ++i ) + { + Mobile mob = guild.Members[i]; + + if ( mob == null || mob == from || mob.NetState == null ) + continue; + + if ( locations && Utility.InUpdateRange( from, mob ) && from.CanSee( mob ) ) + continue; + + m_Stream.Write( (int) mob.Serial ); + + if ( locations ) + { + m_Stream.Write( (short) mob.X ); + m_Stream.Write( (short) mob.Y ); + m_Stream.Write( (byte) ( mob.Map == null ? 0 : mob.Map.MapID ) ); + + if ( Settings.GuildHitsPercent && mob.Alive ) + m_Stream.Write( (byte) ( mob.Hits / Math.Max( mob.HitsMax, 1.0 ) * 100 ) ); + else + m_Stream.Write( (byte) 0 ); + } + } + + m_Stream.Write( (int) 0 ); + } + } + } + } +} \ No newline at end of file diff --git a/Scripts/Misc/ProtocolExtensions.cs b/Scripts/Misc/ProtocolExtensions.cs index 5dbb6bea6..6d607bf4d 100644 --- a/Scripts/Misc/ProtocolExtensions.cs +++ b/Scripts/Misc/ProtocolExtensions.cs @@ -13,22 +13,6 @@ namespace Server.Misc public static void Initialize() { PacketHandlers.Register( 0xF0, 0, false, new OnPacketReceive( DecodeBundledPacket ) ); - - Register( 0x00, true, new OnPacketReceive( QueryPartyLocations ) ); - } - - public static void QueryPartyLocations( NetState state, PacketReader pvSrc ) - { - Mobile from = state.Mobile; - Party party = Party.Get( from ); - - if ( party != null ) - { - AckPartyLocations ack = new AckPartyLocations( from, party ); - - if ( ack.UnderlyingStream.Length > 8 ) - state.Send( ack ); - } } public static void Register( int packetID, bool ingame, OnPacketReceive onReceive ) @@ -78,30 +62,4 @@ namespace Server.Misc m_Stream.Write( (byte) packetID ); } } - - public class AckPartyLocations : ProtocolExtension - { - public AckPartyLocations( Mobile from, Party party ) : base( 0x01, ((party.Members.Count - 1) * 9) + 4 ) - { - for ( int i = 0; i < party.Members.Count; ++i ) - { - PartyMemberInfo pmi = (PartyMemberInfo)party.Members[i]; - - if ( pmi == null || pmi.Mobile == from ) - continue; - - Mobile mob = pmi.Mobile; - - if ( Utility.InUpdateRange( from, mob ) && from.CanSee( mob ) ) - continue; - - m_Stream.Write( (int) mob.Serial ); - m_Stream.Write( (short) mob.X ); - m_Stream.Write( (short) mob.Y ); - m_Stream.Write( (byte) (mob.Map == null ? 0 : mob.Map.MapID) ); - } - - m_Stream.Write( (int) 0 ); - } - } } \ No newline at end of file