Jump to content

Balancer For Acis


te0x

Recommended Posts

This is the balancer that exists on L2JHellas adapted for aCis ;p

I saw a guy that was looking for this some hours ago and i give a try on this :)

 

 

create a new package Extensions.Balancer

inside create this 3 files

/*
 * 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 Extensions.Balancer;

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

import net.sf.l2j.L2DatabaseFactory;

/**
 * @author Anarchy
 */
public class BalanceLoad
{
	public static int[] Evasion = new int[31], Accuracy = new int[31], Speed = new int[31], PAtk = new int[31],
			MAtk = new int[31], PDef = new int[31], MDef = new int[31], HP = new int[31], CP = new int[31],
			MP = new int[31], MAtkSpd = new int[31], PAtkSpd = new int[31];

	public static void LoadEm()
	{
		int z;

		for (z = 0; z < 31; z++)
		{
			Evasion[z] = loadEvasion(88 + z);
			Speed[z] = loadSpeed(z + 88);
			MAtk[z] = loadMAtk(z + 88);
			PAtk[z] = loadPAtk(z + 88);
			PDef[z] = loadPDef(z + 88);
			MDef[z] = loadMDef(z + 88);
			HP[z] = loadHP(z + 88);
			CP[z] = loadCP(z + 88);
			MP[z] = loadMP(z + 88);
			MAtkSpd[z] = loadMAtkSpd(z + 88);
			PAtkSpd[z] = loadPAtkSpd(z + 88);
		}

	}

	public static int loadEvasion(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT ev FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("ev");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}
		return i;
	}

	public static int loadAccuracy(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT acc FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("acc");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}
		return i;
	}

	public static int loadSpeed(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT walk FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("walk");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}
		return i;
	}

	public static int loadPAtk(int classId)
	{
		int i = 0;
		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT patk FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("patk");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}
		return i;
	}

	public static int loadMAtk(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT matk FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("matk");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}
		return i;
	}

	public static int loadPDef(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT pdef FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("pdef");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}

	public static int loadMDef(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT mdef FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("mdef");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}

	public static int loadHP(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT hp FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("hp");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}

	public static int loadCP(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT cp FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("cp");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}

	public static int loadMP(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT mp FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("mp");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}

	public static int loadMAtkSpd(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT matksp FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("matksp");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}

	public static int loadPAtkSpd(int classId)
	{
		int i = 0;

		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement stm = con.prepareStatement("SELECT patksp FROM balance WHERE class_id=" + classId);
			ResultSet rset = stm.executeQuery();

			if (rset.next())
			{
				i = rset.getInt("patksp");
			}

			stm.close();
		}
		catch (Exception e)
		{
			System.err.println("Error while loading balance stats from database.");
			e.printStackTrace();
		}

		return i;
	}
}
/*
 * 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 Extensions.Balancer;

import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;

public class Balancer implements IAdminCommandHandler
{
	private static final String[] ADMIN_COMMANDS =
	{
		"admin_balance"
	};

	@Override
	public boolean useAdminCommand(String command, L2PcInstance activeChar)
	{
		if (command.equals("admin_balance") && activeChar.isGM())
		{
			NpcHtmlMessage htm = new NpcHtmlMessage(0);
			htm.setFile("./data/html/admin/balance/main.htm");
			activeChar.sendPacket(htm);
		}
		return true;
	}

	public static void sendBalanceWindow(int classId, L2PcInstance p)
	{
		NpcHtmlMessage htm = new NpcHtmlMessage(0);
		htm.setFile("./data/html/admin/balance/balance.htm");
		
		htm.replace("%classId%", classId + "");
		htm.replace("%Patk%", BalanceLoad.loadPAtk(classId) + "");
		htm.replace("%Matk%", BalanceLoad.loadMAtk(classId) + "");
		htm.replace("%Pdef%", BalanceLoad.loadPDef(classId) + "");
		htm.replace("%Mdef%", BalanceLoad.loadMDef(classId) + "");
		htm.replace("%Acc%", BalanceLoad.loadAccuracy(classId) + "");
		htm.replace("%Eva%", BalanceLoad.loadEvasion(classId) + "");
		htm.replace("%AtkSp%", BalanceLoad.loadPAtkSpd(classId) + "");
		htm.replace("%CastSp%", BalanceLoad.loadMAtkSpd(classId) + "");
		htm.replace("%Cp%", BalanceLoad.loadCP(classId) + "");
		htm.replace("%Hp%", BalanceLoad.loadHP(classId) + "");
		htm.replace("%Mp%", BalanceLoad.loadMP(classId) + "");
		htm.replace("%Speed%", BalanceLoad.loadSpeed(classId) + "");
		
		p.sendPacket(htm);
	}

	@Override
	public String[] getAdminCommandList()
	{
		return ADMIN_COMMANDS;
	}
}
/*
 * 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 Extensions.Balancer;

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

import net.sf.l2j.L2DatabaseFactory;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
import net.sf.l2j.gameserver.network.serverpackets.UserInfo;

public class BalancerEdit
{
	public static void editStat(String stat, int classId, int value, boolean add)
	{
		switch (stat)
		{
			case "patk":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET patk=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT patk FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("patk") + value);
							BalanceLoad.PAtk[classId - 88] = BalanceLoad.PAtk[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("patk") - value);
							BalanceLoad.PAtk[classId - 88] = BalanceLoad.PAtk[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "matk":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET matk=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT matk FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("matk") + value);
							BalanceLoad.MAtk[classId - 88] = BalanceLoad.MAtk[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("matk") - value);
							BalanceLoad.MAtk[classId - 88] = BalanceLoad.MAtk[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "pdef":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET pdef=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT pdef FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("pdef") + value);
							BalanceLoad.PDef[classId - 88] = BalanceLoad.PDef[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("pdef") - value);
							BalanceLoad.PDef[classId - 88] = BalanceLoad.PDef[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "mdef":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET mdef=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT mdef FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("mdef") + value);
							BalanceLoad.MDef[classId - 88] = BalanceLoad.MDef[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("mdef") - value);
							BalanceLoad.MDef[classId - 88] = BalanceLoad.MDef[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "acc":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET acc=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT acc FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("acc") + value);
							BalanceLoad.Accuracy[classId - 88] = BalanceLoad.Accuracy[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("acc") - value);
							BalanceLoad.Accuracy[classId - 88] = BalanceLoad.Accuracy[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "ev":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET ev=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT ev FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("ev") + value);
							BalanceLoad.Evasion[classId - 88] = BalanceLoad.Evasion[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("ev") - value);
							BalanceLoad.Evasion[classId - 88] = BalanceLoad.Evasion[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "patksp":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET patksp=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT patksp FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("patksp") + value);
							BalanceLoad.PAtkSpd[classId - 88] = BalanceLoad.PAtkSpd[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("patksp") - value);
							BalanceLoad.PAtkSpd[classId - 88] = BalanceLoad.PAtkSpd[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "matksp":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET matksp=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT matksp FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("matksp") + value);
							BalanceLoad.MAtkSpd[classId - 88] = BalanceLoad.MAtkSpd[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("matksp") - value);
							BalanceLoad.MAtkSpd[classId - 88] = BalanceLoad.MAtkSpd[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "cp":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET cp=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT cp FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("cp") + value);
							BalanceLoad.CP[classId - 88] = BalanceLoad.CP[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("cp") - value);
							BalanceLoad.CP[classId - 88] = BalanceLoad.CP[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "hp":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET hp=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT hp FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("hp") + value);
							BalanceLoad.HP[classId - 88] = BalanceLoad.HP[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("hp") - value);
							BalanceLoad.HP[classId - 88] = BalanceLoad.HP[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "mp":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET mp=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT mp FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("mp") + value);
							BalanceLoad.MP[classId - 88] = BalanceLoad.MP[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("mp") - value);
							BalanceLoad.MP[classId - 88] = BalanceLoad.MP[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
			case "walk":
			{
				try (Connection con = L2DatabaseFactory.getInstance().getConnection())
				{
					PreparedStatement stm = con.prepareStatement("UPDATE balance SET walk=? WHERE class_id=?");
					PreparedStatement stm2 = con.prepareStatement("SELECT walk FROM balance WHERE class_id=" + classId);
					ResultSet rset = stm2.executeQuery();

					if (rset.next())
					{
						if (add)
						{
							stm.setInt(1, rset.getInt("walk") + value);
							BalanceLoad.Speed[classId - 88] = BalanceLoad.Speed[classId - 88] + value;
						}
						else
						{
							stm.setInt(1, rset.getInt("walk") - value);
							BalanceLoad.Speed[classId - 88] = BalanceLoad.Speed[classId - 88] - value;
						}
						stm.setInt(2, classId);
					}

					stm.execute();
					stm.close();
					stm2.close();
				}
				catch (Exception e)
				{
					System.err.println("Error while saving balance stats to database.");
					e.printStackTrace();
				}
				for (L2PcInstance p : L2World.getInstance().getAllPlayers().values())
				{
					if (p.getClassId().getId() == classId)
					{
						p.sendPacket(new UserInfo(p));
					}
				}
				break;
			}
		}
	}

	public void sendBalanceWindow(int classId, L2PcInstance p)
	{
		NpcHtmlMessage htm = new NpcHtmlMessage(0);
		htm.setFile("./data/html/admin/balance/balance.htm");
		htm.replace("%classId%", classId + "");

		p.sendPacket(htm);
	}
}

now in the CharStat.java

-	public int getEvasionRate(L2Character target)
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.EVASION_RATE, 0, target, null);
-	}

+	public int getEvasionRate(L2Character target)
+	{
+		if (_activeChar == null)
+			return 1;
+
+		double val = (calcStat(Stats.EVASION_RATE, 0, target, null));
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.Evasion[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getAccuracy()
-	{
-		if (_activeChar == null)
-			return 0;
-		
-		return (int) calcStat(Stats.ACCURACY_COMBAT, 0, null, null);
-	}

+	public int getAccuracy()
+	{
+		if (_activeChar == null)
+			return 0;
+
+		double val = (calcStat(Stats.ACCURACY_COMBAT, 0, null, null));
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.Accuracy[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val > 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getMaxHp()
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.MAX_HP, _activeChar.getTemplate().getBaseHpMax(), null, null);
-	}
-	
-	public int getMaxCp()
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.MAX_CP, _activeChar.getTemplate().getBaseCpMax(), null, null);
-	}
-	
-	public int getMaxMp()
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.MAX_MP, _activeChar.getTemplate().getBaseMpMax(), null, null);
-	}

+	public int getMaxHp()
+	{
+		if (_activeChar == null)
+			return 1;
+
+		double val = calcStat(Stats.MAX_HP, _activeChar.getTemplate().getBaseHpMax(), null, null);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.HP[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val > 0)
+			return (int) val;
+		else
+			return 0;
+	}
+	
+	public int getMaxCp()
+	{
+		if (_activeChar == null)
+			return 1;
+
+		double val = calcStat(Stats.MAX_CP, _activeChar.getTemplate().getBaseCpMax(), null, null);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.CP[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+	}
+	
+	public int getMaxMp()
+	{
+		if (_activeChar == null)
+			return 1;
+
+		double val = calcStat(Stats.MAX_MP, _activeChar.getTemplate().getBaseMpMax(), null, null);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.MP[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getMAtk(L2Character target, L2Skill skill)
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		double attack = _activeChar.getTemplate().getBaseMAtk() * ((_activeChar.isChampion()) ? Config.CHAMPION_ATK : 1);
-		
-		// Add the power of the skill to the attack effect
-		if (skill != null)
-			attack += skill.getPower();
-		
-		// Calculate modifiers Magic Attack
-		return (int) calcStat(Stats.MAGIC_ATTACK, attack, target, skill);
-	}

+	public int getMAtk(L2Character target, L2Skill skill)
+	{
+		if (_activeChar == null)
+			return 1;
+		
+		double attack = _activeChar.getTemplate().getBaseMAtk() * ((_activeChar.isChampion()) ? Config.CHAMPION_ATK : 1);
+		
+		// Add the power of the skill to the attack effect
+		if (skill != null)
+			attack += skill.getPower();
+		
+		// Calculate modifiers Magic Attack
+		double val = calcStat(Stats.MAGIC_ATTACK, attack, target, skill);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.MAtk[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+
+		}
+		if (val > 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getMAtkSpd()
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.MAGIC_ATTACK_SPEED, 333.0 * ((_activeChar.isChampion()) ? Config.CHAMPION_SPD_ATK : 1), null, null);
-	}

+	public int getMAtkSpd()
+	{
+		if (_activeChar == null)
+			return 1;
+		float bonusSpdAtk = 1;
+		if (_activeChar.isChampion())
+		{
+			bonusSpdAtk = (float) Config.CHAMPION_SPD_ATK;
+		}
+		double val = calcStat(Stats.MAGIC_ATTACK_SPEED, 330.0 * bonusSpdAtk, null, null);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.MAtkSpd[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getMDef(L2Character target, L2Skill skill)
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		// Calculate modifiers Magic Attack
-		return (int) calcStat(Stats.MAGIC_DEFENCE, _activeChar.getTemplate().getBaseMDef() * ((_activeChar.isRaid()) ? Config.RAID_DEFENCE_MULTIPLIER : 1), target, skill);
-	}

+	public int getMDef(L2Character target, L2Skill skill)
+	{
+		if (_activeChar == null)
+			return 1;
+
+		// Get the base MDef of the L2Character
+		double defence = _activeChar.getTemplate().getBaseMDef();
+
+		// Calculate modifier for Raid Bosses
+		if (_activeChar.isRaid())
+		{
+			defence *= Config.RAID_DEFENCE_MULTIPLIER;
+		}
+
+		// Calculate modifiers Magic Attack
+		double val = calcStat(Stats.MAGIC_DEFENCE, defence, target, skill);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.MDef[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getPAtk(L2Character target)
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.POWER_ATTACK, _activeChar.getTemplate().getBasePAtk() * ((_activeChar.isChampion()) ? Config.CHAMPION_ATK : 1), target, null);
-	}

+	public int getPAtk(L2Character target)
+	{
+		if (_activeChar == null)
+			return 1;
+		float bonusAtk = 1;
+		if (_activeChar.isChampion())
+		{
+			bonusAtk = (float) Config.CHAMPION_ATK;
+		}
+		double val = calcStat(Stats.POWER_ATTACK, _activeChar.getTemplate().getBasePAtk() * bonusAtk, target, null);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.PAtk[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getPAtkSpd()
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().getBasePAtkSpd() * ((_activeChar.isChampion()) ? Config.CHAMPION_SPD_ATK : 1), null, null);
-	}

+	public int getPAtkSpd()
+	{
+		if (_activeChar == null)
+			return 1;
+		float bonusAtk = 1;
+		if (_activeChar.isChampion())
+		{
+			bonusAtk = (float) Config.CHAMPION_SPD_ATK;
+		}
+		double val = (calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().getBasePAtkSpd() * bonusAtk, null, null));
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.PAtkSpd[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val > 0)
+			return (int) val;
+		else
+			return 0;
+	}
-	public int getPDef(L2Character target)
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.POWER_DEFENCE, _activeChar.getTemplate().getBasePDef() * ((_activeChar.isRaid()) ? Config.RAID_DEFENCE_MULTIPLIER : 1), target, null);
-	}

+	public int getPDef(L2Character target)
+	{
+		if (_activeChar == null)
+			return 1;
+
+		// Get the base PDef of the L2Character
+		double defence = _activeChar.getTemplate().getBasePDef();
+
+		// Calculate modifier for Raid Bosses
+		if (_activeChar.isRaid())
+		{
+			defence *= Config.RAID_DEFENCE_MULTIPLIER;
+		}
+
+		// Calculate modifiers Magic Attack
+		double val = calcStat(Stats.POWER_DEFENCE, defence, target, null);
+		if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+		{
+			val += BalanceLoad.PDef[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+		}
+		if (val >= 0)
+			return (int) val;
+		else
+			return 0;
+
+	}
-	public int getRunSpeed()
-	{
-		if (_activeChar == null)
-			return 1;
-		
-		return (int) calcStat(Stats.RUN_SPEED, _activeChar.getTemplate().getBaseRunSpd(), null, null);
-	}

+	public int getRunSpeed()
+	{
+		if (_activeChar == null)
+			return 1;
+
+		double val = (calcStat(Stats.RUN_SPEED, _activeChar.getTemplate().getBaseRunSpd(), null, null));
+		if (_activeChar instanceof L2PcInstance)
+		{
+			if (_activeChar instanceof L2PcInstance && ((L2PcInstance) _activeChar).getClassId().getId() >= 88)
+			{
+				val += BalanceLoad.Speed[((L2PcInstance) _activeChar).getClassId().getId() - 88];
+			}
+			if (val > 0)
+				return (int) val;
+			else
+				return 0;
+		}
+		return (int) val;
+	}

now in RequestBypassToServer.java

			else if (_command.startsWith("Quest "))
			{
				if (!activeChar.validateBypass(_command))
					return;
				
				String[] str = _command.substring(6).trim().split(" ", 2);
				if (str.length == 1)
					activeChar.processQuestEvent(str[0], "");
				else
					activeChar.processQuestEvent(str[0], str[1]);
			}

+			else if (_command.startsWith("bp_balance"))
+			{
+				String bp = _command.substring(11);
+				StringTokenizer st = new StringTokenizer(bp);
+				
+				if (st.countTokens() != 1)
+				{
+					return;
+				}
+				
+				int classId = Integer.parseInt(st.nextToken());
+				
+				Balancer.sendBalanceWindow(classId, activeChar);
+			}
+			
+			else if (_command.startsWith("bp_add"))
+			{
+				String bp = _command.substring(7);
+				StringTokenizer st = new StringTokenizer(bp);
+				
+				if (st.countTokens() != 3)
+				{
+					return;
+				}
+				
+				String stat = st.nextToken();
+				int classId = Integer.parseInt(st.nextToken()),
+					value = Integer.parseInt(st.nextToken());
+				
+				BalancerEdit.editStat(stat, classId, value, true);
+				
+				Balancer.sendBalanceWindow(classId, activeChar);
+			}
+			
+			else if (_command.startsWith("bp_rem"))
+			{
+				String bp = _command.substring(7);
+				StringTokenizer st = new StringTokenizer(bp);
+				
+				if (st.countTokens() != 3)
+				{
+					return;
+				}
+				
+				String stat = st.nextToken();
+				int classId = Integer.parseInt(st.nextToken()),
+					value = Integer.parseInt(st.nextToken());
+				
+				BalancerEdit.editStat(stat, classId, value, false);
+				
+				Balancer.sendBalanceWindow(classId, activeChar);
+			}

now in AdminAdmin.java

		else if (command.startsWith("admin_reload"))
		{
			StringTokenizer st = new StringTokenizer(command);
			st.nextToken();
			try
			{
				String type = st.nextToken();
				if (type.startsWith("acar"))
				{
					AdminCommandAccessRights.getInstance().reload();
					activeChar.sendMessage("Admin commands rights have been reloaded.");
				}
		+		else if (type.equals("balancer"))
		+		{
		+			BalanceLoad.LoadEm();
		+			activeChar.sendMessage("Balance stats for classes has been reloaded.");
		+		}

in AdminCommandHandler.java

+ registerAdminCommandHandler(new Balancer());

GameServer.java

+BalanceLoad.LoadEm();

sql part

/*
Navicat MySQL Data Transfer

Source Server         : localhost_3306
Source Server Version : 50524
Source Host           : localhost:3306
Source Database       : acis

Target Server Type    : MYSQL
Target Server Version : 50524
File Encoding         : 65001

Date: 2014-10-21 16:57:29
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `balance`
-- ----------------------------
DROP TABLE IF EXISTS `balance`;
CREATE TABLE `balance` (
  `class_id` smallint(6) NOT NULL DEFAULT '0',
  `patk` smallint(6) NOT NULL DEFAULT '0',
  `matk` smallint(6) NOT NULL DEFAULT '0',
  `pdef` smallint(6) NOT NULL DEFAULT '0',
  `mdef` smallint(6) NOT NULL DEFAULT '0',
  `acc` smallint(6) NOT NULL DEFAULT '0',
  `ev` smallint(6) NOT NULL DEFAULT '0',
  `patksp` smallint(6) NOT NULL DEFAULT '0',
  `matksp` smallint(6) NOT NULL DEFAULT '0',
  `cp` smallint(6) NOT NULL DEFAULT '0',
  `hp` smallint(6) NOT NULL DEFAULT '0',
  `mp` smallint(6) NOT NULL DEFAULT '0',
  `walk` smallint(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPRESSED COMMENT='L2jHellas Table';

-- ----------------------------
-- Records of balance
-- ----------------------------
INSERT INTO `balance` VALUES ('88', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('89', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('90', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('91', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('92', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('93', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('94', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('95', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('96', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('97', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('98', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('99', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('101', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('102', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('103', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('104', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('105', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('106', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('107', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('108', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('109', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('110', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('111', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('112', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('113', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('114', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('115', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('116', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('117', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO `balance` VALUES ('118', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');

html part. Create a new folder html/admin/balance

2 files inside

balance.htm

<html><title>Balance Menu</title><body>
<center><edit var="value" width=50 height=20 type=number>
<br><font color="FF6600">Edit the stats here.</font><br1><br1>
<table width="300" height="20">
<tr>
<td align="center" width="75">Stat.</td>
<td align="center" width="75">Default:0</td>
<td align="center" width="75"></td>
<td align="center" width="75"></td>
</tr>
<tr>
<td align="center" width="75">Patk</td>
<td align="center" width="75">%Patk%</td>
<td align="center" width="75"><a action="bypass bp_add patk %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem patk %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Matk</td>
<td align="center" width="75">%Matk%</td>
<td align="center" width="75"><a action="bypass bp_add matk %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem matk %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Pdef</td>
<td align="center" width="75">%Pdef%</td>
<td align="center" width="75"><a action="bypass bp_add pdef %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem pdef %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Mdef</td>
<td align="center" width="75">%Mdef%</td>
<td align="center" width="75"><a action="bypass bp_add mdef %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem mdef %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Acc</td>
<td align="center" width="75">%Acc%</td>
<td align="center" width="75"><a action="bypass bp_add acc %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem acc %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Eva</td>
<td align="center" width="75">%Eva%</td>
<td align="center" width="75"><a action="bypass bp_add ev %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem ev %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">AtkSp</td>
<td align="center" width="75">%AtkSp%</td>
<td align="center" width="75"><a action="bypass bp_add patksp %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem patksp %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">CastSp</td>
<td align="center" width="75">%CastSp%</td>
<td align="center" width="75"><a action="bypass bp_add matksp %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem matksp %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Cp</td>
<td align="center" width="75">%Cp%</td>
<td align="center" width="75"><a action="bypass bp_add cp %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem cp %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Hp</td>
<td align="center" width="75">%Hp%</td>
<td align="center" width="75"><a action="bypass bp_add hp %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem hp %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Mp</td>
<td align="center" width="75">%Mp%</td>
<td align="center" width="75"><a action="bypass bp_add mp %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem mp %classId% $value">Remove</a></td>
</tr>
<tr>
<td align="center" width="75">Speed</td>
<td align="center" width="75">%Speed%</td>
<td align="center" width="75"><a action="bypass bp_add walk %classId% $value">Add</a></td>
<td align="center" width="75"><a action="bypass bp_rem walk %classId% $value">Remove</a></td>
</tr>
</table><br><a action="bypass -h admin_balance">Back</a>
</center>
</body></html>

main.htm

<html><title>Balance class select Menu</title><body>
<center><font color="FF6600">Choose the 3rd class stats to edit.</font><br1>
<table width="300" height="20">
<tr>
<td align="center" width="75"><a action="bypass bp_balance 88">Duelist</a></td>
<td align="center" width="75"><a action="bypass bp_balance 89">DreadNought</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 90">Phoenix Knight</a></td>
<td align="center" width="75"><a action="bypass bp_balance 91">Hell Knight</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 92">Sagittarius</a></td>
<td align="center" width="75"><a action="bypass bp_balance 93">Adventurer</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 94">Archmage</a></td>
<td align="center" width="75"><a action="bypass bp_balance 95">Soultaker</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 96">Arcana Lord</a></td>
<td align="center" width="75"><a action="bypass bp_balance 97">Cardinal</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 98">Hierophant</a></td>
<td align="center" width="75"><a action="bypass bp_balance 99">Eva Templar</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 100">Sword Muse</a></td>
<td align="center" width="75"><a action="bypass bp_balance 101">Wind Rider</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 102">Moonlight Sentinel</a></td>
<td align="center" width="75"><a action="bypass bp_balance 103">Mystic Muse</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 104">Elemental Master</a></td>
<td align="center" width="75"><a action="bypass bp_balance 105">Eva Saint</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 106">Shillien Templar</a></td>
<td align="center" width="75"><a action="bypass bp_balance 107">Spectral Dancer</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 108">Ghost Hunter</a></td>
<td align="center" width="75"><a action="bypass bp_balance 109">Ghost Sentinel</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 110">Storm Screamer</a></td>
<td align="center" width="75"><a action="bypass bp_balance 111">Spectral Master</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 112">Shillen Saint</a></td>
<td align="center" width="75"><a action="bypass bp_balance 113">Titan</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 114">Grand Khauatari</a></td>
<td align="center" width="75"><a action="bypass bp_balance 115">Dominator</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 116">Doomcryer</a></td>
<td align="center" width="75"><a action="bypass bp_balance 117">Fortune Seeker</a></td>
</tr>
<tr>
<td align="center" width="75"><a action="bypass bp_balance 118">Maestro</a></td>
</tr>
</table>
</center>
</body></html>

and the last register the command in admin_commands_rights.xml

<aCar name="admin_balance" accessLevel="1" />
Link to comment
Share on other sites

great share !thanks for help!

you know how to use that code? because that code if you change in game the stats patk from duelist for example, after server restart status need again edit

Link to comment
Share on other sites

you will have a balanced server now

if you are talking with irony i actually do not care if with this you can make a balanced server, i just shared it for this guy.

 

you know how to use that code? because that code if you change in game the stats patk from duelist for example, after server restart status need again edit

After the restart the stats remain i tested it.

Link to comment
Share on other sites

if you are talking with irony i actually do not care if with this you can make a balanced server, i just shared it for this guy.

 

After the restart the stats remain i tested it.

are you sure about that? if the stats remain after restart is realy good. but i have test the code from hellas to l2j freya pack and doesnt work. after a restart if i login in game again the stats not exists. on database exists but in game not..

Link to comment
Share on other sites

are you sure about that? if the stats remain after restart is realy good. but i have test the code from hellas to l2j freya pack and doesnt work. after a restart if i login in game again the stats not exists. on database exists but in game not..

they do remain in the game too, i tested it and i saw that everything its okey. i removed the addition that i had added and i lost the bonus normally

 

ps. i just tested it again and the bonus remains 100%.

Edited by te0x
Link to comment
Share on other sites

make your server heavier and then hire a man like me to fix your bugs!

bye when the time comes send me a PM

My friend was asking from you to fix a bug on scoria files and he told me u fixed nothing :P

Link to comment
Share on other sites

Every one is speaking "I can fix bug", such a cliche .. Maybe some of you are mad that the "guy" that will use that code did not bought it from you?

Nevermight... First of all this code is not a "Balancer" since you can give 1000 HP to mages for example but this will not solve your problems with the well known archer servers... And etc.. This is just a simple "Stats Editor" that will help you manage the characters stats faster. But will kill some of the performance of  the server. It is easier to create new skill, put it to passives and there add the stats that you want. And that will not hurt the server's performance at all :)

 

How ever Thank you for your share! Much of the "New maxcheaters" community members will forget to say it :)

Link to comment
Share on other sites

Every one is speaking "I can fix bug", such a cliche .. Maybe some of you are mad that the "guy" that will use that code did not bought it from you?

Nevermight... First of all this code is not a "Balancer" since you can give 1000 HP to mages for example but this will not solve your problems with the well known archer servers... And etc.. This is just a simple "Stats Editor" that will help you manage the characters stats faster. But will kill some of the performance of  the server. It is easier to create new skill, put it to passives and there add the stats that you want. And that will not hurt the server's performance at all :)

 

How ever Thank you for your share! Much of the "New maxcheaters" community members will forget to say it :)

That's the name that they called it. I agree with you, the passive skills are way better than this since you can edit everything cAtk, pvpPhysicalDam, abosrbDam, etc. Stats that you cannot change with this.

anyway i just shared it since some ppl was searching for this :)

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now



  • Posts

    • After 12 years after our first launch of Frintezza, we are not the young men and women anymore, a lot of us have jobs, family, kids, or something else that doesn't allow us to play this game the amount of time that we used to have, but we still want to play this wonderful game once again. In this order of ideas, this is why we have thought of a battery of customizations to the OFF files in order to bring you a great quality of game and at the same time, make it more enjoyable at the time of sitting down to play it. These quality of life improvements contain: Frintezza II x1 - Game Features  General Server Settings  Frintezza Core  Founder Membership  Premium Accounts  Server Phases  General Settings  Starter Packs (ingame Gifts)  Improved Mana Regeneration system  Buff system through Agathions  Vitamin Pets (Hunting Partners)  Class rebalance (skills modifications & new skills)  Gatekeepers improvement  Black Wyvern Rider  UI improvements  Enchantment system improvements  Quality of Life changes Re: Frintezza x1 - Server Settings & General information  TUE MAR 12, 2024 5:38 PM  XP & SP: x1  Adena: x1.5  Drop: x1  Spoil: x2  Quest Drop: x2  Quest Reward: x2  High-End Server and Network: Our platform boasts an enterprise-class server equipped with dual physical processors, featuring 144 threads, and employs Enterprise SuperFast NVME U2 storage to ensure a seamless gaming experience without lag. Our network is fortified against DDOS attacks and includes multiple DDOS-protected Accelerator links through AWS, OVH, and Hetzner.  L2OFF PTS: We prioritize game stability and authentic retail features. To achieve this, we offer the finest Files, Scripts, and Geodata available. We extend an invitation for you to join our exclusive Founder Membership. As a member, you will enjoy lifetime weekly rewards across all current and future servers. Don't miss this opportunity to continuously earn rewards across all our platforms. Founder Member Benefits Weekly Rewards: Lifetime rewards on any current and future servers. Anniversary Rewards: Lifetime rewards on any current and future servers. Stay Informed: Be the first to receive email notifications about the launch of new servers. Participate in Polls: Have a say in the selection of upcoming server chronicles and styles. Exclusive Beta Access: Be among the first to be informed about and invited to closed beta tests. Preferred Nickname Selection: Founder members receive priority in choosing their nicknames. Preferred Clan name Selection: Founder members receive priority in choosing their clan names. FrintezzaL2 Community Upcoming Servers: A variety of server rates including low, mid, and high, across different Chronicles (C4, Interlude, H5, Classic, Essence). Upcoming Styles: A selection of gameplay styles such as Vanilla L2OFF, Stacksub, Craft, PVP, GVE, and more. Your Opinion Matters: Our community is built on the feedback of our members. We strive to create a welcoming environment and are committed to using your recommendations and opinions to enhance the gaming experience. We encourage you to share your thoughts in our Discord and Forum. Your input is valuable and will contribute to making a meaningful difference. Be a Founder Member today, HERE!  XP & SP: +50%  Adena: +50%  Drop: +50%  Spoil: +25% Premium Features Auto-Hunt usage Blacksmith of Mammon through the Premium Manager Merchant of Mammon through the Premium Manager Weekly Consumables Rewards through the Premium Manager Premium Cost  15 days - 150 Frintezza Coins   Dawnfall Dominion marks the beginning of your journey in the world of Lineage 2. In this phase, players start as fledgling adventurers, exploring the lands, honing their skills, and facing the challenges of the early game. They can progress up to level 70, forming alliances, battling monsters, and laying the foundation for their adventures to come. Game-related context: Players begin their journey in the lower level zones, encountering basic quests, monsters, and dungeons suitable for beginners. Focus is on leveling up, acquiring gear, learning the game mechanics and being part of Epic battles fighting the Ant Queen, Core and Orfen. Rates: 1-70: x1 Key points Phase duration: 1 month Equipment goal: A-Grade Raid bosses: Ant Queen, Orfen and Core. First respawn will be previusly announced. Midgard's Ascendancy represents a significant advancement in your journey. As players reach this stage, they have already proven themselves as formidable warriors, capable of facing greater challenges. With the level cap raised to 80, players delve deeper into the world's lore, engage in epic battles, and unlock new abilities with 3rd class changes, subclass and olympiads. Game-related context: In this phase, players explore more advanced zones, encounter tougher monsters, and participate in more complex quests and events. They may also engage in PvP battles, begin to focus on endgame content and battle the fierce Baium. Rates: 1-70: x3 70-80: x1 Key points Phase duration: 1 month Equipment goal: Icarus & Moirai Raid bosses: Baium & Zaken. First respawn will be previusly announced, also Ant Queen, Orfen and Core will have their levels raised and drops altered. Start of Olympiads Twilight's Apex marks the pinnacle of power and achievement in your Lineage 2 journey. As players reach level 85, they stand among the mightiest heroes of the realm, wielding incredible strength and skill. In this phase, players undertake legendary quests, conquer formidable foes, and vie for supremacy in epic battles that shape the fate of the world. Game-related context: At this stage, players tackle the most challenging content the game has to offer, including high-level raids, Epic bosses, and PvP battles. They may also focus on maximizing their character's abilities through advanced gear, skills, and strategic gameplay as they reach level 85. Rates: 1-70: x7 70-80: x3 81+: x1 Key points Equipment goal: Vesper & Vorpal Raid bosses: Frintezza, Freya, Beleth, Antharas & Valakas.  Chronicle: High-Five  Premium Buff system: Agathions basic buff time 4 hs, dances/songs/prophecies 20 minutes.  Community Board: Yes  Equipment: Retail like, up to Top-C in the normal shops, including common & shadow equipment.  Monsters: Original monsters. Quantity of monsters in initial areas has been increased and also reduced the respawn time to avoid traffic jam.  Vitality: Retail-Like  Dual box: Allowed 2 windows per PC 1st & 2nd Class changes: 1st change 50k adena, 2nd change 1kk adena (Reward Agathion: Griffin) or 200 coins (Reward Agathion: Griffin + 5kk Adena) or else, quests.  Skills: Auto-learn  Noblesse: 300 coins Noblesse (+1sub) or else, quest chain.  Offline shop: Available  Auto-loot: Available Catacombs/Necropolises: Retail-like  Manor: Available  Herbs: Available  In-game store: Available. More details in another topic  In-game Starter Kits: Yes - New characters will receive NG & D-Grade starter kits.  Luxury Shop: Up to A-Grade, including top A items (values have been increased)  Cloaks: Yes - We have unlocked all sets bonuses to have the posibility to wear a Cloak Players will receive the following rewards: No-Grade Beginner's Adventurer Pack: Shadow No-Grade Weapon/Armor, Fruit Cocktail, Soulshots, Blessed Spiritshots and Agathion Monkey. D-Grade Fighter/Mage Support Pack: Common D-Grade Weapon/Armor. Beginner's Adventurer Reinforcement Pack: Afro Hair (7 days) and Rune of EXP 30% (7 days). Introducing an exciting enhancement to gameplay: MP recovery now happens even faster! As a part of our ongoing Quality of Life (QoL) updates, all "Buffer Agathions" will now come equipped with a new buff: Mana Blessing. This buff significantly boosts passive MP regeneration by 10/25, providing a substantial increase in mana recovery speed. Additionally, the Mana Blessing buff effectively reduces incoming Mana Recharge by 70%. This enhancement benefits all players, ensuring a smoother and more efficient gameplay experience for solo players by alleviating concerns about mana management. However, it's essential to note that casting players won't gain a double advantage from this buff due to the Mana Recharge penalty. Experience the convenience and improved gameplay flow with our latest update, designed to enhance your gaming journey like never before!   To enhance your gameplay experience without interrupting your leveling progress, we've replaced NPC buffers in towns with adorable pets that not only serve as cosmetic companions but also provide essential buffs. Players will receive two charming agathions at different stages of the game. First Stage: Upon character creation, players will receive the Agathion - Monkey, granting the following buffs for 4 hours: Wind Walk, Shield, Might, Acumen, Focus, Concentration, Berserker Spirit, and Mana Blessing. Second Stage: Upon reaching level 40 and completing the 2nd class change, players will receive the Agathion - Griffin, providing an array of buffs for 4 hours, including Wind Walk, Shield, Magic Barrier, Might, Focus, Death Whisper, Guidance, Haste, Vampiric Rage, Clarity, Acumen, Empower, Berserker Spirit, Decrease Weight, Mental Shield, Bless Shield, and Mana Blessing. *Note: Read the "Improved Mana Regeneration" section for more information. We're thrilled to introduce the enhanced vitamin pets, designed to be your trusted companions throughout your journey. Each pet boasts a unique set of skills tailored to complement various classes. Key Features: Our premium pets retain a retail-like experience, with optimized buffs for enhanced gameplay. They no longer consume %EXP from their master, ensuring uninterrupted progression. These exclusive pets will be readily available in the in-game store, providing easy access for all players. Buffs:  Weapon Maintenance: Increases your attack dmg.  Armor Maintenance: Increases your defense.  Blessing of Queen: Increase of 25% P. Critical Rage. Buffs:  Wild Magic: Increases your Magic Critical rate.  Armor Maintenance: Increases your defense.  Gift of Seraphim: Reuse delay decreased by 30%. Stats & Skills retail-like, great companions for enchanters/supports.    [New lv. 55] Knight Fury: Increases party members' P.Def by 5%, M.Def by 5%, Atk. Spd. by 5%, Casting Spd. by 5% and Speed by 5. Effects are applied instantly depending on strike probability. Does not work in olympiad matches.  Seed of Revenge: Increased activation chance of each level to 35%.  [New lv. 52/64/70] Defense Aura: Increases party member's P.Def by 3%/4%/5% and M.Def by 3%/4%/5%. Effect does not stack with Combat Aura.  [New lv. 55] Knight Fury: Increases party members' P.Def by 5%, M.Def by 5%, Atk. Spd. by 5%, Casting Spd. by 5% and Speed by 5. Effects are applied instantly depending on strike probability. Does not work in olympiad matches.  Angelic Icon: Angelic Icon buff has been changed as follows - For 1 minute, increases Resistance to debuff attacks by 40%, P. Def. by 50%, M. Def. by 50%, Accuracy by 6, Speed by 5/10/15, Atk. Spd. by 5%/10%/15%, Critical Rate by 17/30/50, Critical Damage by 17%/33%/50% and Resistance to buff-canceling attacks by 40%. Decreases the effect of recovery magic by 80%. Available when HP is 30% or lower.  Summon Phoenix: The Phoenix has been adjusted to ensure its parity with the other 3rd class summons.  Spirit of Phoenix: Increased activation chance of each level to 35%  [New lv. 52/64/70] Defense Aura: Increases party member's P.Def by 3%/4%/5% and M.Def by 3%/4%/5%. Effect does not stack with Combat Aura.  [New lv. 55] Knight Fury: Increases party members' P.Def by 5%, M.Def by 5%, Atk. Spd. by 5%, Casting Spd. by 5% and Speed by 5. Effects are applied instantly depending on strike probability. Does not work in olympiad matches.  Pain of Shilen: Increased activation chance of each level to 35%.  [New lv. 52/64/70] Defense Aura: Increases party member's P.Def by 3%/4%/5% and M.Def by 3%/4%/5%. Effect does not stack with Combat Aura.  [New lv. 80] Massive Lightning Strike: A lightning strike deals damage to the target and surrounding enemies with 1082 Power, immobilizes them for 15 seconds and then paralyzes for 10 seconds.  [New lv. 55] Knight Fury: Increases party members' P.Def by 5%, M.Def by 5%, Atk. Spd. by 5%, Casting Spd. by 5% and Speed by 5. Effects are applied instantly depending on strike probability. Does not work in olympiad matches.  Eva's Will: Increased activation chance of each level to 35%.  [New lv. 52/64/70] Defense Aura: Increases party member's P.Def by 3%/4%/5% and M.Def by 3%/4%/5%. Effect does not stack with Combat Aura.  [New lv. 80] Eva's Defense: Increases party member's P.Def by 15% and M.Def by 10% and Speed by 4 for 5 minutes.  [New from lv. 40+] Dual Weapon Mastery: Increases P. Atk. when using a dualsword.  [New 44/56/68] Mana Drain: Has a chance to recover MP when striking.  [New from lv. 40+] Dual Weapon Mastery: Increases P. Atk. when using a dualsword.  [New 44/56/68] Mana Drain: Has a chance to recover MP when striking.  [New 44/58] Chant of Improved Combat (Self-buff): Increases Atk. Spd. by 15%/33% and bestows the ability to recover as HP 9% of the standard melee damage inflicted on the enemy.  [New from lv. 40+] Dual Weapon Mastery: Increases P. Atk. when using a dualsword.  [New from lv. 40+] Revenge Strike: Attacks the enemy with 738 Power added to P. Atk. Requires a sword, dual-sword or blunt weapon. Does not work in olympiad matches.  [New 44/58] Blood Awakening (Self-buff): Increases Atk. Spd. by 15%/33% and bestows the ability to recover as HP 9% of the standard melee damage inflicted on the enemy.  [New lv. 40] Rush: Charges toward the enemy.  [New from lv. 40+] Sword Crush: Attacks the enemy with 487 Power added to P. Atk. and inflicts Shock for 7 seconds. Requires a sword or dual-sword weapon. Does not work in olympiad matches.  Dances: Increased time duration of dances to 20 minutes (+Time enchant extends time duration to be 47 minutes).  [New lv. 40] Rush: Charges toward the enemy.  [New from lv. 40+] Sword Crush: Attacks the enemy with 487 Power added to P. Atk. and inflicts Shock for 7 seconds. Requires a sword or dual-sword weapon. Does not work in olympiad matches.  Songs: Increased time duration of songs to 20 minutes (+Time enchant extends time duration up to 47 minutes)  [New from lv. 40+] Mechanical Smash: Swings a spear to attack nearby enemies with 421 Power added to P. Atk. and causes Stun for 9 seconds. Requires a polearm to be equipped.  [New from lv. 40+] Provoke (ONLY WARSMITH): Provokes enemies within a wide range and decreases Resistance to spear weapons by 10 for 10 seconds.  Chain Heal: Adjusted the learning level to level 80.  [Shilien Saint NEW lv. 80] Lord of Vampires: For 30 seconds, gives all party members the ability to recover as HP 80% of the damage inflicted on the enemy.  Healers' Skills Transfer: Increased the Holy Pomander amount for Eva's Saint & Cardinals to 2.  Dagger Mastery [Trigger]: Increased the Dagger Mastery trigger duration to 15 seconds and increases Speed by +4.  [NEW] Bow Mastery [Trigger]: Bow Mastery will now trigger an active buff for 15 seconds that will increase Bow/Crossbow range by 20, Accuracy by 3 and Speed by 4.  Premium Buffs (Agathions Buffs): Increased time duration to be 4 hours.  Chant of Victory & Proof of Fire/Wind/Water: Increased time duration to be 20 minutes (+Time enchant extends time duration up to 40 minutes).  [NEW] Frintezza Welcome Skill(all classes): Increased weight limit by 4 and opens 24 inventory slots.  Warcry: Increased time duration to be 20 minutes.  Battle Roar: Increased time duration to be 20 minutes.  Thrill Fight: Increased time duration to be 20 minutes.  Fell Swoop: Increased time duration to be 20 minutes.  Majesty: Increased time duration to be 20 minutes.  Hawkeye: Eliminated the -10% P.def penalty and increased time duration to be 20 minutes.  Focus chance: Increased time duration to be 20 minutes.  Focus power: Increased time duration to be 20 minutes.  Focus Death: Increased time duration to be 20 minutes.  Mortal Strike: Increased time duration to be 20 minutes.  Seed of Fire/Water/Wind: Increased time duration to be 20 minutes.  Warrior Servitor: Increased time duration to be 20 minutes.  Wizard Servitor: Increased time duration to be 20 minutes.  Assassin Servitor: Increased time duration to be 20 minutes.  Final Servitor: Increased time duration to be 20 minutes.  Rage: Increased time duration to be 20 minutes.  Dark Form: Increased time duration to be 20 minutes.  Totem of Bear: Increased time duration to be 20 minutes.  Totem of Wolf: Increased time duration to be 20 minutes.  Totem of Ogre: Increased time duration to be 20 minutes.  Totem of Puma: Increased time duration to be 20 minutes.  Totem of Bison: Increased time duration to be 20 minutes.  Totem of Rabbit: Increased time duration to be 20 minutes.  Totem of Hawk: Increased time duration to be 20 minutes.  Battle Cry: Increased time duration to be 20 minutes.  Blood Pact: Increased time duration to be 20 minutes.  Furious Soul: Increased time duration to be 20 minutes.  Feline Queen Buffs: Increased time duration to be 20 minutes.  Seraphim the Unicorn Buffs: Increased time duration to be 20 minutes. Frintezza II Creator https://frintezzal2.com Join our Discord channel
    • We are introducing a Loyalty Program for streamers who show the in-game world situation. As a L2Metawars streamer you will get the gift listed below every week:    🔹Premium Account - 7 days   Conditions for streamers:   Your stream must contain L2MetaWars in its title and L2MetaWars banner or logo in its window. All the streamed materials have to be saved! 20 hours of transmission per week grants a gift. Gifts given every Monday. First gift u can get on June 3 and you will need only 10h+ of streaming. You must put link on you stream in special streaming channel on discord when you start broadcasting.   Special role on discord for streamers you will have to message  @MetaMan on Discord with a link to your streaming channel and ask for the reward. Gift given each Monday.
  • Topics

×
×
  • Create New...