[share] Скрипт защиты от Pk
7 ответов237 просмотровСейчас просматривают: 1
· 16.07.2009, 20:01
Подборка новых мануалов.
Вот порылся на различных форумах + преклеил свои мозги и порылся в своих архивах.
В прошлых темах мы рассматривали шанс точки кристал скролами и делали осадные КХ обычными, сейчас же рассмотрим также очень простые функции.
0
· 16.07.2009, 20:08
ибо хайд кривой поставил, читайте внимательней...
Быть пользователем с именем Спасибо
Создавайте акк с ником Спасибо и читайте :D
0
· 16.07.2009, 20:32
Вот ппц) Терь не отредактить, сча сек, скину ;)
Раскрывающийся текст
Цитата
+#------------------------------------------------ ---------------
+ # Защита от PK
+#------------------------------------------------ ---------------
+ # Чтобы отключить, поставьте 0. Чтобы запустить защито до какого-то лвла (например до 15ого) поставьте 15ть.
+ DisableAttackIfLvlDifferenceOver = 0
+ #Если игрок находится в зоне где мобы выше перса на заданное число, то защита отключается
+ DisableProtectionIfInAreaLvlOver = 15
+ # Если игрок имеет больше, чем заданное число Pk в отчетный период,
+ # Он / она автоматически наказывается. Если установлено 0, эта функция отключена.
+ PunishPKPlayerIfPKsOver = 0
+ # За какой период (в секундах), Pk должны контролироваться
+ PKMonitorPeriod = 3600
+ # Punisment типа:
+ # jail - чар будет заключен в тюрьму
+ PKPunishmentType = jail
+ # Наказания продолжительность (в секундах)
+ # Если наказание типа jail, то срок наказания должен быть divisable
+ # 60 минут - значение 3600
+ PKPunishmentPeriod = 3600
Подключаем конфиги
Цитата
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java
+++ java/net/sf/l2j/Config.java (working copy)
@@ -562,6 +562,12 @@
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_DISABLE_PROTECTION_IF_IN_AREA_LVL_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 **/
@@ -1777,6 +1783,13 @@
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_DISABLE_PROTECTION_IF_IN_AREA_LVL_OVER = Integer.parseInt(L2JModSettings.getProperty("DisableProtectionIfInAreaLvlOver", "15"));
+ 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)
{
@@ -2327,6 +2340,14 @@
// 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("DisableProtectionIfInAreaLvlOver")) L2JMOD_DISABLE_PROTECTION_IF_IN_AREA_LVL_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/network/clientpackets/RequestActionUse.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestActionUse.java
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestActionUse.java (working copy)
@@ -31,6 +31,7 @@
import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2SiegeSummonInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2StaticObjectInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2SummonInstance;
@@ -172,6 +173,15 @@
activeChar.sendPacket(new SystemMessage(SystemMessageId.TARGET_IN_PEACEZONE));
return;
}
+
+ if (target instanceof L2PlayableInstance &&
+ activeChar.isPKProtected((L2PlayableInstance) target)) {
+ activeChar.sendMessage(
+ "You cannot attack player with too low level.");
+ sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) target).sendPKProtectedMessage(activeChar);
+ return;
+ }
if (target.isAutoAttackable(activeChar) || _ctrlPressed)
{
Цитата
Index: java/net/sf/l2j/gameserver/model/L2Summon.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Summon.java
+++ java/net/sf/l2j/gameserver/model/L2Summon.java (working copy)
@@ -862,6 +862,12 @@
// Send a Server->Client packet ActionFailed to the L2PcInstance
actingPlayer.sendPacket(ActionFailed.STATIC_PACKET);
+ } else if (getTarget() instanceof L2PlayableInstance &&
+ actingPlayer.isPKProtected((L2PlayableInstance) getTarget())) {
+ actingPlayer.sendMessage(
+ "You cannot attack player with too low level.");
+ actingPlayer.sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) getTarget()).sendPKProtectedMessage(actingPlayer);
} else {
int petLevel = getLevel();
int skillLevel = petLevel/10;
Цитата
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java (working copy)
@@ -24,6 +24,7 @@
import net.sf.l2j.gameserver.model.quest.QuestState;
import net.sf.l2j.gameserver.templates.chars.L2CharTemplate;
import net.sf.l2j.gameserver.templates.skills.L2EffectType;
+import net.sf.l2j.gameserver.util.StringUtil;
/**
* This class represents all Playable characters in the world.<BR><BR>
@@ -309,4 +310,23 @@
setCharmOfLuck(false);
updateAbnormalEffect();
}
+
+ /**
+ * Sends message to the PC related to this playable instance that
+ * he/she was protected against someones attack.
+ */
+ public void sendPKProtectedMessage(final L2PcInstance attacker) {
+ final L2PcInstance target;
+
+ if (this instanceof L2PcInstance) {
+ target = (L2PcInstance) this;
+ } else if (this instanceof L2Summon) {
+ target = ((L2Summon) this).getOwner();
+ } else {
+ return;
+ }
+
+ target.sendMessage(StringUtil.concat(
+ "You was protected against ", attacker.getName(), "'s attack"));
+ }
}
Цитата
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -305,10 +305,18 @@
@Override
public void doAttack(L2Character target)
{
+ if (target instanceof L2PlayableInstance &&
+ isPKProtected((L2PlayableInstance) target)) {
+ sendMessage(
+ "You cannot attack player with too low level.");
+ sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) target).sendPKProtectedMessage(getPlayer());
+ } else {
super.doAttack(target);
// cancel the recent fake-death protection instantly if the player attacks or casts spells
getPlayer().setRecentFakeDeath(false);
+ }
}
@Override
@@ -758,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
{
@@ -5341,6 +5352,32 @@
// Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
sendPacket(new UserInfo(this));
+
+ /** Масс Пк защита **/
+ 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;
+ }
+ }
+
+ _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)
@@ -8044,6 +8081,16 @@
break;
}
+ if (target != this && target instanceof L2PlayableInstance &&
+ skill.isOffensive() &&
+ isPKProtected((L2PlayableInstance) target)) {
+ setIsCastingNow(false);
+ sendMessage("You cannot attack player with too low level.");
+ sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) target).sendPKProtectedMessage(this);
+ return;
+ }
+
// Notify the AI with AI_INTENTION_CAST and target
getAI().setIntention(CtrlIntention.AI_INTENTION_CAST, skill, target);
}
@@ -8580,6 +8627,92 @@
return true;
}
+ public boolean isPKProtected(final L2PlayableInstance target) {
+ if (getAccessLevel().allowPeaceAttack()) {
+ return false;
+ }
+
+ if (Config.L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER > 0) {
+ final L2PcInstance targetPlayer;
+
+ if (target instanceof L2PcInstance) {
+ targetPlayer = (L2PcInstance) target;
+ } else if (target instanceof L2Summon) {
+ targetPlayer = ((L2Summon) target).getOwner();
+ } else {
+ return false;
+ }
+
+ if (targetPlayer.isInsideZone(L2Character.ZONE_SIEGE) ||
+ targetPlayer.isInsideZone(L2Character.ZONE_PVP) ||
+ (getClan() != null && targetPlayer.getClan() != null &&
+ targetPlayer.getClan().isAtWarWith(getClanId())) ||
+ (targetPlayer.getParty() != null &&
+ targetPlayer.getParty().isAtWarWith(getClanId()) &&
+ !targetPlayer.getProtectionBlessing())) {
+ return false;
+ }
+
+ if (targetPlayer.getPvpFlag() == 0 &&
+ targetPlayer.getKarma() == 0) {
+ if (targetPlayer.getProtectionBlessing() &&
+ targetPlayer.getLevel() + 10 < getLevel()) {
+ return true;
+ }
+
+ if ((targetPlayer.getParty() == null ?
+ targetPlayer.getLevel() :
+ targetPlayer.getParty().getLevel()) +
+ Config.L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER <
+ getLevel()) {
+ final Integer monsterLevel =
+ targetPlayer.getKnownListMonsterLevel();
+
+ return monsterLevel == null || monsterLevel.intValue() -
+ targetPlayer.getLevel() <=
+ Config.L2JMOD_DISABLE_PROTECTION_IF_IN_AREA_LVL_OVER;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private Integer getKnownListMonsterLevel() {
+ int sum = 0;
+ int count = 0;
+
+ for (final L2Character character :
+ getKnownList().getKnownCharacters()) {
+ if (character instanceof L2MonsterInstance) {
+ sum += character.getLevel();
+ count++;
+ }
+ }
+
+ return count == 0 ? null : sum / count;
+ }
+
/**
* Return True if the L2PcInstance is a Mage.<BR><BR>
*/
Цитата
Index: java/net/sf/l2j/gameserver/model/L2Party.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Party.java
+++ java/net/sf/l2j/gameserver/model/L2Party.java (working copy)
@@ -808,4 +808,27 @@
{
return _members.getFirst();
}
+
+ / **
+ * Возвращает TRUE, если хотя бы один член партии находится в состоянии войны с заданными персами
+ * Клан.
+ *
+ * @ Param clanId идентификатор клана
+ *
+ * @ Вернуться верно, если, по крайней мере хоть один член партии находится в состоянии войны с кланом,
+ * Иначе ложной
+ * /
+ public boolean isAtWarWith(final int clanId) {
+ boolean result = false;
+
+ for (final L2PcInstance member : getPartyMembers()) {
+ if (member.getClan() != null &&
+ member.getClan().isAtWarWith(clanId)) {
+ result = true;
+ break;
+ }
+ }
+
+ return result;
+ }
}
+#------------------------------------------------ ---------------
+ # Защита от PK
+#------------------------------------------------ ---------------
+ # Чтобы отключить, поставьте 0. Чтобы запустить защито до какого-то лвла (например до 15ого) поставьте 15ть.
+ DisableAttackIfLvlDifferenceOver = 0
+ #Если игрок находится в зоне где мобы выше перса на заданное число, то защита отключается
+ DisableProtectionIfInAreaLvlOver = 15
+ # Если игрок имеет больше, чем заданное число Pk в отчетный период,
+ # Он / она автоматически наказывается. Если установлено 0, эта функция отключена.
+ PunishPKPlayerIfPKsOver = 0
+ # За какой период (в секундах), Pk должны контролироваться
+ PKMonitorPeriod = 3600
+ # Punisment типа:
+ # jail - чар будет заключен в тюрьму
+ PKPunishmentType = jail
+ # Наказания продолжительность (в секундах)
+ # Если наказание типа jail, то срок наказания должен быть divisable
+ # 60 минут - значение 3600
+ PKPunishmentPeriod = 3600
Подключаем конфиги
Цитата
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java
+++ java/net/sf/l2j/Config.java (working copy)
@@ -562,6 +562,12 @@
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_DISABLE_PROTECTION_IF_IN_AREA_LVL_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 **/
@@ -1777,6 +1783,13 @@
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_DISABLE_PROTECTION_IF_IN_AREA_LVL_OVER = Integer.parseInt(L2JModSettings.getProperty("DisableProtectionIfInAreaLvlOver", "15"));
+ 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)
{
@@ -2327,6 +2340,14 @@
// 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("DisableProtectionIfInAreaLvlOver")) L2JMOD_DISABLE_PROTECTION_IF_IN_AREA_LVL_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/network/clientpackets/RequestActionUse.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestActionUse.java
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestActionUse.java (working copy)
@@ -31,6 +31,7 @@
import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2SiegeSummonInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2StaticObjectInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2SummonInstance;
@@ -172,6 +173,15 @@
activeChar.sendPacket(new SystemMessage(SystemMessageId.TARGET_IN_PEACEZONE));
return;
}
+
+ if (target instanceof L2PlayableInstance &&
+ activeChar.isPKProtected((L2PlayableInstance) target)) {
+ activeChar.sendMessage(
+ "You cannot attack player with too low level.");
+ sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) target).sendPKProtectedMessage(activeChar);
+ return;
+ }
if (target.isAutoAttackable(activeChar) || _ctrlPressed)
{
Цитата
Index: java/net/sf/l2j/gameserver/model/L2Summon.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Summon.java
+++ java/net/sf/l2j/gameserver/model/L2Summon.java (working copy)
@@ -862,6 +862,12 @@
// Send a Server->Client packet ActionFailed to the L2PcInstance
actingPlayer.sendPacket(ActionFailed.STATIC_PACKET);
+ } else if (getTarget() instanceof L2PlayableInstance &&
+ actingPlayer.isPKProtected((L2PlayableInstance) getTarget())) {
+ actingPlayer.sendMessage(
+ "You cannot attack player with too low level.");
+ actingPlayer.sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) getTarget()).sendPKProtectedMessage(actingPlayer);
} else {
int petLevel = getLevel();
int skillLevel = petLevel/10;
Цитата
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java (working copy)
@@ -24,6 +24,7 @@
import net.sf.l2j.gameserver.model.quest.QuestState;
import net.sf.l2j.gameserver.templates.chars.L2CharTemplate;
import net.sf.l2j.gameserver.templates.skills.L2EffectType;
+import net.sf.l2j.gameserver.util.StringUtil;
/**
* This class represents all Playable characters in the world.<BR><BR>
@@ -309,4 +310,23 @@
setCharmOfLuck(false);
updateAbnormalEffect();
}
+
+ /**
+ * Sends message to the PC related to this playable instance that
+ * he/she was protected against someones attack.
+ */
+ public void sendPKProtectedMessage(final L2PcInstance attacker) {
+ final L2PcInstance target;
+
+ if (this instanceof L2PcInstance) {
+ target = (L2PcInstance) this;
+ } else if (this instanceof L2Summon) {
+ target = ((L2Summon) this).getOwner();
+ } else {
+ return;
+ }
+
+ target.sendMessage(StringUtil.concat(
+ "You was protected against ", attacker.getName(), "'s attack"));
+ }
}
Цитата
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -305,10 +305,18 @@
@Override
public void doAttack(L2Character target)
{
+ if (target instanceof L2PlayableInstance &&
+ isPKProtected((L2PlayableInstance) target)) {
+ sendMessage(
+ "You cannot attack player with too low level.");
+ sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) target).sendPKProtectedMessage(getPlayer());
+ } else {
super.doAttack(target);
// cancel the recent fake-death protection instantly if the player attacks or casts spells
getPlayer().setRecentFakeDeath(false);
+ }
}
@Override
@@ -758,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
{
@@ -5341,6 +5352,32 @@
// Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
sendPacket(new UserInfo(this));
+
+ /** Масс Пк защита **/
+ 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;
+ }
+ }
+
+ _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)
@@ -8044,6 +8081,16 @@
break;
}
+ if (target != this && target instanceof L2PlayableInstance &&
+ skill.isOffensive() &&
+ isPKProtected((L2PlayableInstance) target)) {
+ setIsCastingNow(false);
+ sendMessage("You cannot attack player with too low level.");
+ sendPacket(ActionFailed.STATIC_PACKET);
+ ((L2PlayableInstance) target).sendPKProtectedMessage(this);
+ return;
+ }
+
// Notify the AI with AI_INTENTION_CAST and target
getAI().setIntention(CtrlIntention.AI_INTENTION_CAST, skill, target);
}
@@ -8580,6 +8627,92 @@
return true;
}
+ public boolean isPKProtected(final L2PlayableInstance target) {
+ if (getAccessLevel().allowPeaceAttack()) {
+ return false;
+ }
+
+ if (Config.L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER > 0) {
+ final L2PcInstance targetPlayer;
+
+ if (target instanceof L2PcInstance) {
+ targetPlayer = (L2PcInstance) target;
+ } else if (target instanceof L2Summon) {
+ targetPlayer = ((L2Summon) target).getOwner();
+ } else {
+ return false;
+ }
+
+ if (targetPlayer.isInsideZone(L2Character.ZONE_SIEGE) ||
+ targetPlayer.isInsideZone(L2Character.ZONE_PVP) ||
+ (getClan() != null && targetPlayer.getClan() != null &&
+ targetPlayer.getClan().isAtWarWith(getClanId())) ||
+ (targetPlayer.getParty() != null &&
+ targetPlayer.getParty().isAtWarWith(getClanId()) &&
+ !targetPlayer.getProtectionBlessing())) {
+ return false;
+ }
+
+ if (targetPlayer.getPvpFlag() == 0 &&
+ targetPlayer.getKarma() == 0) {
+ if (targetPlayer.getProtectionBlessing() &&
+ targetPlayer.getLevel() + 10 < getLevel()) {
+ return true;
+ }
+
+ if ((targetPlayer.getParty() == null ?
+ targetPlayer.getLevel() :
+ targetPlayer.getParty().getLevel()) +
+ Config.L2JMOD_DISABLE_ATTACK_IF_LVL_DIFFERENCE_OVER <
+ getLevel()) {
+ final Integer monsterLevel =
+ targetPlayer.getKnownListMonsterLevel();
+
+ return monsterLevel == null || monsterLevel.intValue() -
+ targetPlayer.getLevel() <=
+ Config.L2JMOD_DISABLE_PROTECTION_IF_IN_AREA_LVL_OVER;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private Integer getKnownListMonsterLevel() {
+ int sum = 0;
+ int count = 0;
+
+ for (final L2Character character :
+ getKnownList().getKnownCharacters()) {
+ if (character instanceof L2MonsterInstance) {
+ sum += character.getLevel();
+ count++;
+ }
+ }
+
+ return count == 0 ? null : sum / count;
+ }
+
/**
* Return True if the L2PcInstance is a Mage.<BR><BR>
*/
Цитата
Index: java/net/sf/l2j/gameserver/model/L2Party.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Party.java
+++ java/net/sf/l2j/gameserver/model/L2Party.java (working copy)
@@ -808,4 +808,27 @@
{
return _members.getFirst();
}
+
+ / **
+ * Возвращает TRUE, если хотя бы один член партии находится в состоянии войны с заданными персами
+ * Клан.
+ *
+ * @ Param clanId идентификатор клана
+ *
+ * @ Вернуться верно, если, по крайней мере хоть один член партии находится в состоянии войны с кланом,
+ * Иначе ложной
+ * /
+ public boolean isAtWarWith(final int clanId) {
+ boolean result = false;
+
+ for (final L2PcInstance member : getPartyMembers()) {
+ if (member.getClan() != null &&
+ member.getClan().isAtWarWith(clanId)) {
+ result = true;
+ break;
+ }
+ }
+
+ return result;
+ }
}
Вот ловите ;)
AbsT , будь добр, отредактируй 1й пост ;)
0
· 16.07.2009, 20:45
Сообщение № 4 я там сделал без всего, скиньте в Пм , как делать, чтоб за СПасибо, а не пользователя с именем "Спасибо" ;)
0
· 10.08.2009, 15:12
Vans(molodoys): Сообщение № 4 я там сделал без всего, скиньте в Пм , как делать, чтоб за СПасибо, а не пользователя с именем "Спасибо" ;)
для начала, не ленись пройтись по разделу "Новости".... ВОТ!
— Уважаемый
0
Тема закрыта для ответов




