feat: Fixes beneficial notoriety checks and adds better young restrictions/messaging (#2000)

This commit is contained in:
Kamron Batman 2025-01-20 11:27:19 -08:00 committed by GitHub
parent 64e32a817d
commit 84d9383294
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 78 additions and 96 deletions

View file

@ -7105,23 +7105,17 @@ public partial class Mobile : IHued, IComparable<Mobile>, ISpawnable, IObjectPro
return false;
}
if (item.Parent != null)
if (item.Parent is Item parent)
{
if (item.Parent is Item parent)
if (!(CanSee(parent) && parent.IsChildVisibleTo(this, item)))
{
if (!(CanSee(parent) && parent.IsChildVisibleTo(this, item)))
{
return false;
}
}
else if (item.Parent is Mobile mobile)
{
if (!CanSee(mobile))
{
return false;
}
return false;
}
}
else if (item.Parent is Mobile mobile && !CanSee(mobile))
{
return false;
}
if (item is BankBox box && m_AccessLevel <= AccessLevel.Counselor && (box.Owner != this || !box.Opened))
{

View file

@ -466,6 +466,10 @@ public class BandageContext : Timer
{
healer.SendLocalizedMessage(501042); // Target cannot be resurrected at that location.
}
else if ((healer as PlayerMobile)?.Young == true && (patient as PlayerMobile)?.Young == false)
{
healer.SendLocalizedMessage(500952); // As a young player, you may not use beneficial skills on older players.
}
else if (healer.CanBeBeneficial(patient, true, true))
{
healer.DoBeneficial(patient);

View file

@ -44,15 +44,8 @@ namespace Server.Misc
return GuildStatus.Waring;
}
private static bool CheckBeneficialStatus(GuildStatus from, GuildStatus target)
{
if (from == GuildStatus.Waring || target == GuildStatus.Waring)
{
return false;
}
return true;
}
private static bool CheckBeneficialStatus(GuildStatus from, GuildStatus target) =>
from != GuildStatus.Waring && target != GuildStatus.Waring;
/*private static bool CheckHarmfulStatus( GuildStatus from, GuildStatus target )
{
@ -70,20 +63,16 @@ namespace Server.Misc
return true;
}
if (from.Region.IsPartOf<SafeZone>() || target.Region.IsPartOf<SafeZone>())
{
return false;
}
var bcFrom = from as BaseCreature;
var bcTarg = target as BaseCreature;
var pmFrom = from as PlayerMobile;
var pmTarg = target as PlayerMobile;
if (pmFrom == null && bcFrom?.Summoned == true)
{
pmFrom = bcFrom.SummonMaster as PlayerMobile;
}
if (pmTarg == null && bcTarg?.Summoned == true)
{
pmTarg = bcTarg.SummonMaster as PlayerMobile;
}
var pmFrom = (bcFrom?.GetMaster() ?? from) as PlayerMobile;
var pmTarg = (bcTarg?.GetMaster() ?? target) as PlayerMobile;
if (pmFrom != null && pmTarg != null)
{
@ -124,11 +113,6 @@ namespace Server.Misc
return false;
}
if (from.Region.IsPartOf<SafeZone>() || target.Region.IsPartOf<SafeZone>())
{
return false;
}
var map = from.Map;
var targetFaction = Faction.Find(target, true);
@ -143,7 +127,7 @@ namespace Server.Misc
return true; // In felucca, anything goes
}
if (!from.Player)
if (!from.Player && pmFrom?.AccessLevel != AccessLevel.Player)
{
return true; // NPCs have no restrictions
}
@ -153,9 +137,9 @@ namespace Server.Misc
return false; // Players cannot heal uncontrolled mobiles
}
if (pmFrom?.Young == true && pmTarg?.Young != true)
if (pmFrom?.Young == true && pmTarg?.Young == false)
{
return false; // Young players cannot perform beneficial actions towards older players
return false; // Young players cannot perform beneficial actions towards non-young players or pets
}
if (from.Guild is Guild fromGuild && target.Guild is Guild targetGuild &&
@ -175,20 +159,16 @@ namespace Server.Misc
return true;
}
if (from.Region.IsPartOf<SafeZone>() || target.Region.IsPartOf<SafeZone>())
{
return false;
}
var bcFrom = from as BaseCreature;
var pmFrom = from as PlayerMobile;
var pmTarg = target as PlayerMobile;
var bcTarg = target as BaseCreature;
if (pmFrom == null && bcFrom?.Summoned == true)
{
pmFrom = bcFrom.SummonMaster as PlayerMobile;
}
if (pmTarg == null && bcTarg?.Summoned == true)
{
pmTarg = bcTarg.SummonMaster as PlayerMobile;
}
var pmFrom = (bcFrom?.GetMaster() ?? from) as PlayerMobile;
var pmTarg = (bcTarg?.GetMaster() ?? target) as PlayerMobile;
if (pmFrom != null && pmTarg != null)
{
@ -224,11 +204,6 @@ namespace Server.Misc
return false;
}
if (from.Region.IsPartOf<SafeZone>() || target.Region.IsPartOf<SafeZone>())
{
return false;
}
var map = from.Map;
if ((map?.Rules & MapRules.HarmfulRestrictions) == 0)
@ -236,16 +211,11 @@ namespace Server.Misc
return true; // In felucca, anything goes
}
if (!from.Player && !(from is BaseCreature bc && bc.GetMaster() != null &&
bc.GetMaster().AccessLevel == AccessLevel.Player))
if (!from.Player && pmFrom?.AccessLevel != AccessLevel.Player)
{
if (!CheckAggressor(from.Aggressors, target) && !CheckAggressed(from.Aggressed, target) &&
pmTarg?.CheckYoungProtection(from) == true)
{
return false;
}
return true; // Uncontrolled NPCs are only restricted by the young system
// Uncontrolled NPCs are only restricted by the young system
return CheckAggressor(from.Aggressors, target) || CheckAggressed(from.Aggressed, target) ||
(target as PlayerMobile)?.CheckYoungProtection(from) != true;
}
var fromGuild = GetGuildFor(from.Guild as Guild, from);
@ -258,7 +228,7 @@ namespace Server.Misc
}
if (bcTarg?.Controlled == true
|| (bcTarg?.Summoned == true && bcTarg.SummonMaster != from && bcTarg.SummonMaster.Player))
|| bcTarg?.Summoned == true && bcTarg.SummonMaster != from && bcTarg.SummonMaster.Player)
{
return false; // Cannot harm other controlled mobiles from players
}
@ -278,23 +248,24 @@ namespace Server.Misc
public static Guild GetGuildFor(Guild def, Mobile m)
{
var g = def;
if (m is BaseCreature c && c.Controlled && c.ControlMaster != null)
if (m is not BaseCreature c || !c.Controlled || c.ControlMaster == null)
{
c.DisplayGuildTitle = false;
if (c.Map != Map.Internal && (Core.AOS || Guild.NewGuildSystem || c.ControlOrder is OrderType.Attack or OrderType.Guard))
{
g = (Guild)(c.Guild = c.ControlMaster.Guild);
}
else if (c.Map == Map.Internal || c.ControlMaster.Guild == null)
{
g = (Guild)(c.Guild = null);
}
return def;
}
return g;
c.DisplayGuildTitle = false;
if (c.Map != Map.Internal && (Core.AOS || Guild.NewGuildSystem || c.ControlOrder is OrderType.Attack or OrderType.Guard))
{
return (Guild)(c.Guild = c.ControlMaster.Guild);
}
if (c.Map == Map.Internal || c.ControlMaster.Guild == null)
{
return (Guild)(c.Guild = null);
}
return def;
}
public static int CorpseNotoriety(Mobile source, Corpse target)

View file

@ -2621,12 +2621,9 @@ namespace Server.Mobiles
}
}
if (Young && DuelContext == null)
if (Young && DuelContext == null && YoungDeathTeleport())
{
if (YoungDeathTeleport())
{
Timer.StartTimer(TimeSpan.FromSeconds(2.5), SendYoungDeathNotice);
}
Timer.StartTimer(TimeSpan.FromSeconds(2.5), SendYoungDeathNotice);
}
if (DuelContext?.Registered != true || !DuelContext.Started || m_DuelPlayer?.Eliminated != false)

View file

@ -18,6 +18,7 @@ namespace Server.SkillHandlers
{
public static readonly bool ClassicMode = false;
public static readonly bool SuspendOnMurder = false;
private const int MaxWeightToSteal = 10;
public static void Initialize()
{
@ -80,6 +81,7 @@ namespace Server.SkillHandlers
var root = toSteal.RootParent;
var mobRoot = root as Mobile;
var rootIsPlayer = mobRoot?.Player == true;
StealableArtifacts.StealableInstance si = toSteal.Parent == null || !toSteal.Movable
? StealableArtifacts.GetStealableInstance(toSteal)
@ -93,16 +95,23 @@ namespace Server.SkillHandlers
{
m_Thief.SendMessage("You may not steal in this area.");
}
else if (mobRoot?.Player == true && !IsInGuild(m_Thief))
else if ((m_Thief as PlayerMobile)?.Young == true && (rootIsPlayer || mobRoot is BaseCreature))
{
m_Thief.SendLocalizedMessage(502700); // You cannot steal from people or monsters right now. Practice on chests and barrels.
}
else if (rootIsPlayer && !IsInGuild(m_Thief))
{
m_Thief.SendLocalizedMessage(1005596); // You must be in the thieves guild to steal from other players.
}
else if (SuspendOnMurder && mobRoot?.Player == true && IsInGuild(m_Thief) &&
m_Thief.Kills > 0)
else if (SuspendOnMurder && rootIsPlayer && IsInGuild(m_Thief) && m_Thief.Kills > 0)
{
m_Thief.SendLocalizedMessage(502706); // You are currently suspended from the thieves guild.
}
else if (root is BaseVendor vendor && vendor.IsInvulnerable)
else if ((mobRoot as PlayerMobile)?.Young == true)
{
m_Thief.SendLocalizedMessage(502699); // You cannot steal from the Young.
}
else if ((root as BaseVendor)?.IsInvulnerable == true)
{
m_Thief.SendLocalizedMessage(1005598); // You can't steal from shopkeepers.
}
@ -114,10 +123,6 @@ namespace Server.SkillHandlers
{
m_Thief.SendLocalizedMessage(500237); // Target can not be seen.
}
else if (m_Thief.Backpack?.CheckHold(m_Thief, toSteal, false, true) != true)
{
m_Thief.SendLocalizedMessage(1048147); // Your backpack can't hold anything else.
}
else if (toSteal is Sigil sig)
{
var pl = PlayerState.Find(m_Thief);
@ -206,6 +211,10 @@ namespace Server.SkillHandlers
m_Thief.SendLocalizedMessage(1005588); // You must join a faction to do that
}
}
else if (m_Thief.Backpack?.CheckHold(m_Thief, toSteal, false, true) != true)
{
m_Thief.SendLocalizedMessage(1048147); // Your backpack can't hold anything else.
}
else if (si == null && (toSteal.Parent == null || !toSteal.Movable))
{
m_Thief.SendLocalizedMessage(502710); // You can't steal that!
@ -250,9 +259,10 @@ namespace Server.SkillHandlers
{
var w = toSteal.Weight + toSteal.TotalWeight;
if (w > 10)
if (w > MaxWeightToSteal)
{
m_Thief.SendMessage("That is too heavy to steal.");
// This item is too heavy to steal from someone's backpack.
m_Thief.SendLocalizedMessage(502722);
}
else
{

View file

@ -831,6 +831,12 @@ namespace Server.Spells
return false;
}
if ((Caster as PlayerMobile)?.Young == true && (target as PlayerMobile)?.Young == false)
{
Caster.SendLocalizedMessage(500278); // As a young player, you may not cast beneficial spells onto older players.
return false;
}
if (Caster.CanBeBeneficial(target, true, allowDead) && CheckSequence())
{
Caster.DoBeneficial(target);