Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Evento PkHunterEvent

Iniciado por Swarlog, Jul 15, 2025, 12:09 AM

Tema anterior - Siguiente tema

Swarlog

CitarCORE:

diff --git a/dist/game/config/L2JMods.properties b/dist/game/config/L2JMods.properties
index 6043a24..88f0e99 100644
--- a/dist/game/config/L2JMods.properties
+++ b/dist/game/config/L2JMods.properties
@@ -507,4 +507,29 @@
 
 # Enables .changepassword voiced command which allows the players to change their account's password ingame.
 # Default: False
-AllowChangePassword = False
\ No newline at end of file
+AllowChangePassword = False
+
+# ---------------------------------------------------------------------------
+# PkHunter - Event       
+# ---------------------------------------------------------------------------
+# Enable/Disable PkHunter Event, Default: True
+EnablePKHunterEvent = True
+
+# Chance to start the event when someone gets PK. The probability will be 1/20 if its default.
+# Default: 20
+PKHunterEventChance = 20
+
+# Reward for the player that kills the PK.
+# Example: PKHunterEventRewards = itemId,amount;itemId,amount;itemId,amount
+PKHunterEventRewards = 14720,5;14721,2
+
+# Reward for the PK if he survives.
+# Example: PKHunterEventRewards = itemId,amount;itemId,amount;itemId,amount
+PKHunterEventPkRewards = 14720,25;14721,10
+
+# Enable/Disable if the PK of the event will have chances to drop or not, Default: False
+PKHunterEventDrop = False
+
+# Time that will take the event to end if noone kills the PK. In minutes.
+# Default: 5
+PKHunterEventTime = 5
\ No newline at end of file
diff --git a/src/main/java/com/l2jserver/Config.java b/src/main/java/com/l2jserver/Config.java
index 9e67519..d5636f8 100644
--- a/src/main/java/com/l2jserver/Config.java
+++ b/src/main/java/com/l2jserver/Config.java
@@ -775,6 +775,12 @@
 	public static int L2JMOD_DUALBOX_CHECK_MAX_L2EVENT_PARTICIPANTS_PER_IP;
 	public static Map<Integer, Integer> L2JMOD_DUALBOX_CHECK_WHITELIST;
 	public static boolean L2JMOD_ALLOW_CHANGE_PASSWORD;
+	public static boolean ENABLE_PKHUNTEREVENT;
+	public static boolean DROP_PKHUNTEREVENT;
+	public static int PKHUNTEREVENT_CHANCE;
+	public static int TIME_PKHUNTEREVENT;
+	public static List<int[]> PKHUNTEREVENT_REWARD;
+	public static List<int[]> PKHUNTEREVENT_PK_REWARD;
 	// --------------------------------------------------
 	// NPC Settings
 	// --------------------------------------------------
@@ -2005,7 +2011,7 @@
 			RAID_MIN_RESPAWN_MULTIPLIER = NPC.getFloat("RaidMinRespawnMultiplier", 1.0f);
 			RAID_MAX_RESPAWN_MULTIPLIER = NPC.getFloat("RaidMaxRespawnMultiplier", 1.0f);
 			RAID_MINION_RESPAWN_TIMER = NPC.getInt("RaidMinionRespawnTime", 300000);
-			final String[] propertySplit = NPC.getString("CustomMinionsRespawnTime", "").split(";");
+			String[] propertySplit = NPC.getString("CustomMinionsRespawnTime", "").split(";");
 			MINIONS_RESPAWN_TIME = new HashMap<>(propertySplit.length);
 			for (String prop : propertySplit)
 			{
@@ -2509,7 +2515,73 @@
 				}
 			}
 			L2JMOD_ALLOW_CHANGE_PASSWORD = L2JModSettings.getBoolean("AllowChangePassword", false);
+			ENABLE_PKHUNTEREVENT = L2JModSettings.getBoolean("EnablePKHunterEvent", true);
+			DROP_PKHUNTEREVENT = L2JModSettings.getBoolean("PKHunterEventDrop", false);
+			PKHUNTEREVENT_CHANCE = L2JModSettings.getInt("PKHunterEventChance", 20);
+			TIME_PKHUNTEREVENT = L2JModSettings.getInt("PKHunterEventTime", 5);
 			
+			if (PKHUNTEREVENT_CHANCE < 1)
+			{
+				PKHUNTEREVENT_CHANCE = 1;
+			}
+			PKHUNTEREVENT_REWARD = new ArrayList<>();
+			propertySplit = L2JModSettings.getString("PKHunterEventRewards", "14720,5;14721,2").split(";");
+			
+			for (String reward : propertySplit)
+			{
+				String[] rewardSplit = reward.split(",");
+				if (rewardSplit.length != 2)
+				{
+					_log.warn(StringUtil.concat("PkHunterEvent: invalid config property ->PkHunterEventRewards \"", reward, "\""));
+				}
+				else
+				{
+					try
+					{
+						PKHUNTEREVENT_REWARD.add(new int[]
+						{
+							Integer.parseInt(rewardSplit[0]),
+							Integer.parseInt(rewardSplit[1])
+						});
+					}
+					catch (NumberFormatException nfe)
+					{
+						if (!reward.isEmpty())
+						{
+							_log.warn(StringUtil.concat("PkHunterEvent: invalid config property -> PkHunterEventRewards \"", reward, "\""));
+						}
+					}
+				}
+			}
+			PKHUNTEREVENT_PK_REWARD = new ArrayList<>();
+			propertySplit = L2JModSettings.getString("PKHunterEventPkRewards", "14720,5;14721,2").split(";");
+			
+			for (String reward : propertySplit)
+			{
+				String[] rewardSplit = reward.split(",");
+				if (rewardSplit.length != 2)
+				{
+					_log.warn(StringUtil.concat("PkHunterEvent: invalid config property ->PkHunterEventPkRewards \"", reward, "\""));
+				}
+				else
+				{
+					try
+					{
+						PKHUNTEREVENT_PK_REWARD.add(new int[]
+						{
+							Integer.parseInt(rewardSplit[0]),
+							Integer.parseInt(rewardSplit[1])
+						});
+					}
+					catch (NumberFormatException nfe)
+					{
+						if (!reward.isEmpty())
+						{
+							_log.warn(StringUtil.concat("PkHunterEvent: invalid config property -> PkHunterEventPkRewards \"", reward, "\""));
+						}
+					}
+				}
+			}
 			// Load PvP L2Properties file (if exists)
 			final PropertiesParser PVPSettings = new PropertiesParser(PVP_CONFIG_FILE);
 			
diff --git a/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
index 555d525..f130f8f 100644
--- a/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
+++ b/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
@@ -194,6 +194,8 @@
 import com.l2jserver.gameserver.model.entity.Hero;
 import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.entity.L2Event;
+import com.l2jserver.gameserver.model.entity.PkHunterEvent;
+import com.l2jserver.gameserver.model.entity.PkHunterEventConditions;
 import com.l2jserver.gameserver.model.entity.Siege;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.events.EventDispatcher;
@@ -5129,6 +5131,7 @@
 				EventDispatcher.getInstance().notifyEventAsync(new OnPlayerPvPKill(pk, this), this);
 				
 				TvTEvent.onKill(killer, this);
+				PkHunterEventConditions.checkDie(killer, this);
 				
 				if (L2Event.isParticipant(pk))
 				{
@@ -5266,6 +5269,11 @@
 		if ((getKarma() <= 0) && (pk != null) && (pk.getClan() != null) && (getClan() != null) && (pk.getClan().isAtWarWith(getClanId())
 		// || getClan().isAtWarWith(((L2PcInstance)killer).getClanId())
 		))
+		{
+			return;
+		}
+		
+		if (PkHunterEvent.isPk(killer) && !Config.DROP_PKHUNTEREVENT)
 		{
 			return;
 		}
@@ -5466,6 +5474,7 @@
 			setPkKills(getPkKills() + 1);
 		}
 		
+		PkHunterEventConditions.checkPk(this, target);
 		// Update player's UI.
 		sendPacket(new UserInfo(this));
 		sendPacket(new ExBrExtraUserInfo(this));
diff --git a/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEvent.java b/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEvent.java
new file mode 100644
index 0000000..63bf8c7
--- /dev/null
+++ b/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEvent.java
@@ -0,0 +1,175 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.entity;
+
+import com.l2jserver.gameserver.model.L2World;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.util.Util;
+
+/**
+ * @author Wyatt
+ */
+
+public class PkHunterEvent
+{
+	private static boolean isActive = false;
+	private static L2PcInstance Pk = null;
+	private static int[] PkLocation =
+	{
+		0,
+		0,
+		0
+	};
+	
+	public static boolean isActive()
+	{
+		return isActive;
+	}
+	
+	public static L2PcInstance getPk()
+	{
+		return Pk;
+	}
+	
+	public static void setPk(L2PcInstance player)
+	{
+		Pk = player;
+	}
+	
+	public static void setActive(Boolean active)
+	{
+		isActive = active;
+	}
+	
+	public static void setPkLocation(int x, int y, int z)
+	{
+		PkLocation[0] = x;
+		PkLocation[1] = y;
+		PkLocation[2] = z;
+	}
+	
+	public static int[] getPkLocation()
+	{
+		return PkLocation;
+	}
+	
+	public static boolean isPk(L2Character pk)
+	{
+		if ((pk != null) && (getPk() != null) && pk.getName().equals(getPk().getName()))
+		{
+			return true;
+		}
+		return false;
+	}
+	
+	public static boolean isPkOnline()
+	{
+		if ((getPk() != null) && getPk().isOnline())
+		{
+			return true;
+		}
+		return false;
+	}
+	
+	public static void sendLocationMessage(L2PcInstance activeChar)
+	{
+		if (isPkOnline())
+		{
+			L2PcInstance target = L2World.getInstance().getPlayer(PkHunterEvent.getPk().getName());
+			double angle = activeChar.getHeading() / 182.044444444;
+			double angle2 = Util.calculateAngleFrom(activeChar, target);
+			String location = "";
+			String distance = "";
+			double finalAngle = angle - angle2;
+			
+			if (finalAngle < 0)
+			{
+				finalAngle += 360;
+			}
+			
+			double octamore = 22.5;
+			
+			if ((finalAngle >= (octamore * 15)) && (finalAngle < (octamore * 17)))
+			{
+				location = " infront of you";
+			}
+			else if ((finalAngle >= (octamore * 1)) && (finalAngle < (octamore * 3)))
+			{
+				location = " infront of you, on your left";
+			}
+			else if ((finalAngle >= (octamore * 3)) && (finalAngle < (octamore * 5)))
+			{
+				location = " on your left";
+			}
+			else if ((finalAngle >= (octamore * 5)) && (finalAngle < (octamore * 7)))
+			{
+				location = " behind you, on your left";
+			}
+			else if ((finalAngle >= (octamore * 7)) && (finalAngle < (octamore * 9)))
+			{
+				location = " behind you";
+			}
+			else if ((finalAngle >= (octamore * 9)) && (finalAngle < (octamore * 11)))
+			{
+				location = " behind you, on your right";
+			}
+			else if ((finalAngle >= (octamore * 11)) && (finalAngle < (octamore * 13)))
+			{
+				location = " on your right";
+			}
+			else if ((finalAngle >= (octamore * 13)) && (finalAngle < (octamore * 15)))
+			{
+				location = " infront of you, on your right";
+			}
+			else
+			{
+				location = " infront of you";
+			}
+			
+			double dist = Util.calculateDistance(activeChar, target, false, true);
+			
+			if (dist < 400)
+			{
+				distance = ", very close";
+			}
+			else if (dist < 1000)
+			{
+				distance = ", close";
+			}
+			else if (dist < 4000)
+			{
+				distance = ", at medium range";
+			}
+			else if (dist < 12000)
+			{
+				distance = ", quite some distance away";
+			}
+			else if (dist < 20000)
+			{
+				distance = ", far away";
+			}
+			else
+			{
+				distance = ", very very far away";
+			}
+			activeChar.sendMessage(target.getName() + " is" + location + " " + distance + ".");
+		}
+		else
+		{
+			activeChar.sendMessage("The PK is Offline now.");
+		}
+	}
+}
diff --git a/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEventConditions.java b/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEventConditions.java
new file mode 100644
index 0000000..dd1f243
--- /dev/null
+++ b/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEventConditions.java
@@ -0,0 +1,190 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.entity;
+
+import java.util.concurrent.ScheduledFuture;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.enums.Team;
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.util.Broadcast;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author Wyatt
+ */
+public class PkHunterEventConditions
+{
+	private static ScheduledFuture<?> _timerTask;
+	
+	public static void checkFinishByMobs(L2PcInstance killer)
+	{
+		if (PkHunterEvent.isPk(killer) && Config.ENABLE_PKHUNTEREVENT)
+		{
+			if (killer.getKarma() == 0)
+			{
+				Broadcast.toAllOnlinePlayers("PkHunter Event ended. " + killer.getName() + " has survived.", true);
+				PkHunterEvent.setPk(null);
+				PkHunterEvent.setActive(false);
+				killer.setTeam(Team.NONE);
+				endTask();
+				rewardPk(killer);
+			}
+		}
+	}
+	
+	public static void checkDie(L2Object killer, final L2PcInstance killed)
+	{
+		if (PkHunterEvent.isPk(killed) && Config.ENABLE_PKHUNTEREVENT)
+		{
+			if (killer instanceof L2PcInstance)
+			{
+				L2PcInstance kr = ((L2PcInstance) killer);
+				SystemMessage systemMessage = null;
+				
+				for (int[] reward : Config.PKHUNTEREVENT_REWARD)
+				{
+					PcInventory inv = kr.getInventory();
+					
+					if (ItemTable.getInstance().getTemplate(reward[0]).isStackable())
+					{
+						inv.addItem("PKHunter Event", reward[0], reward[1], kr, kr);
+						
+						if (reward[1] > 1)
+						{
+							systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
+							systemMessage.addItemName(reward[0]);
+							systemMessage.addInt(reward[1]);
+						}
+						else
+						{
+							systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
+							systemMessage.addItemName(reward[0]);
+						}
+						kr.sendPacket(systemMessage);
+					}
+					else
+					{
+						for (int i = 0; i < reward[1]; ++i)
+						{
+							inv.addItem("PkHunter Event", reward[0], 1, kr, kr);
+							systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
+							systemMessage.addItemName(reward[0]);
+							kr.sendPacket(systemMessage);
+						}
+					}
+				}
+			}
+			Broadcast.toAllOnlinePlayers("Pk Hunting Event: Event ended. " + killer.getName() + " killed the Pk.", true);
+			killed.setTeam(Team.NONE);
+			PkHunterEvent.setActive(false);
+			PkHunterEvent.setPk(null);
+			endTask();
+			
+			ThreadPoolManager.getInstance().scheduleGeneral(() -> killed.setKarma(0), 100);
+		}
+	}
+	
+	public static void checkPk(L2PcInstance killer, L2Character target)
+	{
+		if (Config.ENABLE_PKHUNTEREVENT && !PkHunterEvent.isActive())
+		{
+			switch (Rnd.get(1, Config.PKHUNTEREVENT_CHANCE))
+			{
+				case 1:
+					killer.setKarma(900000);
+					killer.setTeam(Team.RED);
+					PkHunterEvent.setActive(true);
+					PkHunterEvent.setPk(killer);
+					PkHunterEvent.setPkLocation(killer.getX(), killer.getY(), killer.getZ());
+					startEvent();
+					break;
+			}
+		}
+	}
+	
+	public static void endCoward(L2PcInstance activeChar)
+	{
+		if (PkHunterEvent.isActive())
+		{
+			PkHunterEvent.setActive(false);
+			PkHunterEvent.setPk(null);
+			Broadcast.toAllOnlinePlayers("PkHunter Event ended.", true);
+			endTask();
+		}
+		activeChar.setKarma(10000);
+		activeChar.sendMessage("You karma updated to 10.000 due to be a coward, PkHunter Event ended.");
+	}
+	
+	public static void startEvent()
+	{
+		Broadcast.toAllOnlinePlayers("PkHunter Event started: " + PkHunterEvent.getPk().getName() + " is the PK, write .gopk to teleport where the pk was done. Write .pkinfo to know if you are far or near to him.", true);
+		_timerTask = ThreadPoolManager.getInstance().scheduleGeneral(new PkHunterEventTask(), Config.TIME_PKHUNTEREVENT * 60000);
+	}
+	
+	static void endTask()
+	{
+		if (_timerTask != null)
+		{
+			_timerTask.cancel(false);
+		}
+		_timerTask = null;
+	}
+	
+	public static void rewardPk(L2PcInstance kr)
+	{
+		SystemMessage systemMessage = null;
+		
+		for (int[] reward : Config.PKHUNTEREVENT_PK_REWARD)
+		{
+			PcInventory inv = kr.getInventory();
+			
+			if (ItemTable.getInstance().getTemplate(reward[0]).isStackable())
+			{
+				inv.addItem("PKHunter Event", reward[0], reward[1], kr, kr);
+				
+				if (reward[1] > 1)
+				{
+					systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
+					systemMessage.addItemName(reward[0]);
+					systemMessage.addInt(reward[1]);
+				}
+				else
+				{
+					systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
+					systemMessage.addItemName(reward[0]);
+				}
+				kr.sendPacket(systemMessage);
+			}
+			else
+			{
+				for (int i = 0; i < reward[1]; ++i)
+				{
+					inv.addItem("PkHunter Event", reward[0], 1, kr, kr);
+					systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
+					systemMessage.addItemName(reward[0]);
+					kr.sendPacket(systemMessage);
+				}
+			}
+		}
+	}
+}
diff --git a/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEventTask.java b/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEventTask.java
new file mode 100644
index 0000000..3fe1ada
--- /dev/null
+++ b/src/main/java/com/l2jserver/gameserver/model/entity/PkHunterEventTask.java
@@ -0,0 +1,40 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.entity;
+
+import com.l2jserver.gameserver.enums.Team;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.util.Broadcast;
+
+/**
+ * @author Wyatt
+ */
+public class PkHunterEventTask implements Runnable
+{
+	@Override
+	public void run()
+	{
+		if (PkHunterEvent.isPkOnline())
+		{
+			L2PcInstance kr = PkHunterEvent.getPk();
+			kr.setKarma(0);
+			kr.setTeam(Team.NONE);
+			PkHunterEventConditions.rewardPk(kr);
+		}
+		Broadcast.toAllOnlinePlayers("PkHunter Event ended. " + PkHunterEvent.getPk().getName() + " has survived.", true);
+		PkHunterEvent.setActive(false);
+		PkHunterEvent.setPk(null);
+	}
+}
diff --git a/src/main/java/com/l2jserver/gameserver/model/olympiad/OlympiadManager.java b/src/main/java/com/l2jserver/gameserver/model/olympiad/OlympiadManager.java
index 06deacb..5c25cad 100644
--- a/src/main/java/com/l2jserver/gameserver/model/olympiad/OlympiadManager.java
+++ b/src/main/java/com/l2jserver/gameserver/model/olympiad/OlympiadManager.java
@@ -31,6 +31,7 @@
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.PkHunterEvent;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -235,6 +236,12 @@
 			return false;
 		}
 		
+		if (PkHunterEvent.isPk(player))
+		{
+			player.sendMessage("You can't participate in Olympiads while in event.");
+			return false;
+		}
+		
 		switch (type)
 		{
 			case CLASSED:
diff --git a/src/main/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java b/src/main/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
index 08af29e..e3e05d0 100644
--- a/src/main/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
+++ b/src/main/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
@@ -51,6 +51,7 @@
 import com.l2jserver.gameserver.model.entity.Fort;
 import com.l2jserver.gameserver.model.entity.FortSiege;
 import com.l2jserver.gameserver.model.entity.L2Event;
+import com.l2jserver.gameserver.model.entity.PkHunterEventConditions;
 import com.l2jserver.gameserver.model.entity.Siege;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.entity.clanhall.AuctionableHall;
@@ -207,6 +208,13 @@
 				SkillTreesData.getInstance().addSkills(activeChar, true);
 			}
 		}
+		else
+		{
+			if ((activeChar.getKarma() >= 500000) && !activeChar.isCursedWeaponEquipped() && Config.ENABLE_PKHUNTEREVENT)
+			{
+				PkHunterEventConditions.endCoward(activeChar);
+			}
+		}
 		
 		// Set dead status if applies
 		if (activeChar.getCurrentHp() < 0.5)
diff --git a/src/main/java/com/l2jserver/gameserver/network/clientpackets/Logout.java b/src/main/java/com/l2jserver/gameserver/network/clientpackets/Logout.java
index 460d77c..e1c72ca 100644
--- a/src/main/java/com/l2jserver/gameserver/network/clientpackets/Logout.java
+++ b/src/main/java/com/l2jserver/gameserver/network/clientpackets/Logout.java
@@ -26,6 +26,7 @@
 import com.l2jserver.gameserver.SevenSignsFestival;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.L2Event;
+import com.l2jserver.gameserver.model.entity.PkHunterEvent;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -43,7 +44,7 @@
 	@Override
 	protected void readImpl()
 	{
-		
+	
 	}
 	
 	@Override
@@ -65,6 +66,13 @@
 			return;
 		}
 		
+		if (PkHunterEvent.isPk(player))
+		{
+			player.sendPacket(ActionFailed.STATIC_PACKET);
+			player.sendMessage("You can't logout while in event.");
+			return;
+		}
+		
 		if (player.isLocked())
 		{
 			_log.warning("Player " + player.getName() + " tried to logout during class change.");
diff --git a/src/main/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java b/src/main/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java
index 7ea3781..9070674 100644
--- a/src/main/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java
+++ b/src/main/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java
@@ -28,9 +28,11 @@
 import com.l2jserver.gameserver.instancemanager.AntiFeedManager;
 import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.PkHunterEvent;
 import com.l2jserver.gameserver.network.L2GameClient;
 import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
 import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.CharSelectionInfo;
 import com.l2jserver.gameserver.network.serverpackets.RestartResponse;
 import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
@@ -66,6 +68,13 @@
 			return;
 		}
 		
+		if (PkHunterEvent.isPk(player))
+		{
+			player.sendPacket(ActionFailed.STATIC_PACKET);
+			sendPacket(RestartResponse.valueOf(false));
+			return;
+		}
+		
 		if (player.isLocked())
 		{
 			_log.warning("Player " + player.getName() + " tried to restart during class change.");

CitarDATA:

diff --git a/dist/game/data/scripts/handlers/effecthandlers/Escape.java b/dist/game/data/scripts/handlers/effecthandlers/Escape.java
index d692606..8f0215f 100644
--- a/dist/game/data/scripts/handlers/effecthandlers/Escape.java
+++ b/dist/game/data/scripts/handlers/effecthandlers/Escape.java
@@ -24,6 +24,7 @@
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.entity.PkHunterEvent;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
@@ -61,6 +62,12 @@
 			return;
 		}
 		
+		if (PkHunterEvent.isPk(info.getEffected()))
+		{
+			info.getEffected().sendMessage("You can't use escape skills while in event.");
+			return;
+		}
+		
 		info.getEffected().teleToLocation(MapRegionManager.getInstance().getTeleToLocation(info.getEffected(), _escapeType), true);
 		info.getEffected().getActingPlayer().setIsIn7sDungeon(false);
 		info.getEffected().setInstanceId(0);

CitarOTHER:

Index: java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillMount.java
===================================================================
--- java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillMount.java   (revision 5822)
+++ java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillMount.java   (working copy)
@@ -18,6 +18,7 @@
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.PkHunterEvent;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -54,6 +55,12 @@
          return;
       }
       
+      if (PkHunterEvent.isPk(activePlayer))
+      {
+         activePlayer.sendMessage("You can't mount while in event.");
+         return;
+      }
+     
       // Dismount Action
       if (_npcId == 0)
       {
Index: java/com/l2jserver/gameserver/model/actor/L2Attackable.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/L2Attackable.java   (revision 5822)
+++ java/com/l2jserver/gameserver/model/actor/L2Attackable.java   (working copy)
@@ -52,6 +52,7 @@
 import com.l2jserver.gameserver.model.actor.knownlist.AttackableKnownList;
 import com.l2jserver.gameserver.model.actor.status.AttackableStatus;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
+import com.l2jserver.gameserver.model.entity.PkHunterEventConditions;
 import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
@@ -540,6 +541,8 @@
         
          if (player != null)
          {
+            PkHunterEventConditions.checkFinishByMobs(player);
+           
             if (getTemplate().getEventQuests(Quest.QuestEventType.ON_KILL) != null)
             {
                for (Quest quest : getTemplate().getEventQuests(Quest.QuestEventType.ON_KILL))