Jump to content

L2j Lisvus (C4) Scions of Destiny.


Recommended Posts

6 horas atrás, Reveal disse:

Olá, boa tarde, como faço para por o maria db no database para executar?

:configure
call :colors 17
title L2JLisvus DB Installer - Setup
cls
set config_version=1
if NOT %upgrade_mode% == 2 (
set fresh_setup=1
set mysqlBinPath=%ProgramFiles%\MySQL\MySQL Server 5.7\bin
set lsuser=root
set lspass=
set lsdb=l2jdb
set lshost=localhost
set gsuser=root
set gspass=
set gsdb=l2jdb
set gshost=localhost

Tira o # na linha que indica mariadb.

Coloca # onde ta mysql.

 

URL=jdbc:mariadb://localhost/l2jdb?

#URL=jdbc:mysql://localhost/l2jdb?

 

Edited by junin00

👀🙏🦮🚗🏃‍♂️☀️🎧♐📳⚽🚲🏓☕🎣🚭🏳️

Link to comment
Share on other sites


  • 3 weeks later...
42 minutos atrás, SCRASH0 disse:

poderia citar ?

Mano eu acho que tenho uma system C4 q pega no Win 10 até pq eu tô criando meu projeto e antes de formatar era windows 10 build  vou procurar qualquer coisa mando aqui blz

Edited by VirusBlack S2
Errei as letras
Link to comment
Share on other sites

Em 13/05/2022 at 09:33, yokitosmt disse:

Alguem teria um Raidinfo ou alguns outros mods adaptados para disponibilizar ?

Acho que se você achar um da aCis antiga, é facil pra adaptar.

👀🙏🦮🚗🏃‍♂️☀️🎧♐📳⚽🚲🏓☕🎣🚭🏳️

Link to comment
Share on other sites

  • 2 weeks later...

Alguem pode ajudar corrigir esse erro no raid info?

image.png.068ce2edf28e8796cb96d36a3983eca3.png

 

Index:java/net/sf/l2j/Config.java

public static final String TELNET_FILE = "./config/Telnet.properties";
+public static final String CUSTOM_NPCS_FILE = "./config/CustomMods/RaidInfo.properties";


public static int INVENTORY_MAXIMUM_PET;
+	public static int RAID_BOSS_INFO_PAGE_LIMIT;
+	public static int RAID_BOSS_DROP_PAGE_LIMIT;
+	public static String RAID_BOSS_DATE_FORMAT;
+	public static String RAID_BOSS_IDS;
+	public static List<Integer> LIST_RAID_BOSS_IDS;



+						Properties SpecialNpcs = new Properties();
+						try (InputStream is = new FileInputStream(new File(CUSTOM_NPCS_FILE)))
+						{
+							SpecialNpcs.load(is);
+						}
+						catch (Exception e)
+						{
+							e.printStackTrace();
+							throw new Error("Failed to Load " + CUSTOM_NPCS_FILE + " File.");
+						}
+						
+						RAID_BOSS_INFO_PAGE_LIMIT = Integer.parseInt(SpecialNpcs.getProperty("RaidBossInfoPageLimit", "15"));
+						RAID_BOSS_DROP_PAGE_LIMIT = Integer.parseInt(SpecialNpcs.getProperty("RaidBossDropPageLimit", "15"));
+						RAID_BOSS_DATE_FORMAT = SpecialNpcs.getProperty("RaidBossDateFormat", "MMM dd, HH:mm");
+						RAID_BOSS_IDS = SpecialNpcs.getProperty("RaidBossIds", "0,0");
+						LIST_RAID_BOSS_IDS = new ArrayList<>();
+						for (String val : RAID_BOSS_IDS.split(","))
+						{
+						int npcId = Integer.parseInt(val);
+						LIST_RAID_BOSS_IDS.add(npcId);
+					    }

			// Τelnet
			Properties telnetSettings = new Properties();
			try (InputStream is = new FileInputStream(new File(TELNET_FILE)))
			{
				telnetSettings.load(is);
			}
			catch (Exception e)
			{
				e.printStackTrace();
				throw new Error("Failed to Load " + TELNET_FILE + " File.");
			}

Index:java/net/sf/l2j/gameserver/GameServer.java

+import net.sf.l2j.gameserver.instancemanager.RaidBossInfoManager;
import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager;


BufferTable.getInstance();
+RaidBossInfoManager.getInstance();



Index:java/net/sf/l2j/gameserver/instancemanager/GrandBossManager.java

+import net.sf.l2j.Config;
import net.sf.l2j.L2DatabaseFactory;

 public void setStatsSet(int bossId, StatsSet info)
    {
        _storedInfo.put(bossId, info);
        storeToDb();
+        if (Config.LIST_RAID_BOSS_IDS.contains(bossId))
+      	 {
+      	 RaidBossInfoManager.getInstance().updateRaidBossInfo(bossId, info.getLong("respawn_time"));    	 
+      	 }
    }



Index:java/net/sf/l2j/gameserver/instancemanager/RaidBossInfoManager.java

+/*
+ * 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.instancemanager;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.L2DatabaseFactory;
+
+public class RaidBossInfoManager
+{
+	private static final Logger _log = Logger.getLogger(RaidBossInfoManager.class.getName());
+	
+	private final Map<Integer, Long> _raidBosses;
+	
+	public static RaidBossInfoManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	protected RaidBossInfoManager()
+	{
+		_raidBosses = new ConcurrentHashMap<>();
+		load();
+	}
+	
+	public void load()
+	{
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement;
+			ResultSet rs;
+			
+			statement = con.prepareStatement("SELECT boss_id, respawn_time FROM grandboss_data UNION SELECT boss_id, respawn_time FROM raidboss_spawnlist ORDER BY boss_id");
+			rs = statement.executeQuery();
+			while (rs.next())
+			{
+				int bossId = rs.getInt("boss_id");
+				if (Config.LIST_RAID_BOSS_IDS.contains(bossId))
+					_raidBosses.put(bossId, rs.getLong("respawn_time"));
+			}
+			rs.close();
+			statement.close();
+		}
+		catch (Exception e)
+		{
+			_log.warning("Exception: RaidBossInfoManager load: " + e);
+		}
+		
+		_log.info("RaidBossInfoManager: Loaded " + _raidBosses.size() + " instances.");
+	}
+	
+	public void updateRaidBossInfo(int bossId, long respawnTime)
+	{
+		_raidBosses.put(bossId, respawnTime);
+	}
+	
+	public long getRaidBossRespawnTime(int bossId)
+	{
+		return _raidBosses.get(bossId);
+	}
+	
+	private static class SingletonHolder
+	{
+		protected static final RaidBossInfoManager _instance = new RaidBossInfoManager();
+	}
+}


Index:java/net/sf/l2j/gameserver/instancemanager/RaidBossSpawnManager.java

 		if (_bosses.containsKey(bossId))
        	_bosses.remove(bossId);
        
        if (_schedules.containsKey(bossId))
        {
           	ScheduledFuture<?> f = _schedules.get(bossId);
           	f.cancel(true);
           	_schedules.remove(bossId);
+		if (Config.LIST_RAID_BOSS_IDS.contains(bossId))
+          		RaidBossInfoManager.getInstance().updateRaidBossInfo(bossId, 0);
}      
        if (_storedInfo.containsKey(bossId))
        	_storedInfo.remove(bossId);


           if (!_schedules.containsKey(boss.getNpcId()))
            {
                ScheduledFuture<?> futureSpawn;
                futureSpawn = ThreadPoolManager.getInstance().scheduleGeneral(new spawnSchedule(boss.getNpcId()), respawn_delay);

                _schedules.put(boss.getNpcId(), futureSpawn);
                // To update immediately Database uncomment on the following line, to post the hour of respawn raid boss on your site for example or to envisage a crash landing of the waiter.
                updateDb();
            }
+				if (Config.LIST_RAID_BOSS_IDS.contains(boss.getNpcId()))
+           	RaidBossInfoManager.getInstance().updateRaidBossInfo(boss.getNpcId(), respawnTime);
 }
        else
        {
            boss.setRaidStatus(StatusEnum.ALIVE);

            info.set("currentHP", boss.getCurrentHp());
            info.set("currentMP", boss.getCurrentMp());
            info.set("respawnTime", 0L);
        }

        _storedInfo.put(boss.getNpcId(), info);
    }

    public void addNewSpawn(L2Spawn spawnDat, long respawnTime, double currentHP, double currentMP, boolean storeInDb)



Index:java/net/sf/l2j/gameserver/templates/L2NpcTemplate.java
	

public void setRace(int newrace)
	{
		race = newrace;
	}

+public String getName()
+	{
+		return name;
+	}
+}

Index:java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossInfoInstance.java

+/*
+ * 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.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.sf.l2j.Config;
+
+import net.sf.l2j.gameserver.datatables.ItemTable;
+import net.sf.l2j.gameserver.datatables.NpcTable;
+import net.sf.l2j.gameserver.instancemanager.RaidBossInfoManager;
+import net.sf.l2j.gameserver.model.L2DropData;
+import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
+import net.sf.l2j.gameserver.templates.L2NpcTemplate;
+import net.sf.l2j.util.Rnd;
+
+public class L2RaidBossInfoInstance extends L2NpcInstance
+{
+	private final Map<Integer, Integer> _lastPage = new ConcurrentHashMap<>();
+	
+	private final String[][] _messages =
+	{
+		{
+			"<font color=\"LEVEL\">%player%</font>, are you not afraid?",
+			"Be careful <font color=\"LEVEL\">%player%</font>!"
+		},
+		{
+			"Here is the drop list of <font color=\"LEVEL\">%boss%</font>!",
+			"Seems that <font color=\"LEVEL\">%boss%</font> has good drops."
+		},
+	};
+	
+	public L2RaidBossInfoInstance(int objectId, L2NpcTemplate template)
+	{
+		super(objectId, template);
+	}
+	
+	@Override
+	public void showChatWindow(L2PcInstance player, int val)
+	{
+		String name = "data/html/mods/raidbossinfo/" + getNpcId() + ".htm";
+		if (val != 0)
+			name = "data/html/mods/raidbossinfo/" + getNpcId() + "-" + val + ".htm";
+		
+		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setFile(name);
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		player.sendPacket(html);
+		player.sendPacket(new ActionFailed());
+	}
+	
+	@Override
+	public void onBypassFeedback(L2PcInstance player, String command)
+	{
+		StringTokenizer st = new StringTokenizer(command, " ");
+		String currentCommand = st.nextToken();
+		
+		if (currentCommand.startsWith("RaidBossInfo"))
+		{
+			int pageId = Integer.parseInt(st.nextToken());
+			_lastPage.put(player.getObjectId(), pageId);
+			showRaidBossInfo(player, pageId);
+		}
+		else if (currentCommand.startsWith("RaidBossDrop"))
+		{
+			int bossId = Integer.parseInt(st.nextToken());
+			int pageId = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 1;
+			showRaidBossDrop(player, bossId, pageId);
+		}
+		
+		super.onBypassFeedback(player, command);
+	}
+	
+	private void showRaidBossInfo(L2PcInstance player, int pageId)
+	{
+		List<Integer> infos = new ArrayList<>();
+		infos.addAll(Config.LIST_RAID_BOSS_IDS);
+		
+		final int limit = Config.RAID_BOSS_INFO_PAGE_LIMIT;
+		final int max = infos.size() / limit + (infos.size() % limit == 0 ? 0 : 1);
+		infos = infos.subList((pageId - 1) * limit, Math.min(pageId * limit, infos.size()));
+		
+		final StringBuilder sb = new StringBuilder();
+		sb.append("<html>");
+		sb.append("<center>");
+		sb.append("<body>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">%name%</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"left\">" + _messages[0][Rnd.get(_messages.length)].replace("%player%", player.getName()) + "</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"224\" bgcolor=\"000000\">");
+		sb.append("<tr><td width=\"224\" align=\"center\">Raid Boss Infos</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		
+		for (int bossId : infos)
+		{
+			final L2NpcTemplate template = NpcTable.getInstance().getTemplate(bossId);
+			if (template == null)
+				continue;
+			
+			String bossName = template.getName();
+			
+			if (bossName.length() > 23)
+				bossName = bossName.substring(0, 23) + "...";
+			
+			final long respawnTime = RaidBossInfoManager.getInstance().getRaidBossRespawnTime(bossId);
+			if (respawnTime <= System.currentTimeMillis())
+			{
+				sb.append("<tr>");
+				sb.append("<td width=\"146\" align=\"left\"><a action=\"bypass -h npc_%objectId%_RaidBossDrop " + bossId + "\">" + bossName + "</a></td>");
+				sb.append("<td width=\"110\" align=\"right\"><font color=\"9CC300\">Alive</font></td>");
+				sb.append("</tr>");
+			}
+			else
+			{
+				sb.append("<tr>");
+				sb.append("<td width=\"146\" align=\"left\"><a action=\"bypass -h npc_%objectId%_RaidBossDrop " + bossId + "\">" + bossName + "</a></td>");
+				sb.append("<td width=\"110\" align=\"right\"><font color=\"FB5858\">Dead</font> " + new SimpleDateFormat(Config.RAID_BOSS_DATE_FORMAT).format(new Date(respawnTime)) + "</td>");
+				sb.append("</tr>");
+			}
+		}
+		
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"224\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		
+		for (int x = 0; x < max; x++)
+		{
+			final int pageNr = x + 1;
+			if (pageId == pageNr)
+				sb.append("<td align=\"center\">" + pageNr + "</td>");
+			else
+				sb.append("<td align=\"center\"><a action=\"bypass -h npc_%objectId%_RaidBossInfo " + pageNr + "\">" + pageNr + "</a></td>");
+		}
+		
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"160\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		sb.append("<td width=\"160\" align=\"center\"><a action=\"bypass -h npc_%objectId%_Chat 0\">Return</a></td>");
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">Lineage II</td></tr>");
+		sb.append("</table>");
+		sb.append("</center>");
+		sb.append("</body>");
+		sb.append("</html>");
+		
+		final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setHtml(sb.toString());
+		html.replace("%name%", getName());
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		player.sendPacket(html);
+	}
+	
+	private void showRaidBossDrop(L2PcInstance player, int bossId, int pageId)
+	{
+		final L2NpcTemplate template = NpcTable.getInstance().getTemplate(bossId);
+		if (template == null)
+			return;
+		
+		List<Integer> drops = new ArrayList<>();
+		for (L2DropData drop : template.getAllDropData())
+			drops.add(drop.getItemId());
+		
+		final int limit = Config.RAID_BOSS_DROP_PAGE_LIMIT;
+		final int max = drops.size() / limit + (drops.size() % limit == 0 ? 0 : 1);
+		drops = drops.subList((pageId - 1) * limit, Math.min(pageId * limit, drops.size()));
+		
+		final StringBuilder sb = new StringBuilder();
+		sb.append("<html>");
+		sb.append("<center>");
+		sb.append("<body>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">%name%</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"left\">" + _messages[1][Rnd.get(_messages.length)].replace("%boss%", template.getName()) + "</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"224\" bgcolor=\"000000\">");
+		sb.append("<tr><td width=\"224\" align=\"center\">Raid Boss Drops</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		
+		for (int itemId : drops)
+		{
+			String itemName = ItemTable.getInstance().getTemplate(itemId).getName();
+			if (itemName.length() > 47)
+				itemName = itemName.substring(0, 47) + "...";
+			
+			sb.append("<tr><td width=\"256\" align=\"center\">" + itemName + "</td></tr>");
+		}
+		
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"64\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		
+		for (int x = 0; x < max; x++)
+		{
+			final int pageNr = x + 1;
+			if (pageId == pageNr)
+				sb.append("<td align=\"center\">" + pageNr + "</td>");
+			else
+				sb.append("<td align=\"center\"><a action=\"bypass -h npc_%objectId%_RaidBossDrop " + bossId + " " + pageNr + "\">" + pageNr + "</a></td>");
+		}
+		
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"160\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		sb.append("<td width=\"160\" align=\"center\"><a action=\"bypass -h npc_%objectId%_RaidBossInfo " + _lastPage.get(player.getObjectId()) + "\">Return</a></td>");
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">Lineage II</td></tr>");
+		sb.append("</table>");
+		sb.append("</center>");
+		sb.append("</body>");
+		sb.append("</html>");
+		
+		final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setHtml(sb.toString());
+		html.replace("%name%", getName());
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		player.sendPacket(html);
+	}
+}

Index:\gameserver\config\CustomMods\RaidInfo.properties

+#=============================================================
+#                   RaidInfo C4
+#=============================================================
+# Limit of displayed raid boss per page
+# Default: 15
+RaidBossInfoPageLimit = 15
+
+# Limit of displayed drop per page
+# Default: 15
+RaidBossDropPageLimit = 15
+
+# Displayed date format for dead raid boss
+# Default: (MMM dd, HH:mm)
+RaidBossDateFormat = (MMM dd, HH:mm)
+
+# Displayed raid boss
+# Syntax: bossId,bossId, ...
+RaidBossIds =12001,12052,12169,12211,12372,12374,12899



HTML NPC - LOCAL DA PASTA \gameserver\data\html\mods\raidbossinfo
+<html>
+<body>
+<center>
+<img src="l2ui.bbs_lineage2" width=78 height=13><br>
+<td><img src="L2UI.SquareBlank" width=40 height=2></td>
+<center><img src="L2UI.SquareGray" width=300 height=1></center>
+<table bgcolor="000000" width=300>
+<table>
+<tr>
+<td width=40><td width=40><img src=icon.skill4416_human width=32 height=32></td>
+<td width=200>
+<table>
+<tr><td>Select your destination, I will make the</td></tr>
+<tr><td>connection with the others <font color="FFFF00">All Raid Bosses!</font></td></tr><tr><td></td></tr>
+</table>
+</td>
+</tr>
+</table><br>
+<button value="Clique to List" action="bypass -h npc_%objectId%_RaidBossInfo 1" width=135 height=22  back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3" >
+<br>
+<img src="L2UI.SquareGray" width=300 height=1>
+<table border=0 bgcolor=000000 width=300 height=1>
+<img src="Sek.cbui371" width=276 height=1><br>
+<center><a action="bypass -h npc_%objectId%_multisell 002"><font color="0066CC">Exchange with the Dimensional Diamond</font></a></center>
+<img src="Sek.cbui371" width=300 height=1>
+<table width=300 bgcolor="000000">
+<tr>
+<tr><td><center>We <font color="FFFF00">Grand Bosses</font> use the Will of the Gods to open the</td></tr></center>
+<tr><td><center>doors to time and space and Reneward Items.</td></tr></center>
+<tr><td><center>Which door would you Life to Dead?</td></tr></center>
+</table>
+<img src="Sek.cbui371" width=300 height=1>
+</body>
+</html>

 

Link to comment
Share on other sites

hace 12 horas, yokitosmt dijo:

Alguem pode ajudar corrigir esse erro no raid info?

image.png.068ce2edf28e8796cb96d36a3983eca3.png

Index:java/net/sf/l2j/Config.java

public static final String TELNET_FILE = "./config/Telnet.properties";
+public static final String CUSTOM_NPCS_FILE = "./config/CustomMods/RaidInfo.properties";


public static int INVENTORY_MAXIMUM_PET;
+	public static int RAID_BOSS_INFO_PAGE_LIMIT;
+	public static int RAID_BOSS_DROP_PAGE_LIMIT;
+	public static String RAID_BOSS_DATE_FORMAT;
+	public static String RAID_BOSS_IDS;
+	public static List<Integer> LIST_RAID_BOSS_IDS;



+						Properties SpecialNpcs = new Properties();
+						try (InputStream is = new FileInputStream(new File(CUSTOM_NPCS_FILE)))
+						{
+							SpecialNpcs.load(is);
+						}
+						catch (Exception e)
+						{
+							e.printStackTrace();
+							throw new Error("Failed to Load " + CUSTOM_NPCS_FILE + " File.");
+						}
+						
+						RAID_BOSS_INFO_PAGE_LIMIT = Integer.parseInt(SpecialNpcs.getProperty("RaidBossInfoPageLimit", "15"));
+						RAID_BOSS_DROP_PAGE_LIMIT = Integer.parseInt(SpecialNpcs.getProperty("RaidBossDropPageLimit", "15"));
+						RAID_BOSS_DATE_FORMAT = SpecialNpcs.getProperty("RaidBossDateFormat", "MMM dd, HH:mm");
+						RAID_BOSS_IDS = SpecialNpcs.getProperty("RaidBossIds", "0,0");
+						LIST_RAID_BOSS_IDS = new ArrayList<>();
+						for (String val : RAID_BOSS_IDS.split(","))
+						{
+						int npcId = Integer.parseInt(val);
+						LIST_RAID_BOSS_IDS.add(npcId);
+					    }

			// Τelnet
			Properties telnetSettings = new Properties();
			try (InputStream is = new FileInputStream(new File(TELNET_FILE)))
			{
				telnetSettings.load(is);
			}
			catch (Exception e)
			{
				e.printStackTrace();
				throw new Error("Failed to Load " + TELNET_FILE + " File.");
			}

Index:java/net/sf/l2j/gameserver/GameServer.java

+import net.sf.l2j.gameserver.instancemanager.RaidBossInfoManager;
import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager;


BufferTable.getInstance();
+RaidBossInfoManager.getInstance();



Index:java/net/sf/l2j/gameserver/instancemanager/GrandBossManager.java

+import net.sf.l2j.Config;
import net.sf.l2j.L2DatabaseFactory;

 public void setStatsSet(int bossId, StatsSet info)
    {
        _storedInfo.put(bossId, info);
        storeToDb();
+        if (Config.LIST_RAID_BOSS_IDS.contains(bossId))
+      	 {
+      	 RaidBossInfoManager.getInstance().updateRaidBossInfo(bossId, info.getLong("respawn_time"));    	 
+      	 }
    }



Index:java/net/sf/l2j/gameserver/instancemanager/RaidBossInfoManager.java

+/*
+ * 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.instancemanager;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.L2DatabaseFactory;
+
+public class RaidBossInfoManager
+{
+	private static final Logger _log = Logger.getLogger(RaidBossInfoManager.class.getName());
+	
+	private final Map<Integer, Long> _raidBosses;
+	
+	public static RaidBossInfoManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	protected RaidBossInfoManager()
+	{
+		_raidBosses = new ConcurrentHashMap<>();
+		load();
+	}
+	
+	public void load()
+	{
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+		{
+			PreparedStatement statement;
+			ResultSet rs;
+			
+			statement = con.prepareStatement("SELECT boss_id, respawn_time FROM grandboss_data UNION SELECT boss_id, respawn_time FROM raidboss_spawnlist ORDER BY boss_id");
+			rs = statement.executeQuery();
+			while (rs.next())
+			{
+				int bossId = rs.getInt("boss_id");
+				if (Config.LIST_RAID_BOSS_IDS.contains(bossId))
+					_raidBosses.put(bossId, rs.getLong("respawn_time"));
+			}
+			rs.close();
+			statement.close();
+		}
+		catch (Exception e)
+		{
+			_log.warning("Exception: RaidBossInfoManager load: " + e);
+		}
+		
+		_log.info("RaidBossInfoManager: Loaded " + _raidBosses.size() + " instances.");
+	}
+	
+	public void updateRaidBossInfo(int bossId, long respawnTime)
+	{
+		_raidBosses.put(bossId, respawnTime);
+	}
+	
+	public long getRaidBossRespawnTime(int bossId)
+	{
+		return _raidBosses.get(bossId);
+	}
+	
+	private static class SingletonHolder
+	{
+		protected static final RaidBossInfoManager _instance = new RaidBossInfoManager();
+	}
+}


Index:java/net/sf/l2j/gameserver/instancemanager/RaidBossSpawnManager.java

 		if (_bosses.containsKey(bossId))
        	_bosses.remove(bossId);
        
        if (_schedules.containsKey(bossId))
        {
           	ScheduledFuture<?> f = _schedules.get(bossId);
           	f.cancel(true);
           	_schedules.remove(bossId);
+		if (Config.LIST_RAID_BOSS_IDS.contains(bossId))
+          		RaidBossInfoManager.getInstance().updateRaidBossInfo(bossId, 0);
}      
        if (_storedInfo.containsKey(bossId))
        	_storedInfo.remove(bossId);


           if (!_schedules.containsKey(boss.getNpcId()))
            {
                ScheduledFuture<?> futureSpawn;
                futureSpawn = ThreadPoolManager.getInstance().scheduleGeneral(new spawnSchedule(boss.getNpcId()), respawn_delay);

                _schedules.put(boss.getNpcId(), futureSpawn);
                // To update immediately Database uncomment on the following line, to post the hour of respawn raid boss on your site for example or to envisage a crash landing of the waiter.
                updateDb();
            }
+				if (Config.LIST_RAID_BOSS_IDS.contains(boss.getNpcId()))
+           	RaidBossInfoManager.getInstance().updateRaidBossInfo(boss.getNpcId(), respawnTime);
 }
        else
        {
            boss.setRaidStatus(StatusEnum.ALIVE);

            info.set("currentHP", boss.getCurrentHp());
            info.set("currentMP", boss.getCurrentMp());
            info.set("respawnTime", 0L);
        }

        _storedInfo.put(boss.getNpcId(), info);
    }

    public void addNewSpawn(L2Spawn spawnDat, long respawnTime, double currentHP, double currentMP, boolean storeInDb)



Index:java/net/sf/l2j/gameserver/templates/L2NpcTemplate.java
	

public void setRace(int newrace)
	{
		race = newrace;
	}

+public String getName()
+	{
+		return name;
+	}
+}

Index:java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossInfoInstance.java

+/*
+ * 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.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.sf.l2j.Config;
+
+import net.sf.l2j.gameserver.datatables.ItemTable;
+import net.sf.l2j.gameserver.datatables.NpcTable;
+import net.sf.l2j.gameserver.instancemanager.RaidBossInfoManager;
+import net.sf.l2j.gameserver.model.L2DropData;
+import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
+import net.sf.l2j.gameserver.templates.L2NpcTemplate;
+import net.sf.l2j.util.Rnd;
+
+public class L2RaidBossInfoInstance extends L2NpcInstance
+{
+	private final Map<Integer, Integer> _lastPage = new ConcurrentHashMap<>();
+	
+	private final String[][] _messages =
+	{
+		{
+			"<font color=\"LEVEL\">%player%</font>, are you not afraid?",
+			"Be careful <font color=\"LEVEL\">%player%</font>!"
+		},
+		{
+			"Here is the drop list of <font color=\"LEVEL\">%boss%</font>!",
+			"Seems that <font color=\"LEVEL\">%boss%</font> has good drops."
+		},
+	};
+	
+	public L2RaidBossInfoInstance(int objectId, L2NpcTemplate template)
+	{
+		super(objectId, template);
+	}
+	
+	@Override
+	public void showChatWindow(L2PcInstance player, int val)
+	{
+		String name = "data/html/mods/raidbossinfo/" + getNpcId() + ".htm";
+		if (val != 0)
+			name = "data/html/mods/raidbossinfo/" + getNpcId() + "-" + val + ".htm";
+		
+		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setFile(name);
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		player.sendPacket(html);
+		player.sendPacket(new ActionFailed());
+	}
+	
+	@Override
+	public void onBypassFeedback(L2PcInstance player, String command)
+	{
+		StringTokenizer st = new StringTokenizer(command, " ");
+		String currentCommand = st.nextToken();
+		
+		if (currentCommand.startsWith("RaidBossInfo"))
+		{
+			int pageId = Integer.parseInt(st.nextToken());
+			_lastPage.put(player.getObjectId(), pageId);
+			showRaidBossInfo(player, pageId);
+		}
+		else if (currentCommand.startsWith("RaidBossDrop"))
+		{
+			int bossId = Integer.parseInt(st.nextToken());
+			int pageId = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 1;
+			showRaidBossDrop(player, bossId, pageId);
+		}
+		
+		super.onBypassFeedback(player, command);
+	}
+	
+	private void showRaidBossInfo(L2PcInstance player, int pageId)
+	{
+		List<Integer> infos = new ArrayList<>();
+		infos.addAll(Config.LIST_RAID_BOSS_IDS);
+		
+		final int limit = Config.RAID_BOSS_INFO_PAGE_LIMIT;
+		final int max = infos.size() / limit + (infos.size() % limit == 0 ? 0 : 1);
+		infos = infos.subList((pageId - 1) * limit, Math.min(pageId * limit, infos.size()));
+		
+		final StringBuilder sb = new StringBuilder();
+		sb.append("<html>");
+		sb.append("<center>");
+		sb.append("<body>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">%name%</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"left\">" + _messages[0][Rnd.get(_messages.length)].replace("%player%", player.getName()) + "</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"224\" bgcolor=\"000000\">");
+		sb.append("<tr><td width=\"224\" align=\"center\">Raid Boss Infos</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		
+		for (int bossId : infos)
+		{
+			final L2NpcTemplate template = NpcTable.getInstance().getTemplate(bossId);
+			if (template == null)
+				continue;
+			
+			String bossName = template.getName();
+			
+			if (bossName.length() > 23)
+				bossName = bossName.substring(0, 23) + "...";
+			
+			final long respawnTime = RaidBossInfoManager.getInstance().getRaidBossRespawnTime(bossId);
+			if (respawnTime <= System.currentTimeMillis())
+			{
+				sb.append("<tr>");
+				sb.append("<td width=\"146\" align=\"left\"><a action=\"bypass -h npc_%objectId%_RaidBossDrop " + bossId + "\">" + bossName + "</a></td>");
+				sb.append("<td width=\"110\" align=\"right\"><font color=\"9CC300\">Alive</font></td>");
+				sb.append("</tr>");
+			}
+			else
+			{
+				sb.append("<tr>");
+				sb.append("<td width=\"146\" align=\"left\"><a action=\"bypass -h npc_%objectId%_RaidBossDrop " + bossId + "\">" + bossName + "</a></td>");
+				sb.append("<td width=\"110\" align=\"right\"><font color=\"FB5858\">Dead</font> " + new SimpleDateFormat(Config.RAID_BOSS_DATE_FORMAT).format(new Date(respawnTime)) + "</td>");
+				sb.append("</tr>");
+			}
+		}
+		
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"224\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		
+		for (int x = 0; x < max; x++)
+		{
+			final int pageNr = x + 1;
+			if (pageId == pageNr)
+				sb.append("<td align=\"center\">" + pageNr + "</td>");
+			else
+				sb.append("<td align=\"center\"><a action=\"bypass -h npc_%objectId%_RaidBossInfo " + pageNr + "\">" + pageNr + "</a></td>");
+		}
+		
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"160\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		sb.append("<td width=\"160\" align=\"center\"><a action=\"bypass -h npc_%objectId%_Chat 0\">Return</a></td>");
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">Lineage II</td></tr>");
+		sb.append("</table>");
+		sb.append("</center>");
+		sb.append("</body>");
+		sb.append("</html>");
+		
+		final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setHtml(sb.toString());
+		html.replace("%name%", getName());
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		player.sendPacket(html);
+	}
+	
+	private void showRaidBossDrop(L2PcInstance player, int bossId, int pageId)
+	{
+		final L2NpcTemplate template = NpcTable.getInstance().getTemplate(bossId);
+		if (template == null)
+			return;
+		
+		List<Integer> drops = new ArrayList<>();
+		for (L2DropData drop : template.getAllDropData())
+			drops.add(drop.getItemId());
+		
+		final int limit = Config.RAID_BOSS_DROP_PAGE_LIMIT;
+		final int max = drops.size() / limit + (drops.size() % limit == 0 ? 0 : 1);
+		drops = drops.subList((pageId - 1) * limit, Math.min(pageId * limit, drops.size()));
+		
+		final StringBuilder sb = new StringBuilder();
+		sb.append("<html>");
+		sb.append("<center>");
+		sb.append("<body>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">%name%</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"left\">" + _messages[1][Rnd.get(_messages.length)].replace("%boss%", template.getName()) + "</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"224\" bgcolor=\"000000\">");
+		sb.append("<tr><td width=\"224\" align=\"center\">Raid Boss Drops</td></tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		
+		for (int itemId : drops)
+		{
+			String itemName = ItemTable.getInstance().getTemplate(itemId).getName();
+			if (itemName.length() > 47)
+				itemName = itemName.substring(0, 47) + "...";
+			
+			sb.append("<tr><td width=\"256\" align=\"center\">" + itemName + "</td></tr>");
+		}
+		
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"64\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		
+		for (int x = 0; x < max; x++)
+		{
+			final int pageNr = x + 1;
+			if (pageId == pageNr)
+				sb.append("<td align=\"center\">" + pageNr + "</td>");
+			else
+				sb.append("<td align=\"center\"><a action=\"bypass -h npc_%objectId%_RaidBossDrop " + bossId + " " + pageNr + "\">" + pageNr + "</a></td>");
+		}
+		
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"160\" cellspacing=\"2\">");
+		sb.append("<tr>");
+		sb.append("<td width=\"160\" align=\"center\"><a action=\"bypass -h npc_%objectId%_RaidBossInfo " + _lastPage.get(player.getObjectId()) + "\">Return</a></td>");
+		sb.append("</tr>");
+		sb.append("</table>");
+		sb.append("<br>");
+		sb.append("<table width=\"256\">");
+		sb.append("<tr><td width=\"256\" align=\"center\">Lineage II</td></tr>");
+		sb.append("</table>");
+		sb.append("</center>");
+		sb.append("</body>");
+		sb.append("</html>");
+		
+		final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+		html.setHtml(sb.toString());
+		html.replace("%name%", getName());
+		html.replace("%objectId%", String.valueOf(getObjectId()));
+		player.sendPacket(html);
+	}
+}

Index:\gameserver\config\CustomMods\RaidInfo.properties

+#=============================================================
+#                   RaidInfo C4
+#=============================================================
+# Limit of displayed raid boss per page
+# Default: 15
+RaidBossInfoPageLimit = 15
+
+# Limit of displayed drop per page
+# Default: 15
+RaidBossDropPageLimit = 15
+
+# Displayed date format for dead raid boss
+# Default: (MMM dd, HH:mm)
+RaidBossDateFormat = (MMM dd, HH:mm)
+
+# Displayed raid boss
+# Syntax: bossId,bossId, ...
+RaidBossIds =12001,12052,12169,12211,12372,12374,12899



HTML NPC - LOCAL DA PASTA \gameserver\data\html\mods\raidbossinfo
+<html>
+<body>
+<center>
+<img src="l2ui.bbs_lineage2" width=78 height=13><br>
+<td><img src="L2UI.SquareBlank" width=40 height=2></td>
+<center><img src="L2UI.SquareGray" width=300 height=1></center>
+<table bgcolor="000000" width=300>
+<table>
+<tr>
+<td width=40><td width=40><img src=icon.skill4416_human width=32 height=32></td>
+<td width=200>
+<table>
+<tr><td>Select your destination, I will make the</td></tr>
+<tr><td>connection with the others <font color="FFFF00">All Raid Bosses!</font></td></tr><tr><td></td></tr>
+</table>
+</td>
+</tr>
+</table><br>
+<button value="Clique to List" action="bypass -h npc_%objectId%_RaidBossInfo 1" width=135 height=22  back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3" >
+<br>
+<img src="L2UI.SquareGray" width=300 height=1>
+<table border=0 bgcolor=000000 width=300 height=1>
+<img src="Sek.cbui371" width=276 height=1><br>
+<center><a action="bypass -h npc_%objectId%_multisell 002"><font color="0066CC">Exchange with the Dimensional Diamond</font></a></center>
+<img src="Sek.cbui371" width=300 height=1>
+<table width=300 bgcolor="000000">
+<tr>
+<tr><td><center>We <font color="FFFF00">Grand Bosses</font> use the Will of the Gods to open the</td></tr></center>
+<tr><td><center>doors to time and space and Reneward Items.</td></tr></center>
+<tr><td><center>Which door would you Life to Dead?</td></tr></center>
+</table>
+<img src="Sek.cbui371" width=300 height=1>
+</body>
+</html>

cual rev vc ta fazendo?

Eu me imagino com 90 anos e jogando L2🙈

Link to comment
Share on other sites

hace 1 hora, yokitosmt dijo:

L2JLisvus  Rev 742

en o discord do lisvus nao posto? 

Eu me imagino com 90 anos e jogando L2🙈

Link to comment
Share on other sites

  • 1 month later...
  • 3 weeks later...
9 horas atrás, ~DnR~ disse:

@SaYmOn CordeiroAssim como Levy mencionou, o projeto migrou para  https://gitlab.com/TheDnR/l2j-lisvus

É possível substituir os links antigos do repositório na primeira postagem por um novo? Obrigado

Thank you very much friend for the project, yes it will be updated.

  • Like 1

L2JDREAM PROJECT TEAM

Link to comment
Share on other sites

Version 747 is out.

This update consists of refactoring. Starting from quest 17, scripts were converted to Java up to quest 53.

Here is the list of quests that were updated:

quests/Q017_LightAndDarkness/Q017_LightAndDarkness.java
quests/Q018_MeetingWithTheGoldenRam/Q018_MeetingWithTheGoldenRam.java
quests/Q019_GoToThePastureland/Q019_GoToThePastureland.java
quests/Q020_BringUpWithLove/Q020_BringUpWithLove.java
quests/Q021_HiddenTruth/Q021_HiddenTruth.java
quests/Q022_TragedyInVonHellmannForest/Q022_TragedyInVonHellmannForest.java
quests/Q023_LidiasHeart/Q023_LidiasHeart.java
quests/Q024_InhabitantsOfTheForestOfTheDead/Q024_InhabitantsOfTheForestOfTheDead.java
quests/Q025_HidingBehindTheTruth/Q025_HidingBehindTheTruth.java
quests/Q027_ChestCaughtWithABaitOfWind/Q027_ChestCaughtWithABaitOfWind.java
quests/Q028_ChestCaughtWithABaitOfIcyAir/Q028_ChestCaughtWithABaitOfIcyAir.java
quests/Q029_ChestCaughtWithABaitOfEarth/Q029_ChestCaughtWithABaitOfEarth.java
quests/Q030_ChestCaughtWithABaitOfFire/Q030_ChestCaughtWithABaitOfFire.java
quests/Q031_SecretBuriedInTheSwamp/Q031_SecretBuriedInTheSwamp.java
quests/Q032_AnObviousLie/Q032_AnObviousLie.java
quests/Q033_MakeAPairOfDressShoes/Q033_MakeAPairOfDressShoes.java
quests/Q034_InSearchOfCloth/Q034_InSearchOfCloth.java
quests/Q035_FindGlitteringJewelry/Q035_FindGlitteringJewelry.java
quests/Q036_MakeASewingKit/Q036_MakeASewingKit.java
quests/Q037_MakeFormalWear/Q037_MakeFormalWear.java
quests/Q038_DragonFangs/Q038_DragonFangs.java
quests/Q039_RedEyedInvaders/Q039_RedEyedInvaders.java
quests/Q042_HelpTheUncle/Q042_HelpTheUncle.java
quests/Q043_HelpTheSister/Q043_HelpTheSister.java
quests/Q044_HelpTheSon/Q044_HelpTheSon.java
quests/Q045_ToTalkingIsland/Q045_ToTalkingIsland.java
quests/Q046_OnceMoreInTheArmsOfTheMotherTree/Q046_OnceMoreInTheArmsOfTheMotherTree.java
quests/Q047_IntoTheDarkForest/Q047_IntoTheDarkForest.java
quests/Q048_ToTheImmortalPlateau/Q048_ToTheImmortalPlateau.java
quests/Q049_TheRoadHome/Q049_TheRoadHome.java
quests/Q050_LanoscosSpecialBait/Q050_LanoscosSpecialBait.java
quests/Q051_OFullesSpecialBait/Q051_OFullesSpecialBait.java
quests/Q052_WilliesSpecialBait/Q052_WilliesSpecialBait.java
quests/Q053_LinnaeusSpecialBait/Q053_LinnaeusSpecialBait.java

 

I'm not very active at working on project but I'll try to update more in the future.

 

BR,

DnR

  • Like 5
  • I love it 1
Link to comment
Share on other sites

Em 14/05/2022 at 18:26, SCRASH0 disse:

infelizmente só pagando 

Quem vende, você conhece ou sabe quem trabalha ?

sss.jpg

Link to comment
Share on other sites

  • 4 weeks later...
  • Join now

    Be part of the largest and oldest communities about Lineage2 in Latin America.






×
×
  • Create New...

Important Information

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.