예제 #1
0
        public override bool IsAllowedToAttack(GameLiving attacker, GameLiving defender, bool quiet)
        {
            if (!base.IsAllowedToAttack(attacker, defender, quiet))
            {
                return(false);
            }

            // if controlled NPC - do checks for owner instead
            if (attacker is GameNPC npc)
            {
                if (npc.Brain is IControlledBrain controlled)
                {
                    attacker = controlled.GetLivingOwner();
                    quiet    = true; // silence all attacks by controlled npc
                }
            }

            if (defender is GameNPC gameNpc)
            {
                if (gameNpc.Brain is IControlledBrain controlled)
                {
                    defender = controlled.GetLivingOwner();
                }
            }

            // "You can't attack yourself!"
            if (attacker == defender)
            {
                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack yourself!");
                }

                return(false);
            }

            // Don't allow attacks on same realm members on Normal Servers
            if (attacker.Realm == defender.Realm && !(attacker is GamePlayer && ((GamePlayer)attacker).DuelTarget == defender))
            {
                // allow confused mobs to attack same realm
                if (attacker is GameNPC && (attacker as GameNPC).IsConfused)
                {
                    return(true);
                }

                if (attacker.Realm == 0)
                {
                    return(FactionMgr.CanLivingAttack(attacker, defender));
                }

                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack a member of your realm!");
                }

                return(false);
            }

            return(true);
        }
예제 #2
0
        public override bool IsAllowedToAttack(GameLiving attacker, GameLiving defender, bool quiet)
        {
            if (!base.IsAllowedToAttack(attacker, defender, quiet))
            {
                return(false);
            }

            // if controlled NPC - do checks for owner instead
            if (attacker is GameNPC)
            {
                IControlledBrain controlled = ((GameNPC)attacker).Brain as IControlledBrain;
                if (controlled != null)
                {
                    attacker = controlled.GetLivingOwner();
                    quiet    = true;                  // silence all attacks by controlled npc
                }
            }
            if (defender is GameNPC)
            {
                IControlledBrain controlled = ((GameNPC)defender).Brain as IControlledBrain;
                if (controlled != null)
                {
                    defender = controlled.GetLivingOwner();
                }
            }

            // can't attack self
            if (attacker == defender)
            {
                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack yourself!");
                }
                return(false);
            }

            //ogre: sometimes other players shouldn't be attackable
            GamePlayer playerAttacker = attacker as GamePlayer;
            GamePlayer playerDefender = defender as GamePlayer;

            if (playerAttacker != null && playerDefender != null)
            {
                //check group
                if (playerAttacker.Group != null && playerAttacker.Group.IsInTheGroup(playerDefender))
                {
                    if (!quiet)
                    {
                        MessageToLiving(playerAttacker, "You can't attack your group members.");
                    }
                    return(false);
                }

                if (playerAttacker.DuelTarget != defender)
                {
                    //check guild
                    if (playerAttacker.Guild != null && playerAttacker.Guild == playerDefender.Guild)
                    {
                        if (!quiet)
                        {
                            MessageToLiving(playerAttacker, "You can't attack your guild members.");
                        }
                        return(false);
                    }

                    // Player can't hit other members of the same BattleGroup
                    BattleGroup mybattlegroup = (BattleGroup)playerAttacker.TempProperties.getProperty <object>(BattleGroup.BATTLEGROUP_PROPERTY, null);

                    if (mybattlegroup != null && mybattlegroup.IsInTheBattleGroup(playerDefender))
                    {
                        if (!quiet)
                        {
                            MessageToLiving(playerAttacker, "You can't attack a member of your battlegroup.");
                        }
                        return(false);
                    }

                    // Safe regions
                    if (m_safeRegions != null)
                    {
                        foreach (int reg in m_safeRegions)
                        {
                            if (playerAttacker.CurrentRegionID == reg)
                            {
                                if (quiet == false)
                                {
                                    MessageToLiving(playerAttacker, "You're currently in a safe zone, you can't attack other players here.");
                                }
                                return(false);
                            }
                        }
                    }


                    // Players with safety flag can not attack other players
                    if (playerAttacker.Level < m_safetyLevel && playerAttacker.SafetyFlag)
                    {
                        if (quiet == false)
                        {
                            MessageToLiving(attacker, "Your PvP safety flag is ON.");
                        }
                        return(false);
                    }

                    // Players with safety flag can not be attacked in safe regions
                    if (playerDefender.Level < m_safetyLevel && playerDefender.SafetyFlag)
                    {
                        bool unsafeRegion = false;
                        foreach (int regionID in m_unsafeRegions)
                        {
                            if (regionID == playerDefender.CurrentRegionID)
                            {
                                unsafeRegion = true;
                                break;
                            }
                        }
                        if (unsafeRegion == false)
                        {
                            //"PLAYER has his safety flag on and is in a safe area, you can't attack him here."
                            if (quiet == false)
                            {
                                MessageToLiving(attacker, playerDefender.Name + " has " + playerDefender.GetPronoun(1, false) + " safety flag on and is in a safe area, you can't attack " + playerDefender.GetPronoun(2, false) + " here.");
                            }
                            return(false);
                        }
                    }
                }
            }

            if (attacker.Realm == 0 && defender.Realm == 0)
            {
                return(FactionMgr.CanLivingAttack(attacker, defender));
            }

            //allow confused mobs to attack same realm
            if (attacker is GameNPC && (attacker as GameNPC).IsConfused && attacker.Realm == defender.Realm)
            {
                return(true);
            }

            // "friendly" NPCs can't attack "friendly" players
            if (defender is GameNPC && defender.Realm != 0 && attacker.Realm != 0 && defender is GameKeepGuard == false && defender is GameFont == false)
            {
                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack a friendly NPC!");
                }
                return(false);
            }
            // "friendly" NPCs can't be attacked by "friendly" players
            if (attacker is GameNPC && attacker.Realm != 0 && defender.Realm != 0 && attacker is GameKeepGuard == false)
            {
                return(false);
            }

            #region Keep Guards
            //guard vs guard / npc
            if (attacker is GameKeepGuard)
            {
                if (defender is GameKeepGuard)
                {
                    return(false);
                }

                if (defender is GameNPC && (defender as GameNPC).Brain is IControlledBrain == false)
                {
                    return(false);
                }
            }

            //player vs guard
            if (defender is GameKeepGuard && attacker is GamePlayer &&
                GameServer.KeepManager.IsEnemy(defender as GameKeepGuard, attacker as GamePlayer) == false)
            {
                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack a friendly NPC!");
                }
                return(false);
            }

            //guard vs player
            if (attacker is GameKeepGuard && defender is GamePlayer &&
                GameServer.KeepManager.IsEnemy(attacker as GameKeepGuard, defender as GamePlayer) == false)
            {
                return(false);
            }
            #endregion

            return(true);
        }
예제 #3
0
        public override bool IsAllowedToAttack(GameLiving attacker, GameLiving defender, bool quiet)
        {
            if (!base.IsAllowedToAttack(attacker, defender, quiet))
            {
                return(false);
            }

            // if controlled NPC - do checks for owner instead
            if (attacker is GameNPC)
            {
                IControlledBrain controlled = ((GameNPC)attacker).Brain as IControlledBrain;
                if (controlled != null)
                {
                    attacker = controlled.GetPlayerOwner();
                    quiet    = true;                  // silence all attacks by controlled npc
                }
            }
            if (defender is GameNPC)
            {
                IControlledBrain controlled = ((GameNPC)defender).Brain as IControlledBrain;
                if (controlled != null)
                {
                    defender = controlled.GetPlayerOwner();
                }
            }

            //"You can't attack yourself!"
            if (attacker == defender)
            {
                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack yourself!");
                }
                return(false);
            }

            // Pet release might cause one of these to be null
            if (attacker == null || defender == null)
            {
                return(false);
            }

            if (attacker.Realm != eRealm.None && defender.Realm != eRealm.None)
            {
                if (attacker is GamePlayer && ((GamePlayer)attacker).DuelTarget == defender)
                {
                    return(true);
                }
                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can not attack other players on this server!");
                }
                return(false);
            }

            //allow attacks on same realm only under the following circumstances
            if (attacker.Realm == defender.Realm)
            {
                //allow confused mobs to attack same realm
                if (attacker is GameNPC && (attacker as GameNPC).IsConfused)
                {
                    return(true);
                }

                // else, don't allow mobs to attack mobs
                if (attacker.Realm == eRealm.None)
                {
                    return(FactionMgr.CanLivingAttack(attacker, defender));
                }

                if (quiet == false)
                {
                    MessageToLiving(attacker, "You can't attack a member of your realm!");
                }
                return(false);
            }

            return(true);
        }