Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Pk Protector - Level Low

Iniciado por Swarlog, Ago 19, 2022, 01:01 AM

Tema anterior - Siguiente tema

Swarlog

Index: java/config/l2jmods.properties
===================================================================
--- java/config/l2jmods.properties (revision 2814)
+++ java/config/l2jmods.properties (working copy)
@@ -170,4 +170,25 @@
 # - mana potion (item id 728), using skill id 2005
 # Please, notice this is just core support, server administrator is requested to
 # edit skill 2005 on DataPack to get them working
-EnableManaPotionSupport = False
\ No newline at end of file
+EnableManaPotionSupport = False
+
+#---------------------------------------------------------------
+# PK protection
+#---------------------------------------------------------------
+# Disables attacking char if the attacker's lvl minus victim's lvl is over
+# specified difference and the target is not flagged. For example, if you want
+# to disable PK'ing chars that are more than 20 lvls below attacker's lvl, set
+# the value to 20. Setting the value to 0 disables the feature.
+DisableAttackIfLvlDifferenceOver=0
+# If player has more than specified number of PKs in the monitored period,
+# he/she is automatically punished. If set to zero, this feature is disabled.
+PunishPKPlayerIfPKsOver=0
+# For what period (in seconds) the PKs should be monitored
+PKMonitorPeriod=3600
+# Punisment type:
+#   jail - char will be jailed
+PKPunishmentType=jail
+# Punishment length (in seconds)
+# If punishment type is jail then the punishment period should be divisable by
+# 60 as jail punishment is counted in minutes
+PKPunishmentPeriod=3600
\ No newline at end of file
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java (revision 2814)
+++ java/net/sf/l2j/Config.java (working copy)
@@ -561,6 +561,11 @@
     public static boolean L2JMOD_ENABLE_WAREHOUSESORTING_PRIVATE;
     public static boolean L2JMOD_ENABLE_WAREHOUSESORTING_FREIGHT;
     public static boolean L2JMOD_ENABLE_MANA_POTIONS_SUPPORT;
+    public static int           L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER;
+    public static int           L2JMOD_PUNISH_PK_PLAYER_IF_PKS_OVER;
+    public static long          L2JMOD_PK_MONITOR_PERIOD;
+    public static String        L2JMOD_PK_PUNISHMENT_TYPE;
+    public static long          L2JMOD_PK_PUNISHMENT_PERIOD;
     
     /** ************************************************** **/
  /** L2JMods Settings -End                              **/
@@ -1768,6 +1773,12 @@
                  L2JMOD_ENABLE_WAREHOUSESORTING_CLAN     = Boolean.valueOf(L2JModSettings.getProperty("EnableWarehouseSortingClan", "False"));
                  L2JMOD_ENABLE_WAREHOUSESORTING_PRIVATE  = Boolean.valueOf(L2JModSettings.getProperty("EnableWarehouseSortingPrivate", "False"));
                  L2JMOD_ENABLE_WAREHOUSESORTING_FREIGHT  = Boolean.valueOf(L2JModSettings.getProperty("EnableWarehouseSortingFreight", "False"));
+
+                        L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER = Integer.parseInt(L2JModSettings.getProperty("DisableAttackIfLvlDifferenceOver", "0"));
+                        L2JMOD_PUNISH_PK_PLAYER_IF_PKS_OVER = Integer.parseInt(L2JModSettings.getProperty("PunishPKPlayerIfPKsOver", "0"));
+                        L2JMOD_PK_MONITOR_PERIOD = Long.parseLong(L2JModSettings.getProperty("PKMonitorPeriod", "3600"));
+                        L2JMOD_PK_PUNISHMENT_TYPE = L2JModSettings.getProperty("PKPunishmentType", "jail");
+                        L2JMOD_PK_PUNISHMENT_PERIOD = Long.parseLong(L2JModSettings.getProperty("PKPunishmentPeriod", "3600"));
 
                  if (TVT_EVENT_PARTICIPATION_NPC_ID == 0)
                  {
@@ -2310,6 +2321,13 @@
         // L2JMod Mana potion
         else if (pName.equalsIgnoreCase("EnableManaPotionSupport")) L2JMOD_ENABLE_MANA_POTIONS_SUPPORT = Boolean.parseBoolean(pValue);
 
+        // L2JMOD Disable PK'ing Low Lvls
+        else if (pName.equalsIgnoreCase("DisableAttackIfLvlDifferenceOver")) L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER = Integer.parseInt(pValue);
+        else if (pName.equalsIgnoreCase("PunishPKPlayerIfPKsOver")) L2JMOD_PUNISH_PK_PLAYER_IF_PKS_OVER = Integer.parseInt(pValue);
+        else if (pName.equalsIgnoreCase("PKMonitorPeriod")) L2JMOD_PK_MONITOR_PERIOD = Long.parseLong(pValue);
+        else if (pName.equalsIgnoreCase("PKPunishmentType")) L2JMOD_PK_PUNISHMENT_TYPE = pValue;
+        else if (pName.equalsIgnoreCase("PKPunishmentPeriod")) L2JMOD_PK_PUNISHMENT_PERIOD = Long.parseLong(pValue);
+
         // PvP settings
         else if (pName.equalsIgnoreCase("MinKarma")) KARMA_MIN_KARMA = Integer.parseInt(pValue);
         else if (pName.equalsIgnoreCase("MaxKarma")) KARMA_MAX_KARMA = Integer.parseInt(pValue);
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 2814)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -307,10 +307,16 @@
  @Override
  public void doAttack(L2Character target)
         {
+                    if (target instanceof L2PcInstance &&
+                            isPKProtected((L2PcInstance) target)) {
+                        sendMessage("You cannot attack player with too low level.");
+                        sendPacket(ActionFailed.STATIC_PACKET);
+                    } else {
  super.doAttack(target);
 
  // cancel the recent fake-death protection instantly if the player attacks or casts spells
  getPlayer().setRecentFakeDeath(false);
+                    }
  }
 
  @Override
@@ -760,6 +766,9 @@
  private boolean _marryrequest = false;
  private boolean _marryaccepted = false;
 
+        /** L2JMOD PK protection **/
+        private List<Long> _pKsCounter = new FastList<Long>();
+
     /** Skill casting information (used to queue when several skills are cast in a short time) **/
     public class SkillDat
     {
@@ -5334,6 +5343,32 @@
 
         // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
         sendPacket(new UserInfo(this));
+
+        /** Mass PK protection stuff **/
+        if (Config.L2JMOD_PUNISH_PK_PLAYER_IF_PKS_OVER > 0) {
+            // Remove expired PKs
+            for (final Long pKTime : _pKsCounter) {
+                if (System.currentTimeMillis() - pKTime.longValue() >
+                        Config.L2JMOD_PK_MONITOR_PERIOD * 1000) {
+                    _pKsCounter.remove(pKTime);
+                } else {
+                    // We reached timestamps that are still valid
+                    break;
+                }
+            }
+
+            // Add new timestamp
+            _pKsCounter.add(Long.valueOf(System.currentTimeMillis()));
+
+            // If PK count is greater than limit then punish the char
+            if (_pKsCounter.size() > Config.L2JMOD_PUNISH_PK_PLAYER_IF_PKS_OVER) {
+                if ("jail".equals(Config.L2JMOD_PK_PUNISHMENT_TYPE)) {
+                    setPunishLevel(PunishLevel.JAIL,
+                            (int) (Config.L2JMOD_PK_PUNISHMENT_PERIOD / 60));
+                    sendMessage("Jailed for excessive PK.");
+                }
+            }
+        }
     }
 
  public int calculateKarmaLost(long exp)
@@ -8042,6 +8077,14 @@
      break;
  }
 
+                if (target != this && target instanceof L2PcInstance &&
+                        skill.isOffensive() && isPKProtected((L2PcInstance) target)) {
+                    setIsCastingNow(false);
+                    sendMessage("You cannot attack player with too low level.");
+                    sendPacket(ActionFailed.STATIC_PACKET);
+                    return;
+                }
+
  // Notify the AI with AI_INTENTION_CAST and target
  getAI().setIntention(CtrlIntention.AI_INTENTION_CAST, skill, target);
     }
@@ -8578,6 +8621,43 @@
  return true;
  }
 
+        /**
+         * Checks whether <code>target</code> is PK protected when attacking
+         * by <code>this</code>. <code>target</code> is PK protected if it is
+         * not flagged, has no karma and difference between players lvl and
+         * target's lvl is above {@link
+         * net.sf.l2j.Config#L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER}.
+         * <code>target</code> is not protected if in mutual war with attacker's
+         * clan or if in siege zone or pvp zone.
+         *
+         * @param target attack target
+         *
+         * @return true if target is PK protected, otherwise false
+         */
+        public boolean isPKProtected(final L2PcInstance target) {
+            if (Config.L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER > 0 &&
+                    target instanceof L2PcInstance) {
+                final L2PcInstance targetPlayer = (L2PcInstance) target;
+
+                if (targetPlayer.isInsideZone(L2Character.ZONE_SIEGE) ||
+                        targetPlayer.isInsideZone(L2Character.ZONE_PVP) ||
+                        (getClan() != null && targetPlayer.getClan() != null &&
+                        targetPlayer.getClan().isAtWarWith(getClanId()))) {
+                    return false;
+                }
+
+                if (targetPlayer.getPvpFlag() == 0 &&
+                        targetPlayer.getKarma() == 0 &&
+                        targetPlayer.getLevel() +
+                        Config.L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER <
+                        getLevel()) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
  /**
  * Return True if the L2PcInstance is a Mage.<BR><BR>
  */

- target is not PK
- target is not flagged (chaotic state)
- target is not member of a clan that has mutual war with attacker's clan
- target is not in PVP or SIEGE zone