Noticias:

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

Menú Principal

Trance's Rebirth Manager

Iniciado por Swarlog, Ago 31, 2022, 08:13 PM

Tema anterior - Siguiente tema

Swarlog


CitarCORE:

### 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

CitarDATA:

### Eclipse Workspace Patch 1.0
#P aCis_datapack
Index: tools/database_installer.sh
===================================================================
--- tools/database_installer.sh (revision 4)
+++ tools/database_installer.sh (working copy)
@@ -90,6 +90,7 @@
 $MYG < ../sql/character_mail.sql &> /dev/null
 $MYG < ../sql/character_quests.sql &> /dev/null
 $MYG < ../sql/character_raid_points.sql &> /dev/null
+$MYG < ../sql/character_rebirths.sql &> /dev/null
 $MYG < ../sql/character_recipebook.sql &> /dev/null
 $MYG < ../sql/character_recommends.sql &> /dev/null
 $MYG < ../sql/character_shortcuts.sql &> /dev/null
Index: data/xml/skills/0500-0599.xml
===================================================================
--- data/xml/skills/0500-0599.xml (revision 0)
+++ data/xml/skills/0500-0599.xml (working copy)
@@ -0,0 +1,147 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list>
+ <skill id="549" levels="3" name="Rebirth Guidance">
+ <!-- Lv 1: Increases accuracy by 5%. -->
+ <!-- Lv 2: Increases accuracy by 10%. -->
+ <!-- Lv 3: Increases accuracy by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="accCombat" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="550" levels="3" name="Rebirth Haste">
+ <!-- Lv 1: Increases Atk. Spd. by 5%. -->
+ <!-- Lv 2: Increases Atk. Spd. by 10%. -->
+ <!-- Lv 3: Increases Atk. Spd. by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="pAtkSpd" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="551" levels="3" name="Rebirth Health">
+ <!-- Lv 1: Increases HP by 10%. -->
+ <!-- Lv 2: Increases HP by 20%. -->
+ <!-- Lv 3: Increases HP by 30%. -->
+ <table name="#reb"> 1.1 1.2 1.3 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="maxHp" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="552" levels="3" name="Rebirth Mana">
+ <!-- Lv 1: Increases MP by 10%. -->
+ <!-- Lv 2: Increases MP by 20%. -->
+ <!-- Lv 3: Increases MP by 30%. -->
+ <table name="#reb"> 1.1 1.2 1.3 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="maxMp" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="553" levels="3" name="Rebirth Wind Walk">
+ <!-- Lv 1: Increases speed by 5%. -->
+ <!-- Lv 2: Increases speed by 10%. -->
+ <!-- Lv 3: Increases speed by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="runSpd" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="554" levels="3" name="Rebirth Focus">
+ <!-- Lv 1: Increases critical attack rate by 15. -->
+ <!-- Lv 2: Increases critical attack rate by 30. -->
+ <!-- Lv 3: Increases critical attack rate by 45. -->
+ <table name="#reb"> 15 30 45 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <add order="0x40" stat="rCrit" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="555" levels="3" name="Rebirth Might">
+ <!-- Lv 1: Increases P. Atk. by 5%. -->
+ <!-- Lv 2: Increases P. Atk. by 10%. -->
+ <!-- Lv 3: Increases P. Atk. by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="pAtk" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="556" levels="3" name="Rebirth Empower">
+ <!-- Lv 1: Increases M. Atk. by 5%. -->
+ <!-- Lv 2: Increases M. Atk. by 10%. -->
+ <!-- Lv 3: Increases M. Atk. by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="mAtk" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="557" levels="3" name="Rebirth Shield">
+ <!-- Lv 1: Increases P. Def. by 5%. -->
+ <!-- Lv 2: Increases P. Def. by 10%. -->
+ <!-- Lv 3: Increases P. Def. by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="pDef" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="558" levels="3" name="Rebirth Magic Barrier">
+ <!-- Lv 1: Increases M. Def. by 5%. -->
+ <!-- Lv 2: Increases M. Def. by 10%. -->
+ <!-- Lv 3: Increases M. Def. by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="mDef" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="559" levels="3" name="Rebirth Agility">
+ <!-- Lv 1: Increases Evasion by 6. -->
+ <!-- Lv 2: Increases Evasion by 11. -->
+ <!-- Lv 3: Increases Evasion by 17. -->
+ <table name="#reb"> 6 11 17 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <add order="0x10" stat="rEvas" val="#reb"/>
+ </for>
+ </skill>
+ <skill id="560" levels="3" name="Rebirth Acumen">
+ <!-- Lv 1: Increases Casting Speed by 5%. -->
+ <!-- Lv 2: Increases Casting Speed by 10%. -->
+ <!-- Lv 3: Increases Casting Speed by 15%. -->
+ <table name="#reb"> 1.05 1.1 1.15 </table>
+ <set name="target" val="TARGET_SELF"/>
+ <set name="skillType" val="BUFF"/>
+ <set name="operateType" val="OP_PASSIVE"/>
+ <for>
+ <mul order="0x30" stat="mAtkSpd" val="#reb"/>
+ </for>
+ </skill>
+</list>
\ No newline at end of file
Index: sql/character_rebirths.sql
===================================================================
--- sql/character_rebirths.sql (revision 0)
+++ sql/character_rebirths.sql (working copy)
@@ -0,0 +1,8 @@
+SET FOREIGN_KEY_CHECKS=0;
+
+DROP TABLE IF EXISTS `character_rebirths`;
+CREATE TABLE `character_rebirths` (
+  `playerId` int(20) NOT NULL,
+  `rebirthCount` int(2) NOT NULL,
+  PRIMARY KEY (`playerId`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
\ No newline at end of file
Index: data/xml/skillstrees/rebirth_skills_tree.xml
===================================================================
--- data/xml/skillstrees/rebirth_skills_tree.xml (revision 0)
+++ data/xml/skillstrees/rebirth_skills_tree.xml (working copy)
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list>
+ <skill id="549" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Guidance -->
+ <skill id="549" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Guidance -->
+ <skill id="549" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Guidance -->
+ <skill id="550" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Haste -->
+ <skill id="550" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Haste -->
+ <skill id="550" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Haste -->
+ <skill id="551" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Health -->
+ <skill id="551" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Health -->
+ <skill id="551" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Health -->
+ <skill id="552" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Mana -->
+ <skill id="552" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Mana -->
+ <skill id="552" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Mana -->
+ <skill id="553" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Wind Walk -->
+ <skill id="553" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Wind Walk -->
+ <skill id="553" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Wind Walk -->
+ <skill id="554" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Focus -->
+ <skill id="554" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Focus -->
+ <skill id="554" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Focus -->
+ <skill id="555" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Might -->
+ <skill id="555" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Might -->
+ <skill id="555" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Might -->
+ <skill id="556" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Empower -->
+ <skill id="556" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Empower -->
+ <skill id="556" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Empower -->
+ <skill id="557" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Shield -->
+ <skill id="557" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Shield -->
+ <skill id="557" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Shield -->
+ <skill id="558" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Magic Barrier -->
+ <skill id="558" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Magic Barrier -->
+ <skill id="558" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Magic Barrier -->
+ <skill id="559" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Agility -->
+ <skill id="559" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Agility -->
+ <skill id="559" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Agility -->
+ <skill id="560" lvl="1" sp="100" itemId="2822"/> <!-- Rebirth Acumen -->
+ <skill id="560" lvl="2" sp="100" itemId="2822"/> <!-- Rebirth Acumen -->
+ <skill id="560" lvl="3" sp="100" itemId="2822"/> <!-- Rebirth Acumen -->
+</list>
\ No newline at end of file
Index: data/html/managers/rebirth-max.htm
===================================================================
--- data/html/managers/rebirth-max.htm (revision 0)
+++ data/html/managers/rebirth-max.htm (working copy)
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <center><font color="FF9900">Rebirth Manager</font></center>
+ <img src="L2UI.SquareWhite" width="280" height="1"><br>
+ &nbsp;You can't perform another rebirth. There's a maximum of<br1>
+ &nbsp;3 rebirths, that you've already reached.
+</body>
+</html>
\ No newline at end of file
Index: data/html/managers/rebirth-successfully.htm
===================================================================
--- data/html/managers/rebirth-successfully.htm (revision 0)
+++ data/html/managers/rebirth-successfully.htm (working copy)
@@ -0,0 +1,7 @@
+<html>
+<body>
+ <center><font color="FF9900">Rebirth Manager</font></center>
+ <img src="L2UI.SquareWhite" width="280" height="1"><br>
+ &nbsp;Your character has been reset successfully to level %level%.
+</body>
+</html>
\ No newline at end of file
Index: tools/database_installer.bat
===================================================================
--- tools/database_installer.bat (revision 4)
+++ tools/database_installer.bat (working copy)
@@ -69,6 +69,7 @@
 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_mail.sql
 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_quests.sql
 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_raid_points.sql
+%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_rebirths.sql
 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_recipebook.sql
 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_recommends.sql
 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/character_shortcuts.sql
Index: data/html/managers/rebirth.htm
===================================================================
--- data/html/managers/rebirth.htm (revision 0)
+++ data/html/managers/rebirth.htm (working copy)
@@ -0,0 +1,23 @@
+<html>
+<body>
+ <center><font color="FF9900">Rebirth Manager</font></center>
+ <img src="L2UI.SquareWhite" width="280" height="1"><br>
+ <table>
+ <tr>
+ <td>&nbsp;A rebirth can be performed to obtain a <font color="FF9900">book of rebirth</font>.<br1>
+ &nbsp;A character can perform 3 rebirths.<br></td>
+ </tr>
+ <tr>
+ <td>&nbsp;A <font color="FF9900">book of rebirth</font> can be used to create a Rebirth Cloak<br1>
+ &nbsp;(with extraordinary skills).<br></td>
+ </tr>
+ <tr>
+ <td>&nbsp;A rebirth is a new birth, again you will become a novice<br1>
+ &nbsp;player (lv %lv%), without any skills. You will keep your items.<br><br><br></td>
+ </tr>
+ <tr>
+ <td><center><a action="bypass -h npc_%objectId%_performRebirth">Perform a rebirth</a></center></td>
+ </tr>
+ </table>
+</body>
+</html>
\ No newline at end of file
Index: data/xml/npcs/npcs.xml
===================================================================
--- data/xml/npcs/npcs.xml (revision 4)
+++ data/xml/npcs/npcs.xml (working copy)
@@ -300199,4 +300199,36 @@
  <skill id="4416" level="16"/>
  </skills>
  </npc>
+ <npc id="50008" idTemplate="30523" name="Selenor" title="Rebirth Manager">
+ <set name="level" val="70"/>
+ <set name="radius" val="7.0"/>
+ <set name="height" val="16.5"/>
+ <set name="rHand" val="0"/>
+ <set name="lHand" val="0"/>
+ <set name="type" val="L2Rebirth"/>
+ <set name="exp" val="0"/>
+ <set name="sp" val="0"/>
+ <set name="hp" val="2444.46819"/>
+ <set name="mp" val="1345.8"/>
+ <set name="hpRegen" val="7.5"/>
+ <set name="mpRegen" val="2.7"/>
+ <set name="pAtk" val="688.86373"/>
+ <set name="pDef" val="700.91597"/>
+ <set name="mAtk" val="470.40463"/>
+ <set name="mDef" val="700.53847"/>
+ <set name="crit" val="4"/>
+ <set name="atkSpd" val="253"/>
+ <set name="str" val="22"/>
+ <set name="int" val="41"/>
+ <set name="dex" val="21"/>
+ <set name="wit" val="20"/>
+ <set name="con" val="27"/>
+ <set name="men" val="20"/>
+ <set name="corpseTime" val="7"/>
+ <set name="walkSpd" val="33"/>
+ <set name="runSpd" val="120"/>
+ <set name="dropHerbGroup" val="0"/>
+ <set name="attackRange" val="40"/>
+ <ai type="mage" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" clan="" clanRange="0" clanIgnore="" canMove="false" seedable="false"/>
+ </npc>
 </list>
Index: data/html/managers/rebirth-level.htm
===================================================================
--- data/html/managers/rebirth-level.htm (revision 0)
+++ data/html/managers/rebirth-level.htm (working copy)
@@ -0,0 +1,7 @@
+<html>
+<body>
+ <center><font color="FF9900">Rebirth Manager</font></center>
+ <img src="L2UI.SquareWhite" width="280" height="1"><br>
+ &nbsp;Sorry, your can't perform a rebirth if you're not level 78.
+</body>
+</html>
\ No newline at end of file

CitarCLIENTE:

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