Jump to content
  • 0

[Request] Rebirth System


Question

Posted

In frozen is rebirth system but you can't select skills

bypass -h custom_rebirth_requestrebirth

don't working. I need rebirth like in l2gold you can choose skills to rebirth.

I think you understand me, because my english is not very good, so please help me, THANKS!

4 answers to this question

Recommended Posts

  • 0
Posted

write down what U HAVE DONE ALREADY and in which part u have got a problem. Lines of code would be awesome

  • 0
Posted

/*
* 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.l2jfrozen.gameserver.model.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;

import com.l2jfrozen.Config;
import com.l2jfrozen.gameserver.datatables.SkillTable;
import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
import com.l2jfrozen.gameserver.datatables.xml.ExperienceData;
import com.l2jfrozen.gameserver.model.L2Skill;
import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
import com.l2jfrozen.gameserver.network.serverpackets.SocialAction;
import com.l2jfrozen.util.CloseUtil;
import com.l2jfrozen.util.database.L2DatabaseFactory;

/**
* <strong>This 'Custom Engine' was developed for L2J Forum Member 'sauron3256' on November 1st, 2008.</strong><br>
* <br>
* <strong>Quick Summary:</strong><br>
* This engine will grant the player special bonus skills at the cost of reseting him to level 1.<br>
* The -USER- can set up to X Rebirths, the skills received and their respective levels, and the item and price of each
* rebirth.<br>
* PLAYER's information is stored in an SQL Db under the table name: REBIRTH_MANAGER.<br>
* 
* @author <strong>Beetle and Shyla</strong>
*/
public class L2Rebirth
{

/** The current instance - static repeller. */
private static L2Rebirth _instance = null;

/** Basically, this will act as a cache so it doesnt have to read DB information on relog. */
private HashMap<Integer, Integer> _playersRebirthInfo = new HashMap<Integer, Integer>();

/**
 * Creates a new NON-STATIC instance.
 */
private L2Rebirth()
{
//Do Nothing ^_-
}

/**
 * Receives the non-static instance of the RebirthManager.
 *
 * @return single instance of L2Rebirth
 */
public static L2Rebirth getInstance()
{
	if(_instance == null)
	{
		_instance = new L2Rebirth();
	}
	return _instance;
}

/**
 * This is what it called from the Bypass Handler. (I think that's all thats needed here).
 *
 * @param player the player
 * @param command the command
 */
public void handleCommand(L2PcInstance player, String command)
{
	if(command.startsWith("custom_rebirth_requestrebirth"))
	{
		displayRebirthWindow(player);
	}
	else if(command.startsWith("custom_rebirth_confirmrequest"))
	{
		requestRebirth(player);
	}
}

/**
 * Display's an HTML window with the Rebirth Options.
 *
 * @param player the player
 */
public void displayRebirthWindow(L2PcInstance player)
{
	try
	{
		int currBirth = getRebirthLevel(player); //Returns the player's current birth level

		//Don't send html if player is already at max rebirth count.
		if(currBirth >= Config.REBIRTH_MAX)
		{
			player.sendMessage("You are currently at your maximum rebirth count!");
			return;
		}

		//Returns true if BASE CLASS is a mage.
		boolean isMage = player.getBaseTemplate().classId.isMage();
		//Returns the skill based on next Birth and if isMage.
		L2Skill skill = getRebirthSkill((currBirth + 1), isMage);

		String icon = "" + skill.getId();//Returns the skill's id.

		//Incase the skill is only 3 digits.
		if(icon.length() < 4)
		{
			icon = "0" + icon;
		}

		skill = null;
		icon = null;

	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
}

/**
 * Checks to see if the player is eligible for a Rebirth, if so it grants it and stores information.
 *
 * @param player the player
 */
public void requestRebirth(L2PcInstance player)
{
	//Check the player's level.
	if(player.getLevel() < Config.REBIRTH_MIN_LEVEL)
	{
		player.sendMessage("You do not meet the level requirement for a Rebirth!");
		return;
	}

	else if(player.isSubClassActive())
	{
		player.sendMessage("Please switch to your Main Class before attempting a Rebirth.");
		return;
	}

	int currBirth = getRebirthLevel(player);
	int itemNeeded = 0;
	int itemAmount = 0;

	if(currBirth >= Config.REBIRTH_MAX)
	{
		player.sendMessage("You are currently at your maximum rebirth count!");
		return;
	}

	//Get the requirements
	int loopBirth = 0;
	for(String readItems : Config.REBIRTH_ITEM_PRICE) {
		String[] currItem = readItems.split(",");
		if (loopBirth == currBirth) {
			itemNeeded = Integer.parseInt(currItem[0]);
			itemAmount = Integer.parseInt(currItem[1]);
			break;
		}
		loopBirth++;
	}

	//Their is an item required
	if(itemNeeded != 0)
	{
		//Checks to see if player has required items, and takes them if so.
		if(!playerIsEligible(player, itemNeeded, itemAmount))
			return;
	}

	//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);
}

/**
 * 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
	{
		double actual_hp = player.getCurrentHp();
		double actual_cp = player.getCurrentCp();

		int max_level = ExperienceData.getInstance().getMaxLevel();

		if(player.isSubClassActive())
		{
			max_level = Config.MAX_SUBCLASS_LEVEL;
		}

		//Protections
		Integer returnToLevel = Config.REBIRTH_RETURN_TO_LEVEL;
		if (returnToLevel < 1) 
			returnToLevel = 1; 
		if (returnToLevel > max_level) 
			returnToLevel = max_level;

		//Resets character to first class.
		player.setClassId(player.getBaseClass());

		player.broadcastUserInfo();

		final byte lvl = Byte.parseByte(returnToLevel+"");

		final long pXp = player.getStat().getExp();
		final long tXp = ExperienceData.getInstance().getExpForLevel(lvl);

		if(pXp > tXp)
		{
			player.getStat().removeExpAndSp(pXp - tXp, 0);
		}
		else if(pXp < tXp)
		{
			player.getStat().addExpAndSp(tXp - pXp, 0);
		}

		//Remove the player's current skills.
		for(L2Skill skill : player.getAllSkills())
		{
			player.removeSkill(skill);
		}
		//Give players their eligible skills.
		player.giveAvailableSkills();

		//restore Hp-Mp-Cp
		player.setCurrentCpDirect(actual_cp);
		player.setCurrentMpDirect(player.getMaxMp());
		player.setCurrentHpDirect(actual_hp);
		player.broadcastStatusUpdate();

		//Updates the player's information in the Character Database.
		player.store();

		if(firstBirth)
		{
			storePlayerBirth(player);
		}
		else
		{
			updatePlayerBirth(player, newBirthCount);
		}

		//Give the player his new Skills.
		grantRebirthSkills(player);


		//Displays a congratulation message to the player.
		displayCongrats(player);
		returnToLevel = null;
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
}

/**
 * Special effects when the player levels.
 *
 * @param player the player
 */
public void displayCongrats(L2PcInstance player)
{
	//Victory Social Action.
	player.setTarget(player);
	player.broadcastPacket(new SocialAction(player.getObjectId(), 3));
	player.sendMessage("Congratulations " + player.getName() + ". You have been REBORN!");
	player.sendMessage("You got the passive skill!");
}

/**
 * Check and verify the player DOES have the item required for a request. Also, remove the item if he has.
 *
 * @param player the player
 * @param itemId the item id
 * @param itemAmount the item amount
 * @return true, if successful
 */
public boolean playerIsEligible(L2PcInstance player, int itemId, int itemAmount)
{
	String itemName = ItemTable.getInstance().getTemplate(itemId).getName();
	L2ItemInstance itemNeeded = player.getInventory().getItemByItemId(itemId);

	if(itemNeeded == null || itemNeeded.getCount() < itemAmount)
	{
		player.sendMessage("You need atleast " + itemAmount + "  [ " + itemName + " ] to request a Rebirth!");
		return false;
	}

	//Player has the required items, so we're going to take them!
	player.getInventory().destroyItemByItemId("Rebirth Engine", itemId, itemAmount, player, null);
	player.sendMessage("Removed " + itemAmount + " " + itemName + " from your inventory!");

	itemName = null;
	itemNeeded = null;

	return true;
}

/**
 * Gives the available Bonus Skills to the player.
 *
 * @param player the player
 */
public void grantRebirthSkills(L2PcInstance player)
{
	//returns the current Rebirth Level
	int rebirthLevel = getRebirthLevel(player);
	//Returns true if BASE CLASS is a mage.
	boolean isMage = player.getBaseTemplate().classId.isMage();

	//Simply return since no bonus skills are granted.
	if(rebirthLevel == 0)
		return;

	  //Load the bonus skills unto the player.
	  CreatureSay rebirthText = null;
	  for(int i = 0; i < rebirthLevel; i++)
	  {
	   L2Skill bonusSkill = getRebirthSkill((i + 1), isMage);
	   player.addSkill(bonusSkill, false);
	  }
}
/**
 * Return the player's current Rebirth Level.
 *
 * @param player the player
 * @return the rebirth level
 */
public int getRebirthLevel(L2PcInstance player)
{
	int playerId = player.getObjectId();

	if(_playersRebirthInfo.get(playerId) == null)
	{
		loadRebirthInfo(player);
	}

	return _playersRebirthInfo.get(playerId);
}

/**
 * Return the L2Skill the player is going to be rewarded.
 *
 * @param rebirthLevel the rebirth level
 * @param mage the mage
 * @return the rebirth skill
 */
public L2Skill getRebirthSkill(int rebirthLevel, boolean mage)
{
	L2Skill skill = null;

	//Player is a Mage.
	if(mage)
	{	
		int loopBirth = 0;
		for(String readSkill : Config.REBIRTH_MAGE_SKILL) {
			String[] currSkill = readSkill.split(",");
			if (loopBirth == (rebirthLevel-1)) {
				skill = SkillTable.getInstance().getInfo(Integer.parseInt(currSkill[0]), Integer.parseInt(currSkill[1]));
				break;
			}
			loopBirth++;
		}
	}
	//Player is a Fighter.
	else
	{
		int loopBirth = 0;
		for(String readSkill : Config.REBIRTH_FIGHTER_SKILL) {
			String[] currSkill = readSkill.split(",");
			if (loopBirth == (rebirthLevel-1)) {
				skill = SkillTable.getInstance().getInfo(Integer.parseInt(currSkill[0]), Integer.parseInt(currSkill[1]));
				break;
			}
			loopBirth++;
		}
	}
	return skill;
}

/**
 * Database caller to retrieve player's current Rebirth Level.
 *
 * @param player the player
 */
public void loadRebirthInfo(L2PcInstance player)
{
	int playerId = player.getObjectId();
	int rebirthCount = 0;

	Connection con = null;
	try
	{
		ResultSet rset;
		con = L2DatabaseFactory.getInstance().getConnection(false);
		PreparedStatement statement = con.prepareStatement("SELECT * FROM `rebirth_manager` WHERE playerId = ?");
		statement.setInt(1, playerId);
		rset = statement.executeQuery();

		while(rset.next())
		{
			rebirthCount = rset.getInt("rebirthCount");
		}

		rset.close();
		statement.close();
		statement = null;
		rset = null;

	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	finally
	{
		CloseUtil.close(con);
		con = null;
	}
	_playersRebirthInfo.put(playerId, rebirthCount);
}

/**
 * Stores the player's information in the DB.
 *
 * @param player the player
 */
public void storePlayerBirth(L2PcInstance player)
{
	Connection con = null;
	try
	{
		con = L2DatabaseFactory.getInstance().getConnection(false);
		PreparedStatement statement = con.prepareStatement("INSERT INTO `rebirth_manager` (playerId,rebirthCount) VALUES (?,1)");
		statement.setInt(1, player.getObjectId());
		statement.execute();
		statement = null;

		_playersRebirthInfo.put(player.getObjectId(), 1);

	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	finally
	{
		CloseUtil.close(con);
		con = null;
	}
}

/**
 * Updates the player's information in the DB.
 *
 * @param player the player
 * @param newRebirthCount the new rebirth count
 */
public void updatePlayerBirth(L2PcInstance player, int newRebirthCount)
{
	Connection con = null;
	try
	{
		int playerId = player.getObjectId();

		con = L2DatabaseFactory.getInstance().getConnection(false);
		PreparedStatement statement = con.prepareStatement("UPDATE `rebirth_manager` SET rebirthCount = ? WHERE playerId = ?");
		statement.setInt(1, newRebirthCount);
		statement.setInt(2, playerId);
		statement.execute();
		statement = null;

		_playersRebirthInfo.put(playerId, newRebirthCount);
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	finally
	{
		CloseUtil.close(con);
		con = null;
	}
}
}

 

as i understand in npc need put this custom_rebirth_requestrebirth to popout window with skill choose, but this don't working, working only custom_rebirth_confirmrequest

Guest
This topic is now closed to further replies.


  • Posts

    • So dont plat that waste time&money server.   GM promises pie in the sky, but does nothing. It's all about money, money, money. And wipe.   SCAM server!
    • I'm looking for someone to remove GameGuard from a game that uses XTRAP. The game no longer uses XTRAP. I have a game server. But the client is kicked from the game after a few minutes of logging in. If I try to remove XTRAP (just by deleting it), the game opens and closes quickly.   Send me a PM. The game is Audition, a dance game.
    • 🎉 L2Dead StuckSub - GRAND OPENING 14 February 2026🎉 After beta, testing, mistakes, laughs and a lot of PvP, the moment has finally come. L2Dead StuckSub is officially opening its gates on 14 February 2026.   ⚔️What to expect: ✦Main Class +6 Stuck Sub system ✦Balanced PvP & custom party farm areas ✦Custom events, bosses and strong rewards ✦Competitive clan scene with castle rewards   📌Until the opening: ✦Create your clans and register them in the Clan-Register channel ✦Invite your friends / old parties / CPs ✦Stay tuned for more information (rates, events, siege times, etc.)   Get your setups ready, prepare your macros and your Discord/voice. On 14 February 2026 20:00 GMT+2, we write the first chapter of L2Dead together. 🔥 https://www.l2dead.com/ https://discord.gg/TGnATuZmdt
    • Here’s the **clean, L2jAcis-style way** to make **Auto Loot work ONLY for Premium players** on **Interlude**.   I’ll give you **two options** — pick what fits your server philosophy.   ---   ## ✅ OPTION 1 (BEST PRACTICE): Premium-Only Auto Loot (Code-based)   ### 🔹 Step 1: Add config option   **`config/Premium.properties`**   ```properties # Enable auto loot only for premium players PremiumAutoLoot = True ```   ---   ### 🔹 Step 2: Read config   **`Config.java`**   ```java public static boolean PREMIUM_AUTO_LOOT; ```   Load it:   ```java PREMIUM_AUTO_LOOT = Premium.getProperty("PremiumAutoLoot", false); ```   ---   ### 🔹 Step 3: Modify drop handling   **File:**   ``` net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance ```   Find **dropItems()** or **doItemDrop()** Replace / modify logic like this:   ```java if (player != null && player.isPremium() && Config.PREMIUM_AUTO_LOOT) {     for (ItemInstance item : items)         player.getInventory().addItem("AutoLoot", item, player, this); } else {     for (ItemInstance item : items)         dropItem(player, item); } ```   ✅ Result:   * **Premium players** → instant loot * **Normal players** → loot on ground   ---   ## ✅ OPTION 2: Auto Loot via Character Variable (More Flexible)   Useful if you want **GM control** per character.   ### 🔹 Premium activation   When premium is added:   ```java player.setVar("AUTO_LOOT", "1"); ```   ### 🔹 Drop check   ```java if (player != null && player.getVarB("AUTO_LOOT")) {     player.addItem("AutoLoot", item, player, true); } else {     dropItem(player, item); } ```   ---   ## 🎯 BONUS (Recommended Add-Ons)   ### 🔸 Adena always auto-loot (even non-premium)   ```java if (item.getItemId() == 57) {     player.addAdena("Loot", item.getCount(), this, true);     continue; } ```   ### 🔸 Party check (premium leader only)   ```java player.isInParty() && player.getParty().getLeader().isPremium() ```   ---   ## ⚠️ Notes (Interlude Safe)   ✔ Compatible with **L2jAcis Interlude** ✔ No client-side changes ✔ No exploit risk ✔ Retail-like behavior   ---      
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..