Esempio n. 1
0
        public static int MobileNotoriety(Mobile source, Mobile target)
        {
            if (Core.AOS && (target.Blessed || (target is BaseVendor && ((BaseVendor)target).IsInvulnerable) || target is PlayerVendor || target is TownCrier))
            {
                return(Notoriety.Invulnerable);
            }

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

            // MODIFICATIONS FOR Capture the Flag / Double Dom games
            Server.Items.CTFTeam ft = Server.Items.CTFGame.FindTeamFor(source);
            if (ft != null)
            {
                Server.Items.CTFTeam tt = Server.Items.CTFGame.FindTeamFor(target);
                if (tt != null && ft.Game == tt.Game)
                {
                    return(ft == tt ? Notoriety.Ally : Notoriety.Enemy);
                }
            }


            if (source.Player && !target.Player && source is PlayerMobile && target is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)target;

                if (!bc.Summoned && !bc.Controled && ((PlayerMobile)source).EnemyOfOneType == target.GetType())
                {
                    return(Notoriety.Enemy);
                }
            }

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

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

            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);
                }
            }

            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 (SkillHandlers.Stealing.ClassicMode && target is PlayerMobile && ((PlayerMobile)target).PermaFlags.Contains(source))
            {
                return(Notoriety.CanBeAttacked);
            }

            if (target is BaseCreature && ((BaseCreature)target).AlwaysAttackable)
            {
                return(Notoriety.CanBeAttacked);
            }

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

            if (!(target is BaseCreature && ((BaseCreature)target).InitialInnocent))
            {
                if (!target.Body.IsHuman && !target.Body.IsGhost && !IsPet(target as BaseCreature) && !Server.Spells.Necromancy.TransformationSpell.UnderTransformation(target))
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

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

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

            if (target is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)target;

                if (bc.Controled && bc.ControlOrder == OrderType.Guard && bc.ControlTarget == source)
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

            if (source is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)source;

                Mobile master = bc.GetMaster();
                if (master != null && CheckAggressor(master.Aggressors, target))
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

//bounty system
            if (BountyBoard.Attackable(source, target))
            {
                return(Notoriety.CanBeAttacked);
            }
//end bounty system

            return(Notoriety.Innocent);
        }
Esempio n. 2
0
        public static void EventSink_PlayerDeath(PlayerDeathEventArgs e)
        {
            Mobile m = e.Mobile;

            List <Mobile> killers = new List <Mobile>();
            List <Mobile> toGive  = new List <Mobile>();

            foreach (AggressorInfo ai in m.Aggressors)
            {
                if (ai.Attacker.Player && ai.CanReportMurder && !ai.Reported)
                {
                    //bounty system edit
                    // orig if ( ai.Attacker.Player && ai.CanReportMurder && !ai.Reported )
                    if (ai.Attacker.Player && ai.CanReportMurder && !ai.Reported && !BountyBoard.Attackable(ai.Attacker, e.Mobile) && !m.IsInEvent)
                    // end bounty system edit
                    {
                        killers.Add(ai.Attacker);
                        ai.Reported        = true;
                        ai.CanReportMurder = false;
                    }
                }
                if (ai.Attacker.Player && (DateTime.Now - ai.LastCombatTime) < TimeSpan.FromSeconds(30.0) &&
                    !toGive.Contains(ai.Attacker))
                {
                    toGive.Add(ai.Attacker);
                }
            }

            foreach (AggressorInfo ai in m.Aggressed)
            {
                if (ai.Defender.Player && (DateTime.Now - ai.LastCombatTime) < TimeSpan.FromSeconds(30.0) && !toGive.Contains(ai.Defender))
                {
                    toGive.Add(ai.Defender);
                }
            }

            foreach (Mobile g in toGive)
            {
                /* Taran: Fame and Karma awards already exists in FameKillSystem.cs
                 *              int n = Notoriety.Compute( g, m );
                 *
                 *              int theirKarma = m.Karma, ourKarma = g.Karma;
                 *              bool innocent = ( n == Notoriety.Innocent );
                 *              bool criminal = ( n == Notoriety.Criminal || n == Notoriety.Murderer );
                 *
                 *              int fameAward = m.Fame / 200;
                 *              int karmaAward = 0;
                 *
                 *              if ( innocent )
                 *                      karmaAward = ( ourKarma > -2500 ? -850 : -110 - (m.Karma / 100) );
                 *              else if ( criminal )
                 *                      karmaAward = 50;
                 *
                 *              Titles.AwardFame( g, fameAward, false );
                 * Titles.AwardKarma(g, karmaAward, true)
                 */
                // modification to support XmlQuest Killtasks of players
                Items.XmlQuest.RegisterKill(m, g);
            }

            if (m is PlayerMobile && ((PlayerMobile)m).NpcGuild == NpcGuild.ThievesGuild)
            {
                return;
            }

            if (killers.Count > 0)
            {
                new GumpTimer(m, killers).Start();
            }
        }
Esempio n. 3
0
        public static void EventSink_PlayerDeath(PlayerDeathEventArgs e)
        {
            Mobile m = e.Mobile;

            ArrayList killers = new ArrayList();
            ArrayList toGive  = new ArrayList();

            foreach (AggressorInfo ai in m.Aggressors)
            {
//bounty system edit
// orig if ( ai.Attacker.Player && ai.CanReportMurder && !ai.Reported )
                if (ai.Attacker.Player && ai.CanReportMurder && !ai.Reported &&
                    !BountyBoard.Attackable(ai.Attacker, e.Mobile))                        // end bounty system edit
                {
                    killers.Add(ai.Attacker);
                    ai.Reported = true;
                }

                if (ai.Attacker.Player && (DateTime.Now - ai.LastCombatTime) < TimeSpan.FromSeconds(30.0) && !toGive.Contains(ai.Attacker))
                {
                    toGive.Add(ai.Attacker);
                }
            }

            foreach (AggressorInfo ai in m.Aggressed)
            {
                if (ai.Defender.Player && (DateTime.Now - ai.LastCombatTime) < TimeSpan.FromSeconds(30.0) && !toGive.Contains(ai.Defender))
                {
                    toGive.Add(ai.Defender);
                }
            }

            foreach (Mobile g in toGive)
            {
                int n = Notoriety.Compute(g, m);

                int  theirKarma = m.Karma, ourKarma = g.Karma;
                bool innocent = (n == Notoriety.Innocent);
                bool criminal = (n == Notoriety.Criminal || n == Notoriety.Murderer);

                int fameAward  = m.Fame / 200;
                int karmaAward = 0;

                if (innocent)
                {
                    karmaAward = (ourKarma > -2500 ? -850 : -110 - (m.Karma / 100));
                }
                else if (criminal)
                {
                    karmaAward = 50;
                }

                Titles.AwardFame(g, fameAward, false);
                Titles.AwardKarma(g, karmaAward, true);
            }

            if (m is PlayerMobile && ((PlayerMobile)m).NpcGuild == NpcGuild.ThievesGuild)
            {
                return;
            }

            if (killers.Count > 0)
            {
                new GumpTimer(m, killers).Start();
            }
        }
Esempio n. 4
0
        public static int MobileNotoriety(Mobile source, Mobile target)
        {
            CustomRegion cR = target.Region as CustomRegion;

            #region Event Notorieties

            //Check event prop first for better use of resources
            if ((source.IsInEvent && !target.IsInEvent) && (cR == null || cR.Controller.HasAttackPenalty))
            {
                return(Notoriety.Invulnerable);
            }
            if ((!source.IsInEvent && target.IsInEvent) && (cR == null || cR.Controller.HasAttackPenalty))
            {
                return(Notoriety.Invulnerable);
            }

            //Deathmatch
            if (Custom.PvpToolkit.PvpCore.IsInDeathmatch(source) && Custom.PvpToolkit.PvpCore.IsInDeathmatch(target))
            {
                Custom.PvpToolkit.DMatch.Items.DMStone dm1 = Custom.PvpToolkit.PvpCore.GetPlayerStone(source);
                Custom.PvpToolkit.DMatch.Items.DMStone dm2 = Custom.PvpToolkit.PvpCore.GetPlayerStone(target);

                return(dm1 == dm2 ? Notoriety.Enemy : Notoriety.Invulnerable);
            }

            //Tournament
            if (Custom.PvpToolkit.Tournament.TournamentCore.IsInTournament(source) && Custom.PvpToolkit.Tournament.TournamentCore.IsInTournament(target))
            {
                Custom.PvpToolkit.Tournament.TournamentStone stone1 = Custom.PvpToolkit.Tournament.TournamentCore.GetPlayerStone(source);
                Custom.PvpToolkit.Tournament.TournamentStone stone2 = Custom.PvpToolkit.Tournament.TournamentCore.GetPlayerStone(target);

                return(stone1 == stone2 ? Notoriety.Enemy : Notoriety.Invulnerable);
            }

            //Capture the Flag / Color Wars / Double Dom games
            if (source is PlayerMobile && target is PlayerMobile)
            {
                PlayerMobile src      = source as PlayerMobile;
                PlayerMobile trg      = target as PlayerMobile;
                BaseTeamGame srcevent = src.CurrentEvent as BaseTeamGame;
                BaseTeamGame trgevent = trg.CurrentEvent as BaseTeamGame;
                if (srcevent != null && trgevent != null)
                {
                    BaseGameTeam srcteam = srcevent.GetTeam(source);
                    if (srcteam != null)
                    {
                        BaseGameTeam trgteam = srcevent.GetTeam(target);
                        if (trgteam != null)
                        {
                            return(srcteam == trgteam ? Notoriety.Ally : Notoriety.Enemy);
                        }
                    }
                }
            }

            #endregion

            if (Core.AOS && (target.Blessed || (target is BaseVendor && ((BaseVendor)target).IsInvulnerable) || target is PlayerVendor || target is TownCrier))
            {
                return(Notoriety.Invulnerable);
            }

            if (target is BaseCreature && (((BaseCreature)target).AlwaysMurderer || ((BaseCreature)target).IsAnimatedDead))
            {
                return(Notoriety.Murderer);
            }

            if (target is PlayerMobile && (((PlayerMobile)target).AlwaysMurderer))
            {
                return(Notoriety.Murderer);
            }

            //All mobiles have same murder rules.
            if (target.Kills >= KILLS_FOR_MURDER)
            {
                return(Notoriety.Murderer);
            }

            //Target should be karma red before guild notoriety
            if (target is PlayerMobile)
            {
                if (target.Karma <= PLAYER_KARMA_RED)
                {
                    return(Notoriety.Murderer);
                }
            }

            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) || (sourceGuild.Type !=
                                                                                      GuildType.Regular && sourceGuild.Type == targetGuild.Type))
                {
                    return(Notoriety.Ally);
                }
                if (sourceGuild.IsEnemy(targetGuild))
                {
                    return(Notoriety.Enemy);
                }
            }

            if (cR != null && !cR.Controller.HasAttackPenalty)
            {
                return(Notoriety.CanBeAttacked);
            }

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

            if (target is PlayerMobile) //Player mobile notoriety hierarchy
            {
                if (target.Criminal)
                {
                    return(Notoriety.Criminal);
                }
                if (target.Karma <= PLAYER_KARMA_GREY)
                {
                    return(Notoriety.CanBeAttacked);
                }
            }
            else //Mobile notoriety hierarchy
            {
                if (target.Karma <= NPC_KARMA_RED)
                {
                    return(Notoriety.Murderer);
                }
                if (target.Criminal)
                {
                    return(Notoriety.Criminal);
                }
                if (target.Karma <= NPC_KARMA_GREY)
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

            if (source.Player && !target.Player && source is PlayerMobile && target is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)target;

                Mobile master = bc.GetMaster();

                if (master != null && master.AccessLevel > AccessLevel.Player)
                {
                    return(Notoriety.CanBeAttacked);
                }

                if (!bc.Summoned && !bc.Controlled && ((PlayerMobile)source).EnemyOfOneType == target.GetType())
                {
                    return(Notoriety.Enemy);
                }

                if (bc.ControlMaster == source)
                {
                    return(Notoriety.CanBeAttacked);
                }

                master = bc.ControlMaster;

                if (Core.ML && master != null)
                {
                    if (source == master && CheckAggressor(target.Aggressors, source))
                    {
                        return(Notoriety.CanBeAttacked);
                    }

                    return(MobileNotoriety(source, master));
                }
            }


            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 (Stealing.ClassicMode && target is PlayerMobile && ((PlayerMobile)target).PermaFlags.Contains(source))
            {
                return(Notoriety.CanBeAttacked);
            }

            if (target is BaseCreature && ((BaseCreature)target).AlwaysAttackable)
            {
                return(Notoriety.CanBeAttacked);
            }

            if (!IsGuardCandidate(target) && (target is BaseGuard))
            {
                return(Notoriety.Innocent);
            }

            //Maka - Repo update, might mess stuff upp
            //Taran - Yeah it did, I had to uncomment it :P
            //if (!(target is BaseCreature && ((BaseCreature)target).InitialInnocent))
            //{
            //  if( !target.Body.IsHuman && !target.Body.IsGhost && !IsPet( target as BaseCreature ) && !TransformationSpellHelper.UnderTransformation( target ) && !AnimalForm.UnderTransformation( target ) )
            //      return Notoriety.CanBeAttacked;
            //}

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

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

            if (target is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)target;

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

            if (source is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)source;

                Mobile master = bc.GetMaster();
                if (master != null && CheckAggressor(master.Aggressors, target))
                {
                    return(Notoriety.CanBeAttacked);
                }
            }

            //bounty system
            if (BountyBoard.Attackable(source, target))
            {
                return(Notoriety.CanBeAttacked);
            }
            //end bounty system

            return(Notoriety.Innocent);
        }