コード例 #1
0
ファイル: Notoriety.cs プロジェクト: zerodowned/UO-Forever
        public static int MobileNotoriety(Mobile source, Mobile target)
        {
            if ((target.Blessed || (target is BaseVendor && ((BaseVendor)target).IsInvulnerable) || target is PlayerVendor || target is TownCrier))
            {
                return(Notoriety.Invulnerable);
            }

            if (AutoRestart.ServerWars || target.AccessLevel > AccessLevel.Player)
            {
                return(Notoriety.CanBeAttacked);
            }

            #region Dueling
            if (source is PlayerMobile && target is PlayerMobile)
            {
                PlayerMobile pmFrom = (PlayerMobile)source;
                PlayerMobile pmTarg = (PlayerMobile)target;

                if (pmFrom.DuelContext != null && pmFrom.DuelContext.StartedBeginCountdown && !pmFrom.DuelContext.Finished && pmFrom.DuelContext == pmTarg.DuelContext)
                {
                    return(pmFrom.DuelContext.IsAlly(pmFrom, pmTarg) ? Notoriety.Ally : Notoriety.Enemy);
                }
            }
            #endregion

            // Alan mod: custom teams
            if (source.CustomTeam && target.CustomTeam)
            {
                List <XmlTeam> targetTeams = XmlAttach.GetTeams(target);
                List <XmlTeam> fromTeams   = XmlAttach.GetTeams(source);

                if (XmlTeam.SameTeam(fromTeams, targetTeams))
                {
                    if (XmlTeam.ShowGreen(fromTeams, targetTeams))
                    {
                        return(Notoriety.Ally);
                    }
                    // if not show green, use default notoriety
                }
                // they are on the enemy team, allow harmful
                else
                {
                    return(Notoriety.Enemy);
                }
            }
            // end Alan mod

            BaseCreature tbc = target as BaseCreature;
            BaseCreature sbc = source as BaseCreature;
            PlayerMobile tpm = target as PlayerMobile;
            PlayerMobile spm = source as PlayerMobile;

            if (source.Player && !target.Player && spm != null && tbc != null)
            {
                Mobile master = tbc.GetMaster();

                if (!tbc.AlwaysMurderer && tbc.Controlled && master != null)
                {
                    if (master.AccessLevel > AccessLevel.Player || (source == master && CheckAggressor(tbc.Aggressors, source)) || (CheckAggressor(source.Aggressors, tbc)))
                    {
                        return(Notoriety.CanBeAttacked);
                    }
                    else
                    {
                        return(MobileNotoriety(source, master));
                    }
                }
            }

            if (target.Kills >= 5 || (target.Body.IsMonster && IsSummoned(tbc) && !(target is BaseFamiliar) && !(target is ArcaneFey) && !(target is Golem)) || (tbc != null && (tbc.AlwaysMurderer || tbc.IsAnimatedDead)))
            {
                return(Notoriety.Murderer);
            }

            if (target.Criminal)
            {
                return(Notoriety.Criminal);
            }

            CustomRegion      region1  = target.Region as CustomRegion;
            CaptureZoneRegion regionCz = target.Region as CaptureZoneRegion;

            if (region1 != null && region1.AlwaysGrey() || regionCz != null && regionCz.Czone.AlwaysGrey)
            {
                return(Notoriety.CanBeAttacked);
            }

            Guild sourceGuild = GetGuildFor(source.Guild as Guild, source);
            Guild targetGuild = GetGuildFor(target.Guild as Guild, target);

            if (sourceGuild != null && targetGuild != null)
            {
                if (sourceGuild == targetGuild || sourceGuild.IsAlly(targetGuild))
                {
                    return(Notoriety.Ally);
                }
                else if (sourceGuild.IsEnemy(targetGuild))
                {
                    return(Notoriety.Enemy);
                }
            }



            #region Ethics Checks of target or master of target
            Ethics.Ethic sourceEthic = Ethics.Ethic.Find(source, true, true);
            Ethics.Ethic targetEthic = Ethics.Ethic.Find(target, true, true);

            if (sourceEthic != null && targetEthic != null && targetEthic != sourceEthic)
            {
                return(Notoriety.Enemy);
            }
            #endregion

            Faction srcFaction = Faction.Find(source, true, true);
            Faction trgFaction = Faction.Find(target, true, true);

            if (srcFaction != null && trgFaction != null && srcFaction != trgFaction && source.Map == Faction.Facet)
            {
                return(Notoriety.Enemy);
            }

            if (tpm != null && SkillHandlers.Stealing.ClassicMode && tpm.PermaFlags.Contains(source))
            {
                return(Notoriety.CanBeAttacked);
            }

            if (tbc != null && tbc.AlwaysAttackable)
            {
                return(Notoriety.CanBeAttacked);
            }

            if (CheckHouseFlag(source, target, target.Location, target.Map))
            {
                return(Notoriety.CanBeAttacked);
            }

            if (!(tbc != null && (tbc.InitialInnocent || tbc.InnocentDefault)))   //If Target is NOT A baseCreature, OR it's a BC and the BC is initial innocent...
            {
                if (!target.Body.IsHuman && !target.Body.IsGhost && !IsPet(tbc) && tpm == null && !target.Player || !target.EraML && !target.CanBeginAction(typeof(Server.Spells.Seventh.PolymorphSpell)) && !target.Player)
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

            if (CheckAggressor(source.Aggressors, target))
            {
                return(Notoriety.CanBeAttacked);
            }

            if (CheckAggressed(source.Aggressed, target))
            {
                return(Notoriety.CanBeAttacked);
            }

            if (tbc != null)
            {
                if (tbc.Controlled && tbc.ControlOrder == OrderType.Guard && tbc.ControlTarget == source)
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

            if (sbc != null)
            {
                Mobile smaster = sbc.GetMaster();

                if (smaster != null)
                {
                    if (CheckAggressor(smaster.Aggressors, target) || MobileNotoriety(smaster, target) == Notoriety.CanBeAttacked || tbc != null)
                    {
                        return(Notoriety.CanBeAttacked);
                    }
                }
            }

            return(Notoriety.Innocent);
        }
コード例 #2
0
ファイル: Notoriety.cs プロジェクト: zerodowned/UO-Forever
        public static int CorpseNotoriety(Mobile source, Corpse target)
        {
            if (AutoRestart.ServerWars || target.AccessLevel > AccessLevel.Player)
            {
                return(Notoriety.CanBeAttacked);
            }

            // Alan mod: custom teams
            if (source.CustomTeam)
            {
                // corpse teams are copied over from the mob
                List <XmlTeam> targetTeams = XmlAttach.GetTeams(target);
                if (targetTeams != null)
                {
                    List <XmlTeam> fromTeams = XmlAttach.GetTeams(source);

                    if (XmlTeam.SameTeam(fromTeams, targetTeams))
                    {
                        if (XmlTeam.ShowGreen(fromTeams, targetTeams))
                        {
                            return(Notoriety.Ally);
                        }
                        // otherwise just use default notoriety
                    }
                    // they are on the enemy team, allow harmful
                    else
                    {
                        return(Notoriety.Enemy);
                    }
                }
            }
            // end Alan mod

            Body body = (Body)target.Amount;

            BaseCreature cretOwner = target.Owner as BaseCreature;

            if (cretOwner != null)
            {
                if (cretOwner.FreelyLootable)
                {
                    return(Notoriety.CanBeAttacked);
                }

                Guild sourceGuild = GetGuildFor(source.Guild as Guild, source);
                Guild targetGuild = GetGuildFor(target.Guild as Guild, target.Owner);

                if (sourceGuild != null && targetGuild != null)
                {
                    if (sourceGuild == targetGuild || sourceGuild.IsAlly(targetGuild))
                    {
                        return(Notoriety.Ally);
                    }
                    else if (sourceGuild.IsEnemy(targetGuild))
                    {
                        return(Notoriety.Enemy);
                    }
                }

                Faction srcFaction = Faction.Find(source, true, true);
                Faction trgFaction = Faction.Find(target.Owner, true, true);

                if (srcFaction != null && trgFaction != null && srcFaction != trgFaction && Faction.IsFactionFacet(source.Map))
                {
                    return(Notoriety.Enemy);
                }

                if (CheckHouseFlag(source, target.Owner, target.Location, target.Map))
                {
                    return(Notoriety.CanBeAttacked);
                }

                int actual = Notoriety.CanBeAttacked;

                if (target.Kills >= 5 || (body.IsMonster && IsSummoned(target.Owner as BaseCreature)) || (target.Owner is BaseCreature && (((BaseCreature)target.Owner).AlwaysMurderer || ((BaseCreature)target.Owner).IsAnimatedDead)))
                {
                    actual = Notoriety.Murderer;
                }

                if (DateTime.UtcNow >= (target.TimeOfDeath + Corpse.MonsterLootRightSacrifice))
                {
                    return(actual);
                }

                Party sourceParty = Party.Get(source);

                List <Mobile> list = target.Aggressors;

                for (int i = 0; i < list.Count; ++i)
                {
                    if (list[i] == source || (sourceParty != null && Party.Get(list[i]) == sourceParty))
                    {
                        return(actual);
                    }
                }

                return(Notoriety.Innocent);
            }
            else
            {
                if (target.Kills >= 5 || (body.IsMonster && IsSummoned(target.Owner as BaseCreature)) || (target.Owner is BaseCreature && (((BaseCreature)target.Owner).AlwaysMurderer || ((BaseCreature)target.Owner).IsAnimatedDead)))
                {
                    return(Notoriety.Murderer);
                }

                if (target.Criminal && target.Map != null && ((target.Map.Rules & MapRules.HarmfulRestrictions) == 0))
                {
                    return(Notoriety.Criminal);
                }

                Guild sourceGuild = GetGuildFor(source.Guild as Guild, source);
                Guild targetGuild = GetGuildFor(target.Guild as Guild, target.Owner);

                if (sourceGuild != null && targetGuild != null)
                {
                    if (sourceGuild == targetGuild || sourceGuild.IsAlly(targetGuild))
                    {
                        return(Notoriety.Ally);
                    }
                    else if (sourceGuild.IsEnemy(targetGuild))
                    {
                        return(Notoriety.Enemy);
                    }
                }

                Faction srcFaction = Faction.Find(source, true, true);
                Faction trgFaction = Faction.Find(target.Owner, true, true);

                if (srcFaction != null && trgFaction != null && srcFaction != trgFaction && Faction.IsFactionFacet(source.Map))
                {
                    List <Mobile> secondList = target.Aggressors;

                    for (int i = 0; i < secondList.Count; ++i)
                    {
                        if (secondList[i] == source || secondList[i] is BaseFactionGuard)
                        {
                            return(Notoriety.Enemy);
                        }
                    }
                }

                if (target.Owner != null && target.Owner is BaseCreature && ((BaseCreature)target.Owner).AlwaysAttackable)
                {
                    return(Notoriety.CanBeAttacked);
                }

                if (CheckHouseFlag(source, target.Owner, target.Location, target.Map))
                {
                    return(Notoriety.CanBeAttacked);
                }

                if (!(target.Owner is PlayerMobile) && !IsPet(target.Owner as BaseCreature))
                {
                    return(Notoriety.CanBeAttacked);
                }

                CustomRegion      region1  = source.Region as CustomRegion;
                CaptureZoneRegion regionCz = source.Region as CaptureZoneRegion;

                if (region1 != null && region1.AlwaysGrey() || regionCz != null && regionCz.Czone.AlwaysGrey)
                {
                    return(Notoriety.CanBeAttacked);
                }

                List <Mobile> list = target.Aggressors;

                for (int i = 0; i < list.Count; ++i)
                {
                    if (list[i] == source)
                    {
                        return(Notoriety.CanBeAttacked);
                    }
                }

                return(Notoriety.Innocent);
            }
        }