Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 09/18/2018 in all areas

  1. 13 points
    Hey Guys, Welcome to L2JBlueHeart Desenvolvedores: @vert | @TurtleLess | @Azazyel | @Reign Npcs ------------------------------------------------------------------------------------------------------------- Sinto falta de jogar um servidor no tempo livre, comecei a jogar a uns 10 anos atrás, joguei por 8 anos, agora trabalho e estudo então sobra pouco tempo, nas minhas ultimas tentativas de jogar L2, eu entrava em um servidor e ele fechava em menos de 1 semana, então cheguei a conclusão de que só estava perdendo meu tempo. Decidi montar um servidor para os players que se sentem como eu se divertirem, algo bem old school; eu joguei vários PvPs e o BrThunder por 8 anos (ele mudou de nome e de crônica várias vezes) mas manteve a essencia do comércio e da jogabilidade (até nos seus ultimos anos, apesar de que acabou perdendo essa essencia infelizmente). A minha ideia de mexer nessa revisão é montar um 20x o mais próximo de como o BrThunder era, focado no comércio, sem customs, com suporte ativo, etc... Vou postar aqui as correções que já fiz nessa pack da JSunrise postada pelo Hl4p3x. L2JBlueHeart ? Changes & Fixes & Details XP em Party - No trecho do código onde é calculado o xp em party, antes o xp em party era a quantia definida no Rates.ini dividida pelos membros na pt, então se a pt tivesse 7 membros e o xp em pt fosse 20x(vezes o xp do mob) (enquando o xp normal é 10x), seria 20 / 7 = 2,85x(vezes o xp do mob), e para contornar esse desfalque, se a rate do xp em party fosse aumentada, uma pt de 2 players receberia bem mais e seria injusto, tornando inviável um servidor low/mid rate ser balanceado. Agora o xp em pt é multiplicado pela quantidade de pessoas na PT; exemplo: servidor é 20x normal, 1.1x xp em party (upar em pt irá render 10% a mais de xp, se fosse 1.6, seria 60%, etc...), pois o calculo ficou assim: (xp mob) * (rate xp * rate xp party * quantidade de players na party). Item-mall (Shop Prime) - Ele estava duplicando items: se a pessoa já tivesse 1 item do que seria comprado, aí o sistema agia como o esperado e só adicionava, caso não tivesse nenhum item, os items eram comprados em várias quantidades, exemplo: não tenho enchant armor S e pretendo comprar 10 no shop prime, ele iria me entregar 10 enchant armor S (10) 10 vezes, ficaria com 100 enchants no total. Era uma verificação escrita sem atenção e acabou gerando o "bug". Transformação AIO - Transformação aio criada, 7 dias e 30 dias (fotos). Voice Command EXP (.exp|.expoff|.expon) - O que veio na revisão só funcionava se a configuração do .ccp estivesse ativa, então criei um voice command separado, o .exp funciona como um switch (se estiver on, destiva, se estiver off, ativa). Nevit System - O buff do vitality estava ativando com muita frequencia, agora ele ativa de 20 em 20 leveis (apróximadamente), o que é ótimo para os players novos e não se torna uma bola de neve para os players avançados. Beginner's Pack - Ao criar um personagem, o mesmo recebe um auxilio do sistema, alguns itens: soulshot, spiritshot, cocktail buff, revita pop, armors shadow até a grade A. Infos & Configs Buffs = 20 min RateXp = 20 RateQuestDrop = 3 // Preciso verificar essa rate, pensei em quests básicas como a de monstone mas não chequei as que dão s84 lá de antharas. RateDropItemsById = 57,7.5 // (adena 7.5x) RateCommonHerbs = 0.5 RateHpHerbs = 0.5 RateMpHerbs = 0.5 RateSpecialHerbs = 0.5 RateVitalityHerbs = 0.3 DecreaseSkillOnDelevel = False // Importante para chars de farm, como upar um titan pra 81, add forgotten nele, delevar pra 76 e farmar elemental stone. MaxLvlDiffCanKeepSkillLvl = 9 AltWeightLimit = 6 AutoLearnSkills = True // Focar no que importa: se divertir AutoLearnForgottenScrollSkills = False // Um mundo precisa ter comércio, até o L2 MaxBuffAmount = 24 MaxTriggeredBuffAmount = 12 MaxDanceAmount = 12 DanceCancelBuff = True // Allow players to cancel dances/songs via Alt+click on buff icon AutoLearnDivineInspiration = False // ;) MagicFailures = True // Está bem tranquilo upar de mago ou de fighter... AltSubClassWithoutQuests = False // Hello boss de sub AltTransformationWithoutQuest = False // Hello quest chata de transformação RestoreServitorOnReconnect = True // Restaura os summons ao reconectar RestorePetOnReconnect = True // Restaura os pets ao reconectar EnableVitality = True MaxSubclass = 3 MaxSubclassLevel = 80 EnchantChanceElementStone = 50 EnchantChanceElementCrystal = 30 EnchantChanceElementJewel = 15 EnchantChanceElementEnergy = 10 AugmentationNGSkillChance = 15 AugmentationMidSkillChance = 30 AugmentationHighSkillChance = 45 AugmentationTopSkillChance = 60 AugmentationNGGlowChance = 0 AugmentationMidGlowChance = 40 AugmentationHighGlowChance = 70 AugmentationTopGlowChance = 100 CraftMasterwork = True AltMaxNumOfClansInAlly = 3 AltClanMembersForWar = 15 AltLeavePartyLeader = True // Quando o lider da party sai, o próximo membro de torna o lider ao invés de desfazer a pt UnstuckInterval = 30 AllowDiscardItem = True AutoDestroyDroppedItemAfter = 600 // 10 min AutoDestroyHerbTime = 15 // 15 secs EnableCommunity = False // Por enquanto o community board está desabilitado HellboundWithoutQuest = False // Hello hellbound Fotos do Projeto Há mais fotos do projeto, todas estão aqui: https://imgur.com/a/jTjinyw Caso encontrem algo que precise de correção ou mudança, é só postar aqui no tópico, vou tentar manter o tópico atualizado com as informações pra vocês. Suportes ativos, tudo balanceado (o máximo possível), ter um server pra sempre se divertir com os amigos, etc... Andei pesquisando e testando, consigo por o servidor online no linux entre 80 a 60 reais ou até menos dependendo da estrutura que eu montar (login, game, banco de dados), a forma do servidor se pagar seria com mana potions, enfeites, etc... Nada que atrapalhasse a jogabilidade, são 200 mana potions por 3 reais, cp potion, etc... Para ganhar dinheiro eu trabalho, o servidor seria pra matar a saudade dos velhos tempos (tanto pra mim quanto pros outros jogadores), gostaria de relembrar a infância em um servidor que não reabrisse todo mês... Para a galera que quer contribuir, testar e se divertir, o servidor de testes está online: download system Para os que vão contribuir e testar, podem utilizar esse tópico pra reportar bugs e melhorias. Para os que vão apenas se divertir, pretendo tratar o servidor como um servidor pronto e real (não irei ficar derrubando a máquina toda hora para atualizar), esse é o Alpha Test, então os que jogarem não estarão perdendo tempo pois as participações no Alpha Test e no Beta Test ficarão registradas e receberão alguns brindes no servidor após os períodos de teste. Como não é um servidor real, não possui site, a criação de conta é in game e estou disponibilizando um Account Panel Manager pra vocês se divertirem. Instruções sobre o ACP: ao deslogar, é preciso vir aqui e clicar no link novamente pra dizer ao painel em qual servidor se conectar, caso queiram deixar o link salvo na barra de favoritos, eis aqui o link completo: http://panel.lineage2.store/login/4EA3-AEB2-F32A-F7A123 Se for feita alguma doação para o servidor através do ACP, uma parte será destinada a pagar a manutenção das máquinas em que o servidor de teste está online e outra parte será convertida em doação aqui para a JBr para auxiliar nos custos de manter o fórum. As moedas serão registradas no banco de dados, e poderão ser transferidas para o game além de serem usadas no shop do ACP. Como teremos os registros delas, elas serão reembolsadas (enviadas sem precisar doar novamente) após o período de testes. Os períodos do Teste Beta e do Teste Alpha não estão definidos, podendo durar várias semanas ou meses... O intuito desse projeto não é ganhar dinheiro, mas sim disponibilizar um servidor legal para todos se divertirem, auxiliar na manutenção da JBr como agradecimento pelo conhecimento que adquirimos aqui e trocar informações sobre bug fixes dos que já foram fixados e os que ainda serão; Qualquer dúvida ou feedback é só postar ;D PS: Irei manter os créditos da JSunrise no core do projeto, não da pra ver na foto que coloquei no tópico, mas mantive todos os créditos, somente adicionei os meus já que estou usando a Sunrise como base. Os releases serão postados no github e aqui no tópico, então fiquem de olho no tópico. PS 2: As correções só serão feitas com base no que vocês reportarem, se não reportarem nada, não haverá novos releases; É um projeto que deve ser mantido pela comunidade, então conto com todos; Vocês terão o que contribuírem, caso não contribuam, não terão nada. Tópico na área de desenvolvimento: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Custom html dressme by @alexfabiano: Em agradecimento pelo dressme estou postando uma html opcional do painel .dressme editado por mim! Substituir a pasta: \game\data\html\sunrise\dressme Também adicionei o botão de back to menu nas abas de cada dressme. Espero que gostem! DOWNLOAD ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Custom shift+click by @Azazyel Ai, ao testar o Shift+Click nos monstros me deparei com uma html horrivel e toda fora do lugar, fui la e fiz umas modificações. Retirei os status do monstro, pois acho que só o que importa mesmo são as informações sobre o drop, spoil e quest. Link para download: http://www.mediafire.com/file/iyr4zn7d6e5087n/Drop+Info.rar Basta substituir o arquivo que se encontra ja no seu caminho! Quem tiver algum receio faça um back apenas compactando o arquivo original "L2NpcActionShift.java". É o unico arquivo modificado! Print: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Cálculo do XP e XP em party; | vert Cálculo dos pontos Nevit's recebidos a cada level | vert Shop Prime (item mall) | vert DressMe | TurtleLess, alexfabiano, Reign Siege | Reign TW | Reign Grácia Área | Reign Hellbound | Reign Flag Zone | Reign Chaotic Zone | Reign Manor Manager | Reign Level Up | Onã Game Play | Onã Skills Transformation AIO ++ | Reign Premium Admin | alexfabiano Queen e Orfen | xRodox Quest Valakas, Baium, Antharas | Reign ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Download Revisão: https://github.com/danielbarion/L2JBlueHeart Source da Revisão: https://github.com/danielbarion/JBlueHeart-Source
  2. 11 points
    Bom Galera Como Eu Estava Um Poco Inativo Aqui No Forum Pra Voces, Ai Eu Lenbrei Que Era Menbro Ainda Aqui OPASKdpokASPODKpaksd Entao Como Nao Tinha Nada Para Fazer Resolvi Fazer 1 Server Packs Pré Configurado Em Modo pvp-Rate Algumas Info: Siege Semanal Olly semanal Tatto Custom Weapons valakas - dynasty - icarus Armor titanium , dark kignt , dynasty , vesper Custom Donate Shop VIP - Hero - Class, Name e Sex Change 99 Acessórios 2018 Blessed Scroll: 90% +18 - Crystal Scroll 100% até +22 - Golden Scroll 100% até +25 Buff Clan Manager Raid Info Augment NPC Skills Enchant NPC Tournament Event - TvT - Party farm events Chaotic Zone Aiox System Vip System Mod Phantom - Fake Player System Anti-bot com Captcha Alguns Comandos: .menu .info .donate .status .skills .inventory .ranking //fakes tudo configurado manualmente pelo fakesplayer.properties Start new char configurado manualmente pelo startupmanager.properties Algumas Imagens:
  3. 8 points
    Esse guia tem como objetivo apresentar de maneira sucinta os passos necessários para utilizar o mmocore assíncrono. Não sabe o que é? dê uma olhada nesse tópico. Estarei utilizando L2jServer Interlude para realizar a migração. Outras versões podem ter algumas diferenças, mas nada muito específico que este guia não possa cobrir. Remover o mmocore da pasta lib. Nesse momento vários erros aparecerão na IDE, caso esteja usando Adicionar o mmocore-2.0 no projeto A versão compilada está disponível aqui Caso prefira compilar: github Realizar as alterações em L2GameServerPacket Index: L2J_Server/java/net/sf/l2j/gameserver/serverpackets/L2GameServerPacket.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/serverpackets/L2GameServerPacket.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/serverpackets/L2GameServerPacket.java (date 1538483553000) @@ -21,12 +21,12 @@ import net.sf.l2j.gameserver.network.L2GameClient; -import org.mmocore.network.SendablePacket; +import org.l2j.mmocore.WritablePacket; /** * @author KenM */ -public abstract class L2GameServerPacket extends SendablePacket<L2GameClient> +public abstract class L2GameServerPacket extends WritablePacket<L2GameClient> { private static final Logger _log = Logger.getLogger(L2GameServerPacket.class.getName()); Realizar as alterações em L2GameClientPacket Index: L2J_Server/java/net/sf/l2j/gameserver/clientpackets/L2GameClientPacket.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/clientpackets/L2GameClientPacket.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/clientpackets/L2GameClientPacket.java (date 1538485300000) @@ -24,13 +24,13 @@ import net.sf.l2j.gameserver.serverpackets.ActionFailed; import net.sf.l2j.gameserver.serverpackets.L2GameServerPacket; -import org.mmocore.network.ReceivablePacket; +import org.l2j.mmocore.ReadablePacket; /** * Packets received by the game server from clients * @author KenM */ -public abstract class L2GameClientPacket extends ReceivablePacket<L2GameClient> +public abstract class L2GameClientPacket extends ReadablePacket<L2GameClient> { private static final Logger _log = Logger.getLogger(L2GameClientPacket.class.getName()); Realizar as alterações no L2GameClient Index: L2J_Server/java/net/sf/l2j/gameserver/network/L2GameClient.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/network/L2GameClient.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/network/L2GameClient.java (date 1538486040000) @@ -45,14 +45,14 @@ import net.sf.l2j.gameserver.serverpackets.UserInfo; import net.sf.l2j.util.EventData; -import org.mmocore.network.MMOClient; -import org.mmocore.network.MMOConnection; +import org.l2j.mmocore.Client; +import org.l2j.mmocore.Connection; /** * Represents a client connected on Game Server * @author KenM */ -public final class L2GameClient extends MMOClient<MMOConnection<L2GameClient>> +public final class L2GameClient extends Client<Connection<L2GameClient>> { protected static final Logger _log = Logger.getLogger(L2GameClient.class.getName()); @@ -89,7 +89,7 @@ public byte packetsSentInSec = 0; public int packetsSentStartTick = 0; - public L2GameClient(MMOConnection<L2GameClient> con) + public L2GameClient(Connection<L2GameClient> con) { super(con); state = GameClientState.CONNECTED; @@ -121,18 +121,17 @@ } @Override - public boolean decrypt(ByteBuffer buf, int size) + public boolean decrypt(byte[] buf, int offset, int size) { - crypt.decrypt(buf.array(), buf.position(), size); + crypt.decrypt(buf, offset, size); return true; } @Override - public boolean encrypt(final ByteBuffer buf, final int size) + public int encrypt(final byte[] buf, final int offset, final int size) { - crypt.encrypt(buf.array(), buf.position(), size); - buf.position(buf.position() + size); - return true; + crypt.encrypt(buf, offset, size); + return size; } public L2PcInstance getActiveChar() @@ -180,7 +179,7 @@ public void sendPacket(L2GameServerPacket gsp) { - getConnection().sendPacket(gsp); + writePacket(gsp); gsp.runImpl(); } @@ -467,11 +466,6 @@ } } - public void close(L2GameServerPacket gsp) - { - getConnection().close(gsp); - } - /** * @param charslot * @return @@ -486,15 +480,15 @@ Integer objectId = _charSlotMapping.get(charslot); return objectId.intValue(); } - + + @Override - protected void onForcedDisconnection() - { - _log.info("Client " + toString() + " disconnected abnormally."); + public void onConnected() { + } - + /** - * @see org.mmocore.network.MMOClient#onDisconnection() + * @see Client#onDisconnection() */ @Override protected void onDisconnection() @@ -582,15 +576,15 @@ { try { - InetAddress address = getConnection().getInetAddress(); + String address = getHostAddress(); switch (getState()) { case CONNECTED: - return "[IP: " + (address == null ? "disconnected" : address.getHostAddress()) + "]"; + return "[IP: " + (address.isEmpty() ? "disconnected" : address) + "]"; case AUTHED: - return "[Account: " + getAccountName() + " - IP: " + (address == null ? "disconnected" : address.getHostAddress()) + "]"; + return "[Account: " + getAccountName() + " - IP: " + (address.isEmpty() ? "disconnected" : address) + "]"; case IN_GAME: - return "[Character: " + (getActiveChar() == null ? "disconnected" : getActiveChar().getName()) + " - Account: " + getAccountName() + " - IP: " + (address == null ? "disconnected" : address.getHostAddress()) + "]"; + return "[Character: " + (getActiveChar() == null ? "disconnected" : getActiveChar().getName()) + " - Account: " + getAccountName() + " - IP: " + (address.isEmpty() ? "disconnected" : address) + "]"; default: throw new IllegalStateException("Missing state on switch"); } Realizar as alterações em L2LoginServerPacket Index: L2J_Server/java/net/sf/l2j/loginserver/serverpackets/L2LoginServerPacket.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/serverpackets/L2LoginServerPacket.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/serverpackets/L2LoginServerPacket.java (date 1538486372000) @@ -19,12 +19,12 @@ import net.sf.l2j.loginserver.L2LoginClient; -import org.mmocore.network.SendablePacket; +import org.l2j.mmocore.WritablePacket; /** * @author KenM */ -public abstract class L2LoginServerPacket extends SendablePacket<L2LoginClient> +public abstract class L2LoginServerPacket extends WritablePacket<L2LoginClient> { } Realizar as alterações em L2LoginClientPacket Index: L2J_Server/java/net/sf/l2j/loginserver/clientpackets/L2LoginClientPacket.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/clientpackets/L2LoginClientPacket.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/clientpackets/L2LoginClientPacket.java (date 1538486503000) @@ -21,12 +21,12 @@ import net.sf.l2j.loginserver.L2LoginClient; -import org.mmocore.network.ReceivablePacket; +import org.l2j.mmocore.ReadablePacket; /** * @author KenM */ -public abstract class L2LoginClientPacket extends ReceivablePacket<L2LoginClient> +public abstract class L2LoginClientPacket extends ReadablePacket<L2LoginClient> { private static Logger _log = Logger.getLogger(L2LoginClientPacket.class.getName()); Realizar as alterações no L2LoginClient Index: L2J_Server/java/net/sf/l2j/loginserver/L2LoginClient.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/L2LoginClient.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/L2LoginClient.java (date 1538486988000) @@ -18,14 +18,13 @@ package net.sf.l2j.loginserver; import java.io.IOException; -import java.net.InetAddress; -import java.nio.ByteBuffer; import java.security.interfaces.RSAPrivateKey; import java.util.logging.Logger; import net.sf.l2j.Config; import net.sf.l2j.loginserver.crypt.LoginCrypt; import net.sf.l2j.loginserver.crypt.ScrambledKeyPair; +import net.sf.l2j.loginserver.serverpackets.Init; import net.sf.l2j.loginserver.serverpackets.L2LoginServerPacket; import net.sf.l2j.loginserver.serverpackets.LoginFail; import net.sf.l2j.loginserver.serverpackets.LoginFail.LoginFailReason; @@ -33,15 +32,15 @@ import net.sf.l2j.loginserver.serverpackets.PlayFail.PlayFailReason; import net.sf.l2j.util.Rnd; -import org.mmocore.network.MMOClient; -import org.mmocore.network.MMOConnection; -import org.mmocore.network.SendablePacket; +import org.l2j.mmocore.Client; +import org.l2j.mmocore.Connection; +import org.l2j.mmocore.WritablePacket; /** * Represents a client connected into the LoginServer * @author KenM */ -public final class L2LoginClient extends MMOClient<MMOConnection<L2LoginClient>> +public final class L2LoginClient extends Client<Connection<L2LoginClient>> { private static Logger _log = Logger.getLogger(L2LoginClient.class.getName()); @@ -72,11 +71,11 @@ /** * @param con */ - public L2LoginClient(MMOConnection<L2LoginClient> con) + public L2LoginClient(Connection<L2LoginClient> con) { super(con); _state = LoginClientState.CONNECTED; - String ip = getConnection().getInetAddress().getHostAddress(); + String ip = getHostAddress(); // TODO unhardcode this if (ip.startsWith("192.168") || ip.startsWith("10.0") || ip.equals("127.0.0.1")) @@ -98,53 +97,48 @@ } /** - * @see #decrypt(java.nio.ByteBuffer, int) + * @see Client#decrypt(byte[], int, int) */ @Override - public boolean decrypt(ByteBuffer buf, int size) + public boolean decrypt(byte[] buf, int offset, int size) { boolean ret = false; try { - ret = _loginCrypt.decrypt(buf.array(), buf.position(), size); + ret = _loginCrypt.decrypt(buf, offset, size); } catch (IOException e) { e.printStackTrace(); - super.getConnection().close((SendablePacket<L2LoginClient>) null); + close((WritablePacket<L2LoginClient>) null); return false; } if (!ret) { - byte[] dump = new byte[size]; - System.arraycopy(buf.array(), buf.position(), dump, 0, size); - _log.warning("Wrong checksum from client: " + toString()); - super.getConnection().close((SendablePacket<L2LoginClient>) null); + close((WritablePacket<L2LoginClient>) null); } return ret; } /** - * @see #encrypt(java.nio.ByteBuffer, int) + * @see Client#encrypt(byte[], int, int) */ @Override - public boolean encrypt(ByteBuffer buf, int size) + public int encrypt(byte[] buf, int offset, int size) { - final int offset = buf.position(); + int encryptedSize = -1; try { - size = _loginCrypt.encrypt(buf.array(), offset, size); + encryptedSize = _loginCrypt.encrypt(buf, offset, size); } catch (IOException e) { e.printStackTrace(); - return false; } - - buf.position(offset + size); - return true; + + return encryptedSize; } public LoginClientState getState() @@ -234,26 +228,26 @@ public void sendPacket(L2LoginServerPacket lsp) { - getConnection().sendPacket(lsp); + writePacket(lsp); } public void close(LoginFailReason reason) { - getConnection().close(new LoginFail(reason)); + super.close(new LoginFail(reason)); } public void close(PlayFailReason reason) { - getConnection().close(new PlayFail(reason)); - } - - public void close(L2LoginServerPacket lsp) - { - getConnection().close(lsp); + super.close(new PlayFail(reason)); } - - /** - * @see org.mmocore.network.MMOClient#onDisconnection() + + @Override + public void onConnected() { + sendPacket(new Init(this)); + } + + /** + * @see Client#onDisconnection() */ @Override protected void onDisconnection() @@ -272,25 +266,16 @@ LoginController.getInstance().removeAuthedLoginClient(getAccount()); } } - - /** - * @see org.mmocore.network.MMOClient#onForcedDisconnection() - */ - @Override - protected void onForcedDisconnection() - { - // TODO Auto-generated method stub - - } + @Override public String toString() { - InetAddress address = getConnection().getInetAddress(); + String address = getHostAddress(); if (getState() == LoginClientState.AUTHED_LOGIN) { - return "[" + getAccount() + " (" + (address == null ? "disconnected" : address.getHostAddress()) + ")]"; + return "[" + getAccount() + " (" + (address.isEmpty() ? "disconnected" : address) + ")]"; } - return "[" + (address == null ? "disconnected" : address.getHostAddress()) + "]"; + return "[" + (address.isEmpty() ? "disconnected" : address) + "]"; } } Realizar as alterações em SelectorHelper Index: L2J_Server/java/net/sf/l2j/loginserver/SelectorHelper.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/SelectorHelper.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/SelectorHelper.java (date 1538498336000) @@ -17,23 +17,20 @@ */ package net.sf.l2j.loginserver; -import java.nio.channels.SocketChannel; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.AsynchronousSocketChannel; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import net.sf.l2j.loginserver.serverpackets.Init; -import org.mmocore.network.IAcceptFilter; -import org.mmocore.network.IClientFactory; -import org.mmocore.network.IMMOExecutor; -import org.mmocore.network.MMOConnection; -import org.mmocore.network.ReceivablePacket; +import org.l2j.mmocore.*; /** * @author KenM */ -public class SelectorHelper implements IMMOExecutor<L2LoginClient>, IClientFactory<L2LoginClient>, IAcceptFilter +public class SelectorHelper implements PacketExecutor<L2LoginClient>, ClientFactory<L2LoginClient>, ConnectionFilter { private final ThreadPoolExecutor _generalPacketsThreadPool; @@ -43,22 +40,27 @@ } @Override - public void execute(ReceivablePacket<L2LoginClient> packet) + public void execute(ReadablePacket<L2LoginClient> packet) { _generalPacketsThreadPool.execute(packet); } @Override - public L2LoginClient create(MMOConnection<L2LoginClient> con) + public L2LoginClient create(Connection<L2LoginClient> con) { L2LoginClient client = new L2LoginClient(con); - client.sendPacket(new Init(client)); return client; } @Override - public boolean accept(SocketChannel sc) + public boolean accept(AsynchronousSocketChannel sc) { - return !LoginController.getInstance().isBannedAddress(sc.socket().getInetAddress()); + try { + InetSocketAddress socketAddress = (InetSocketAddress) sc.getRemoteAddress(); + return !LoginController.getInstance().isBannedAddress(socketAddress.getAddress()); + } catch (IOException e) { + return false; + } + } } Realizar as alterações no LoginController Index: L2J_Server/java/net/sf/l2j/loginserver/LoginController.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/LoginController.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/LoginController.java (date 1538498717000) @@ -68,7 +68,7 @@ private final Map<InetAddress, BanInfo> _bannedIps = new FastMap<InetAddress, BanInfo>().shared(); - private final Map<InetAddress, FailedLoginAttempt> _hackProtection; + private final Map<String, FailedLoginAttempt> _hackProtection; protected ScrambledKeyPair[] _keyPairs; @@ -476,12 +476,12 @@ public boolean loginValid(String user, String password, L2LoginClient client) { boolean ok = false; - InetAddress address = client.getConnection().getInetAddress(); + String address = client.getHostAddress(); // log it anyway - Log.add("'" + (user == null ? "null" : user) + "' " + (address == null ? "null" : address.getHostAddress()), "logins_ip"); + Log.add("'" + (user == null ? "null" : user) + "' " + (address.isEmpty() ? "null" : address), "logins_ip"); // player disconnected meanwhile - if (address == null) + if (address.isEmpty()) { return false; } @@ -529,7 +529,7 @@ ps2.setString(2, Base64.encodeBytes(hash)); ps2.setLong(3, System.currentTimeMillis()); ps2.setInt(4, 0); - ps2.setString(5, address.getHostAddress()); + ps2.setString(5, address); ps2.execute(); } @@ -569,7 +569,7 @@ try (PreparedStatement ps3 = con.prepareStatement("UPDATE accounts SET lastactive=?, lastIP=? WHERE login=?")) { ps3.setLong(1, System.currentTimeMillis()); - ps3.setString(2, address.getHostAddress()); + ps3.setString(2, address); ps3.setString(3, user); ps3.execute(); } @@ -583,13 +583,13 @@ if (!ok) { - Log.add("'" + user + "' " + address.getHostAddress(), "logins_ip_fails"); + Log.add("'" + user + "' " + address, "logins_ip_fails"); FailedLoginAttempt failedAttempt = _hackProtection.get(address); int failedCount; if (failedAttempt == null) { - _hackProtection.put(address, new FailedLoginAttempt(address, password)); + _hackProtection.put(address, new FailedLoginAttempt(password)); failedCount = 1; } else @@ -600,14 +600,18 @@ if (failedCount >= Config.LOGIN_TRY_BEFORE_BAN) { - _log.info("Banning '" + address.getHostAddress() + "' for " + Config.LOGIN_BLOCK_AFTER_BAN + " seconds due to " + failedCount + " invalid user/pass attempts"); - this.addBanForAddress(address, Config.LOGIN_BLOCK_AFTER_BAN * 1000); + _log.info("Banning '" + address + "' for " + Config.LOGIN_BLOCK_AFTER_BAN + " seconds due to " + failedCount + " invalid user/pass attempts"); + try { + this.addBanForAddress(address, Config.LOGIN_BLOCK_AFTER_BAN * 1000); + } catch (UnknownHostException e) { + e.printStackTrace(); + } } } else { _hackProtection.remove(address); - Log.add("'" + user + "' " + address.getHostAddress(), "logins_ip"); + Log.add("'" + user + "' " + address, "logins_ip"); } return ok; @@ -649,7 +653,7 @@ private long _lastAttempTime; private String _lastPassword; - public FailedLoginAttempt(InetAddress address, String lastPassword) + public FailedLoginAttempt(String lastPassword) { // _ipAddress = address; _count = 1; Realizar as alterações no ThreadPoolManager Index: L2J_Server/java/net/sf/l2j/gameserver/ThreadPoolManager.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/ThreadPoolManager.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/ThreadPoolManager.java (date 1538498840000) @@ -31,7 +31,7 @@ import net.sf.l2j.Config; import net.sf.l2j.gameserver.network.L2GameClient; -import org.mmocore.network.ReceivablePacket; +import org.l2j.mmocore.ReadablePacket; /** * <p> @@ -219,12 +219,12 @@ } } - public void executePacket(ReceivablePacket<L2GameClient> pkt) + public void executePacket(ReadablePacket<L2GameClient> pkt) { _generalPacketsThreadPool.execute(pkt); } - public void executeIOPacket(ReceivablePacket<L2GameClient> pkt) + public void executeIOPacket(ReadablePacket<L2GameClient> pkt) { _ioPacketsThreadPool.execute(pkt); } Realizar as alterações no Ipv4Filter Index: L2J_Server/java/net/sf/l2j/gameserver/util/IPv4Filter.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/util/IPv4Filter.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/util/IPv4Filter.java (date 1538499075000) @@ -14,19 +14,20 @@ */ package net.sf.l2j.gameserver.util; -import java.net.InetAddress; -import java.nio.channels.SocketChannel; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.AsynchronousSocketChannel; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; -import org.mmocore.network.IAcceptFilter; +import org.l2j.mmocore.ConnectionFilter; /** * Formatted Forsaiken's IPv4 filter [DrHouse] * @author Forsaiken */ -public class IPv4Filter implements IAcceptFilter, Runnable +public class IPv4Filter implements ConnectionFilter, Runnable { private final HashMap<Integer, Flood> _ipFloodMap; private static final long SLEEP_TIME = 5000; @@ -62,54 +63,47 @@ } @Override - public boolean accept(SocketChannel sc) - { - InetAddress addr = sc.socket().getInetAddress(); - int h = hash(addr.getAddress()); - - long current = System.currentTimeMillis(); - Flood f; - synchronized (_ipFloodMap) - { - f = _ipFloodMap.get(h); - } - if (f != null) - { - if (f.trys == -1) - { - f.lastAccess = current; - return false; - } - - if ((f.lastAccess + 1000) > current) - { - f.lastAccess = current; - - if (f.trys >= 3) - { - f.trys = -1; - return false; - } - - f.trys++; - } - else - { - f.lastAccess = current; - } - } - else - { - synchronized (_ipFloodMap) - { - _ipFloodMap.put(h, new Flood()); + public boolean accept(AsynchronousSocketChannel sc) { + try { + InetSocketAddress socketAddress = (InetSocketAddress) sc.getRemoteAddress(); + int h = hash(socketAddress.getAddress().getAddress()); + + long current = System.currentTimeMillis(); + Flood f; + synchronized (_ipFloodMap) { + f = _ipFloodMap.get(h); + } + if (f != null) { + if (f.trys == -1) { + f.lastAccess = current; + return false; + } + + if ((f.lastAccess + 1000) > current) { + f.lastAccess = current; + + if (f.trys >= 3) { + f.trys = -1; + return false; + } + + f.trys++; + } else { + f.lastAccess = current; + } + } else { + synchronized (_ipFloodMap) { + _ipFloodMap.put(h, new Flood()); + } } + } catch (IOException e) { + e.printStackTrace(); } - + return true; } Realizar as alterações no L2LoginPacketHandler Index: L2J_Server/java/net/sf/l2j/loginserver/L2LoginPacketHandler.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/L2LoginPacketHandler.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/L2LoginPacketHandler.java (date 1538499673000) @@ -17,7 +17,6 @@ */ package net.sf.l2j.loginserver; -import java.nio.ByteBuffer; import net.sf.l2j.loginserver.L2LoginClient.LoginClientState; import net.sf.l2j.loginserver.clientpackets.AuthGameGuard; @@ -25,21 +24,22 @@ import net.sf.l2j.loginserver.clientpackets.RequestServerList; import net.sf.l2j.loginserver.clientpackets.RequestServerLogin; -import org.mmocore.network.IPacketHandler; -import org.mmocore.network.ReceivablePacket; +import org.l2j.mmocore.DataWrapper; +import org.l2j.mmocore.PacketHandler; +import org.l2j.mmocore.ReadablePacket; /** * Handler for packets received by Login Server * @author KenM */ -public final class L2LoginPacketHandler implements IPacketHandler<L2LoginClient> +public final class L2LoginPacketHandler implements PacketHandler<L2LoginClient> { @Override - public ReceivablePacket<L2LoginClient> handlePacket(ByteBuffer buf, L2LoginClient client) + public ReadablePacket<L2LoginClient> handlePacket(DataWrapper buf, L2LoginClient client) { int opcode = buf.get() & 0xFF; - ReceivablePacket<L2LoginClient> packet = null; + ReadablePacket<L2LoginClient> packet = null; LoginClientState state = client.getState(); switch (state) Realizar as alterações no L2GamePacketHandler Index: L2J_Server/java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java (date 1538499928000) @@ -17,7 +17,6 @@ */ package net.sf.l2j.gameserver.network; -import java.nio.ByteBuffer; import java.util.concurrent.RejectedExecutionException; import java.util.logging.Logger; @@ -27,11 +26,8 @@ import net.sf.l2j.gameserver.network.L2GameClient.GameClientState; import net.sf.l2j.util.Util; -import org.mmocore.network.IClientFactory; -import org.mmocore.network.IMMOExecutor; -import org.mmocore.network.IPacketHandler; -import org.mmocore.network.MMOConnection; -import org.mmocore.network.ReceivablePacket; +import org.l2j.mmocore.*; + /** * Stateful Packet Handler<BR> @@ -41,17 +37,17 @@ * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states. * @author KenM */ -public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient> +public final class L2GamePacketHandler implements PacketHandler<L2GameClient>, ClientFactory<L2GameClient>, PacketExecutor<L2GameClient> { private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName()); // implementation @Override - public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client) + public ReadablePacket<L2GameClient> handlePacket(DataWrapper buf, L2GameClient client) { int opcode = buf.get() & 0xFF; - ReceivablePacket<L2GameClient> msg = null; + ReadablePacket<L2GameClient> msg = null; GameClientState state = client.getState(); switch (state) @@ -644,7 +640,7 @@ case 0xd0: int id2 = -1; - if (buf.remaining() >= 2) + if (buf.available() >= 2) { id2 = buf.getShort() & 0xffff; } @@ -813,33 +809,27 @@ return msg; } - private void printDebug(int opcode, ByteBuffer buf, GameClientState state, L2GameClient client) + private void printDebug(int opcode, DataWrapper buf, GameClientState state, L2GameClient client) { - int size = buf.remaining(); _log.warning("Unknown Packet: " + Integer.toHexString(opcode) + " on State: " + state.name() + " Client: " + client.toString()); - byte[] array = new byte[size]; - buf.get(array); - _log.warning(Util.printData(array, size)); + _log.warning(Util.printData(buf.expose())); } - private void printDebugDoubleOpcode(int opcode, int id2, ByteBuffer buf, GameClientState state, L2GameClient client) + private void printDebugDoubleOpcode(int opcode, int id2, DataWrapper buf, GameClientState state, L2GameClient client) { - int size = buf.remaining(); _log.warning("Unknown Packet: " + Integer.toHexString(opcode) + ":" + Integer.toHexString(id2) + " on State: " + state.name() + " Client: " + client.toString()); - byte[] array = new byte[size]; - buf.get(array); - _log.warning(Util.printData(array, size)); + _log.warning(Util.printData(buf.expose())); } // impl @Override - public L2GameClient create(MMOConnection<L2GameClient> con) + public L2GameClient create(Connection<L2GameClient> con) { return new L2GameClient(con); } @Override - public void execute(ReceivablePacket<L2GameClient> rp) + public void execute(ReadablePacket<L2GameClient> rp) { try { Realizar as alterações no GeoEditorThread Index: L2J_Server/java/net/sf/l2j/gameserver/geoeditorcon/GeoEditorThread.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/geoeditorcon/GeoEditorThread.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/geoeditorcon/GeoEditorThread.java (date 1538566418000) @@ -87,13 +87,14 @@ { for (L2PcInstance gm : _gms) { - if (!gm.getClient().getConnection().isClosed()) - { - sendGmPosition(gm); - } - else + if (!gm.getClient().isConnected()) { _gms.remove(gm); + } + else + { + sendGmPosition(gm); + } } timer = 0; Realizar as alterações no Gameserver Index: L2J_Server/java/net/sf/l2j/gameserver/GameServer.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/GameServer.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/GameServer.java (date 1538566997000) @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.Calendar; import java.util.logging.Level; @@ -233,8 +234,8 @@ import net.sf.l2j.gameserver.util.IPv4Filter; import net.sf.l2j.status.Status; -import org.mmocore.network.SelectorConfig; -import org.mmocore.network.SelectorThread; +import org.l2j.mmocore.ConnectionBuilder; +import org.l2j.mmocore.ConnectionHandler; /** * This class ... @@ -243,7 +244,7 @@ public class GameServer { private static final Logger _log = Logger.getLogger(GameServer.class.getName()); - private final SelectorThread<L2GameClient> _selectorThread; + private final ConnectionHandler<L2GameClient> connectionHandler; private final SkillTable _skillTable; private final ItemTable _itemTable; private final NpcTable _npcTable; @@ -269,15 +270,17 @@ private final ThreadPoolManager _threadpools; public static final Calendar dateTimeServerStarted = Calendar.getInstance(); - + public long getUsedMemoryMB() { return (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1048576; // 1024 * 1024 = 1048576; } - - public SelectorThread<L2GameClient> getSelectorThread() - { - return _selectorThread; + + public static void shutdown() { + if(gameServer != null) { + gameServer.connectionHandler.shutdown(); + gameServer.connectionHandler.setDaemon(true); + } } public ClanHallManager getCHManager() @@ -665,41 +668,20 @@ _loginThread = LoginServerThread.getInstance(); _loginThread.start(); - - // TODO: Unhardcode this configuration options - final SelectorConfig sc = new SelectorConfig(); - sc.MAX_READ_PER_PASS = 12; // Config.MMO_MAX_READ_PER_PASS; - sc.MAX_SEND_PER_PASS = 12; // Config.MMO_MAX_SEND_PER_PASS; - sc.SLEEP_TIME = 20; // Config.MMO_SELECTOR_SLEEP_TIME; - sc.HELPER_BUFFER_COUNT = 20; // Config.MMO_HELPER_BUFFER_COUNT; - sc.TCP_NODELAY = false; // Config.MMO_TCP_NODELAY; - + L2GamePacketHandler gph = new L2GamePacketHandler(); - _selectorThread = new SelectorThread<>(sc, gph, gph, gph, new IPv4Filter()); - InetAddress bindAddress = null; - if (!Config.GAMESERVER_HOSTNAME.equals("*")) - { - try - { - bindAddress = InetAddress.getByName(Config.GAMESERVER_HOSTNAME); - } - catch (UnknownHostException e1) - { - _log.log(Level.SEVERE, "WARNING: The GameServer bind address is invalid, using all avaliable IPs. Reason: " + e1.getMessage(), e1); - } - } - - try - { - _selectorThread.openServerSocket(bindAddress, Config.PORT_GAME); + + InetSocketAddress bindAddress; + if (!Config.GAMESERVER_HOSTNAME.equals("*")) { + bindAddress = new InetSocketAddress(Config.GAMESERVER_HOSTNAME, Config.PORT_GAME); + } else { + bindAddress = new InetSocketAddress(Config.PORT_GAME); } - catch (IOException e) - { - _log.log(Level.SEVERE, "FATAL: Failed to open server socket. Reason: " + e.getMessage(), e); - System.exit(1); - } + + connectionHandler = ConnectionBuilder.create(bindAddress, gph,gph,gph).filter(new IPv4Filter()).build(); + connectionHandler.start(); - _selectorThread.start(); + _log.config("Maximum Numbers of Connected Players: " + Config.MAXIMUM_ONLINE_USERS); } Realizar as alterações no Shutdown Index: L2J_Server/java/net/sf/l2j/gameserver/Shutdown.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/Shutdown.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/Shutdown.java (date 1538567074000) @@ -216,8 +216,7 @@ // saveData sends messages to exit players, so sgutdown selector after it try { - GameServer.gameServer.getSelectorThread().shutdown(); - GameServer.gameServer.getSelectorThread().setDaemon(true); + GameServer.shutdown(); } catch (Throwable t) { Realizar as alterações em L2LoginServer Index: L2J_Server/java/net/sf/l2j/loginserver/L2LoginServer.java =================================================================== --- L2J_Server/java/net/sf/l2j/loginserver/L2LoginServer.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/loginserver/L2LoginServer.java (date 1538567848000) @@ -24,11 +24,10 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; -import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.security.GeneralSecurityException; import java.sql.SQLException; -import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; @@ -36,9 +35,9 @@ import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.Server; import net.sf.l2j.status.Status; +import org.l2j.mmocore.ConnectionBuilder; +import org.l2j.mmocore.ConnectionHandler; -import org.mmocore.network.SelectorConfig; -import org.mmocore.network.SelectorThread; /** * @author KenM @@ -50,11 +49,10 @@ private static L2LoginServer _instance; private final Logger _log = Logger.getLogger(L2LoginServer.class.getName()); private GameServerListener _gameServerListener; - private SelectorThread<L2LoginClient> _selectorThread; + private ConnectionHandler<L2LoginClient> connectionHandler; private Status _statusServer; - public static void main(String[] args) - { + public static void main(String[] args) throws IOException { _instance = new L2LoginServer(); } @@ -63,8 +61,7 @@ return _instance; } - public L2LoginServer() - { + public L2LoginServer() throws IOException { Server.serverMode = Server.MODE_LOGINSERVER; // Local Constants final String LOG_FOLDER = "log"; // Name of folder for log file @@ -159,44 +156,8 @@ } loadBanFile(); - - InetAddress bindAddress = null; - if (!Config.LOGIN_BIND_ADDRESS.equals("*")) - { - try - { - bindAddress = InetAddress.getByName(Config.LOGIN_BIND_ADDRESS); - } - catch (UnknownHostException e1) - { - _log.severe("WARNING: The LoginServer bind address is invalid, using all avaliable IPs. Reason: " + e1.getMessage()); - if (Config.DEVELOPER) - { - e1.printStackTrace(); - } - } - } + - // TODO: Unhardcode this configuration options - final SelectorConfig sc = new SelectorConfig(); - sc.MAX_READ_PER_PASS = 12; // Config.MMO_MAX_READ_PER_PASS; - sc.MAX_SEND_PER_PASS = 12; // Config.MMO_MAX_SEND_PER_PASS; - sc.SLEEP_TIME = 20; // Config.MMO_SELECTOR_SLEEP_TIME; - sc.HELPER_BUFFER_COUNT = 20; // Config.MMO_HELPER_BUFFER_COUNT; - sc.TCP_NODELAY = false; // Config.MMO_TCP_NODELAY; - - final L2LoginPacketHandler lph = new L2LoginPacketHandler(); - final SelectorHelper sh = new SelectorHelper(); - try - { - _selectorThread = new SelectorThread<>(sc, sh, lph, sh, sh); - } - catch (IOException e) - { - _log.log(Level.SEVERE, "FATAL: Failed to open Selector. Reason: " + e.getMessage(), e); - System.exit(1); - } - try { _gameServerListener = new GameServerListener(); @@ -233,18 +194,22 @@ { System.out.println("Telnet server is currently disabled."); } - - try - { - _selectorThread.openServerSocket(bindAddress, Config.PORT_LOGIN); + + InetSocketAddress bindAddress; + if (!Config.LOGIN_BIND_ADDRESS.equals("*")) { + bindAddress = new InetSocketAddress(Config.LOGIN_BIND_ADDRESS, Config.PORT_LOGIN); + } else { + bindAddress = new InetSocketAddress(Config.PORT_LOGIN); } - catch (IOException e) - { - _log.log(Level.SEVERE, "FATAL: Failed to open server socket. Reason: " + e.getMessage(), e); - System.exit(1); - } - _selectorThread.start(); - _log.info("Login Server ready on " + (bindAddress == null ? "*" : bindAddress.getHostAddress()) + ":" + Config.PORT_LOGIN); + + final L2LoginPacketHandler lph = new L2LoginPacketHandler(); + final SelectorHelper sh = new SelectorHelper(); + + + connectionHandler = ConnectionBuilder.create(bindAddress, sh,lph,sh).filter(sh).build(); + connectionHandler.start(); + + _log.info("Login Server ready on " + (bindAddress == null ? "*" : bindAddress.getHostString()) + ":" + Config.PORT_LOGIN); } public Status getStatusServer() Realizar as alterações em AdminEditChar Index: L2J_Server/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java =================================================================== --- L2J_Server/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java (date 1538568122000) @@ -749,7 +749,7 @@ adminReply.setFile("data/html/admin/ipfind.htm"); for (L2PcInstance player : players) { - ip = player.getClient().getConnection().getInetAddress().getHostAddress(); + ip = player.getClient().getHostAddress(); if (ip.equals(IpAdress)) { name = player.getName(); As seguintes substituições nas chamadas de método devem ser realizadas. Essa substituição pode ser feita em lote em algum editor de texto ou IDE readC() -> readUnsignedByte() readH() -> readShort() readD() -> readInt() readF() -> readDouble() readQ() -> readLong() readS() -> readString() readB() -> readBytes() buf.remaining() -> availableData() .getConnection().sendPacket -> .sendPacket writeC( -> writeByte( writeH( -> writeShort( writeD( -> writeInt( writeF( -> writeDouble( writeQ( -> writeLong( writeS( -> writeString( writeB( -> writeBytes( Realizar as alterações no build.xml Index: L2J_Server/build.xml =================================================================== --- L2J_Server/build.xml (revision 21608dd4679422d6037c9683767493221807a2e7) +++ L2J_Server/build.xml (date 1538567213000) @@ -37,7 +37,7 @@ <include name="javolution-5.5.1.jar" /> <include name="mchange-commons-0.2.jar" /> <include name="mysql-connector-java-5.1.18-bin.jar" /> - <include name="mmocore.jar" /> + <include name="mmocore-2.0.jar" /> </fileset> </path> <target name="init" depends="clean" description="Create the output directories."> Depois desses passos você deverá ser capaz de compilar o source. Dependendo do projeto/revisão/versão que esteja usando, pode ser que precise editar outros arquivos além desses. Mas as alterações básicas são essas. [ ]'s
  4. 7 points
    Release 1.3.0 Disponível: https://github.com/JoeAlisson/L2jOrg/releases Atualizações: * Update para Secret of Empire (Download System cliente europeu) * Elemental Attribute System * Mais detalhes: https://github.com/JoeAlisson/L2jOrg/milestone/3?closed=1 Elemental System: Nos últimos dias (talvez último mês) tive pouquíssimo tempo, então as atualizações foram poucas. Ainda estou precisando de ajuda para as atualizações serem mais frequentes e maiores, não precisa ser um expert. Se tiver um conhecimento básico e vontade de aprender e ajudar entra em contato comigo para conversarmos ?
  5. 7 points
    Papangus, venho ao off-topic deixar um assunto que quero falar a comunidade do lineage a algum tempo já. Embora eu seja profissional de TI, o marketing está presente na minha vida a bastante tempo, seja administrando os anúncios do https://top.l2jbrasil.com seja gerenciando propagandas dos negócios da família no facebook/instagram. Antigamente, antes da internet ser tão usada, principalmente na televisão, os anúncios eram colocados no meio de um programa com alta audiência, forçando os telespectadores a conhecerem um produto ou um serviço. As empresas investiam em técnicas invasivas, nas quais o consumidor era interrompido em sua atividade para visualizar uma propaganda. De fato, esse tipo de marketing ainda existe e traz resultados, mas é preciso acompanhar as tendências e investir em inbound marketing. O inbound marketing se trata de uma estratégia que coloca a necessidade do cliente como foco, e não mais o produto ou o serviço. É necessário entender a necessidade do consumidor e oferecer soluções, atraindo-o de forma voluntária e fornecendo todas as informações para que ele tome a decisão de compra. Mas, até que ele chegue a isso, é preciso passar por várias etapas. Qual é a necessidade de um jogador de lineage 2 ou algum outro game? Passar o tempo? Fazer amigos? é algo muito importante a ser identificado. Porque mensagens enviadas para o mesmo público podem ter uma performance melhor que outras? Veja a imagem abaixo: Imagem retirada do analytics do sistema de push notification do top.l2jbrasil.com A qualidade da arte é notavelmente importante, mas a mensagem passada pela mensagem também é importante, focando na necessidade e não no servidor em sí. Pensando em um funil real, o topo tem área maior e vai se estreitando, até que um volume menor chega ao final. O funil de marketing segue essa ideia: começa com alto número de possíveis clientes e, no final, consegue extrair os mais qualificados. Imagem: Reprodução : https://www.legions.biz/blog/marketing-digital-conhecendo-funil/ Topo do funil No topo do funil está o grande público, é a fase de atração, Hoje são milhões de pessoas usando a Internet, como atrair a atenção destes usuários para sua empresa (produto/serviço). Existem as principais ferramentas publicitárias como: Google Adwords, Facebook Ads, Bing Ads, Linkedin ads, Twitter Ads, Native Ads entre outras, todas chamamos de forma resumida de Links Patrocinados. Além do trabalho de SEO (Otimização para site de Busca) onde sua página precisa ser bem escrita para que os buscadores como Google, Bing, Yahoo entre outros encontre-a. Os usuários são agrupados pelos seus interesses , games, comida, lifestyle, etc, e o conteúdo direcionado para as coisas que eles gostam será mais atrativo. Para conquistar esse objetivo, é necessário investir em estratégias com alto alcance, como sites direcionados (ex. Top L2jBrasil) e campanhas nas redes sociais. É nesse estágio que possíveis "clientes" chegam até você, descobrem que você existem e ao acessar isso pode ou não se tornar uma conversão, que é um estágio do Meio do funil. Meio do funil Como falamos, no topo do funil há um grande número de possíveis consumidores da sua marca, mas nem todos eles vão se interessar pelo conteúdo, os usuários que chegam a se cadastrar, efetuar um download . Este momento é quando o visitante da Internet teve um interesse por você, chamamos isso de conversão. A quantidade de conversões está relacionado com o engajamento desse público que veio pelo topo do funil. Por exemplo vamos supor, você obteve 100 cliques na publicidade que você impulsionou no Facebook e apenas 40 cliques no seu banner do Top L2jBrasil, acontece que o Facebook gerou 2 registros e o Top L2jBrasil, 4, isso indica que a taxa de conversão do Facebook foi de 2% e o do top de 10%. Isso acontece pois a probabilidade do Facebook gerar uma conversão é bem menor que a do top pois o link impulsionado pelo Facebook leva em consideração usuários que possuem engajamento com o conteúdo que você está divulgando, porém não estão propensos a consumirem seu produto/serviço, que nesse caso é o servidor de lineage2. O usuários que estão navegando pelo top já foram convertidos e agora eles são Leads, ou seja, eles além de terem sido convertidos pela peneira da conversão do funil, eles já possuem um relacionamento com potencial para consumir "Lineage2" e estão muito mais propensos à consumir o seu serviço, nesse caso jogarem no seu servidor. Nesse caso a quantidade de cliques não é importante e sim a qualidade do público do site, compare a divulgação no facebook como pescar em um enorme lago, aonde você não faz ideia se vai pegar um peixe ou uma bota, e divulgar em um site de conteúdo direcionado como pescar em um aquário usando uma redinha. Fundo do funil Nesse estágio o usuário já está navegando no seu site, é muito importante que o site esteja bem apresentável, consiga passar a informação que o usuário busca (um servidor estável, com potencial de ter comércio e jogabilidade, etc). Invista em técnicas que incentivem o lead a conhecer o que você tem à oferecer. Sabemos que servidores de lineage 2 são temporário, pela minha experiência posso dizer que servidores pvp tem vida útil de 2 meses quanto low tem de 1 a 2 anos , porém mostre para aqueles que buscam a melhor oferta o que os seus jogadores fidelizados alcançaram jogando no seu servidor. Divulgue os resultados obtidos através de fotos e vídeos e, se possível, peça aos seus players para mostrar, de forma natural e sincera, como foi a experiência com o servidor(avaliações). Nesse ponto você pode analisar melhor a taxa de conversão (navegou por mais tempo e/ou clicou em outros links no seu site, como o registre-se) e também a taxa de rejeição. Para exemplificar vou postar aqui a taxa de conversão que eu criei no google analytics chamado "click at banner" que monitora o usuário que entrou no site e clicou em algum banner Se quiser saber mais sobre como configurar "Goals" e monitoramento de conversão clique aqui: https://support.google.com/analytics/answer/1032415?hl=en No relatório "Goal Flow" vc pode ver o funil trabalhando, mostrando pra mim como a conversão de "click at banner" acontece e quem são as fontes de tráfego mais rentáveis: A categoria "Organic Search" (Google, bing, yahoo, etc) é a que mais gera tráfego e que mais gera clicks , e a social a que menos gera click, isso não significa que eu devo deixar de investir em tráfego social, mas que eu deva intensificar o marketing lá pois não estou atingindo os Leads do Facebook/instagram. Se você falhar nesse ponto o lead não irá consumir seu serviço e todo dinheiro que você investiu para afunilar usuários até chegarem no seu site foi jogado às traças. Se sua estratégia tiver adequada ao seu público com certeza obterá sucesso. Se você quer mais conteúdo como esse deixe o seu joinha ?
  6. 6 points
    Tópico Refeito e Repostado. NewErabySmallz Tamanho: 2,9 MB Créditos: Systextures e Animations: • WilliamFS Server e System: • Smallz'
  7. 5 points
    I am not proud of the source so I don't wanna share it. It take a lot of shortcuts because this was never meant to be shared. It's just for personal entertainment purposes and to provide inspiration. Nothing else.
  8. 5 points
    Galera, eu fiz muitas modificações, e o pack encontra-se " jogável ". Porém as modificações feitas por mim são características minhas e a meu modo e meu estilo, porém mesmo assim estou pensando em postar aqui com o intenção de " animar " a galera pra continuar trabalhando nesse projeto, a única coisa que estou tendo dificuldades em arrumar é as jóias dos brooches antes não era possível nem equipar o broche porque estava configurado errado, eu arrumei, porém as joias ainda não equipam, aparece que para usar precisa estar com o brooche equipado, porém ele já está equipado e mesmo assim não usa a joia. Eu fiz todos os npc customizados, community moderna e funcional e várias outras coisas. Se alguém anima mecher nesse projeto juntamente comigo e outros companheiros me envie privado, podemos organizar uma distribuição de tarefas de acordo com a experiência de cada um e criar um projeto excelente. mais eu não posso postar o servidor aqui prontinho apenas para galera copiar, a intenção seria várias pessoas trabalhando junto no projeto e sem " sangue-suga " que só quer pegar tudo pronto e dar ctrl+c ctrl v... Eu digo que é possível arrumar esse projeto, minha dificuldade está em arrumar as joias dos brooches, se alguém tem alguma idéia de como fazer isso, me diga por favor.. Com relação aos mobs e bosses bugados pode ser problema com geodata, pois alguns mobs estão de baixo da terra, e ainda não encontrei um geodata compatível com esse pack, continuo procurando. um videozinho que fiz, bem armador, só pra mostrar um pouco do que estou fazendo.
  9. 5 points
  10. 5 points
    Este será meu último post sobre o assunto. Seria vantajoso para nós? Sem dúvidas. Pelo uso da plataforma, pela responsabilidade que nos exigiria, teríamos a ganhar financeiramente com uma área de vendas aqui, pois teríamos de cobrar uma taxa por transação, assim como todos sites similares fazem. Além da geração de conteúdo, movimentação, enfim, seria fantástico para todos! A grande questão Se é vantajoso, então por que não fazemos? - Não queremos evoluir? É claro que queremos! - A administração faz parte de um complô que quer controlar tudo? Definitivamente, nãaao! Há uma mínima possibilidade, que devemos considerar, de termos bastante prejuízo com isso, pois temos um cenário jurídico e político bastante instável e injusto. A OLX, citada anteriormente, por exemplo, passou por duas situações... Foi condenada a pagar R$ 87.000,00 (Processo TJ-GO 5229297.46.2017.8.09.0006), mas também foi vitoriosa em um outro processo de R$ 950,00 (TJ-DF 0701260-61.2017.8.07.0016), ambos de mesma natureza, mesmo motivo. Se há uma possibilidade disso acontecer conosco, não iremos fazer. Não temos estrutura financeira para isso, infelizmente. Espero que realmente tenha compreendido nosso ponto de vista. Sua ideia é ótima e já foi discutida várias vezes por nós, mas infelizmente, no cenário atual, é inviável. Obrigado.
  11. 5 points
    Tópico Refeito e Repostado. Todos detalhes e status 100% originais com Skills + Shield. MadebySmallz2013 Tamanho: 32,1 MB Obrigatório! Download (Baixe esse arquivo e coloque dentro da System e sempre que trocar de System, não esqueça de copia-lo então nem a armadura nem a system funcionará) Créditos: Server e System: • Smallz' Systextures e Animations: • Avengers Team
  12. 5 points
  13. 4 points
    Todas as armas com S.A totalmente corrigidas e funcionando corretamente os skills. Weapons Password: www.l2jbrasil.com : Download Extrair na system : Download Env.int Password: By-Sherlock Download Abyssal Armor
  14. 4 points
    A próxima geração de iPhone XR teve uma possível atualização divulgada. De acordo com um perfil na rede social chinesa Weibo, a Apple pode estar trabalhando em um novo modelo com entrada para USB-C. A informação deve ser vista ainda como um rumor, mas foi apresentada uma imagem de uma entrada para carregador relativamente maior que a presente em outros dispositivos com porta Lightning. O padrão estaria mais próximo do encontrado em uma entrada USB-C, já comum em outros aparelhos da Apple. Nova geração do iPhone XR deve ser apresentada em setembro. (Fonte: Apple/Divulgação) A fonte relata que a nova geração de iPhone XR tem o mesmo tamanho dos modelos atuais, 6,1 polegadas, e três aberturas na parte de trás do aparelho; isso provavelmente se refere aos dois sensores de câmera e ao flash. Por fim, foi revelado que o iPhone tem microfone e aberturas dos alto-falantes projetados de maneira assimétrica na parte inferior. Os novos iPhones XR devem ser apresentados para o público em setembro, mas não há nenhuma informação oficial sobre essas possíveis mudanças até o momento. Ainda assim, a empresa já tem lançado diversos aparelhos com entrada USB-C, e algumas informações recentes apontam para uma tentativa de padronizar esse modelo, seguindo uma tendência de mercado. Fonte: Tecmundo
  15. 4 points
    Cara jogos são uma fonte de cultura tremenda. A tributação sobre este tipo de serviço já deveria ser revista a muito tempo, eu aprendi 90% do que sei de inglês do tempo que eu jogava final fantasy com um dicionário de inglês no colo. As cadeiras do congresso são ocupadas por dinossauros que além de não entender do assunto ainda tem um preconceito tremendo sobre jogos eletrônicos por taxar que todo jogo é "violento" e politicas para barrar tanto distribuição como dificultar o acesso por conta dessa carga tributaria monstra. Jogos eletrônicos devem ser tratados como livros tanto em questão de políticas públicas quanto tributárias.
  16. 4 points
    Não interessa se vc mudou uma vírgula ou reescreveu uma classe inteira, se ele é baseado em qualquer linha do l2j ele precisa seguir as mesmas regras, GNU é GNU e explico melhor no tópico que eu linquei ali em cima, se a licença fosse MIT ai é outra história, mas sendo GNU vc tem a obrigação de compartilhar as modificações e redistribuir sobre os mesmos termos. "Sad but true" Agora se vcs vão fazer ou não com o projeto é um problema de vcs, assim como jogar lixo no chão não é legal, mas tem gente que faz. É a mesma coisa com códigos opensource, fazer modificações e querer "modificar" a licença de distribuição já é uma falta grande. No mínimo vcs estão sendo mal educados do ponto de vista do desenvolvimento de software. Eu não sou o criador do projeto inicial ou de nenhum desses que vcs citaram, nem mesmo posso reclamar direitos ou cobrar que vcs os façam, isso aqui é um fórum e estou fazendo o que se fazem em fóruns da internet, comentando e dando a minha opinião baseada justamente no meu conhecimento como engenheiro de software e experiencia de mais de 12 anos em l2j e mais de 15 anos em programação. 600 players usando 4gb daria em média 6.66666667 megabytes por player. Suponhamos que eu pudesse mensurar tudo isso de forma estática e cada player custa ao servidor 6mb de RAM ao servidor (sem contar o processamento), considerando ai o socket TCP ativo, o buffer dos pacotes enviados, os dados em memória as instâncias, itens, cache etc. No mínimo para 5000 players seriam necessários 32gb de ram só para mante-los conectados . Nessa conta temos que levantar o número de threads, a banda de RX/TX usada para cada um dentro do link disponível do servidor. L2j é uma aplicação monolítica que escala de forma vertical , pra ter mais players vc só precisa ter mais recursos no servidor, não tem como fazer milagre.
  17. 4 points
    Saquei fera, o que você diz faz sentido; mas eu particularmente não gosto de eventos custom; Vou explicar o porque: acho que o servidor (ao menos no HighFive que é a versão que estou usando) já existem vários eventos retail, instancias e coisas para se fazer (fortress, siege, hellbound é um trabalhão pra subir o nível de forma retail... Fantasy isle); o que falta é donos de servidores que sabem usar isso corretamente e de forma consciente; O único evento que acho válido ter (dependendo do estilo do servidor) é TvT e ainda assim os donos de servidores privados acabam por não saber montar o estilo de jogo com a premiação do TvT... Aí o player tem que escolher entre 10 a 20 min de TvT pra ganhar 1 coin ou farmar, pra qualquer item especial precisa de 50 coins.... Entende ? Ai a galera não vai no TvT porque não vale a pena, os players acham que n tem ninguém no servidor e saem. Porque player br hoje é assim infelizmente, qualquer coisinha ta saindo do servidor. Então por isso estou fazendo a autopilot engine ao invés de uma de eventos, pois se os players logarem e virem o servidor cheio e os fake players forem tão bem feitos a ponto do player não saber distinguir se é fake ou não, ele vai querer jogar (tipo maria vai com as outras - se tem player, é porque é bom...); Lembrando que essa é apenas a minha opinião pessoal, não quer dizer que estou certo xD Mas de toda forma, pelo menos eu vou receber as notas na facul e estou aprendendo um pouco de Java com algo que eu gosto hahaha
  18. 4 points
    " Olá turminha, a um tempo procurava a Sacrífice 5 Partes para meu uso, não achei, porém eu mesmo consegui fazer-la 5 Partes com as Texturas que encontrei aqui no fórum, deixarei os créditos (Corrige-me se eu estiver errado!) - Créditos pela UTX: Maruca Metal " Download abaixo! Créditos pelos files: Marco Santos (perereco) WEAPONS SACRIFICE - CLICK AQUI! PRINT's*
  19. 4 points
    Fala fera, de boas? Então, por favor não quote o tópico todo, fica uma mensagem muito extensa. Sobre a interface: eu não mexo com interface, quem é fera nisso é o @Onã
  20. 4 points
    Info: https://l2wiki.com/Freezing_Invoke https://www.mediafire.com/file/hndsddlh9ay2vbm/FreezingInvoke_SGERfjs.rar/file
  21. 4 points
    O projeto está passando por mudanças e voltará em breve, essa revisão não está estável para servidor de rate nenhum, fecharei o tópico até ter novidades a respeito para postar.
  22. 4 points
    Nós agradecemos campeão! Não não, só que ontem eu atualizei o servidor no meu trabalho, então não dava pra abrir o l2 lá e desligar o server da forma correta, tive que matar os processos, pode ser que não tenha salvo alguma informação porque ele faz um fluxo ao desligar o game server (salva olly, atualiza os dados do banco, etc...); Agora está dropando Lord Adena, dá para você comprar o que precisar no prime shop (lembrando que é preciso baixar a nova system), o aio está no prime shop também ?
  23. 4 points
    Galera, não estamos parados com o projeto, nosso ritmo vai junto com o ritmo de vocês de reportarem bugs e explicarem o fluxo pra podermos corrigir.
  24. 4 points
    Pessoal, o cost não aumenta tempo de duração da skill, cost na tradução do inglês é "custo", é o custo de mana, se em algum servidor aumentava o tempo (que seria o enchant da skill na rota "time") então estava bugado; Cost = Custo de mana para castar a skill; Time = Tempo de duração da skill; Recycle = Tempo de reúso da skill; Se tiverem mais alguma dúvida quanto a isso é só postar a rota que explico o que é, mas quanto ao cost, a unica coisa que tem que mudar ao encantar a skill para a rota cost é a quantidade de mana que a skill vai gastar;
  25. 3 points
    Recentemente abandonei tudo relacionado a Lineage 2, e como presente de natal para esse maravilhoso fórum, eu hoje venho trazer para vocês as duas sources atualizada da sunrise (XML e SQL), acho que muitos já conhecem, então não preciso falar muito. DOWNLOAD É isso galera!
  26. 3 points
    eeeeaaae, demorou mas saiu, afinal são muitas ombreiras e muitas texturas demorei mais por ter tido muitos imprevistos houve um desinteresse de quem me incentivou a desenvolver o set pro fórum, por tanto só vou postar a parte do cliente quem quiser desenvolver pro servidor ficarei grato e colocarei no post com os devidos créditos. bom proveito. Topico do Desenvolvimento. Mod Restrição de Classes by: Tayran.JavaDev Print / Print Video Preview. https://www.youtube.com/watch?v=V4BnnhX5iuc BUGS FIXED https://www.youtube.com/watch?v=KcSGS7oxpzU Download. 14.7MB 30MB V1.4 V1.5 Password: SHEV Créditos: SHEV
  27. 3 points
    Fui programador L2OFF e encontrei vários problemas no desenvolvimento. Antonio vocẽ não tem source, isso é um extender, extensão, quem vai ter um source em breve é o Master Tomas rodando na IDE visual studio mais atual, ele ta decompilando o projeto inteiro, ai sim ele pode fazer coisas incrivéis, como reescrever ele para linux colocar mods mais avançados-> mais em baixo explico porque não da de ter coisas avançadas no OFF O OFF é cheio de problemas a ser resolvido que levará decadas para nós, começando pelo compilador velhos útilizando C99 ISO/IEC 9899:1999. Útiliza um formato únicode de decadas são queles caracteres especiais se você não sabe o OFF não suporta imagina o que mais não pode suporta que seria legal. E pra reescrever tudo que é preciso não tem outro jeito a não ser fazer como o Master Tomas. Seria legal poder compartilhar o que aprendi e tem caras no Brasil que entendem mais que eu, como HITMAN e outros. Porque eu mesmo entendo muito da linguagem mais para programar o OFF precisa saber da historia dele. ÉÉ é exemplo quais updates foram feitos do C4 para C5 os programadores na época do lançamento eles acompanhava o desenvolvimento análisando os releases fix etc.. Não da para ir cegamente desenvolvendo. Já passando um spoiler eles usam coisas como referencias para lozaliza no format PE sendo elas, AI.OBJ nomes de váriaveis, class demais scripts etc... Acredito que para o forum seria bom, mais tem o problemas com política de autorais. Agora com minha experiência de verdade, os players não querem se divertir com OFF ou J eles querem um server legal só isso. Vamos planeja mais trocar ideias de como fazer um server legal, eu tenho umas ideias bacanas mesmo, certeza de que os players irão gostar. Player não quer performace, player quer zueira e bagunça. Quando envolve performace envolve complexbilidade milindrosa e a % maior dos players só querem se divertir sem nada muito complicado, eles já tem uma carga no trabalho extressante o dia todo pra jogar um server complexo cheio de regras muito diciplinar se perde baium passa raiva, agora saca o erro em julgar os players. Deixo aqui conhecimento necessário para saber L2OFF. Programar bem. ASM/C OU C++, API WINDOWS, PE FORMAT, ENGENHARIA REVERSA, ENTENDER FERRAMENTAS COMO OLLY DEBUGGER UM POUCO DE GEOMETRIA, THREADS, SQL. SÓ UNS 5 ANOS DE ESTUDO. Sem esse pacote não faz nada além de editar NPC. Antonio se tivesse source não precisaria de tudo isto que citei acima para poder desenvolver, como no java, apenas java aqui apenas C++ OU C;
  28. 3 points
    Ru: Представляю мою первою сборку лост-ворд тут много было делано Если буду вопрос пишите отвечю всем Eng: I present my first lost-ward assembly here a lot has been done If I have a question, write, I will answer all https://cloud.mail.ru/public/52Zi/38qGBGWzz
  29. 3 points
    Fala rapaziada... Arte feita no PS, cliente gostou.. o que vocês acham?
  30. 3 points
    Good friends I share this humble contribution I hope you like it I hope you like it SERVER LOGO IN PSD GM SHOP FULL + MULTISELL ( TESTED IN L2JACIS ) ARGUMENTER BUFFER ENCHANT SKILLS GATEKEEPER GLOBAL SYMBOL MAKER WAREHOUSE DOWNLOAD https://www.mediafire.com/file/q10ea15l5ty1ota/PACK.rar Credits : Unstopable
  31. 3 points
    Olá pessoal, aqui deixo uma videoteca com muitos tutoriais relacionados ao desenvolvimento de servidores Lineage 2. Alguns têm legendas em inglês e português, outros não. Mas você pode silenciar o vídeo e seguir os passos. Considere isso como uma videoteca. Eu só queria que você soubesse que no meu canal você encontrará os tutoriais mais atualizados. Canal: https://www.youtube.com/user/reynolsreynaldo/videos
  32. 3 points
    Gilberto Barbosa da Silva Neto Um pouco sobre mim Tomaram um susto com meu nome? Por isso prefiro Netinho, como vocês já me conhecem(haha), estou há muito tempo no fórum, fiquei um tempo afastado por diversos fatores externos, tantos pessoais, quanto profissionais, sem tempo, deixei de acompanhar o L2J e seus projetos. Sempre gostei de jogar, Lineage principalmente, desde a minha infância me habituei nesse jogo magnífico (madrugando em lan houses as vezes), mas como a vida não é um conto de fadas, todo mundo cresce e precisa assumir suas responsabilidades como adulto. Hoje com 23 anos sou um estudante de Redes de Computadores, trabalho como segurança nas horas vagas e sou atendente de Telemarketing em carteira assinada, tranquei a faculdade de Engenharia da Computação no terceiro período por problemas financeiros (um dia pretendo voltar quando me estabilizar de vez). Por quê me candidatar? Como voltei para o fórum recentemente (este ano), vejo uma oportunidade de me aproximar ainda mais com o grupo e desenvolver ideias para o L2J, observo que os servidores de hoje estão saturando muito rápido por falta de ideias, e também assim como dividir o conhecimento que tenho, pretendo aprimorá-lo. Minhas principais ideias Como citado anteriormente, uma das ideias que tenho em mente é ajudar a desenvolver JavaMods jamais feitos ou pensados, me aprofundar no assunto para que o fórum seja mais movimentado, observo que muitos tópicos hoje estão parados e abandonados em diversos tópicos do fórum, seja por vontade do autor, ou por falta de tempo, falta de interesse geral, etc; são N motivos para que cada um se ausente por um período. Também tenho em mente de continuar ajudando a área de dúvidas – como sempre fiz - ajudando a saná-las, organizando os tópicos, resolvendo e afins. Agora claro, tudo sempre dentro das normas da comunidade. Perguntas e respostas: 1. É comum nos depararmos com perguntas mal-elaboradas aqui no site (por preguiça ou mesmo por falta de experiência dos usuários). Essas perguntas, ou pelo menos a maioria delas, é redigida por usuários novatos e afetam diretamente o comportamento dos usuários mais veteranos e dedicados, em alguns casos tornando eles intolerantes ou apenas indiferentes. Como moderador, gostaria de saber qual é sua visão do problema citado, como pretende "esfriar" e motivar esses usuários?  2. Você entende a cultura da comunidade e o que realmente a tornou grande ou acredita simplesmente que moderador é um suporte técnico para perguntas com algumas funções a mais? 3. Moderar não é simples e toma muito mais tempo do que as pessoas imaginam. E é bem burocrático. Falo disto com mais detalhes aqui. Moderar é desagradar quase a todos em algum momento. Ocorre até com os moderadores mais "moderados". O perfil necessário é que tome a responsabilidade para si. Moderar como diamante não é a mesma coisa que moderar comunitariamente. Não podemos errar e depois a pessoa perceber que não dá conta de todo o fardo da moderação. Você entende isto? Terá tempo para tudo o que diz que fará, manter o que já faz e o que precisa ser feito? A promessa é realista? A pergunta não é para sim ou não, ela é propositalmente aberta para ver como você entende como a comunidade funciona e o que você fará como diamante que não pode fazer hoje. Não economize pra mostrar pra gente como vê isto. 4. Como você lidaria com um usuário que produz diversas boas postagens, mas que tende a causar discussões e receber warns/advertência? 5. Como você agiria se você discordasse do fechamento/remoção/etc de um tópico, por parte de outro moderador? 6. Como você acredita que deve ser a imparcialidade de um moderador na hora de lidar com um amigo ou com um membro de alta pontuação dentro da comunidade? E como lidaria com um membro com mais experiência que você no site? 7. Além da sua participação normal no site, como você pretende gerenciar seu tempo com as atividades de moderação? Caso tenha alguma ocupação extra-site e já investe parte do seu tempo participando da comunidade, como lidará com o fato de, provavelmente, ter que abrir mão de ganhar reputação com seus conteúdos para moderar?  8. É comum vermos muitos casos de problemas no site, parece que estamos enxugando gelo. E temos outros afazeres. Tudo isto pode ir afastando um moderador da sua atividade para que foi eleito. Caso isto ocorra e sua "produtividade" no site caia muito, você acha que estará cumprindo o que se propôs fazer? E o que fará a respeito? Mesmo que considere que não acontecerá com você faça um exercício da hipótese. 9. Talvez você já seja um ótimo usuário e moderador comunitário. Por que você precisa dos poderes de moderador? O que poderá fazer que já não faz ou pode fazer hoje? Por que agregará a equipe atual? 10. Na sua opinião, quais problemas que o L2jBrasil tem que você pretende atuar para melhorar? Que ações você espera fazer em relação a isso? De que forma você pretende ser diferente dos demais moderadores nesse ponto? Boa sorte a todos os participantes, hehe! Depois que tudo isso acabar irei matar todos vocês
  33. 3 points
    L2JFrozen NPC's Version 6 Estou postando a sexta versão de NPC's para L2JFrozen feitas por mim e que utilizei no meu último pré-configurado. bom proveito. Buffer Enchant Item Announcer (Ela anda por Giran conversando/anunciando) All in One Global Gatekeeper Warehouse Symbol Maker Top 10 Clan Manager Event Buffer Grand Olympiad Manager, Wedding and Class Master Welcome Event's (Sem imagem)Versões anteriores de NPC's: L2JFrozen NPC's V. 4 L2JFrozen NPC's V. 5 L2JFrozen NPC's V. 6 DOWNLOAD Tamanho: 42 KB Senha: MadebySmallz2013 Créditos: Smallz' :pirate: Gostou do conteúdo? Não esqueça de curtir o tópico. Obrigado. :bom:
  34. 3 points
    Super Atualização na REV! Arquivos Editados BuffFinishTask.java, BuffTimeTask.java, Creature.java, BuffInfo.java,PlayerInstance.java, AbstractConditionalHpEffect.java, PlayerAppearance.java, PartyPledge.java, Imagens
  35. 3 points
    Versão Sevens Signs é igual ao liona e pandora que está online. vcs podem conferir que lá já tem os broochs e as transformações e estão funcionando lá. então abrir um sv que não funciona os broochs e transformações já é um ponto negativo e sinceramente não vale mto a pena... esperamos que eles arrumem isso. mais se eu achar um pack que funcione os broochs e as transformações eu mudo na hora! DETALHE IMPORTANTE LEMBRAR: Classic não é feito pra galera jogar full buffs. e quando vc fica full buff no classic vc mata geral. porém nem sempre está full buff. No Liona classic GLADIADOR E TYRANTY são bugados, Até SPOIL é bugadão pq tem 3 stun e não tem delay em nenhum e por ser full buffs, principalmente por causa do renewal e champion as skills de DUELIST por exemplo, não tem delay nenhum praticamente e o duelista consegue bater só de longe com o dedo travado na skill nem precisa chegar perto para matar. tyranty a msm coisa so bate de longe... lá TYRANTY E DUELIST BATE SO DE LONGE E AINDA E MELHOR QUE ARCHER. kkkkkkkkkkkk e mto ridículo na moral por isso parei de jogar lá. Então se vc vai fazer um classic pvp com buffs, é bom por um delayzinho nas skills de figther ou remover o song renewal, champion do npc, se não vai ter só duelista no servidor... só uma dica de um jogador experiente de lineage que passou a vida jogando l2. então aceita quem quer.
  36. 3 points
    Segue Link. @Seferus já adicionei a correção nesse link. https://mega.nz/#!2goVnATB!en1NP3RH9Ozo4IEzU8idJmQIzpx2vdTukOx_rnTFGvY
  37. 3 points
    Que sensacional fera! @vaneves, poderia importar o repositório para o github por gentileza ? Notei que tem utilizado o github e por lá é melhor pra acompanhar as atualizações em diferentes projetos (feed de atividades ?)
  38. 3 points
    Tem cada troféuzinho que me enche de orgulho no fórum, heiiiiin! :) Parabéns pelo novo sistema Leo, todos veem você e a equipe trabalhando sempre para manter as coisas funcionando e com novis.
  39. 3 points
    obrigado. obrigado cara, realmente podia ter vendido mas tenho esperança em uma comunidade melhor.
  40. 3 points
    Que bom que se interessou em ajudar, eu acho muito mais interessante dar continuidade na L2JServer do que pegar L2JFrozen para mexer, e no fim quando chegar em um projeto bom e estável você terá usado como base o que é a base de todas e não tem herança de nenhum outro projeto desses atuais. Nosso projeto L2JBrasil atualmente encontra-se fechado por que está passando por mudanças e por enquanto não faz sentido publicar uma revisão, em breve estarei postando revisão para teste e continuando o projeto Interlude usando como base a última L2JServer, a gente tava dando continuidade ao projeto de 2011 mas não estava sendo interessante para nós ficar consertando erros que vieram depois da L2JServer, então a continuidade agora é da L2JServer limpa, se você tem interesse em trabalhar com a Base principal que é a L2JServer será interessante nos juntarmos para fazer isso, por que já estamos fazendo.
  41. 3 points
    E ai pessoal, como estão os testes e desenvolvimentos ?
  42. 3 points
    Hum, beleza; Belê; Mais alguém teve erro com essa quest ? @TurtleLess da uma olhada quando puder maninho; Você quer o mod ou o html ? Do que precisa fera ? O TurtleLess me passou o mod, faltavam uma parte do código dele (do restart) que eu fiz; Já o html custom foi o @alexfabiano que contribuiu;
  43. 3 points
    Sim, você eu também estou ciente hahaha
  44. 3 points
    Beleza, caso o TurtleLess não consiga ver antes de segunda, na segunda dou uma olhada; Obrigado campeão, seria algo bem legal, mas não pra adicionar na revisão agora, beleza ? Como o pessoal já mencionou, o nosso foco é resolver os bugs e deixar ela o mais próxima do retail possível; Ter mods é bem legais, mas se começarmos a abrir pra por mods, o pessoal não vai testar e vai só ficar querendo mods pra abrir servidor PvP; por isso o foco do projeto é low rate e resolução de bugs, pois para configurar um servidor PvP a partir de um low, é bem rápido; OBS: adicionamos alguns mods simples que não demandaram tanto tempo; já a Zeus engine, é algo mais complexo, já vi uma revisão implementada com ela e a revisão com ela também consome bem mais memória (quase que o dobro), por isso vamos deixar para mais para frente; Queremos sempre manter um projeto free com a qualidade de um pago aqui para os membros ? Mas muito obrigado e seja bem vindo ao tópico do projeto fera!
  45. 3 points
    Concordo; Está dando algum erro fera ? Pode ser mais específico por favor ?
  46. 3 points
    Obrigado, foi testado bem por cima, só os items da foto; Poderia dar uma testada mais a fundo por favor e nos dizer se está tudo OK ?
  47. 3 points
    O @TurtleLess tinha o código do .dressme para sunrise, estamos implementando, quando estiver pronto e testado, posto o release;
  48. 3 points
    @Escanor valeu campeão! Beleza; Atualizei o projeto, agora é possível colocar skills ++ na transformação AIO; https://github.com/danielbarion/L2JBlueHeart Alterações: https://github.com/danielbarion/L2JBlueHeart/commit/51d6234a9c70ddfbbab1287fd90fe17afe3b192d Deixei algumas resistencias encantadas para você usar como exemplo; @Escanor vou aguardar juntar mais algumas dúvidas aqui no tópico e então criar o tópico lá na área de dúvidas; Ai te dou um toque;
  49. 3 points
    Champs, os pontos são adicionados semanalmente: protected synchronized void addWeeklyPoints() { if (_period == 1) { return; } int currentPoints; for (StatsSet nobleInfo : NOBLES.values()) { currentPoints = nobleInfo.getInt(POINTS); currentPoints += WEEKLY_POINTS; nobleInfo.set(POINTS, currentPoints); } } Então quando um char virar nobles, na semana seguinte ele vai ter pontos para lutar; Sobre o tempo do char ficar flag, vou ter que dar uma olhada com mais calma porque ainda não encontrei nada; @TurtleLess caso você tenha um tempo, da uma olhada no tempo do char ficar flag por favor;
  50. 3 points
    Opa campeão, essa já é a versão buildada; É só fazer download e configurar, depois iniciar pelos scripts .bat



     



  • Newsletter

    block_newsletter_signup
    Sign Up
×
×
  • Create New...