Jump to content

L2J Rewrite - Buscando developers


Rogiel

Recommended Posts

Salve pessoal! Estive no último mes trabalhando numa reescrita do L2J. É notório

para qualquer desenvolvedor Java que o L2J não teve um bom projeto: Statements por

todo código ou alto consumo de memória, só para exemplificar. Sem nem entrar no

quesito de uso de memória que é extremamente alto, eu acredito que é possível fazer melhor!

 

Estou reescrevendo esse emulador do zero, não estou usando uma linha sequer do L2JServer.

Porque? Porque consertar os erros do servidor é muito mais difícil do que recriar! Vou

citar algumas das características que fiz para o emulator:

  • Baseado em serviços: de logs e rede à AI é tudo um serviço. Serviços podem ser substituidos
    facilmente e comunicarem entre si.
  • Mundo baseado em eventos: cada ação de um player ou NPC, gera um evento que pode ser escutado
    por outro serviço! A aplicação principal disso são as knwonlists, não é preciso fazer o "broadcast"
    manual dos pacotes, é tudo feito pelos eventos!
    final WorldListener l = new WorldListener() {
    @Override
    protected boolean dispatch(WorldEvent e) {
    	if(e instanceof CharacterEnterWorldEvent) {
    		System.out.println("Character "+e.getCharacter()+" has logged-in.");
    	}
    	// keep listener alive
    	return true;
    }
    };
    // este é um evento global
    eventDispatcher.addListener(l);
    // é possivel também adicionar listeners para apenas um objeto
    final L2Character character = ...;
    eventDispatcher.addListener(character, l);
    


  • Sem singleton: singleton é simples, mas gera problemas. É quase impossivel alterar, temporariamente,
    uma implementação. Estou usando Google Guice.
  • Sem XML: é tudo Java. Templates de items, characters, NPC, Monstros, são uma classe em Java.
    Dessa maneira um determinado monstro ou item pode ter seu comportamento mudado sem precisar usar
    "hard-coded" ids no código! Além disso, os templates são compilados na inicialização do servidor
    e podem ser recarregados quando for necessário.
    Infelizmente esse conceito não funcionou muito bem e foi criado um novo formato de XML (bem diferente do L2J) para armazenar esses dados estáticos.
  • DAO-Aware IDs: é possível usar os objetos de ID para obter instâncias dos objetos no banco
    de dados!
    final CharacterID id = provider.createID(268437456);
    final L2Character character = id.getObject();


  • Chat baseado em canais: você adiciona um listener no canal é recebe notificações sempre que
    uma nova mensagem for enviada no canal (existem canais privados: player->player,
    ou públicos: player->vários players)
    ChatChannelListener l = new ChatChannelListener() {
    @Override
    public void onMessage(ChatChannel channel, CharacterID source,
    		String message) {
    	System.out.println(source.getObject().getName()+": "+message);
    }
    };
    chatService.getTradeChannel().addChatChannelListener(l);
    // sending a message
    final L2Character sender = ...;
    chatService.getTradeChannel().send(sender, "Hello world!");
    


  • Capacidade de filtrar objetos no mundo: basta adicionar filtros e você apenas "verá" o que o filtro aceitar.
    // neste exemplo todos os NPCs que o character pode ver são enviados para o cliente
    final L2Character character = ...;
    final Lineage2Connection conn = ...;
    for (final NPC npc : worldService.iterable(new AndFilter<NPC>(new InstanceFilter<NPC>(NPC.class),
    		new KnownListFilter(character)))) {
    conn.write(new NPCInformationPacket(npc));
    }
    


 

Vejam o código fonte no repositório abaixo para verem todos os detalhes!

 

O estágio atual do servidor é bem inicial, é possível criar characters, entrar no mundo e

caminhar. Entretando ainda não é possivel equipar ou desequipar armas nem atacar.

Existe um NPC fixo (dando spawn junto ao spawn inicial dos humandos fighter) como teste.

Ao clicar nele, uma mensagem de erro aparece. Como login server possuo uma versão patcheada

do login server do l2j, pretendo substituir mais a frente.

 

Tenho toda a source sincronizada no meu repositório no GitHub.

GitHub: https://github.com/l2jserver2/l2jserver2

Fórum: http://forum.l2jserver2.com/

 

Temporariamente estou usando o nome l2jserver2, pois quando iniciei o desenvolvimento apresentei

aos desenvolvedores do l2j: fui ignorado. Ainda não tive a chance de alterar o nome.

 

Depois de apresentado o projeto, gostaria de saber se tem alguém interessado em se juntar ao

projeto, seja para desenvolver ou para ajudar com as templates (a linguagem é simples). Pessoas

interessadas em ajudar no desenvolvimento podem entrar em contato comigo por MP ou por email ([email protected]).

 

É isso ai pessoal!

Link to comment
Share on other sites


  • Replies 77
  • Created
  • Last Reply

E - X - C - E - L - E - N - T - E

 

Muito bom cara, muito bom mesmo. Maaaaas, tem alguns pontos que ainda precisam ser vistos

 

Mundo baseado em eventos: cada ação de um player ou NPC, gera um evento que pode ser escutado

por outro serviço! A aplicação principal disso são as knwonlists, não é preciso fazer o "broadcast"

manual dos pacotes, é tudo feito pelos eventos!

Quanto à troca de packets server->client/client->server, isso geraria muito tráfego de packet inválido ou mesmo desnecessário, uma vez que nem sempre é preciso fazer o broadcast dos mesmos.

 

Sem XML: é tudo Java. Templates de items, characters, NPC, Monstros, são uma classe em Java.

Dessa maneira um determinado monstro ou item pode ter seu comportamento mudado sem precisar usar

"hard-coded" ids no código! Além disso, os templates são compilados na inicialização do servidor

e podem ser recarregados quando for necessário.

Isso sim é bom, uma vez que aplicações que dependem de arquivos XML em tamanho semelhante ao L2J perder 300% de performance. Mas, fazer via java seria ainda pior, porque diminuiria a acessibilidade aos dados requeridos. O melhor método ainda é o uso de banco de dados.

Aí, alguém vai me falar "mas vai aumentar o uso do banco de dados"

O uso do banco de dados é muito mais viável do que uso de XML (como mencionada a questão da performance) ou qualquer outra fonte física, pois aumenta a acessibilidade e comodidade em relação à edição de registros, tanto pelo source quanto pelo usuário.

 

E quanto aos milhares de Statementes, tu fez o que? Usou Hibernate ?

 

Por hora, só isso. Apenas algumas dicas e sugestões. Parabéns pela iniciativa.

 

Por mim, daria FIX nesse tópico, pq isso sim é projeto.

 

Abraços.

8cp1z10.png
Link to comment
Share on other sites

Como disse o mend3, isso sim que é projeto, so essa alteração dos pacotes ja torna o servidor bem seguro por um bom tempo.

Infelizmente sou leigo em java, adoraria contribuir.

A honra nunca se ofende impunemente: nunca existe por metade; inteira é forte, ferida está morta.

Link to comment
Share on other sites

Caraca, a quanto tempo estava esperando alguém tomar essa iniciativa tão "maravilhosamente incrível". Isso será uma inovação, sair fora da rotina do L2JServer, todos os servidores L2J são baseados nela e muitos pensam que os bugs estão presentes nas modificações, claro, que por parte sim, mais os grandes erros podem estar lá por muito mais tempo antes de ter modificado.

Eu queria poder ajudar, mais o conhecimento que tenho não é vasto, mais se precisar, pode contar comigo.

 

Boa sorte, ótima iniciativa!

mSw8ymV.gif

Link to comment
Share on other sites

E - X - C - E - L - E - N - T - E

 

Muito bom cara, muito bom mesmo. Maaaaas, tem alguns pontos que ainda precisam ser vistos

 

 

Quanto à troca de packets server->client/client->server, isso geraria muito tráfego de packet inválido ou mesmo desnecessário, uma vez que nem sempre é preciso fazer o broadcast dos mesmos.

 

 

Isso sim é bom, uma vez que aplicações que dependem de arquivos XML em tamanho semelhante ao L2J perder 300% de performance. Mas, fazer via java seria ainda pior, porque diminuiria a acessibilidade aos dados requeridos. O melhor método ainda é o uso de banco de dados.

Aí, alguém vai me falar "mas vai aumentar o uso do banco de dados"

O uso do banco de dados é muito mais viável do que uso de XML (como mencionada a questão da performance) ou qualquer outra fonte física, pois aumenta a acessibilidade e comodidade em relação à edição de registros, tanto pelo source quanto pelo usuário.

 

E quanto aos milhares de Statementes, tu fez o que? Usou Hibernate ?

 

Por hora, só isso. Apenas algumas dicas e sugestões. Parabéns pela iniciativa.

 

Por mim, daria FIX nesse tópico, pq isso sim é projeto.

 

Abraços.

Aos eventos, são apenas no lado do servidor, inclusive o sistema de broadcast é feito usando os eventos, no momento que o servidor despacha CharacterMoveEvent, um listener, que filtra apenas os objetos dentro do range do character, envia a mensagem de brodascast para o cliente. Ele apenas envia esse pacote caso o player esteja vendo (dentro do range). Veja esse serviço aqui apartir da linha 169: https://github.com/Rogiel/l2jserver2-gs/blob/master/src/main/java/com/l2jserver/service/game/character/CharacterServiceImpl.java

Esse sistema de broadcast ainda é temporário e vai ser movido de lugar, provavelmente para um novo serviço especializado em broadcast.

 

Minha intenção com os templates em Java foi focar nos comportamentos (de npcs, items e skills principalmente) ao invés de focar na acessibilidade externa, assim simplifica o "core" do servidor. Embora perca a acessibilidade fora do servidor, o ganho em flexibilidade é muito mais valioso: é possível criar um novo NPC de forma muito fácil. Na template em java os valores são definidos diretamente na classe e compilados na inicialização, isso gera um tempo de inicialização um pouco maior, mas acredito que ainda ficará mais rápido que usando SQL ou XML. No momento, com todos templates de NPC, o tempo de inicialização está em certa de 20-25 segundos. É possível ainda usar os templatates de forma pré-compilada, nesse módo o tempo de inicialização deve cair para menos de 6 segundos.

 

Aos statements do L2J eu me referi junto ao business, não estavam centralizados e eram repetidos em vários lugares. Eu usei DAO, assim é simples trocar de banco de dados.

Link to comment
Share on other sites

Nossa achei que ja tinha visto de tudo,mas isso sim é um projeto,parabéms mesmo!

 

Se isso for adiante concerteza irá revolucionar o Lineage II Java!

 

Incrivelmente maravilhoso[2]

 

 

Precisando de algo chama ai!

HYWuN.png

 

Quer algo bem feito?Faça você mesmo!

Link to comment
Share on other sites

Muito bomwink.gif, o trabalho que terá vai ser recompensado com um código limpo e fácil de entender.

 

Se eu não tivesse tão ocupado com certeza ia entrar nessa com você, mas alguns projetos da faculdade não me deixa blush.gif

 

Parabéns pela iniciativa e boa sorte wink.gif

Link to comment
Share on other sites

isso sim é 1 projeto de verdade !

 

tbm sinto muito nao poder contribuir meus conhecimentos em java sao muito limitados :S

cyCrFTF.jpg

Obrigado pelo presente Mickaelll

Corintiano Fanático;

Estudante de T.I e l2jbrasileiro nas horas vagas.

Link to comment
Share on other sites

Dá pra notar que vai pra frente mesmo, inciando pelo português do administrador.

Parabéns, boa sorte.

Este é um dos únicos projetos que eu vi aqui nesta área que vai pra frente.

Sucesso!

Sou um usuário aposentado há anos do L2JBrasil, por gentileza, não me contate para suporte, pois não entendo mais nada de L2J. Fiquei no tempo.
Link to comment
Share on other sites

Enquanto ao Projeto , Vai ser Free ou Privado ? Posso ajudar em Muita coisa oq for possivel ao meu alcanse .

 

Abraços.

Open source... projeto desse porte closed-source não vai pra frente. Todo código fonte já está no Git para qualquer um acessar.

 

Um update: reverti o conceito dos templates em Java, havia um problema que eu não previ -- o uso de memória duplicava. Criei um modelo de XML melhor que o do L2J. Dentro do XML também estão os HTMLs da conversa, assim tudo relacionado ao NPC fica dentro do arquivo do NPC. no futuro será também adicionada a lista de items que o NPC pode vender.

 

Conversar com NPCs já está funcionando, teleporte pelas gatekeepers também. As demais ações (multisell, buy, sell, atacar, etc...) ainda mostram uma mensagem de erro.

Link to comment
Share on other sites

Havia parado um tempo com L2J pelo desempenho,mas com esse projeto,vou ficar atento sobre ele.

Logo mais estarei compilando para testes.

Parabéns mano,você tem futuro :happy:

class L2JBrasil {
   protected function L2JBr() {
if($user->logon = 'FALSE'){
return "Leecher-> ALT+F5";}}}

Link to comment
Share on other sites

Ai galera vamos fazer um multirão pra criar as XMLS dos items sei la...

 

Reparte uma parte pra cada ai!O kara ja fez muito de postar o projeto aqui!

Eu acho que se montar uma equipe,ele vai ficar pronto mais rapido ;D

HYWuN.png

 

Quer algo bem feito?Faça você mesmo!

Link to comment
Share on other sites

Poderia disponibilizar a mesma já compilada?

É por que estou sem eclipse neste computador. :/

Ainda não vale a pena compilar, ainda falta muita coisa. Mas assim que o servidor ficar mais utilizável, faço uma compilação sim.

 

Ai galera vamos fazer um multirão pra criar as XMLS dos items sei la...

 

Reparte uma parte pra cada ai!O kara ja fez muito de postar o projeto aqui!

Eu acho que se montar uma equipe,ele vai ficar pronto mais rapido ;D

De momento estou usando bastante conversão dos dados do L2J (link abaixo), mas uma equipe para ajudar nisso seria ótimo. Ainda não fiz conversor para os items (eles são bem complexos). Characters e NPCs já tem um conversor bem desenvolvido.

https://github.com/Rogiel/l2jserver2-gs/blob/master/data/templates/npc/kamaelvillagemaster/32146-Valpor.xml -- esse é um exemplo de um NPC convertido a partir de vários arquivos do L2J.

Link to comment
Share on other sites

Se quiser ajuda nas .xml's é só falar, estou disponível agora. (:

Eu falo, compilar para ver como está o andamento do projeto. Adoraria testar aqui em casa, mesmo não estando completo.

mSw8ymV.gif

Link to comment
Share on other sites

Se quiser ajuda nas .xml's é só falar, estou disponível agora. (:

Eu falo, compilar para ver como está o andamento do projeto. Adoraria testar aqui em casa, mesmo não estando completo.

Fiz uma compilação, ainda não fiz loginserver, então estou usando uma versão patcheada do L2J, ela desativa a verificação de autenticação com o GS. Os arquivos que configuração não estão completos, mas o que precisa está ali: database.properties.

jdbc.mysql.url = jdbc:mysql://localhost/l2jserver2
jdbc.mysql.driver = com.mysql.jdbc.Driver
jdbc.mysql.username = l2j
jdbc.mysql.password = changeme

Não precisa muita explicação eu acho.

 

As SQL para criar as tabelas estão em "sql". São poucas de momento. Já possui alguns dados, só lembrem-se de editar o nome da conta à qual o character pertence.

Apenas tem um script de inicialização para Linux (eu uso linux), mas nem ele foi implementado ainda.

 

Nota: uma série de warnings aparece dizendo que um template de NPC não foi encontrado, isso acontece pois o conversor está dando erro na hora de converter esse único NPC. Por enquanto é normal e não causa muito problema, o NPC é "Fairy Pixy" -- inútil!

com.l2jserver.db.dao.mysql5.MySQL5NPCDAO:109 - No template found for NPCTemplateID [id=31845]

 

GameServer -> http://www.megaupload.com/?d=S4212E91

LoginServer -> http://www.megaupload.com/?d=DVMBU9I3

Link to comment
Share on other sites

Olá, bom dia.

Como você disse, tem o arquivo database.properties para configurar, até aí tudo bem. Mas, eu modifico o mesmo e ainda continua a mesma senha e o mesmo login de usuário.

Então me fez pensar que está configuração não está funcionando, se for erro meu, por favor me corriga.

 

Olha o log:

[ERROR 2011-05-26 09-57-50] com.l2jserver.service.database.MySQLDatabaseService:
154 - Could not open database connection
java.sql.SQLException: Access denied for user 'l2j'@'localhost' (using password: YES)
       at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
       at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
       at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
       at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:935)
       at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4101)
       at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1300)
       at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2337)
       at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
       at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
       at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
       at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
       at java.lang.reflect.Constructor.newInstance(Unknown Source)
       at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
       at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
       at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
       at java.sql.DriverManager.getConnection(Unknown Source)
       at java.sql.DriverManager.getConnection(Unknown Source)
       at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:94)
       at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:256)
       at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:816)
       at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:115)
       at com.l2jserver.service.database.MySQLDatabaseService.query(MySQLDatabaseService.java:144)
       at com.l2jserver.db.dao.mysql5.MySQL5CharacterDAO.selectIDs(MySQL5CharacterDAO.java:272)
       at com.l2jserver.service.game.world.CachedWorldIDService.load(CachedWorldIDService.java:107)
       at com.l2jserver.service.game.world.WorldServiceImpl.doStart(WorldServiceImpl.java:85)
       at com.l2jserver.service.AbstractService.start(AbstractService.java:40)
       at com.l2jserver.service.ServiceManager.start(ServiceManager.java:77)
       at com.l2jserver.service.ServiceManager.startDependencies(ServiceManager.java:98)
       at com.l2jserver.service.ServiceManager.start(ServiceManager.java:74)
       at com.l2jserver.l2jgameserverMain.main(l2jgameserverMain.java:54)

 

Agora veja o arquivo configurado:

jdbc.mysql.url = jdbc:mysql://localhost/rogiel
jdbc.mysql.driver = com.mysql.jdbc.Driver
jdbc.mysql.username = root
jdbc.mysql.password = 

 

Olhe no log acima, e veja que mesmo eu mundando o username para o default que é root, continua acusando que está l2j e o mesmo acontece com a senha e o banco de dados.

Fui procurar o erro através dos arquivos e creio eu que tenha algo a ver com está pedição de configuração:

package com.l2jserver.service.database;

/**
* Configuration interface for {@link MySQLDatabaseService}.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public interface MySQLDatabaseConfiguration extends DatabaseConfiguration {
/**
* @return the jdbc url
*/
@ConfigurationPropertyGetter(name = "jdbc.mysql.url", defaultValue = "jdbc:mysql://localhost/l2jserver2")
String getJdbcUrl();

/**
* @param jdbcUrl
* the new jdbc url
*/
@ConfigurationPropertySetter(name = "jdbc.mysql.url")
void setJdbcUrl(String jdbcUrl);

/**
* @return the jdbc driver class
*/
@ConfigurationPropertyGetter(name = "jdbc.mysql.driver", defaultValue = "com.mysql.jdbc.Driver")
String getDriver();

/**
* @param driver
* the new jdbc driver
*/
@ConfigurationPropertySetter(name = "jdbc.mysql.driver")
void setDriver(Class<?> driver);

/**
* @return the mysql database username
*/
@ConfigurationPropertyGetter(name = "jdbc.mysql.username", defaultValue = "l2j")
String getUsername();

/**
* @param username
* the mysql database username
*/
@ConfigurationPropertySetter(name = "jdbc.mysql.username")
void setUsername(String username);

/**
* @return the mysql database password
*/
@ConfigurationPropertyGetter(name = "jdbc.mysql.password", defaultValue = "changeme")
String getPassword();

/**
* @param password
* the mysql database password
*/
@ConfigurationPropertySetter(name = "jdbc.mysql.password")
void setPassword(String password);
}

 

Caso eu esteja errado, repido, por favor me corrija.

 

Obrigado.

mSw8ymV.gif

Link to comment
Share on other sites

Olá, bom dia.

Como você disse, tem o arquivo database.properties para configurar, até aí tudo bem. Mas, eu modifico o mesmo e ainda continua a mesma senha e o mesmo login de usuário.

Então me fez pensar que está configuração não está funcionando, se for erro meu, por favor me corriga.

 

Olha o log:

...

 

Agora veja o arquivo configurado:

...

 

Olhe no log acima, e veja que mesmo eu mundando o username para o default que é root, continua acusando que está l2j e o mesmo acontece com a senha e o banco de dados.

Fui procurar o erro através dos arquivos e creio eu que tenha algo a ver com está pedição de configuração:

...

 

Caso eu esteja errado, repido, por favor me corrija.

 

Obrigado.

O ProxyConfigurationService não estava buscando na hierarquia das classes uma @annotation @ConfigurationName("database"), dai ele nunca encontrava um arquivo de configurações. Fix um hotfix: http://www.megaupload.com/?d=6PJ6DACE, é apenas o .jar. Só substituir e pronto.

 

Outra coisa que esqueci de comentar que a versão do protocolo usada atualmente é Freya.

/**
* Freya(216)
*/
FREYA(216, RELEASE)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • 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.