Noticias:

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

Menú Principal

Nevit's Advent Blessing

Iniciado por Swarlog, Ago 03, 2025, 12:29 AM

Tema anterior - Siguiente tema

Swarlog

Index: java/com/l2jserver/gameserver/model/zone/type/L2PeaceZone.java
===================================================================
--- java/com/l2jserver/gameserver/model/zone/type/L2PeaceZone.java	(revision 6515)
+++ java/com/l2jserver/gameserver/model/zone/type/L2PeaceZone.java	(working copy)
@@ -53,6 +53,9 @@
 			{
 				return;
 			}
+			
+			/* Nevit Turn Off on Peace Zone */
+			player.getNevitSystem().stopAdventTask(true);
 		}
 		
 		if (Config.PEACE_ZONE_MODE != 2)
Index: java/com/l2jserver/gameserver/model/entity/NevitSystem.java
===================================================================
--- java/com/l2jserver/gameserver/model/entity/NevitSystem.java	(revision 0)
+++ java/com/l2jserver/gameserver/model/entity/NevitSystem.java	(revision 0)
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server 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.
+ * 
+ * L2J Server 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.Calendar;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventEffect;
+import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventPointInfoPacket;
+import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventTimeChange;
+import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerDespawnListener;
+import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerSpawnListener;
+
+/**
+ * Nevit's Blessing handler.
+ * @author Janiko
+ */
+public class NevitSystem
+{
+	// Timers
+	private static final int MAX_POINTS = 7200;
+	private static final int BONUS_EFFECT_TIME = 180;
+	
+	// Nevit Hour
+	private static final int ADVENT_TIME = 14400;
+	public final L2PcInstance _player;
+	
+	ScheduledFuture<?> _adventTask;
+	private ScheduledFuture<?> _nevitEffectTask;
+	
+	public NevitSystem(L2PcInstance player)
+	{
+		_player = player;
+	}
+	
+	PlayerSpawnListener spawn = new PlayerSpawnListener()
+	{
+		@Override
+		public void onPlayerLogin(L2PcInstance player)
+		{
+			player.sendPacket(new ExNevitAdventPointInfoPacket(getAdventPoints()));
+			player.sendPacket(new ExNevitAdventTimeChange(getAdventTime(), true));
+			
+			Calendar temp = Calendar.getInstance();
+			temp.set(Calendar.HOUR_OF_DAY, 6);
+			temp.set(Calendar.MINUTE, 30);
+			temp.set(Calendar.SECOND, 0);
+			temp.set(Calendar.MILLISECOND, 0);
+			
+			// Reset Nevit's Blessing
+			if ((player.getLastAccess() < (temp.getTimeInMillis() / 1000L)) && (System.currentTimeMillis() > temp.getTimeInMillis()))
+			{
+				player.getVariables().set("hunting_time", 0);
+			}
+			
+			startNevitEffect(player.getVariables().getInt("nevit_b", 0));
+			
+			// Set percent
+			int percent = CalcPercent(player.getVariables().getInt("hunting_points", 0));
+			
+			if ((percent >= 45) && (percent < 50))
+			{
+				player.sendPacket(SystemMessageId.YOU_ARE_STARTING_TO_FEEL_THE_EFFECTS_OF_NEVITS_ADVENT_BLESSING);
+			}
+			else if ((percent >= 50) && (percent < 75))
+			{
+				player.sendPacket(SystemMessageId.YOU_ARE_FURTHER_INFUSED_WITH_THE_BLESSINGS_OF_NEVIT);
+			}
+			else if (percent >= 75)
+			{
+				player.sendPacket(SystemMessageId.NEVITS_ADVENT_BLESSING_SHINES_STRONGLY_FROM_ABOVE);
+			}
+		}
+	};
+	
+	PlayerDespawnListener despawn = new PlayerDespawnListener()
+	{
+		@Override
+		public void onPlayerLogout(L2PcInstance player)
+		{
+			stopNevitEffectTask(true);
+			stopAdventTask(false);
+		}
+	};
+	
+	public void addPoints(int val)
+	{
+		int percent = CalcPercent(getAdventPoints());
+		switch (percent)
+		{
+			case 45:
+			{
+				getPlayer().sendPacket(SystemMessageId.YOU_ARE_STARTING_TO_FEEL_THE_EFFECTS_OF_NEVITS_ADVENT_BLESSING);
+				break;
+			}
+			case 50:
+			{
+				getPlayer().sendPacket(SystemMessageId.YOU_ARE_FURTHER_INFUSED_WITH_THE_BLESSINGS_OF_NEVIT);
+				break;
+			}
+			case 75:
+			{
+				getPlayer().sendPacket(SystemMessageId.NEVITS_ADVENT_BLESSING_SHINES_STRONGLY_FROM_ABOVE);
+				break;
+			}
+		}
+		
+		if (getEffectTime() > 0)
+		{
+			setAdventPoints(0);
+		}
+		else
+		{
+			setAdventPoints(getAdventPoints() + val);
+		}
+		
+		if (getAdventPoints() > MAX_POINTS)
+		{
+			setAdventPoints(0);
+			startNevitEffect(BONUS_EFFECT_TIME);
+		}
+		
+		getPlayer().sendPacket(new ExNevitAdventPointInfoPacket(getAdventPoints()));
+	}
+	
+	public void startAdventTask()
+	{
+		if ((_adventTask == null) && (getAdventTime() < ADVENT_TIME))
+		{
+			_adventTask = ThreadPoolManager.getInstance().scheduleGeneral(new AdventTask(), 30000);
+			getPlayer().sendPacket(new ExNevitAdventTimeChange(getAdventTime(), false));
+		}
+	}
+	
+	public class AdventTask implements Runnable
+	{
+		@Override
+		public void run()
+		{
+			setAdventTime(getAdventTime() + 30);
+			if (getAdventTime() >= ADVENT_TIME)
+			{
+				setAdventTime(ADVENT_TIME);
+				stopAdventTask(true);
+			}
+			else
+			{
+				addPoints(72);
+				if ((getAdventTime() % 60) == 0)
+				{
+					getPlayer().sendPacket(new ExNevitAdventTimeChange(getAdventTime(), false));
+				}
+			}
+			stopAdventTask(false);
+		}
+	}
+	
+	public void stopAdventTask(boolean sendPacket)
+	{
+		if (_adventTask != null)
+		{
+			_adventTask.cancel(true);
+			_adventTask = null;
+		}
+		if (sendPacket)
+		{
+			getPlayer().sendPacket(new ExNevitAdventTimeChange(getAdventTime(), true));
+		}
+	}
+	
+	public void startNevitEffect(int time)
+	{
+		if (getEffectTime() > 0)
+		{
+			stopNevitEffectTask(false);
+			time += getEffectTime();
+		}
+		if ((getAdventTime() < ADVENT_TIME) && (time > 0))
+		{
+			getPlayer().getVariables().set("nevit_b", time);
+			getPlayer().sendPacket(new ExNevitAdventEffect(time));
+			getPlayer().sendPacket(SystemMessageId.THE_ANGEL_NEVIT_HAS_BLESSED_YOU_FROM_ABOVE);
+			getPlayer().startAbnormalVisualEffect(true, AbnormalVisualEffect.NAVIT_ADVENT);
+			_nevitEffectTask = ThreadPoolManager.getInstance().scheduleGeneral(new NevitEffectEnd(), time * 1000L);
+		}
+	}
+	
+	public class NevitEffectEnd implements Runnable
+	{
+		@Override
+		public void run()
+		{
+			getPlayer().getVariables().remove("nevit_b");
+			getPlayer().sendPacket(new ExNevitAdventEffect(0));
+			getPlayer().sendPacket(new ExNevitAdventPointInfoPacket(getAdventPoints()));
+			getPlayer().sendPacket(SystemMessageId.NEVITS_ADVENT_BLESSING_HAS_ENDED);
+			getPlayer().stopAbnormalVisualEffect(true, AbnormalVisualEffect.NAVIT_ADVENT);
+			stopNevitEffectTask(false);
+		}
+	}
+	
+	public void stopNevitEffectTask(boolean saveTime)
+	{
+		if (_nevitEffectTask != null)
+		{
+			if (saveTime)
+			{
+				int time = getEffectTime();
+				if (time > 0)
+				{
+					getPlayer().getVariables().set("nevit_b", time);
+				}
+				else
+				{
+					getPlayer().getVariables().remove("nevit_b");
+				}
+			}
+			_nevitEffectTask.cancel(true);
+			_nevitEffectTask = null;
+		}
+	}
+	
+	public L2PcInstance getPlayer()
+	{
+		return _player;
+	}
+	
+	public int getObjectId()
+	{
+		return _player.getObjectId();
+	}
+	
+	private int getEffectTime()
+	{
+		if (_nevitEffectTask == null)
+		{
+			return 0;
+		}
+		return (int) Math.max(0, _nevitEffectTask.getDelay(TimeUnit.SECONDS));
+	}
+	
+	public boolean isAdventBlessingActive()
+	{
+		return ((_nevitEffectTask != null) && (_nevitEffectTask.getDelay(TimeUnit.MILLISECONDS) > 0));
+	}
+	
+	public static int CalcPercent(int points)
+	{
+		return (int) ((100.0D / MAX_POINTS) * points);
+	}
+	
+	public void setAdventPoints(int points)
+	{
+		getPlayer().getVariables().set("hunting_points", points);
+	}
+	
+	public void setAdventTime(int time)
+	{
+		getPlayer().getVariables().set("hunting_time", time);
+	}
+	
+	public int getAdventPoints()
+	{
+		return getPlayer().getVariables().getInt("hunting_points", 0);
+	}
+	
+	public int getAdventTime()
+	{
+		return getPlayer().getVariables().getInt("hunting_time", 0);
+	}
+}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/stat/PcStat.java	(revision 6515)
+++ java/com/l2jserver/gameserver/model/actor/stat/PcStat.java	(working copy)
@@ -141,12 +141,22 @@
 		double bonusExp = 1.;
 		double bonusSp = 1.;
 		
+		if (activeChar.getNevitSystem().isAdventBlessingActive())
+		{
+			setVitalityPoints(getVitalityPoints() + 10, false);// increase Vitality During Blessing
+		}
+		
 		if (useBonuses)
 		{
 			bonusExp = getExpBonusMultiplier();
 			bonusSp = getSpBonusMultiplier();
 		}
 		
+		if ((addToExp > 0) && !activeChar.isInsideZone(ZoneId.PEACE))
+		{
+			activeChar.getNevitSystem().startAdventTask();
+		}
+		
 		addToExp *= bonusExp;
 		addToSp *= bonusSp;
 		
@@ -323,6 +333,8 @@
 		getActiveChar().sendPacket(new UserInfo(getActiveChar()));
 		getActiveChar().sendPacket(new ExBrExtraUserInfo(getActiveChar()));
 		getActiveChar().sendPacket(new ExVoteSystemInfo(getActiveChar()));
+		// Nevit Points For Level
+		getActiveChar().getNevitSystem().addPoints(2000);
 		
 		return levelIncreased;
 	}
@@ -617,8 +629,12 @@
 	{
 		final byte level;
 		
-		if (_vitalityPoints <= VITALITY_LEVELS[0])
+		if (getActiveChar().getNevitSystem().isAdventBlessingActive())
 		{
+			level = 4;
+		}
+		else if (_vitalityPoints <= VITALITY_LEVELS[0])
+		{
 			level = 0;
 		}
 		else if (_vitalityPoints <= VITALITY_LEVELS[1])
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java	(revision 6515)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
@@ -198,6 +198,7 @@
 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.NevitSystem;
 import com.l2jserver.gameserver.model.entity.Siege;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.fishing.L2Fish;
@@ -5462,7 +5463,7 @@
 					if (Config.ALT_GAME_DELEVEL)
 					{
 						// If player is Lucky shouldn't get penalized.
-						if (!isLucky())
+						if (!isLucky() && !getNevitSystem().isAdventBlessingActive())
 						{
 							// Reduce the Experience of the L2PcInstance in function of the calculated Death Penalty
 							// NOTE: deathPenalty +- Exp will update karma
@@ -5902,6 +5903,11 @@
 			}
 		}
 		
+		if (getNevitSystem().isAdventBlessingActive())
+		{
+			lostExp = 0;
+		}
+		
 		// Set the new Experience value of the L2PcInstance
 		getStat().addExp(-lostExp);
 	}
@@ -14750,4 +14756,12 @@
 	{
 		return (_actionMask & act.getMask()) == act.getMask();
 	}
+	
+	// High Five: Nevit's Bonus System
+	private final NevitSystem _nevitSystem = new NevitSystem(this);
+	
+	public NevitSystem getNevitSystem()
+	{
+		return _nevitSystem;
+	}
 }
\ No newline at end of file
Index: java/com/l2jserver/gameserver/network/SystemMessageId.java
===================================================================
--- java/com/l2jserver/gameserver/network/SystemMessageId.java	(revision 6515)
+++ java/com/l2jserver/gameserver/network/SystemMessageId.java	(working copy)
@@ -15177,6 +15177,30 @@
 	public static final SystemMessageId YOU_HAVE_S1_MATCHES_REMAINING_THAT_YOU_CAN_PARTECIPATE_IN_THIS_WEEK_S2_CLASSED_S3_NON_CLASSED_S4_TEAM;
 	
 	/**
+	 * The angel Nevit has blessed you from above. You are imbued with full Vitality as well as a Vitality Replenishing effect. And should you die, you will not lose Exp! Nevit's Advent Blessing is Upon You!
+	 */
+	public static final SystemMessageId THE_ANGEL_NEVIT_HAS_BLESSED_YOU_FROM_ABOVE;
+	/**
+	 * You are starting to feel the effects of Nevit's Advent Blessing.
+	 */
+	public static final SystemMessageId YOU_ARE_STARTING_TO_FEEL_THE_EFFECTS_OF_NEVITS_ADVENT_BLESSING;
+	
+	/**
+	 * You are further infused with the blessings of Nevit! Continue to battle evil wherever it may lurk.
+	 */
+	public static final SystemMessageId YOU_ARE_FURTHER_INFUSED_WITH_THE_BLESSINGS_OF_NEVIT;
+	
+	/**
+	 * Nevit's Advent Blessing shines strongly from above. You can almost see his divine aura.
+	 */
+	public static final SystemMessageId NEVITS_ADVENT_BLESSING_SHINES_STRONGLY_FROM_ABOVE;
+	
+	/**
+	 * Nevit's Advent Blessing has ended. Continue your journey and you will surely meet his favor again sometime soon.
+	 */
+	public static final SystemMessageId NEVITS_ADVENT_BLESSING_HAS_ENDED;
+	
+	/**
 	 * ID: 6004<br>
 	 * Message: Enchant failed. The enchant level for the corresponding item will be exactly retained.
 	 */
@@ -17724,6 +17748,11 @@
 		MP_BECAME_0_ARCANE_SHIELD_DISAPPEARING = new SystemMessageId(3256);
 		CANNOT_USE_SKILL_WITHOUT_SERVITOR = new SystemMessageId(3260);
 		YOU_HAVE_S1_MATCHES_REMAINING_THAT_YOU_CAN_PARTECIPATE_IN_THIS_WEEK_S2_CLASSED_S3_NON_CLASSED_S4_TEAM = new SystemMessageId(3261);
+		THE_ANGEL_NEVIT_HAS_BLESSED_YOU_FROM_ABOVE = new SystemMessageId(3266);
+		YOU_ARE_STARTING_TO_FEEL_THE_EFFECTS_OF_NEVITS_ADVENT_BLESSING = new SystemMessageId(3267);
+		YOU_ARE_FURTHER_INFUSED_WITH_THE_BLESSINGS_OF_NEVIT = new SystemMessageId(3268);
+		NEVITS_ADVENT_BLESSING_SHINES_STRONGLY_FROM_ABOVE = new SystemMessageId(3269);
+		NEVITS_ADVENT_BLESSING_HAS_ENDED = new SystemMessageId(3275);
 		SAFE_ENCHANT_FAILED = new SystemMessageId(6004);
 		YOU_CANNOT_BOOKMARK_THIS_LOCATION_BECAUSE_YOU_DO_NOT_HAVE_A_MY_TELEPORT_FLAG = new SystemMessageId(6501);
 		THOMAS_D_TURKEY_APPEARED = new SystemMessageId(6503);
Index: java/com/l2jserver/gameserver/network/serverpackets/ExNevitAdventTimeChange.java
===================================================================
--- java/com/l2jserver/gameserver/network/serverpackets/ExNevitAdventTimeChange.java	(revision 6515)
+++ java/com/l2jserver/gameserver/network/serverpackets/ExNevitAdventTimeChange.java	(working copy)
@@ -26,10 +26,10 @@
 	private final boolean _paused;
 	private final int _time;
 	
-	public ExNevitAdventTimeChange(int time)
+	public ExNevitAdventTimeChange(int time, boolean paused)
 	{
-		_time = time > 240000 ? 240000 : time;
-		_paused = _time < 1;
+		_time = time;
+		_paused = paused;
 	}
 	
 	@Override
Index: java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java	(revision 6515)
+++ java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java	(working copy)
@@ -68,7 +68,6 @@
 import com.l2jserver.gameserver.network.serverpackets.ExBasicActionList;
 import com.l2jserver.gameserver.network.serverpackets.ExGetBookMarkInfoPacket;
 import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventPointInfoPacket;
-import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventTimeChange;
 import com.l2jserver.gameserver.network.serverpackets.ExNoticePostArrived;
 import com.l2jserver.gameserver.network.serverpackets.ExNotifyPremiumItem;
 import com.l2jserver.gameserver.network.serverpackets.ExShowContactList;
@@ -506,7 +505,6 @@
 		sendPacket(new SkillCoolTime(activeChar));
 		sendPacket(new ExVoteSystemInfo(activeChar));
 		sendPacket(new ExNevitAdventPointInfoPacket(0));
-		sendPacket(new ExNevitAdventTimeChange(-1)); // only set pause state...
 		sendPacket(new ExShowContactList(activeChar));
 		
 		for (L2ItemInstance i : activeChar.getInventory().getItems())