Tempo fa Gramoz scrisse di un sistema per far leggere alla map di Steam le ally tra gilde, ho visto solo ora che l'autore di UOS mi ha mandato un messaggio con scritto questo se può in qualche modo esservi utile:
This can be implemented by server administrators, modifying server scripts to send alliance members along with guild members. I have not tested but the changes below should work:
Scripts/Misc/MapUO.cs
Scripts/Misc/Guild.cs
updated, I was using an old guild system alliance definition, now it should work with both old/new guild system.
Scripts/Misc/MapUO.cs
codice:
using System; using System.Collections.Generic; 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 const bool AllianceTrack = 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; List<Mobile> members = new List<Mobile>( guild.Members ); if ( Settings.AllianceTrack ) { if ( Guild.NewGuildSystem ) { AllianceInfo info = guild.Alliance; if ( info != null ) { foreach ( Guild g in info.Members ) members.AddRange( g.Members ); } } else { foreach ( Guild g in guild.Allies ) members.AddRange( g.Members ); } } Packets.GuildTrack packet = new Packets.GuildTrack( from, members, 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, List<Mobile> members, bool locations ) : base( 0x02, ( ( members.Count ) * ( locations ? 10 : 4 ) ) + 5 ) { m_Stream.Write( (byte) ( locations ? 1 : 0 ) ); for ( int i = 0; i < members.Count; ++i ) { Mobile mob = 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 ); } } } } }
codice:
#region Alliances public class AllianceInfo { .... public List<Guild> Members { get { return m_Members; } } } #endregion ...
Commenta