Después de un poco de craneo, algo de codigo y un resto de testeo, implementé las reglas de los Youngs en Felucca:
- Los youngs no pueden ser atacados por jugadores viejos y vice versa.
- Los youngs no pueden ser atacados por monstruos a menos que ellos inicien el combate.
- Los youngs no pueden realizar actos beneficos sobre jugadores viejos.
- Los jugadores viejos si pueden realizar actos beneficos sobre los youngs.
- Los youngs si pueden realizar actos beneficos entre si, pero no atacarse.
Mas algunas reglas especiales del server:
- Los youngs y pks pueden viajar usando Recall, Sacred Journey y Moongates hacia cualquier destino (viajar a Felucca no impone ninguna limitación).
Por si a alguien le interesa implementar este sistema, el codigo es el siguiente: Reemplazar los dos metodos (beneficial y harmful) en Notoriety.cs, el codigo relevante esta en rojo (para modificar Recall, Sacred Journey y Moongates solo basta comentar las lineas correspondientes -las que tienen el texto ‘you cannot travel, etc’ en los codigos de cada hechizo). El codigo siguiente es válido para cualquier mapa con reglas de Felucca:
public static bool Mobile_AllowBeneficial( Mobile from, Mobile target )
{
if( from == null || target == null || from.AccessLevel > AccessLevel.Player || target.AccessLevel > AccessLevel.Player )
return true;
Map map = from.Map;
#region Factions
Faction targetFaction = Faction.Find( target, true );
if( (!Core.ML || map == Faction.Facet) && targetFaction != null )
{
if( Faction.Find( from, true ) != targetFaction )
return false;
}
#endregion
#region Youngs en Felucca
// Young protegidos en Felucca
if (from.Player && target.Player && ((PlayerMobile)from).Young && !((PlayerMobile)target).Young)
return false; // Youngs no pueden ayudar a jugadores viejos (comprobarlo)
//--------------------------------
#endregion
if ( map != null && (map.Rules & MapRules.BeneficialRestrictions) == 0 )
return true; // In felucca, anything goes
if( !from.Player )
return true; // NPCs have no restrictions
if( target is BaseCreature && !((BaseCreature)target).Controlled )
return false; // Players cannot heal uncontrolled mobiles
if( from is PlayerMobile && ((PlayerMobile)from).Young && (!(target is PlayerMobile) || !((PlayerMobile)target).Young) )
return false; // Young players cannot perform beneficial actions towards older players
Guild fromGuild = from.Guild as Guild;
Guild targetGuild = target.Guild as Guild;
if( fromGuild != null && targetGuild != null && (targetGuild == fromGuild || fromGuild.IsAlly( targetGuild )) )
return true; // Guild members can be beneficial
return CheckBeneficialStatus( GetGuildStatus( from ), GetGuildStatus( target ) );
}
public static bool Mobile_AllowHarmful( Mobile from, Mobile target )
{
if( from == null || target == null || from.AccessLevel > AccessLevel.Player || target.AccessLevel > AccessLevel.Player )
return true;
#region Youngs en Felucca
BaseCreature bcreature = from as BaseCreature;
if (!from.Player && !(bcreature != null && bcreature.GetMaster() != null && bcreature.GetMaster().AccessLevel == AccessLevel.Player))
{
if (!CheckAggressor(from.Aggressors, target) && !CheckAggressed(from.Aggressed, target) && target is PlayerMobile && ((PlayerMobile)target).CheckYoungProtection(from))
return false; // Uncontrolled NPCs are only restricted by the young system
}
if (from.Player && target.Player && (((PlayerMobile)target).Young || ((PlayerMobile)from).Young))
return false; // Jugadores viejos no pueden atacar a Youngs y vice versa
//--------------------
#endregion
Map map = from.Map;
if( map != null && (map.Rules & MapRules.HarmfulRestrictions) == 0 )
return true; // In felucca, anything goes
BaseCreature bc = from as BaseCreature;
if( !from.Player && !(bc != null && bc.GetMaster() != null && bc.GetMaster().AccessLevel == AccessLevel.Player ) )
{
if( !CheckAggressor( from.Aggressors, target ) && !CheckAggressed( from.Aggressed, target ) && target is PlayerMobile && ((PlayerMobile)target).CheckYoungProtection( from ) )
return false;
return true; // Uncontrolled NPCs are only restricted by the young system
}
Guild fromGuild = GetGuildFor( from.Guild as Guild, from );
Guild targetGuild = GetGuildFor( target.Guild as Guild, target );
if( fromGuild != null && targetGuild != null && (fromGuild == targetGuild || fromGuild.IsAlly( targetGuild ) || fromGuild.IsEnemy( targetGuild )) )
return true; // Guild allies or enemies can be harmful
if( target is BaseCreature && (((BaseCreature)target).Controlled || (((BaseCreature)target).Summoned && from != ((BaseCreature)target).SummonMaster)) )
return false; // Cannot harm other controlled mobiles
if( target.Player )
return false; // Cannot harm other players
if( !(target is BaseCreature && ((BaseCreature)target).InitialInnocent) )
{
if( Notoriety.Compute( from, target ) == Notoriety.Innocent )
return false; // Cannot harm innocent mobiles
}
return true;
}
Place your comment