Share Guia de Configuração do ModAdapter

Julio Prado

Vagabond
O ModAdapter é uma ferramenta poderosa para adaptar modificações entre versões diferentes de servidores L2J. Antes de utilizá-la, você precisa configurar corretamente o acesso ao banco de dados.


Passo 1: Configurar o Banco de Dados​


  1. Navegue até a pasta config/ do ModAdapter.
  2. Edite o arquivo de configuração XML (por padrão, é algo como database_config.xml ou similar).
  3. Insira as configurações de conexão com seu banco de dados no seguinte formato:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<configs>
    <!-- Conexão principal com o banco do servidor -->
    <database hostname="127.0.0.1" user="root" pass="root" database="l2jdb" maxConnections="20" />
   
    <!-- Conexão adicional (opcional), exemplo: banco de outro projeto -->
    <database hostname="127.0.0.1" user="root" pass="root" database="l2jfaction" maxConnections="5" />
</configs>
Importante:
  • O hostname pode ser 127.0.0.1 (localhost) se estiver executando o banco na mesma máquina.
  • O campo user e pass devem conter seu usuário e senha do banco.
  • Altere o nome do banco em database conforme o banco de dados que deseja analisar.

️ Verificação no ModAdapter​


Ao abrir o ModAdapter, você verá mensagens como estas na área de log (como mostrado nas imagens):
XML:
Loaded Database Config.
Loaded MariaDbPool 10.4 Database Factory.
Isso confirma que o banco foi configurado e conectado corretamente.

Exportação de Relatórios​


Após o carregamento das classes, você pode salvar o relatório gerado em .txt, escolhendo o local de destino no formato:
XML:
relatorio_classes_lucerav3.txt
Use o menu Arquivos &gt; Salvar Relatório... para exportar.

Download: https://mega.nz/file/5iFQCJJI#C7Czm5yjOQj8hH-kyETmi7HVxa1qw8VsJl_E9DwALjo

1749907227139.webp1749907243325.webp1749907275944.webp


Code:
=== RELATÓRIO COMPLETO DE CLASSES ===
Versão: lucerav3
Total de classes: 3175

   1. l2.gameserver.network.l2.s2c.PrivateStoreMsgSell
   2. l2.gameserver.taskmanager.ItemsAutoDestroy
   3. l2.gameserver.network.l2.c2s.RequestCursedWeaponLocation
   4. l2.gameserver.stats.conditions.ConditionInventory
   5. org.apache.subversion.javahl.SVNUtil$DiffOptions
   6. l2.gameserver.network.l2.c2s.RequestExMoveToLocationInAirShip
   7. l2.gameserver.skills.skillclasses.FishingSkill
   8. l2.gameserver.network.authcomm.as2gs.PlayerAuthResponse
   9. l2.gameserver.model.instances.DeadManInstance
 
Si quiero adaptar este código emergente para eventos, ¿cómo uso su herramienta? ¿Tiene una guía sobre cómo usarla e implementarla? Muchas gracias.



[CÓDIGO]diff --git a/java/com/l2jmega/events/TvT.java b/java/com/l2jmega/events/TvT.java
índice 4339c75..e5ed611 100644
--- a/java/com/l2jmega/eventos/TvT.java
+++ b/java/com/l2jmega/eventos/TvT.java
@@ -762.7 +762.8 @@
_inProgress = verdadero;
_joining = verdadero;
spawnEventNpc();
- Anuncio.Announce("TvT: " + _eventDesc + "!");
+
+ Anuncio.TvTAnnounce("TvT: " + _eventDesc + "!");

Anuncio.Announce("TvT: Se puede unir en " + _joiningLocationName);

diff --git a/java/com/l2jmega/gameserver/model/Announcement.java b/java/com/l2jmega/gameserver/model/Announcement.java
índice 53c580b..e1906e7 100644
--- a/java/com/l2jmega/gameserver/model/Anuncio.java
+++ b/java/com/l2jmega/gameserver/model/Anuncio.java
@@ -5.7 +5.9 @@
importar com.l2jmega.commons.concurrent.ThreadPool;

importar com.l2jmega.Config;
+import com.l2jmega.events.TvT;
importar com.l2jmega.gameserver.model.actor.instance.Player;
+import com.l2jmega.gameserver.model.base.ClassId;
importar com.l2jmega.gameserver.model.location.SpawnLocation;
importar com.l2jmega.gameserver.model.zone.ZoneId;
importar com.l2jmega.gameserver.network.SystemMessageId;
@@ -58.7 +60.7 @@
_task = ThreadPool.scheduleAtFixedRate(this, _initialDelay * 1000, _delay * 1000); // autoprogramación a una tasa fija
_ilimitado = verdadero;
romper;
-
+
por defecto:
_task = ThreadPool.schedule(this, _initialDelay * 1000); // autoprogramación (inicial)
_tempLimit = _limit;
@@ -132.7 +134.7 @@
_task = ThreadPool.scheduleAtFixedRate(this, _initialDelay * 1000, _delay * 1000); // autoprogramación a una tasa fija
_ilimitado = verdadero;
romper;
-
+
por defecto:
_task = ThreadPool.schedule(this, _initialDelay * 1000); // autoprogramación (inicial)
_tempLimit = _limit;
@@ -216.6 +218.47 @@
}
}

+ público estático booleano tvt_register = falso;
+
+ public static void TvTAnnounce(Cadena texto)
+ {
+ tvt_register = verdadero;
+
+ CreatureSay cs = new CreatureSay(0, 18, "", "" + texto);
+
+ para (Jugador jugador: World.getInstance().getPlayers())
+ {
+ si (jugador != null && jugador.estáEnlínea())
+ {
+ jugador.sendPacket(cs);
+
+ ThreadPool.schedule(nuevo Ejecutable()
+ {
+ @Anular
+ public void ejecutar()
+ {
+ tvt_register = falso;
+ }
+ }, 46000);
+
+ booleano final alfil = (jugador.getClassId() == ClassId.BISHOP || jugador.getClassId() == ClassId.CARDINAL || jugador.getClassId() == ClassId.SHILLIEN_ELDER || jugador.getClassId() == ClassId.SHILLIEN_SAINT || jugador.getClassId() == ClassId.EVAS_SAINT || jugador.getClassId() == ClassId.ELVEN_ELDER);
+
+ if (!(jugador.isOlympiadProtection() || jugador.getLevel() < TvT.get_minlvl() || jugador.getLevel() > TvT.get_maxlvl() || jugador.isCursedWeaponEquipped() || jugador.isInObserverMode() || jugador.getFirstLog() || jugador._inEventCTF || jugador.isAio() || alfil) && Config.SCREN_MSG)
+ {
+ Ubicación de aparición _posición = nueva Ubicación de aparición(TvT._npcX, TvT._npcY, TvT._npcX, 0);
+ ConfirmDlg confirmar = nuevo ConfirmDlg(SystemMessageId.EVENT.getId());
+ confirm.addString("~~> Equipo VS Equipo, ¿Quieres registrarte? ");
+ confirmar.addZoneName(_posición);
+ confirmar.addTime(45000);
+ confirm.addRequesterId(jugador.getObjectId());
+ jugador.sendPacket(confirmar);
+ }
+ }
+ }
+
+ cs = nulo;
+ }
+
público estático booleano isSummoning = falso;

public static void ArenaAnnounce(Cadena texto)
@@ -229.33 +272.33 @@
si (jugador != null && jugador.estáEnlínea())
{
jugador.sendPacket(cs);


diff --git a/java/com/l2jmega/gameserver/network/SystemMessageId.java b/java/com/l2jmega/gameserver/network/SystemMessageId.java
índice 9c89f48..77a5c12 100644
--- a/java/com/l2jmega/servidor de juegos/red/SystemMessageId.java
+++ b/java/com/l2jmega/servidor de juegos/red/SystemMessageId.java
@@ -11798.6 +11798.8 @@
*/
público estático final SystemMessageId POR FAVOR_ESPERE_UN_MOMENTO;

+ público estático final SystemMessageId EVENT;
+
/**
* Matriz que contiene todos los SystemMessageIds
* Importante: ¡Inicialice siempre con una longitud del SystemMessageId + 1 más alto!
@@ -13766.6 +13768.7 @@
S1_NO_PUEDE_PARTICIPAR_EN_LA_OLIMPIADA_DURANTE_LA_TELEPORTACIÓN = new SystemMessageId(2029);
ACTUALMENTE_INICIANDO_SESIÓN = new SystemMessageId(2030);
POR FAVOR_ESPERE_UN_MOMENTO = new SystemMessageId(2031);
+ EVENTO = nuevo SystemMessageId(2500);

construirTablaDeBuscarRápida();
}
diff --git a/java/com/l2jmega/gameserver/network/clientpackets/DlgAnswer.java b/java/com/l2jmega/gameserver/network/clientpackets/DlgAnswer.java
índice eb4a65d..e3cfd55 100644
--- a/java/com/l2jmega/servidor de juegos/red/paquetes de cliente/DlgAnswer.java
+++ b/java/com/l2jmega/servidor de juegos/red/paquetes de cliente/DlgAnswer.java
@@ -2.6 +2.7 @@

importar com.l2jmega.Config;
importar com.l2jmega.gameserver.handler.admincommandhandlers.AdminRecallAll;
+import com.l2jmega.gameserver.handler.voicedcommandhandlers.VoicedEvent;
importar com.l2jmega.gameserver.model.Announcement;
importar com.l2jmega.gameserver.model.actor.instance.Player;
importar com.l2jmega.gameserver.network.SystemMessageId;
@@ -42.6 +43.11 @@
activeChar.teleportAnswer(este._respuesta, este._solicitanteId);
}
}
+ si no (_messageId == SystemMessageId.EVENT.getId())
+ {
+ si (Anuncio.tvt_register == verdadero y _respuesta == 1)
+ VoicedEvent.JoinTvT(activoChar);
+ }
de lo contrario si (_messageId == 1983 && Config.ALLOW_WEDDING)
activeChar.engageAnswer(_respuesta);
de lo contrario si (_messageId == SystemMessageId.LE GUSTARÍA_ABRIR_LA_PUERTA.getId())[/CÓDIGO]
 
Back
Top