Jump to content

Question

Posted (edited)

Hello guys,

I need help with this:  http://www.maxcheaters.com/topic/158570-trances-rebirth-manager/

Originally, once I perform the rebirth, character level is decreased to level 1 and it turns to first class. I need to modify this, as that, once the rebirth is done, the charachter should keep the third class status and get the level 1 skills. It just needs a few code modifications that I can't manage how to do them (java newbie :P). Hope you can help me with that.

PS: Sorry for my bad english, and don't think i'm planning to open a live server, I just want to play with some friends (old l2gold players)

Cheers,

 

- Junkee

 

This is the code:

### Eclipse Workspace Patch 1.0
#P aCis_gameserver
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestAcquireSkillInfo.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestAcquireSkillInfo.java	(revision 4)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestAcquireSkillInfo.java	(working copy)
@@ -17,8 +17,8 @@
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.datatables.SkillTable;
 import net.sf.l2j.gameserver.datatables.SkillTreeTable;
-import net.sf.l2j.gameserver.datatables.SpellbookTable;
 import net.sf.l2j.gameserver.model.L2PledgeSkillLearn;
+import net.sf.l2j.gameserver.model.L2RebirthSkillLearn;
 import net.sf.l2j.gameserver.model.L2Skill;
 import net.sf.l2j.gameserver.model.L2SkillLearn;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
@@ -62,7 +62,7 @@
 		
 		switch (_skillType)
 		{
-			// General skills
+			// Trance's Rebirth skills.
 			case 0:
 				int skillLvl = activeChar.getSkillLevel(_skillId);
 				if (skillLvl >= _skillLevel)
@@ -74,14 +74,13 @@
 				if (!trainer.getTemplate().canTeach(activeChar.getSkillLearningClassId()))
 					return;
 					
-				for (L2SkillLearn sl : SkillTreeTable.getInstance().getAvailableSkills(activeChar, activeChar.getSkillLearningClassId()))
+				for (L2RebirthSkillLearn rsl : SkillTreeTable.getInstance().getAvailableRebirthSkills(activeChar, activeChar.getSkillLearningClassId()))
 				{
-					if (sl.getId() == _skillId && sl.getLevel() == _skillLevel)
+					if (rsl.getId() == _skillId && rsl.getLevel() == _skillLevel)
 					{
-						AcquireSkillInfo asi = new AcquireSkillInfo(_skillId, _skillLevel, sl.getSpCost(), 0);
-						int spellbookItemId = SpellbookTable.getInstance().getBookForSkill(_skillId, _skillLevel);
-						if (spellbookItemId != 0)
-							asi.addRequirement(99, spellbookItemId, 1, 50);
+						AcquireSkillInfo asi = new AcquireSkillInfo(_skillId, _skillLevel, rsl.getCostSp(), 0);
+						if (Config.LIFE_CRYSTAL_NEEDED && rsl.getItemId() != 0)
+							asi.addRequirement(1, rsl.getItemId(), 1, 0);
 						sendPacket(asi);
 						break;
 					}
Index: java/net/sf/l2j/gameserver/model/base/ClassId.java
===================================================================
--- java/net/sf/l2j/gameserver/model/base/ClassId.java	(revision 4)
+++ java/net/sf/l2j/gameserver/model/base/ClassId.java	(working copy)
@@ -248,4 +248,15 @@
 	{
 		return _parent;
 	}
+
+	/**
+	 * @return to the first class
+	 */
+	public final ClassId getFirstClass()
+	{
+		if (_parent == null)
+			return this;
+		
+		return _parent.getFirstClass();
+	}
 }
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2RebirthInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2RebirthInstance.java	(revision 0)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2RebirthInstance.java	(working copy)
@@ -0,0 +1,301 @@
+/*
+ * 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 net.sf.l2j.gameserver.model.actor.instance;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.HashMap;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.L2DatabaseFactory;
+import net.sf.l2j.gameserver.model.base.Experience;
+import net.sf.l2j.gameserver.model.L2ItemInstance;
+import net.sf.l2j.gameserver.model.L2Skill;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
+import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
+import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
+import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
+
+/**
+ * Rebirth Manager
+ * @author Trance
+ * @skype chr.trance
+ */
+public final class L2RebirthInstance extends L2NpcInstance
+{
+	private static HashMap<Integer, Integer> _rebirthInfo = new HashMap<>();
+	
+	public L2RebirthInstance(int objectId, L2NpcTemplate template)
+	{
+		super(objectId, template);
+	}
+	
+	@Override
+	public void onBypassFeedback(L2PcInstance player, String command)
+	{
+		if (command.startsWith("performRebirth"))
+		{
+			// Maximum rebirth count. Return the player's current Rebirth Level.
+			int currBirth = getRebirthLevel(player);
+			if (currBirth >= Config.REBIRTH_MAX)
+			{
+				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+				html.setFile("data/html/managers/rebirth-max.htm");
+				
+				player.sendPacket(html);
+				return;
+			}
+			
+			// Level requirement for a rebirth.
+			if (player.getLevel() < Config.REBIRTH_MIN_LEVEL)
+			{
+				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+				html.setFile("data/html/managers/rebirth-level.htm");
+				
+				player.sendPacket(html);
+				return;
+			}
+			
+			int itemId = 0, itemCount = 0, loopBirth = 0;
+			for (String readItems : Config.REBIRTH_ITEMS)
+			{
+				String[] currItem = readItems.split(",");
+				if (loopBirth == currBirth)
+				{
+					itemId = Integer.parseInt(currItem[0]);
+					itemCount = Integer.parseInt(currItem[1]);
+					break;
+				}
+				loopBirth++;
+			}
+			
+			// Rewards the player with an item.
+			rebirthItemReward(player, itemId, itemCount);
+			
+			// Check and see if its the player's first rebirth calling.
+			boolean firstBirth = currBirth == 0;
+			
+			// Player meets requirements and starts Rebirth process.
+			grantRebirth(player, (currBirth + 1), firstBirth);
+		}
+		else
+			super.onBypassFeedback(player, command);
+	}
+	
+	@Override
+	public void showChatWindow(L2PcInstance player)
+	{
+		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setFile("data/html/managers/rebirth.htm");
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		html.replace("%level%", + Config.REBIRTH_RETURN_TO_LEVEL);
+		
+		player.sendPacket(html);
+    }
+	
+	/**
+	 * Physically rewards player and resets status to nothing.
+	 *
+	 * @param player the player
+	 * @param newBirthCount the new birth count
+	 * @param firstBirth the first birth
+	 */
+	public void grantRebirth(L2PcInstance player, int newBirthCount, boolean firstBirth)
+	{
+		try
+		{
+			// Delevel.
+			player.removeExpAndSp(player.getExp() - Experience.LEVEL[Config.REBIRTH_RETURN_TO_LEVEL], 0);
+			
+			// Back to the first class.
+			player.setClassId(player.getClassId().getFirstClass().getId());
+			
+			// Send the Server->Client packet StatusUpdate with current HP, MP and CP to this L2PcInstance
+			player.broadcastStatusUpdate();
+			
+			// Broadcast informations from a user to himself and his knownlist.
+			player.broadcastUserInfo();
+			
+			// Remove the player's current skills.
+			for (L2Skill skill : player.getAllSkills())
+				player.removeSkill(skill);
+			
+			// Give all available skills to the player.
+			player.giveAvailableSkills();
+			
+			// Update L2PcInstance stats in the characters table of the database.
+			player.store();
+			
+			if (firstBirth)
+				// Stores the player's information in the DB.
+				storePlayerBirth(player);
+			else
+				// Updates the player's information in the DB.
+				updatePlayerBirth(player, newBirthCount);
+			
+			// Displays a congratulation window to the player.
+			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+			html.setFile("data/html/managers/rebirth-successfully.htm");
+			html.replace("%level%", + Config.REBIRTH_RETURN_TO_LEVEL);
+			
+			player.sendPacket(html);
+		}
+		catch (Exception e)
+		{
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Rewards the player with an item.
+	 *
+	 * @param player the player
+	 * @param itemId : Identifier of the item.
+	 * @param itemCount : Quantity of items to add.
+	 */
+	public static void rebirthItemReward(L2PcInstance player, int itemId, int itemCount)
+	{
+		// Incorrect amount.
+		if (itemCount <= 0)
+			return;
+		
+		final L2ItemInstance item = player.getInventory().addItem("Quest", itemId, itemCount, player, player);
+		if (item == null)
+			return;
+		
+		// Send message to the client.
+		if (itemId == 57)
+		{
+			SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S1_ADENA);
+			smsg.addItemNumber(itemCount);
+			player.sendPacket(smsg);
+		}
+		else
+		{
+			if (itemCount > 1)
+			{
+				SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
+				smsg.addItemName(itemId);
+				smsg.addItemNumber(itemCount);
+				player.sendPacket(smsg);
+			}
+			else
+			{
+				SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
+				smsg.addItemName(itemId);
+				player.sendPacket(smsg);
+			}
+		}
+		
+		// Send status update packet.
+		StatusUpdate su = new StatusUpdate(player);
+		su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
+		player.sendPacket(su);
+	}
+	
+	/**
+	 * Return the player's current Rebirth Level.
+	 *
+	 * @param player the player
+	 * @return the rebirth level
+	 */
+	public static int getRebirthLevel(L2PcInstance player)
+	{
+		int playerId = player.getObjectId();
+		if (_rebirthInfo.get(playerId) == null)
+			loadRebirthInfo(player);
+		
+		return _rebirthInfo.get(playerId);
+	}
+	
+	/**
+	 * Database caller to retrieve player's current Rebirth Level.
+	 *
+	 * @param player the player
+	 */
+	public static void loadRebirthInfo(L2PcInstance player)
+	{
+		int playerId = player.getObjectId(), rebirthCount = 0;
+		
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			ResultSet rset;
+			PreparedStatement statement = con.prepareStatement("SELECT * FROM `character_rebirths` WHERE playerId = ?");
+			statement.setInt(1, playerId);
+			rset = statement.executeQuery();
+			
+			while (rset.next())
+			{
+				rebirthCount = rset.getInt("rebirthCount");
+			}
+			
+			rset.close();
+			statement.close();
+		}
+		catch (Exception e)
+		{
+			e.printStackTrace();
+		}
+		_rebirthInfo.put(playerId, rebirthCount);
+	}
+	
+	/**
+	 * Stores the player's information in the DB.
+	 *
+	 * @param player the player
+	 */
+	public static void storePlayerBirth(L2PcInstance player)
+	{
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement("INSERT INTO `character_rebirths` (playerId,rebirthCount) VALUES (?,1)");
+			statement.setInt(1, player.getObjectId());
+			statement.execute();
+			
+			_rebirthInfo.put(player.getObjectId(), 1);
+		}
+		catch (Exception e)
+		{
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Updates the player's information in the DB.
+	 *
+	 * @param player the player
+	 * @param newRebirthCount the new rebirth count
+	 */
+	public static void updatePlayerBirth(L2PcInstance player, int newRebirthCount)
+	{
+		int playerId = player.getObjectId();
+		
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement = con.prepareStatement("UPDATE `character_rebirths` SET rebirthCount = ? WHERE playerId = ?");
+			statement.setInt(1, newRebirthCount);
+			statement.setInt(2, playerId);
+			statement.execute();
+			
+			_rebirthInfo.put(playerId, newRebirthCount);
+		}
+		catch (Exception e)
+		{
+			e.printStackTrace();
+		}
+	}
+}
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestAcquireSkill.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestAcquireSkill.java	(revision 4)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestAcquireSkill.java	(working copy)
@@ -17,8 +17,8 @@
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.datatables.SkillTable;
 import net.sf.l2j.gameserver.datatables.SkillTreeTable;
-import net.sf.l2j.gameserver.datatables.SpellbookTable;
 import net.sf.l2j.gameserver.model.L2PledgeSkillLearn;
+import net.sf.l2j.gameserver.model.L2RebirthSkillLearn;
 import net.sf.l2j.gameserver.model.L2ShortCut;
 import net.sf.l2j.gameserver.model.L2Skill;
 import net.sf.l2j.gameserver.model.L2SkillLearn;
@@ -80,7 +80,7 @@
 		// Types.
 		switch (_skillType)
 		{
-			case 0: // General skills.
+			case 0: // Trance's Rebirth skills.
 				// Player already has such skill with same or higher level.
 				int skillLvl = activeChar.getSkillLevel(_skillId);
 				if (skillLvl >= _skillLevel)
@@ -90,16 +90,17 @@
 				if (Math.max(skillLvl, 0) + 1 != _skillLevel)
 					return;
 				
-				int spCost = 0;
+				int spCost = 0, idItem = 0;
 				
 				// Find skill information.
-				for (L2SkillLearn sl : SkillTreeTable.getInstance().getAvailableSkills(activeChar, activeChar.getSkillLearningClassId()))
+				for (L2RebirthSkillLearn rsl : SkillTreeTable.getInstance().getAvailableRebirthSkills(activeChar, activeChar.getSkillLearningClassId()))
 				{
 					// Skill found.
-					if (sl.getId() == _skillId && sl.getLevel() == _skillLevel)
+					if (rsl.getId() == _skillId && rsl.getLevel() == _skillLevel)
 					{
 						exists = true;
-						spCost = sl.getSpCost();
+						idItem = rsl.getItemId();
+						spCost = rsl.getCostSp();
 						break;
 					}
 				}
@@ -116,11 +117,10 @@
 					return;
 				}
 				
-				// Get spellbook and try to consume it.
-				int spbId = SpellbookTable.getInstance().getBookForSkill(_skillId, _skillLevel);
-				if (spbId > 0)
+				// Get item and try to consume it.
+				if (idItem > 0)
 				{
-					if (!activeChar.destroyItemByItemId("SkillLearn", spbId, 1, trainer, true))
+					if (!activeChar.destroyItemByItemId("SkillLearn", idItem, 1, trainer, false))
 					{
 						activeChar.sendPacket(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL);
 						L2NpcInstance.showSkillList(activeChar, trainer, activeChar.getSkillLearningClassId());
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2NpcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2NpcInstance.java	(revision 4)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2NpcInstance.java	(working copy)
@@ -19,11 +19,11 @@
 import net.sf.l2j.gameserver.datatables.SkillTable;
 import net.sf.l2j.gameserver.datatables.SkillTable.FrequentSkill;
 import net.sf.l2j.gameserver.datatables.SkillTreeTable;
+import net.sf.l2j.gameserver.model.L2RebirthSkillLearn;
 import net.sf.l2j.gameserver.model.L2Effect;
 import net.sf.l2j.gameserver.model.L2EnchantSkillData;
 import net.sf.l2j.gameserver.model.L2EnchantSkillLearn;
 import net.sf.l2j.gameserver.model.L2Skill;
-import net.sf.l2j.gameserver.model.L2SkillLearn;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
 import net.sf.l2j.gameserver.model.actor.status.FolkStatus;
 import net.sf.l2j.gameserver.model.base.ClassId;
@@ -99,13 +99,13 @@
 		AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.Usual);
 		boolean empty = true;
 		
-		for (L2SkillLearn sl : SkillTreeTable.getInstance().getAvailableSkills(player, classId))
+		for (L2RebirthSkillLearn rsl : SkillTreeTable.getInstance().getAvailableRebirthSkills(player, classId))
 		{
-			L2Skill sk = SkillTable.getInstance().getInfo(sl.getId(), sl.getLevel());
+			L2Skill sk = SkillTable.getInstance().getInfo(rsl.getId(), rsl.getLevel());
 			if (sk == null)
 				continue;
 			
-			asl.addSkill(sl.getId(), sl.getLevel(), sl.getLevel(), sl.getSpCost(), 0);
+			asl.addSkill(rsl.getId(), rsl.getLevel(), rsl.getLevel(), rsl.getCostSp(), 0);
 			empty = false;
 		}
 		
Index: config/events.properties
===================================================================
--- config/events.properties	(revision 4)
+++ config/events.properties	(working copy)
@@ -251,4 +251,19 @@
 AltFishChampionshipReward2 = 500000
 AltFishChampionshipReward3 = 300000
 AltFishChampionshipReward4 = 200000
-AltFishChampionshipReward5 = 100000
\ No newline at end of file
+AltFishChampionshipReward5 = 100000
+
+#================================================================
+#                    Trance's Rebirth Manager
+#================================================================
+# Minimum level for Rebirth
+RebirthMinLevel = 78
+
+# Maximum rebirth's allowed
+RebirthMaxAllowed = 3
+
+# Return to level
+RebirthReturnToLevel = 1
+
+# Rebirth items
+RebirthItems = 2822,1;2822,1;2822,1;
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/datatables/SkillTreeTable.java
===================================================================
--- java/net/sf/l2j/gameserver/datatables/SkillTreeTable.java	(revision 4)
+++ java/net/sf/l2j/gameserver/datatables/SkillTreeTable.java	(working copy)
@@ -26,6 +26,7 @@
 import net.sf.l2j.gameserver.model.L2EnchantSkillData;
 import net.sf.l2j.gameserver.model.L2EnchantSkillLearn;
 import net.sf.l2j.gameserver.model.L2PledgeSkillLearn;
+import net.sf.l2j.gameserver.model.L2RebirthSkillLearn;
 import net.sf.l2j.gameserver.model.L2Skill;
 import net.sf.l2j.gameserver.model.L2SkillLearn;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
@@ -46,6 +47,7 @@
 	private List<L2PledgeSkillLearn> _pledgeSkillTrees;
 	private Map<Integer, L2EnchantSkillData> _enchantSkillData;
 	private List<L2EnchantSkillLearn> _enchantSkillTrees;
+	private List<L2RebirthSkillLearn> _rebirthSkillTrees;
 	
 	public static SkillTreeTable getInstance()
 	{
@@ -207,10 +209,43 @@
 			_log.severe("PledgeTable: Error while loading pledge skills: " + e);
 		}
 		
+		// Rebirth skills tree
+		try
+		{
+			_rebirthSkillTrees = new ArrayList<>();
+			
+			File f = new File("./data/xml/skillstrees/rebirth_skills_tree.xml");
+			Document doc = XMLDocumentFactory.getInstance().loadDocument(f);
+			
+			for (Node list = doc.getFirstChild().getFirstChild(); list != null; list = list.getNextSibling())
+			{
+				if ("skill".equalsIgnoreCase(list.getNodeName()))
+				{
+					NamedNodeMap skillAttr = list.getAttributes();
+					
+					int skillId = Integer.parseInt(skillAttr.getNamedItem("id").getNodeValue());
+					int skillLvl = Integer.parseInt(skillAttr.getNamedItem("lvl").getNodeValue());
+					int costSp = Integer.valueOf(skillAttr.getNamedItem("sp").getNodeValue());
+					int itemId = 0;
+					
+					Node att = skillAttr.getNamedItem("itemId");
+					if (att != null)
+						itemId = Integer.valueOf(att.getNodeValue());
+					
+					_rebirthSkillTrees.add(new L2RebirthSkillLearn(skillId, skillLvl, costSp, itemId));
+				}
+			}
+		}
+		catch (Exception e)
+		{
+			_log.severe("RebirthTable: Error while loading rebirth skills: " + e);
+		}
+		
 		_log.config("FishingSkillTreeTable: Loaded " + _fishingSkillTrees.size() + " general skills.");
 		_log.config("DwarvenCraftSkillTreeTable: Loaded " + _expandDwarvenCraftSkillTrees.size() + " dwarven skills.");
 		_log.config("EnchantSkillTreeTable: Loaded " + _enchantSkillData.size() + " enchant types and " + _enchantSkillTrees.size() + " enchant skills.");
 		_log.config("PledgeSkillTreeTable: Loaded " + _pledgeSkillTrees.size() + " pledge skills.");
+		_log.config("RebirthSkillTreeTable: Loaded " + _rebirthSkillTrees.size() + " rebirth skills.");
 	}
 	
 	/**
@@ -509,6 +544,39 @@
 		return result;
 	}
 	
+	/**
+	 * @param cha L2PcInstance, player whom skills are compared.
+	 * @param classId 
+	 * @return list of available rebirth skills for L2PcInstance.
+	 */
+	public List<L2RebirthSkillLearn> getAvailableRebirthSkills(L2PcInstance cha, ClassId classId)
+	{
+		List<L2RebirthSkillLearn> result = new ArrayList<>();
+		
+		L2Skill[] chaSkills = cha.getAllSkills();
+		
+		for (L2RebirthSkillLearn rsl : _rebirthSkillTrees)
+		{
+			boolean found = false;
+			
+			for (L2Skill s : chaSkills)
+			{
+				if (s.getId() == rsl.getId())
+				{
+					if (s.getLevel() == rsl.getLevel() - 1)
+						result.add(rsl);
+					
+					found = true;
+					break;
+				}
+			}
+			
+			if (!found && rsl.getLevel() == 1)
+				result.add(rsl);
+		}
+		return result;
+	}
+	
 	public int getMinSkillLevel(int skillId, int skillLvl)
 	{
 		int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl);
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java	(revision 4)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
@@ -5643,16 +5643,6 @@
 								player._classIndex = subClass.getClassIndex();
 					}
 				}
-				if (player.getClassIndex() == 0 && activeClassId != player.getBaseClass())
-				{
-					// Subclass in use but doesn't exist in DB -
-					// a possible restart-while-modifysubclass cheat has been attempted.
-					// Switching to use base class
-					player.setClassId(player.getBaseClass());
-					_log.warning("Player " + player.getName() + " reverted to base class. Possibly has tried a relogin exploit while subclassing.");
-				}
-				else
-					player._activeClass = activeClassId;
 				
 				player.setApprentice(rset.getInt("apprentice"));
 				player.setSponsor(rset.getInt("sponsor"));
Index: java/net/sf/l2j/gameserver/model/actor/L2Character.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/L2Character.java	(revision 4)
+++ java/net/sf/l2j/gameserver/model/actor/L2Character.java	(working copy)
@@ -4515,6 +4515,10 @@
 		if (skill == null)
 			return null;
 		
+		// Skip the rebirth skills.
+		if (skill.getId() >= 549 && skill.getId() <= 560)
+			return null;
+		
 		return removeSkill(skill.getId(), true);
 	}
 	
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java	(revision 4)
+++ java/net/sf/l2j/Config.java	(working copy)
@@ -225,6 +225,12 @@
 	public static int ALT_FISH_CHAMPIONSHIP_REWARD_4;
 	public static int ALT_FISH_CHAMPIONSHIP_REWARD_5;
 	
+	/** Trance's Rebirth Manager */
+	public static int REBIRTH_MIN_LEVEL;
+	public static int REBIRTH_MAX;
+	public static int REBIRTH_RETURN_TO_LEVEL;
+	public static String[] REBIRTH_ITEMS;
+	
 	// --------------------------------------------------
 	// HexID
 	// --------------------------------------------------
@@ -870,6 +876,11 @@
 			ALT_FISH_CHAMPIONSHIP_REWARD_4 = events.getProperty("AltFishChampionshipReward4", 200000);
 			ALT_FISH_CHAMPIONSHIP_REWARD_5 = events.getProperty("AltFishChampionshipReward5", 100000);
 			
+			REBIRTH_MIN_LEVEL = events.getProperty("RebirthMinLevel", 78);
+			REBIRTH_MAX = events.getProperty("RebirthMaxAllowed", 3);
+			REBIRTH_RETURN_TO_LEVEL = events.getProperty("RebirthReturnToLevel", 1);
+			REBIRTH_ITEMS = events.getProperty("RebirthItems", "").split(";");
+			
 			// FloodProtector
 			ExProperties security = load(FLOOD_PROTECTOR_FILE);
 			loadFloodProtectorConfig(security, FLOOD_PROTECTOR_ROLL_DICE, "RollDice", "42");
Index: java/net/sf/l2j/gameserver/model/L2RebirthSkillLearn.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2RebirthSkillLearn.java	(revision 0)
+++ java/net/sf/l2j/gameserver/model/L2RebirthSkillLearn.java	(working copy)
@@ -0,0 +1,55 @@
+/*
+ * 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 net.sf.l2j.gameserver.model;
+
+/**
+ * @author Trance
+ * @skype chr.trance
+ */
+public final class L2RebirthSkillLearn
+{
+	private final int _id;
+	private final int _level;
+	private final int _costSp;
+	private final int _itemId;
+	
+	public L2RebirthSkillLearn(int id, int lvl, int costSp, int itemId)
+	{
+		_id = id;
+		_level = lvl;
+		_costSp = costSp;
+		_itemId = itemId;
+	}
+	
+	public int getId()
+	{
+		return _id;
+	}
+	
+	public int getLevel()
+	{
+		return _level;
+	}
+	
+	public int getCostSp()
+	{
+		return _costSp;
+	}
+	
+	public int getItemId()
+	{
+		return _itemId;
+	}
+}
\ No newline at end of file
Edited by Junkee

1 answer to this question

Recommended Posts

  • 0
Posted

Remove this line

 

 

+            // Back to the first class.
+            player.setClassId(player.getClassId().getFirstClass().getId());

 

and you can skip this code as well, since no use

 

 

Index: java/net/sf/l2j/gameserver/model/base/ClassId.java
Guest
This topic is now closed to further replies.


  • Posts

    • From Salvation onwards I think you need a patched nwindow.dll that allows such modifications, try to see if you get what you need here: https://drive.google.com/drive/u/1/folders/1LLbQFGf8KlR-O0Iv5umfF-pwZgrDh9bd
    • hello everyone! I am wanting to save the files (Ini. - Data - ) of the EP5 Client: Salvation... But they generate the error "corrupt files"... I tried several versions of L2FileEditor without good results. I need help! Thank you!
    • Opening December 6th at 19:00 (GMT +3)! Open Beta Test from November 30th!   https://l2soe.com/   🌟 Introducing L2 Saga of Eternia: A Revolution in Lineage 2 High Five! 🌟   Dear Lineage 2 enthusiasts, Prepare to witness the future of private servers! L2 Saga of Eternia is not just another High Five project—it’s a game-changing experience designed to compete with the giants of the Lineage 2 private server scene. Built for the community, by the community, we’re here to raise the bar in quality, innovation, and longevity. What Sets Us Apart? 💎 No Wipes, Ever Say goodbye to the fear of losing your progress. Our server is built to last and will never close. Stability and consistency are our promises to you. ⚔️ Weekly New Content Our dedicated development team ensures fresh challenges, events, and updates every week. From custom quests to exclusive features, there will always be something exciting to explore. 💰 No Pay-to-Win Skill and strategy matter most here. Enjoy a balanced gameplay environment where your achievements come from effort, not your wallet. 🌍 A Massive Community With 2000+ players expected, join a vibrant and active community of like-minded adventurers ready to conquer the world of Aden. 🏆 Fair and Competitive Gameplay Our systems are designed to promote healthy competition while avoiding abusive mechanics and exploits. 🔧 Professional Development From advanced bug fixes to carefully curated content, we pride ourselves on smooth performance, no lag, and unparalleled server quality. Key Features Chronicle: High Five with unique interface Rate: Dynamic x10 rates Class Balance: Carefully fine-tuned for a fair experience PvP Focused: PvP Ranking & aura display effect for 3 Top PvPers every week Custom Events: Seasonal and permanent events to keep you engaged Additional Features:   Custom Endgame Content: Introduce unique dungeons, raids, or zones unavailable in other servers. Player-Driven Economy: Implement a strong market system and avoid overinflated drops or rewards. Epic Siege Battles: Announce special large-scale sieges and PvP events. Incentives for Streamers and Clans: Attract influencers and big clans to boost server publicity. Roadmap Transparency: Share a public roadmap of planned updates to build trust and excitemen   Here you can read all the features: https://l2soe.com/features   Video preview: Join the Revolution! This is your chance to be part of something legendary. L2 Saga of Eternia is not just a server; it’s a movement to redefine what Lineage 2 can be. Whether you’re a seasoned veteran or a newcomer to the world of Aden, we invite you to experience Lineage 2 at its finest.   Official Launch Date: December 6th 2024 Website: https://l2soe.com/ Facebook: https://www.facebook.com/l2soe Discord: https://discord.com/invite/l2eternia   Let’s build the ultimate Lineage 2 experience together. See you in-game! 🎮
    • That's like a tutorial on how to run l2 on MacOS Xd but good job for the investigation. 
  • Topics

×
×
  • Create New...