Jump to content
Hl4p3x

L2JStudio - A new way for Interlude.

Recommended Posts

PYKlyRG.jpg&key=822e505460230a53f5b13227

Bem vindo ao L2Studio, o seu novo projeto Interlude Open Source do L2JBrasil.
Aqui você poderá ter um servidor completo para abrir o seu tão sonhado SERVER PRIVADO.

 

  • Sobre o L2Studio:
  1. Base: L2jMobius (Latest Free Release).
  2. Java 14, Liberica JDK;
  3. Sistema: Windows ou Linux (CentOS recomendado);
  4. Memória necessária para ligar o servidor: 512~1024 Megabytes.

 

  • Atualização do Projeto:
  1. Será atualizado conforme reporte de problemas;
  2. Conforme a ajuda dos usuários criando uma .diff e enviando no proprio Github do projeto ou aqui.
  3. Conforme a disponibilidade de tempo.
  4. Qualquer um está liberado para dar fork no projeto e atualizar conforme a própria vontade.

 

  • Reporte de Bugs ou problemas:
  1. Poderá reportar o bug no forum do L2jBrasil ou usar a plataforma do GITHUB e abrir um pull request nesse LINK.

 

  • Arquivos necessários para executar o servidor:
  1. Client: https://drive.google.com/uc?id=1LcKCQTbRXJvteJcuvc_rnX8i2gT1fcHB&export=download
  2. System: https://mega.nz/#!t49wiKgZ!PzVAcxcg2o8gRkAiMjH7CUO6lKrBG27npg2JPL1uEq8
  3. JDK: http://www.mediafire.com/file/xox35mknec8f1q0/bellsoft-jdk14%252B36-windows-amd64.msi
  4. Geodata: https://www.mediafire.com/file/0gw6llghfrd6o4q/interlude_l2d_geodata.zip

 

  1. Versão com backup em .psc inclusa.
  2. Após instalar o JDK14, criar uma database e atualizar em ..config/main/Server.ini | ..config/main/LoginServer.ini e executar o servidor.

Gostou? Deixa seu like, compartilhe, CONTRIBUA!

  • Like 11
  • I love it 3
  • Thanks 2

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

Lineage 2 Interlude & High Five
L2STUDIO, seu servidor está aqui!

Share this post


Link to post
Share on other sites

Proteja seu servidor de ataques DDoS massivos!

VPS EPIC

To testando o projeto a quase 2h bem dizer, e pelo visto, ta melhor que a acis, as quests estão tudo funcionando, e o core não é imundo... Acho que ganhou da acis pessoal.. Mas irei testar mais coisas, e tentar descobrir se há bugs, mas seria ótimo se mais pessoas ajuda-se, pq a pack ta parecendo realmente boa. Tem ate npc buff do  tryskell do macro ja implementado.

A source tava tendo problema pra compilar,  estava faltando a pasta lib na pasta java. Eu compilei, quem quiser toma ai.

Source

Pack + backup

Banco de dados ta l2jdb sem senha.

Irei continuar testando, to gostando desse projeto.

Edited by Christian-SDM
  • Like 1

Share this post


Link to post
Share on other sites
6 horas atrás, Christian-SDM disse:

 

Cedo demais para falar : melhor que a aCis

 

Mas, Hl4p3x, por que L2JMobius? O que você viu de interessante neste projeto? Está java 14, sim, mas o código está codado para ter performance nessa versão de JAVA? Ou você deu update nele ? Algumas funções de java's mais antigos não tem mais no 14 por que foi modificado, você fez essas alterações ou a pack veio assim?

 

Me explique um pouco o que você viu demais nessa plataforma, eu olhando, e analisando ainda não vi nada demais para usá-lo como BASE. Mas sem dúvidas, você como desenvolvedor da mesma, vai dar o que falar, será um excelente projeto.

Ah, e pra variar né, a pergunta de sempre, por que interlude? Por que não outra chronica qualquer? Por que não algo novo e sim o velho interlude que já existem inúmeros projetos tanto free quanto pagos ? 

Agradeço se puder responder minhas questões, boa sorte com o projeto! ❤️

  • Like 3

Em breve novo servidor Classic PvP

www.l2prime.co

Private Classic 150x

Share this post


Link to post
Share on other sites
9 horas atrás, Christian-SDM disse:

To testando o projeto a quase 2h bem dizer, e pelo visto, ta melhor que a acis, as quests estão tudo funcionando, e o core não é imundo... Acho que ganhou da acis pessoal.. Mas irei testar mais coisas, e tentar descobrir se há bugs, mas seria ótimo se mais pessoas ajuda-se, pq a pack ta parecendo realmente boa. Tem ate npc buff do  tryskell do macro ja implementado.

A source tava tendo problema pra compilar,  estava faltando a pasta lib na pasta java. Eu compilei, quem quiser toma ai.

Source

Pack + backup

Banco de dados ta l2jdb sem senha.

Irei continuar testando, to gostando desse projeto.

Boa !! Porem estou com erro no hexid , como faço para recriar o hexid ? Nao encontrei nenhum arquivo para tentar recriar ;x  Erro ; Damn! Registration failed! Reason: wrong hexid


Razak

Share this post


Link to post
Share on other sites
2 horas atrás, Lire disse:

Cedo demais para falar : melhor que a aCis

 

Mas, Hl4p3x, por que L2JMobius? O que você viu de interessante neste projeto? Está java 14, sim, mas o código está codado para ter performance nessa versão de JAVA? Ou você deu update nele ? Algumas funções de java's mais antigos não tem mais no 14 por que foi modificado, você fez essas alterações ou a pack veio assim?

 

Me explique um pouco o que você viu demais nessa plataforma, eu olhando, e analisando ainda não vi nada demais para usá-lo como BASE. Mas sem dúvidas, você como desenvolvedor da mesma, vai dar o que falar, será um excelente projeto.

Ah, e pra variar né, a pergunta de sempre, por que interlude? Por que não outra chronica qualquer? Por que não algo novo e sim o velho interlude que já existem inúmeros projetos tanto free quanto pagos ? 

Agradeço se puder responder minhas questões, boa sorte com o projeto! ❤️

Inicialmente rodei muito para achar algo decente na versão Interlude. Procurei muito para trabalhar em cima.
Até que peguei a JMobius para testar e vi que realmente tem um bom trabalho na source do projeto.
Java 14 (Não é full JDK14 ainda), todas as quests funcionais, as que tiver bug, facilmente será fixada, todas as AI e boss funcionando corretamente, spawns, stats e skills vamos trabalhar o CORE para fazer o correto balanceamento de classes sem comprometer o trabalho correto dos skils (Power/Chance). Acis é uma boa base, sem dúvida, mas o desenvolvedor, ao meu ver, já está enrolando para finalizar o projeto e sempre fica mudando o nome dos arquivos e movendo para outro lugar, dificultando o update do mesmo e entendimento de quem é leigo no assunto. Nada contra a aCis, mas nada muito a favor. Quanto ao "Por quê Interlude?" Logo mais entro com um projeto H5 também com base em L2jServer "latest" e com oq falta implementado (Nevits, PC, Quests, Insntancias).

Bom, acho que é isso! A source ta ai e o projeto logo mais começará a ser atualizado. 😉

Agora, razak1995 disse:

Boa !! Porem estou com erro no hexid , como faço para recriar o hexid ? Nao encontrei nenhum arquivo para tentar recriar ;x  Erro ; Damn! Registration failed! Reason: wrong hexid

Acabei de fixar esse lapso, amigão!

CONFERE AQUI

Edited by Hl4p3x
  • Like 1
  • I love it 1

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

Lineage 2 Interlude & High Five
L2STUDIO, seu servidor está aqui!

Share this post


Link to post
Share on other sites

Update 09:
 

DOWNLOAD DO COMPILADO

Custom Daily Reward from aCis to L2jServer/Mobius e...

- Implementado no sistema de ganho diário para players configurações extras.
- Novo backup e sql para o sistema.
- Adicionado as SQL do projeto e um sistema fácil de instalação para pessoas que não tem muita experiencia.
  • Like 2

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

Lineage 2 Interlude & High Five
L2STUDIO, seu servidor está aqui!

Share this post


Link to post
Share on other sites
6 horas atrás, Lire disse:

Cedo demais para falar : melhor que a aCis

 

Mas, Hl4p3x, por que L2JMobius? O que você viu de interessante neste projeto? Está java 14, sim, mas o código está codado para ter performance nessa versão de JAVA? Ou você deu update nele ? Algumas funções de java's mais antigos não tem mais no 14 por que foi modificado, você fez essas alterações ou a pack veio assim?

 

Me explique um pouco o que você viu demais nessa plataforma, eu olhando, e analisando ainda não vi nada demais para usá-lo como BASE. Mas sem dúvidas, você como desenvolvedor da mesma, vai dar o que falar, será um excelente projeto.

Ah, e pra variar né, a pergunta de sempre, por que interlude? Por que não outra chronica qualquer? Por que não algo novo e sim o velho interlude que já existem inúmeros projetos tanto free quanto pagos ? 

Agradeço se puder responder minhas questões, boa sorte com o projeto! ❤️

Não dei certeza de se melhor que a acis, e sim que pode ta melhor.Não falei corretamente, O projeto ta em testes, mas em poucas horas que estou fazendo testes, digo que  estou gostando muito mais que a acis, só pelas quests ta muito a frente da acis, e te todos grand bosses na pack, todos mesmo, Acis ta longe disso, e a revisao não tem  o core poluido igual  a l2jfrozen, o core é mais limpo, mas acis ta um pouco mais leve, mas é porque falta muita coisa na acis pra se implementada, agora o jeito é testar tudo e reportar tudo de errado que encontrar.

Edited by Christian-SDM

Share this post


Link to post
Share on other sites

Fui atacar orfen lv 78 ele tava azul, ate ai normal. fui atacar ele, e fiquei pedrificado, mas gerou esse erro ai

Nenhuma descrição de foto disponível.

Share this post


Link to post
Share on other sites
7 minutos atrás, Christian-SDM disse:

Fui atacar orfen lv 78 ele tava azul, ate ai normal. fui atacar ele, e fiquei pedrificado, mas gerou esse erro ai

Nenhuma descrição de foto disponível.

Testei aqui com char GM, porem com status (Weapon, Armor..) normais sem enchant 65535 e ele ta normal. Mas vou verificar!


PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

Lineage 2 Interlude & High Five
L2STUDIO, seu servidor está aqui!

Share this post


Link to post
Share on other sites

oi Eu sei que é muito mais trabalho. mas é de opinião que, se eles puderem fazer um tutorial em vídeo sobre como instalar o pacote de dados e como configurar algo mínimo, como taxas, para pessoas como eu, por exemplo, que não têm muito conhecimento

 

Edited by canibal10

Share this post


Link to post
Share on other sites
23 hours ago, Lire said:

Cedo demais para falar : melhor que a aCis

 

Mas, Hl4p3x, por que L2JMobius? O que você viu de interessante neste projeto? Está java 14, sim, mas o código está codado para ter performance nessa versão de JAVA? Ou você deu update nele ? Algumas funções de java's mais antigos não tem mais no 14 por que foi modificado, você fez essas alterações ou a pack veio assim?

 

Me explique um pouco o que você viu demais nessa plataforma, eu olhando, e analisando ainda não vi nada demais para usá-lo como BASE. Mas sem dúvidas, você como desenvolvedor da mesma, vai dar o que falar, será um excelente projeto.

Ah, e pra variar né, a pergunta de sempre, por que interlude? Por que não outra chronica qualquer? Por que não algo novo e sim o velho interlude que já existem inúmeros projetos tanto free quanto pagos ? 

Agradeço se puder responder minhas questões, boa sorte com o projeto! ❤️

A voice of reason and wisdom.

aCis need rework of geoengine, movement and new spawn manager - only datapack is strong part of the project

  • Like 1

Share this post


Link to post
Share on other sites

Haha, mobius interlude foi criada baseado na frozen, mudaram toda a engine se baseando na Acis, até renomeou todo o projeto com classes iguais pra facilitar o recebimento de fixes do Triyskel ☺️, ai falar que é melhor que Acis é sacanagem. ( Acis só não é terminada, porque  Tryskel não quer, ele enrola de proposito (eu acho).

Ao meu ver, é mais interessante iniciar um projeto na Acis e adicionar o que falta para ficar uma rev show (Não mods, mas sim quests, correções entre outras coisas)

- Iniciar um projeto baseado na Mobius que baseia-se na frozen pra iniciar e na Acis para correções adicionais?

Mobius é apenas mais organizado o core, porem e a mesma coisa de vc ter uma casa simples e mantê-la sempre arrumada, a impressão que se dá e outra.

Por mais que a mobius seja organizada etc e tudo mais, a Acis tem um fino trato no geral.

 

Otima iniciativa, só não entenda minhas palavras como crítica!

  • Like 1

Share this post


Link to post
Share on other sites
6 horas atrás, SkyDoidao disse:

Haha, mobius interlude foi criada baseado na frozen, mudaram toda a engine se baseando na Acis, até renomeou todo o projeto com classes iguais pra facilitar o recebimento de fixes do Triyskel ☺️, ai falar que é melhor que Acis é sacanagem. ( Acis só não é terminada, porque  Tryskel não quer, ele enrola de proposito (eu acho).

Ao meu ver, é mais interessante iniciar um projeto na Acis e adicionar o que falta para ficar uma rev show (Não mods, mas sim quests, correções entre outras coisas)

- Iniciar um projeto baseado na Mobius que baseia-se na frozen pra iniciar e na Acis para correções adicionais?

Mobius é apenas mais organizado o core, porem e a mesma coisa de vc ter uma casa simples e mantê-la sempre arrumada, a impressão que se dá e outra.

Por mais que a mobius seja organizada etc e tudo mais, a Acis tem um fino trato no geral.

 

Otima iniciativa, só não entenda minhas palavras como crítica!

Tranquilo! Está ai para usar quem quiser. 😉

  • Thanks 2

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

Lineage 2 Interlude & High Five
L2STUDIO, seu servidor está aqui!

Share this post


Link to post
Share on other sites
Em 01/05/2020 at 11:41, Hl4p3x disse:

Tranquilo! Está ai para usar quem quiser. 😉

Isso é verdade, mas os argumentos do rapaz, estão certos. :s

Mas claro, o tempo é seu e você dedica ele como achar mais conveniente

  • Like 1

Em breve novo servidor Classic PvP

www.l2prime.co

Private Classic 150x

Share this post


Link to post
Share on other sites

Fui testar o NPC buffer e ao tentar buffar eu tomo kick do servidor ; Segue em anexo ; image.thumb.png.29f8dc4df964afdfdf08caac41f8ca84.png

 

Alguem tem um SQL com todos npcs e buffer spawnado ou criado ? 


Razak

Share this post


Link to post
Share on other sites

Estou tendo esse problema, instalei, java 14 instalado, mysql 8.0 tambem ok, instalou  o banco de dados certinho, fica subindo erros das tabelas..hgthtrh.png.e857f5d93414a22943d0d8b58a92341d.png


Positividade Sempre.

Share this post


Link to post
Share on other sites
Em 29/04/2020 at 12:20, Hl4p3x disse:

Acis é uma boa base, sem dúvida, mas o desenvolvedor, ao meu ver, já está enrolando para finalizar o projeto e sempre fica mudando o nome dos arquivos e movendo para outro lugar, dificultando o update do mesmo e entendimento de quem é leigo no assunto. Nada contra a aCis, mas nada muito a favor. Quanto ao "Por quê Interlude?" Logo mais entro com um projeto H5 também com base em L2jServer "latest" e com oq falta implementado (Nevits, PC, Quests, Insntancias).
Bom, acho que é isso! A source ta ai e o projeto logo mais começará a ser atualizado. 😉

Acabei de fixar esse lapso, amigão!

CONFERE AQUI

Concordo plenamente.

Cada projeto criado tem o seu valor! os desenvolvedores capricham nas correções que o projeto precisa para deixa-lo 100%, esse é o foco deles.  uns são mais completos em umas partes e outros em outras partes, independente se o seu é uma junção de JaCis, Jfrozen, Jserver ou outras, o importante é estar estável para que possamos ter um jogo limpo  e sem bugs! esse será o diferencial de todos os outros, além disso todos vão querer usar, espero que não desista do seu projeto man, eu vou testar e farei o possível para colaborar.

a primeira coisa que vou checar é se ela já tem os fixes de duplicação! mais testarei as principais quest's. logo mais os bosses por completo, quando tiver tempo é claro.

 

Edited by RootZerO
  • Like 1
  • Thanks 1

img.php?nick=RootZerO&sert=22&text=t6

Share this post


Link to post
Share on other sites

Uma pequena correção no game\data\scripts\ai\bosses

baium.ai

 
/*
 * This file is part of the L2J Mobius project.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package ai.bosses;

import static org.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW;
import static org.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;

import org.l2jserver.Config;
import org.l2jserver.commons.concurrent.ThreadPool;
import org.l2jserver.commons.util.Rnd;
import org.l2jserver.gameserver.datatables.SkillTable;
import org.l2jserver.gameserver.geoengine.GeoEngine;
import org.l2jserver.gameserver.instancemanager.GrandBossManager;
import org.l2jserver.gameserver.model.Effect;
import org.l2jserver.gameserver.model.Skill;
import org.l2jserver.gameserver.model.StatSet;
import org.l2jserver.gameserver.model.WorldObject;
import org.l2jserver.gameserver.model.actor.Creature;
import org.l2jserver.gameserver.model.actor.Summon;
import org.l2jserver.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jserver.gameserver.model.actor.instance.MonsterInstance;
import org.l2jserver.gameserver.model.actor.instance.NpcInstance;
import org.l2jserver.gameserver.model.actor.instance.PlayerInstance;
import org.l2jserver.gameserver.model.entity.Announcements;
import org.l2jserver.gameserver.model.quest.Quest;
import org.l2jserver.gameserver.model.quest.QuestTimer;
import org.l2jserver.gameserver.model.zone.type.BossZone;
import org.l2jserver.gameserver.network.serverpackets.Earthquake;
import org.l2jserver.gameserver.network.serverpackets.MoveToPawn;
import org.l2jserver.gameserver.network.serverpackets.PlaySound;
import org.l2jserver.gameserver.network.serverpackets.SocialAction;
import org.l2jserver.gameserver.util.Util;

/**
 * Baium AI Note1: if the server gets rebooted while players are still fighting Baium, there is no lock, but players also lose their ability to wake baium up. However, should another person enter the room and wake him up, the players who had stayed inside may join the raid. This can be helpful for
 * players who became victims of a reboot (they only need 1 new player to enter and wake up baium) and is not too exploitable since any player wishing to exploit it would have to suffer 5 days of being parked in an empty room. Note2: Neither version of Baium should be a permanent spawn. This script
 * is fully capable of spawning the statue-version when the lock expires and switching it to the mob version promptly. Additional notes ( source http://aleenaresron.blogspot.com/2006_08_01_archive.html ): * Baium only first respawns five days after his last death. And from those five days he will
 * respawn within 1-8 hours of his last death. So, you have to know his last time of death. * If by some freak chance you are the only one in Baium's chamber and NO ONE comes in [ha, ha] you or someone else will have to wake Baium. There is a good chance that Baium will automatically kill whoever
 * wakes him. There are some people that have been able to wake him and not die, however if you've already gone through the trouble of getting the bloody fabric and camped him out and researched his spawn time, are you willing to take that chance that you'll wake him and not be able to finish your
 * quest? Doubtful. [ this powerful attack vs the player who wakes him up is NOT yet implemented here] * once someone starts attacking Baium no one else can port into the chamber where he is. Unlike with the other raid bosses, you can just show up at any time as long as you are there when they die.
 * Not true with Baium. Once he gets attacked, the port to Baium closes. byebye, see you in 5 days. If nobody attacks baium for 30 minutes, he auto-despawns and unlocks the vortex
 * @author Fulminus version 0.1
 */
public class Baium extends Quest
{
	protected static final Logger LOGGER = Logger.getLogger(Baium.class.getName());
	
	private Creature _target;
	private Skill _skill;
	private static final int STONE_BAIUM = 29025;
	private static final int ANGELIC_VORTEX = 31862;
	private static final int LIVE_BAIUM = 29020;
	private static final int ARCHANGEL = 29021;
	
	// Baium status tracking,
	private static final byte ASLEEP = 0; // baium is in the stone version, waiting to be woken up. Entry is unlocked,
	private static final byte AWAKE = 1; // baium is awake and fighting. Entry is locked.
	private static final byte DEAD = 2; // baium has been killed and has not yet spawned. Entry is locked,
	
	// Archangel locations.
	// @formatter:off
	private static final int[][] ANGEL_LOCATION =
	{
		{114239, 17168, 10080, 63544},
		{115780, 15564, 10080, 13620},
		{114880, 16236, 10080, 5400},
		{115168, 17200, 10080, 0},
		{115792, 16608, 10080, 0},
	};
	// @formatter:on
	
	private long _lastAttackVsBaiumTime = 0;
	private final List<NpcInstance> _minions = new CopyOnWriteArrayList<>();
	protected BossZone _zone;
	
	public Baium()
	{
		super(-1, "ai/bosses");
		
		final int[] mob =
		{
			LIVE_BAIUM
		};
		registerMobs(mob);
		
		// Quest NPC starter initialization
		addStartNpc(STONE_BAIUM);
		addStartNpc(ANGELIC_VORTEX);
		addTalkId(STONE_BAIUM);
		addTalkId(ANGELIC_VORTEX);
		_zone = GrandBossManager.getInstance().getZone(113100, 14500, 10077);
		final StatSet info = GrandBossManager.getInstance().getStatSet(LIVE_BAIUM);
		final Integer status = GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM);
		if (status == DEAD)
		{
			// load the unlock date and time for baium from DB
			final long temp = (info.getLong("respawn_time") - System.currentTimeMillis());
			if (temp > 0)
			{
				// the unlock time has not yet expired. Mark Baium as currently locked (dead). Setup a timer
				// to fire at the correct time (calculate the time between now and the unlock time,
				// setup a timer to fire after that many msec)
				startQuestTimer("baium_unlock", temp, null, null);
			}
			else
			{
				// the time has already expired while the server was offline. Delete the saved time and
				// immediately spawn the stone-baium. Also the state need not be changed from ASLEEP
				addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0);
				if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
				{
					Announcements.getInstance().announceToAll("Raid boss Baium Stone spawned in world.");
				}
				GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, ASLEEP);
			}
		}
		else if (status == AWAKE)
		{
			final int loc_x = info.getInt("loc_x");
			final int loc_y = info.getInt("loc_y");
			final int loc_z = info.getInt("loc_z");
			final int heading = info.getInt("heading");
			final int hp = info.getInt("currentHP");
			final int mp = info.getInt("currentMP");
			final GrandBossInstance baium = (GrandBossInstance) addSpawn(LIVE_BAIUM, loc_x, loc_y, loc_z, heading, false, 0);
			if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
			{
				Announcements.getInstance().announceToAll("Raid boss " + baium.getName() + " spawned in world.");
			}
			GrandBossManager.getInstance().addBoss(baium);
			ThreadPool.schedule(() ->
			{
				try
				{
					baium.setCurrentHpMp(hp, mp);
					baium.setInvul(true);
					// _baium.setImobilised(true);
					baium.broadcastPacket(new SocialAction(baium.getObjectId(), 2));
					startQuestTimer("baium_wakeup", 15000, baium, null);
				}
				catch (Exception e)
				{
					LOGGER.warning(e.getMessage());
				}
			}, 100L);
		}
		else
		{
			addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0);
			if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
			{
				Announcements.getInstance().announceToAll("Raid boss Baium Stone spawned in world.");
			}
		}
	}
	
	@Override
	public String onAdvEvent(String event, NpcInstance npc, PlayerInstance player)
	{
		if (event.equals("baium_unlock"))
		{
			GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, ASLEEP);
			addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0);
			if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
			{
				Announcements.getInstance().announceToAll("Raid boss Baium Stone spawned in world.");
			}
		}
		else if (event.equals("skill_range") && (npc != null))
		{
			callSkillAI(npc);
		}
		else if (event.equals("clean_player"))
		{
			_target = getRandomTarget(npc);
		}
		else if (event.equals("baium_wakeup") && (npc != null))
		{
			if (npc.getNpcId() == LIVE_BAIUM)
			{
				npc.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
				npc.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 5));
				// start monitoring baium's inactivity
				_lastAttackVsBaiumTime = System.currentTimeMillis();
				startQuestTimer("baium_despawn", 60000, npc, null, true);
				if (player != null)
				{
					player.reduceCurrentHp(99999999, player);
				}
				
				npc.setRunning();
				
				startQuestTimer("skill_range", 500, npc, null, true);
				final NpcInstance baium = npc;
				ThreadPool.schedule(() ->
				{
					try
					{
						baium.setInvul(false);
						// baium.setImobilised(false);
						// for (NpcInstance minion : _Minions)
						// minion.setShowSummonAnimation(false);
						baium.getAttackByList().addAll(_zone.getCharactersInside());
					}
					catch (Exception e)
					{
						LOGGER.warning(e.getMessage());
					}
				}, 11100L);
				// TODO: the person who woke baium up should be knocked across the room, onto a wall, and
				// lose massive amounts of HP.
				for (int[] element : ANGEL_LOCATION)
				{
					final MonsterInstance angel = (MonsterInstance) addSpawn(ARCHANGEL, element[0], element[1], element[2], element[3], false, 0);
					angel.setInvul(true);
					_minions.add(angel);
					angel.getAttackByList().addAll(_zone.getCharactersInside());
					angel.isAggressive();
				}
			}
			// despawn the live baium after 30 minutes of inactivity
			// also check if the players are cheating, having pulled Baium outside his zone...
		}
		else if (event.equals("baium_despawn") && (npc != null))
		{
			if (npc.getNpcId() == LIVE_BAIUM)
			{
				// just in case the zone reference has been lost (somehow...), restore the reference
				if (_zone == null)
				{
					_zone = GrandBossManager.getInstance().getZone(113100, 14500, 10077);
				}
				if ((_lastAttackVsBaiumTime + (Config.BAIUM_SLEEP * 1000)) < System.currentTimeMillis())
				{
					npc.deleteMe(); // despawn the live-baium
					for (NpcInstance minion : _minions)
					{
						if (minion != null)
						{
							minion.getSpawn().stopRespawn();
							minion.deleteMe();
						}
					}
					_minions.clear();
					addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0); // spawn stone-baium
					GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, ASLEEP); // mark that Baium is not awake any more
					_zone.oustAllPlayers();
					cancelQuestTimer("baium_despawn", npc, null);
				}
				else if (((_lastAttackVsBaiumTime + 300000) < System.currentTimeMillis()) && (npc.getCurrentHp() < ((npc.getMaxHp() * 3) / 4.0)))
				{
					npc.setTarget(npc);
					npc.doCast(SkillTable.getInstance().getInfo(4135, 1));
					if (GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM) != AWAKE)
					{
						cancelQuestTimer("baium_despawn", npc, null);
					}
				}
			}
		}
		return super.onAdvEvent(event, npc, player);
	}
	
	@Override
	public String onTalk(NpcInstance npc, PlayerInstance player)
	{
		final int npcId = npc.getNpcId();
		String htmltext = "";
		if (_zone == null)
		{
			_zone = GrandBossManager.getInstance().getZone(113100, 14500, 10077);
		}
		if (_zone == null)
		{
			return "<html><body>Angelic Vortex:<br>You may not enter while admin disabled this zone</body></html>";
		}
		
		final Integer status = GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM);
		if ((npcId == STONE_BAIUM) && (status == ASLEEP))
		{
			if (Config.ALLOW_DIRECT_TP_TO_BOSS_ROOM || _zone.isPlayerAllowed(player))
			{
				// once Baium is awaken, no more people may enter until he dies, the server reboots, or
				// 30 minutes pass with no attacks made against Baium.
				GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, AWAKE);
				npc.deleteMe();
				final GrandBossInstance baium = (GrandBossInstance) addSpawn(LIVE_BAIUM, npc);
				GrandBossManager.getInstance().addBoss(baium);
				ThreadPool.schedule(() ->
				{
					try
					{
						baium.setInvul(true);
						baium.setRunning();
						baium.broadcastPacket(new SocialAction(baium.getObjectId(), 2));
						startQuestTimer("baium_wakeup", 15000, baium, player);
						// _baium.setShowSummonAnimation(false);
					}
					catch (Throwable e)
					{
						LOGGER.warning(e.getMessage());
					}
				}, 100L);
			}
			else
			{
				htmltext = "Conditions are not right to wake up Baium";
			}
		}
		else if (npcId == ANGELIC_VORTEX)
		{
			if (player.isFlying())
			{
				// print "Player "+player.getName()+" attempted to enter Baium's lair while flying!";
				return "<html><body>Angelic Vortex:<br>You may not enter while flying a wyvern</body></html>";
			}
			
			if ((status == ASLEEP) && (player.getQuestState(getName()).getQuestItemsCount(4295) > 0)) // bloody fabric
			{
				player.getQuestState(getName()).takeItems(4295, 1);
				// allow entry for the player for the next 30 secs (more than enough time for the TP to happen)
				// Note: this just means 30secs to get in, no limits on how long it takes before we get out.
				_zone.allowPlayerEntry(player, 30);
				player.teleToLocation(113100, 14500, 10077);
			}
			else
			{
				npc.showChatWindow(player, 1);
			}
		}
		return htmltext;
	}
	
	@Override
	public String onSpellFinished(NpcInstance npc, PlayerInstance player, Skill skill)
	{
		if (npc.isInvul())
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			return null;
		}
		else if ((npc.getNpcId() == LIVE_BAIUM) && !npc.isInvul())
		{
			callSkillAI(npc);
		}
		return super.onSpellFinished(npc, player, skill);
	}
	
	@Override
	public String onAttack(NpcInstance npc, PlayerInstance attacker, int damage, boolean isPet)
	{
		if (!_zone.isInsideZone(attacker))
		{
			attacker.reduceCurrentHp(attacker.getCurrentHp(), attacker, false);
			return super.onAttack(npc, attacker, damage, isPet);
		}
		if (npc.isInvul())
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			return super.onAttack(npc, attacker, damage, isPet);
		}
		else if ((npc.getNpcId() == LIVE_BAIUM) && !npc.isInvul())
		{
			if (attacker.getMountType() == 1)
			{
				int sk4258 = 0;
				final Effect[] effects = attacker.getAllEffects();
				if ((effects != null) && (effects.length != 0))
				{
					for (Effect e : effects)
					{
						if (e.getSkill().getId() == 4258)
						{
							sk4258 = 1;
						}
					}
				}
				if (sk4258 == 0)
				{
					npc.setTarget(attacker);
					npc.doCast(SkillTable.getInstance().getInfo(4258, 1));
				}
			}
			// update a variable with the last action against baium
			_lastAttackVsBaiumTime = System.currentTimeMillis();
			callSkillAI(npc);
		}
		return super.onAttack(npc, attacker, damage, isPet);
	}
	
	@Override
	public String onKill(NpcInstance npc, PlayerInstance killer, boolean isPet)
	{
		npc.broadcastPacket(new PlaySound(1, "BS01_D", npc));
		cancelQuestTimer("baium_despawn", npc, null);
		// spawn the "Teleportation Cubic" for 15 minutes (to allow players to exit the lair)
		addSpawn(29055, 115203, 16620, 10078, 0, false, 900000); // //should we teleport everyone out if the cubic despawns??
		// "lock" baium for 5 days and 1 to 8 hours [i.e. 432,000,000 + 1*3,600,000 + random-less-than(8*3,600,000) millisecs]
		final long respawnTime = (Config.BAIUM_RESP_FIRST + Rnd.get(Config.BAIUM_RESP_SECOND)) * 3600000;
		GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, DEAD);
		startQuestTimer("baium_unlock", respawnTime, null, null);
		// also save the respawn time so that the info is maintained past reboots
		final StatSet info = GrandBossManager.getInstance().getStatSet(LIVE_BAIUM);
		info.set("respawn_time", System.currentTimeMillis() + respawnTime);
		GrandBossManager.getInstance().setStatSet(LIVE_BAIUM, info);
		for (NpcInstance minion : _minions)
		{
			if (minion != null)
			{
				minion.getSpawn().stopRespawn();
				minion.deleteMe();
			}
		}
		_minions.clear();
		
		if (getQuestTimer("skill_range", npc, null) != null)
		{
			getQuestTimer("skill_range", npc, null).cancel();
		}
		
		return super.onKill(npc, killer, isPet);
	}
	
	public Creature getRandomTarget(NpcInstance npc)
	{
		final List<Creature> result = new ArrayList<>();
		final Collection<WorldObject> objs = npc.getKnownList().getKnownObjects().values();
		{
			for (WorldObject obj : objs)
			{
				if ((obj instanceof Creature) && (((((Creature) obj).getZ() < (npc.getZ() - 100)) && (((Creature) obj).getZ() > (npc.getZ() + 100))) || !GeoEngine.getInstance().canSeeTarget(obj, npc)))
				{
					continue;
				}
				if ((obj instanceof PlayerInstance) && Util.checkIfInRange(9000, npc, obj, true) && !((Creature) obj).isDead())
				{
					result.add((PlayerInstance) obj);
				}
				if ((obj instanceof Summon) && Util.checkIfInRange(9000, npc, obj, true) && !((Creature) obj).isDead())
				{
					result.add((Summon) obj);
				}
			}
		}
		if (result.isEmpty())
		{
			for (NpcInstance minion : _minions)
			{
				if (minion != null)
				{
					result.add(minion);
				}
			}
		}
		
		if (result.isEmpty())
		{
			return null;
		}
		
		final Object[] characters = result.toArray();
		final QuestTimer timer = getQuestTimer("clean_player", npc, null);
		if (timer != null)
		{
			timer.cancel();
		}
		startQuestTimer("clean_player", 20000, npc, null);
		return (Creature) characters[Rnd.get(characters.length)];
	}
	
	public synchronized void callSkillAI(NpcInstance npc)
	{
		if (npc.isInvul() || npc.isCastingNow())
		{
			return;
		}
		
		if ((_target == null) || _target.isDead() || !(_zone.isInsideZone(_target)))
		{
			_target = getRandomTarget(npc);
			if (_target != null)
			{
				_skill = SkillTable.getInstance().getInfo(getRandomSkill(npc), 1);
			}
		}
		
		final Creature target = _target;
		Skill skill = _skill;
		if (skill == null)
		{
			skill = SkillTable.getInstance().getInfo(getRandomSkill(npc), 1);
		}
		if ((target == null) || target.isDead() || !(_zone.isInsideZone(target)))
		{
			// npc.setCastingNow(false);
			return;
		}
		
		if (Util.checkIfInRange(skill.getCastRange(), npc, target, true))
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			npc.setTarget(target);
			// npc.setCastingNow(true);
			if (getDist(skill.getCastRange()) > 0)
			{
				npc.broadcastPacket(new MoveToPawn(npc, target, getDist(skill.getCastRange())));
			}
			try
			{
				wait(1000);
				npc.stopMove(null);
				npc.doCast(skill);
			}
			catch (Exception e)
			{
				LOGGER.warning(e.getMessage());
			}
		}
		else
		{
			npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null);
			// npc.setCastingNow(false);
		}
	}
	
	public int getRandomSkill(NpcInstance npc)
	{
		int skill;
		if (npc.getCurrentHp() > ((npc.getMaxHp() * 3) / 4.0))
		{
			if (Rnd.get(100) < 10)
			{
				skill = 4128;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4129;
			}
			else
			{
				skill = 4127;
			}
		}
		else if (npc.getCurrentHp() > ((npc.getMaxHp() * 2) / 4.0))
		{
			if (Rnd.get(100) < 10)
			{
				skill = 4131;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4128;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4129;
			}
			else
			{
				skill = 4127;
			}
		}
		else if (npc.getCurrentHp() > ((npc.getMaxHp() * 1) / 4.0))
		{
			if (Rnd.get(100) < 10)
			{
				skill = 4130;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4131;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4128;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4129;
			}
			else
			{
				skill = 4127;
			}
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4130;
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4131;
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4128;
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4129;
		}
		else
		{
			skill = 4127;
		}
		return skill;
	}
	
	@Override
	public String onSkillUse(NpcInstance npc, PlayerInstance caster, Skill skill)
	{
		if (npc.isInvul())
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			return null;
		}
		npc.setTarget(caster);
		return super.onSkillUse(npc, caster, skill);
	}
	
	public int getDist(int range)
	{
		int dist = 0;
		switch (range)
		{
			case -1:
			{
				break;
			}
			case 100:
			{
				dist = 85;
				break;
			}
			default:
			{
				dist = range - 85;
				break;
			}
		}
		return dist;
	}
	
	public static void main(String[] args)
	{
		new Baium();
	}
}

Pequena correção no game\data\scripts\ai\bosses

Edited by RootZerO
  • Like 1

img.php?nick=RootZerO&sert=22&text=t6

Share this post


Link to post
Share on other sites
2 horas atrás, RootZerO disse:

Uma pequena correção no game\data\scripts\ai\bosses

baium.ai

  Ocultar conteúdo

/*
 * This file is part of the L2J Mobius project.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package ai.bosses;

import static org.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW;
import static org.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;

import org.l2jserver.Config;
import org.l2jserver.commons.concurrent.ThreadPool;
import org.l2jserver.commons.util.Rnd;
import org.l2jserver.gameserver.datatables.SkillTable;
import org.l2jserver.gameserver.geoengine.GeoEngine;
import org.l2jserver.gameserver.instancemanager.GrandBossManager;
import org.l2jserver.gameserver.model.Effect;
import org.l2jserver.gameserver.model.Skill;
import org.l2jserver.gameserver.model.StatSet;
import org.l2jserver.gameserver.model.WorldObject;
import org.l2jserver.gameserver.model.actor.Creature;
import org.l2jserver.gameserver.model.actor.Summon;
import org.l2jserver.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jserver.gameserver.model.actor.instance.MonsterInstance;
import org.l2jserver.gameserver.model.actor.instance.NpcInstance;
import org.l2jserver.gameserver.model.actor.instance.PlayerInstance;
import org.l2jserver.gameserver.model.entity.Announcements;
import org.l2jserver.gameserver.model.quest.Quest;
import org.l2jserver.gameserver.model.quest.QuestTimer;
import org.l2jserver.gameserver.model.zone.type.BossZone;
import org.l2jserver.gameserver.network.serverpackets.Earthquake;
import org.l2jserver.gameserver.network.serverpackets.MoveToPawn;
import org.l2jserver.gameserver.network.serverpackets.PlaySound;
import org.l2jserver.gameserver.network.serverpackets.SocialAction;
import org.l2jserver.gameserver.util.Util;

/**
 * Baium AI Note1: if the server gets rebooted while players are still fighting Baium, there is no lock, but players also lose their ability to wake baium up. However, should another person enter the room and wake him up, the players who had stayed inside may join the raid. This can be helpful for
 * players who became victims of a reboot (they only need 1 new player to enter and wake up baium) and is not too exploitable since any player wishing to exploit it would have to suffer 5 days of being parked in an empty room. Note2: Neither version of Baium should be a permanent spawn. This script
 * is fully capable of spawning the statue-version when the lock expires and switching it to the mob version promptly. Additional notes ( source http://aleenaresron.blogspot.com/2006_08_01_archive.html ): * Baium only first respawns five days after his last death. And from those five days he will
 * respawn within 1-8 hours of his last death. So, you have to know his last time of death. * If by some freak chance you are the only one in Baium's chamber and NO ONE comes in [ha, ha] you or someone else will have to wake Baium. There is a good chance that Baium will automatically kill whoever
 * wakes him. There are some people that have been able to wake him and not die, however if you've already gone through the trouble of getting the bloody fabric and camped him out and researched his spawn time, are you willing to take that chance that you'll wake him and not be able to finish your
 * quest? Doubtful. [ this powerful attack vs the player who wakes him up is NOT yet implemented here] * once someone starts attacking Baium no one else can port into the chamber where he is. Unlike with the other raid bosses, you can just show up at any time as long as you are there when they die.
 * Not true with Baium. Once he gets attacked, the port to Baium closes. byebye, see you in 5 days. If nobody attacks baium for 30 minutes, he auto-despawns and unlocks the vortex
 * @author Fulminus version 0.1
 */
public class Baium extends Quest
{
	protected static final Logger LOGGER = Logger.getLogger(Baium.class.getName());
	
	private Creature _target;
	private Skill _skill;
	private static final int STONE_BAIUM = 29025;
	private static final int ANGELIC_VORTEX = 31862;
	private static final int LIVE_BAIUM = 29020;
	private static final int ARCHANGEL = 29021;
	
	// Baium status tracking,
	private static final byte ASLEEP = 0; // baium is in the stone version, waiting to be woken up. Entry is unlocked,
	private static final byte AWAKE = 1; // baium is awake and fighting. Entry is locked.
	private static final byte DEAD = 2; // baium has been killed and has not yet spawned. Entry is locked,
	
	// Archangel locations.
	// @formatter:off
	private static final int[][] ANGEL_LOCATION =
	{
		{114239, 17168, 10080, 63544},
		{115780, 15564, 10080, 13620},
		{114880, 16236, 10080, 5400},
		{115168, 17200, 10080, 0},
		{115792, 16608, 10080, 0},
	};
	// @formatter:on
	
	private long _lastAttackVsBaiumTime = 0;
	private final List<NpcInstance> _minions = new CopyOnWriteArrayList<>();
	protected BossZone _zone;
	
	public Baium()
	{
		super(-1, "ai/bosses");
		
		final int[] mob =
		{
			LIVE_BAIUM
		};
		registerMobs(mob);
		
		// Quest NPC starter initialization
		addStartNpc(STONE_BAIUM);
		addStartNpc(ANGELIC_VORTEX);
		addTalkId(STONE_BAIUM);
		addTalkId(ANGELIC_VORTEX);
		_zone = GrandBossManager.getInstance().getZone(113100, 14500, 10077);
		final StatSet info = GrandBossManager.getInstance().getStatSet(LIVE_BAIUM);
		final Integer status = GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM);
		if (status == DEAD)
		{
			// load the unlock date and time for baium from DB
			final long temp = (info.getLong("respawn_time") - System.currentTimeMillis());
			if (temp > 0)
			{
				// the unlock time has not yet expired. Mark Baium as currently locked (dead). Setup a timer
				// to fire at the correct time (calculate the time between now and the unlock time,
				// setup a timer to fire after that many msec)
				startQuestTimer("baium_unlock", temp, null, null);
			}
			else
			{
				// the time has already expired while the server was offline. Delete the saved time and
				// immediately spawn the stone-baium. Also the state need not be changed from ASLEEP
				addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0);
				if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
				{
					Announcements.getInstance().announceToAll("Raid boss Baium Stone spawned in world.");
				}
				GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, ASLEEP);
			}
		}
		else if (status == AWAKE)
		{
			final int loc_x = info.getInt("loc_x");
			final int loc_y = info.getInt("loc_y");
			final int loc_z = info.getInt("loc_z");
			final int heading = info.getInt("heading");
			final int hp = info.getInt("currentHP");
			final int mp = info.getInt("currentMP");
			final GrandBossInstance baium = (GrandBossInstance) addSpawn(LIVE_BAIUM, loc_x, loc_y, loc_z, heading, false, 0);
			if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
			{
				Announcements.getInstance().announceToAll("Raid boss " + baium.getName() + " spawned in world.");
			}
			GrandBossManager.getInstance().addBoss(baium);
			ThreadPool.schedule(() ->
			{
				try
				{
					baium.setCurrentHpMp(hp, mp);
					baium.setInvul(true);
					// _baium.setImobilised(true);
					baium.broadcastPacket(new SocialAction(baium.getObjectId(), 2));
					startQuestTimer("baium_wakeup", 15000, baium, null);
				}
				catch (Exception e)
				{
					LOGGER.warning(e.getMessage());
				}
			}, 100L);
		}
		else
		{
			addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0);
			if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
			{
				Announcements.getInstance().announceToAll("Raid boss Baium Stone spawned in world.");
			}
		}
	}
	
	@Override
	public String onAdvEvent(String event, NpcInstance npc, PlayerInstance player)
	{
		if (event.equals("baium_unlock"))
		{
			GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, ASLEEP);
			addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0);
			if (Config.ANNOUNCE_TO_ALL_SPAWN_RB)
			{
				Announcements.getInstance().announceToAll("Raid boss Baium Stone spawned in world.");
			}
		}
		else if (event.equals("skill_range") && (npc != null))
		{
			callSkillAI(npc);
		}
		else if (event.equals("clean_player"))
		{
			_target = getRandomTarget(npc);
		}
		else if (event.equals("baium_wakeup") && (npc != null))
		{
			if (npc.getNpcId() == LIVE_BAIUM)
			{
				npc.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
				npc.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 5));
				// start monitoring baium's inactivity
				_lastAttackVsBaiumTime = System.currentTimeMillis();
				startQuestTimer("baium_despawn", 60000, npc, null, true);
				if (player != null)
				{
					player.reduceCurrentHp(99999999, player);
				}
				
				npc.setRunning();
				
				startQuestTimer("skill_range", 500, npc, null, true);
				final NpcInstance baium = npc;
				ThreadPool.schedule(() ->
				{
					try
					{
						baium.setInvul(false);
						// baium.setImobilised(false);
						// for (NpcInstance minion : _Minions)
						// minion.setShowSummonAnimation(false);
						baium.getAttackByList().addAll(_zone.getCharactersInside());
					}
					catch (Exception e)
					{
						LOGGER.warning(e.getMessage());
					}
				}, 11100L);
				// TODO: the person who woke baium up should be knocked across the room, onto a wall, and
				// lose massive amounts of HP.
				for (int[] element : ANGEL_LOCATION)
				{
					final MonsterInstance angel = (MonsterInstance) addSpawn(ARCHANGEL, element[0], element[1], element[2], element[3], false, 0);
					angel.setInvul(true);
					_minions.add(angel);
					angel.getAttackByList().addAll(_zone.getCharactersInside());
					angel.isAggressive();
				}
			}
			// despawn the live baium after 30 minutes of inactivity
			// also check if the players are cheating, having pulled Baium outside his zone...
		}
		else if (event.equals("baium_despawn") && (npc != null))
		{
			if (npc.getNpcId() == LIVE_BAIUM)
			{
				// just in case the zone reference has been lost (somehow...), restore the reference
				if (_zone == null)
				{
					_zone = GrandBossManager.getInstance().getZone(113100, 14500, 10077);
				}
				if ((_lastAttackVsBaiumTime + (Config.BAIUM_SLEEP * 1000)) < System.currentTimeMillis())
				{
					npc.deleteMe(); // despawn the live-baium
					for (NpcInstance minion : _minions)
					{
						if (minion != null)
						{
							minion.getSpawn().stopRespawn();
							minion.deleteMe();
						}
					}
					_minions.clear();
					addSpawn(STONE_BAIUM, 116033, 17447, 10104, 40188, false, 0); // spawn stone-baium
					GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, ASLEEP); // mark that Baium is not awake any more
					_zone.oustAllPlayers();
					cancelQuestTimer("baium_despawn", npc, null);
				}
				else if (((_lastAttackVsBaiumTime + 300000) < System.currentTimeMillis()) && (npc.getCurrentHp() < ((npc.getMaxHp() * 3) / 4.0)))
				{
					npc.setTarget(npc);
					npc.doCast(SkillTable.getInstance().getInfo(4135, 1));
					if (GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM) != AWAKE)
					{
						cancelQuestTimer("baium_despawn", npc, null);
					}
				}
			}
		}
		return super.onAdvEvent(event, npc, player);
	}
	
	@Override
	public String onTalk(NpcInstance npc, PlayerInstance player)
	{
		final int npcId = npc.getNpcId();
		String htmltext = "";
		if (_zone == null)
		{
			_zone = GrandBossManager.getInstance().getZone(113100, 14500, 10077);
		}
		if (_zone == null)
		{
			return "<html><body>Angelic Vortex:<br>You may not enter while admin disabled this zone</body></html>";
		}
		
		final Integer status = GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM);
		if ((npcId == STONE_BAIUM) && (status == ASLEEP))
		{
			if (Config.ALLOW_DIRECT_TP_TO_BOSS_ROOM || _zone.isPlayerAllowed(player))
			{
				// once Baium is awaken, no more people may enter until he dies, the server reboots, or
				// 30 minutes pass with no attacks made against Baium.
				GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, AWAKE);
				npc.deleteMe();
				final GrandBossInstance baium = (GrandBossInstance) addSpawn(LIVE_BAIUM, npc);
				GrandBossManager.getInstance().addBoss(baium);
				ThreadPool.schedule(() ->
				{
					try
					{
						baium.setInvul(true);
						baium.setRunning();
						baium.broadcastPacket(new SocialAction(baium.getObjectId(), 2));
						startQuestTimer("baium_wakeup", 15000, baium, player);
						// _baium.setShowSummonAnimation(false);
					}
					catch (Throwable e)
					{
						LOGGER.warning(e.getMessage());
					}
				}, 100L);
			}
			else
			{
				htmltext = "Conditions are not right to wake up Baium";
			}
		}
		else if (npcId == ANGELIC_VORTEX)
		{
			if (player.isFlying())
			{
				// print "Player "+player.getName()+" attempted to enter Baium's lair while flying!";
				return "<html><body>Angelic Vortex:<br>You may not enter while flying a wyvern</body></html>";
			}
			
			if ((status == ASLEEP) && (player.getQuestState(getName()).getQuestItemsCount(4295) > 0)) // bloody fabric
			{
				player.getQuestState(getName()).takeItems(4295, 1);
				// allow entry for the player for the next 30 secs (more than enough time for the TP to happen)
				// Note: this just means 30secs to get in, no limits on how long it takes before we get out.
				_zone.allowPlayerEntry(player, 30);
				player.teleToLocation(113100, 14500, 10077);
			}
			else
			{
				npc.showChatWindow(player, 1);
			}
		}
		return htmltext;
	}
	
	@Override
	public String onSpellFinished(NpcInstance npc, PlayerInstance player, Skill skill)
	{
		if (npc.isInvul())
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			return null;
		}
		else if ((npc.getNpcId() == LIVE_BAIUM) && !npc.isInvul())
		{
			callSkillAI(npc);
		}
		return super.onSpellFinished(npc, player, skill);
	}
	
	@Override
	public String onAttack(NpcInstance npc, PlayerInstance attacker, int damage, boolean isPet)
	{
		if (!_zone.isInsideZone(attacker))
		{
			attacker.reduceCurrentHp(attacker.getCurrentHp(), attacker, false);
			return super.onAttack(npc, attacker, damage, isPet);
		}
		if (npc.isInvul())
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			return super.onAttack(npc, attacker, damage, isPet);
		}
		else if ((npc.getNpcId() == LIVE_BAIUM) && !npc.isInvul())
		{
			if (attacker.getMountType() == 1)
			{
				int sk4258 = 0;
				final Effect[] effects = attacker.getAllEffects();
				if ((effects != null) && (effects.length != 0))
				{
					for (Effect e : effects)
					{
						if (e.getSkill().getId() == 4258)
						{
							sk4258 = 1;
						}
					}
				}
				if (sk4258 == 0)
				{
					npc.setTarget(attacker);
					npc.doCast(SkillTable.getInstance().getInfo(4258, 1));
				}
			}
			// update a variable with the last action against baium
			_lastAttackVsBaiumTime = System.currentTimeMillis();
			callSkillAI(npc);
		}
		return super.onAttack(npc, attacker, damage, isPet);
	}
	
	@Override
	public String onKill(NpcInstance npc, PlayerInstance killer, boolean isPet)
	{
		npc.broadcastPacket(new PlaySound(1, "BS01_D", npc));
		cancelQuestTimer("baium_despawn", npc, null);
		// spawn the "Teleportation Cubic" for 15 minutes (to allow players to exit the lair)
		addSpawn(29055, 115203, 16620, 10078, 0, false, 900000); // //should we teleport everyone out if the cubic despawns??
		// "lock" baium for 5 days and 1 to 8 hours [i.e. 432,000,000 + 1*3,600,000 + random-less-than(8*3,600,000) millisecs]
		final long respawnTime = (Config.BAIUM_RESP_FIRST + Rnd.get(Config.BAIUM_RESP_SECOND)) * 3600000;
		GrandBossManager.getInstance().setBossStatus(LIVE_BAIUM, DEAD);
		startQuestTimer("baium_unlock", respawnTime, null, null);
		// also save the respawn time so that the info is maintained past reboots
		final StatSet info = GrandBossManager.getInstance().getStatSet(LIVE_BAIUM);
		info.set("respawn_time", System.currentTimeMillis() + respawnTime);
		GrandBossManager.getInstance().setStatSet(LIVE_BAIUM, info);
		for (NpcInstance minion : _minions)
		{
			if (minion != null)
			{
				minion.getSpawn().stopRespawn();
				minion.deleteMe();
			}
		}
		_minions.clear();
		
		if (getQuestTimer("skill_range", npc, null) != null)
		{
			getQuestTimer("skill_range", npc, null).cancel();
		}
		
		return super.onKill(npc, killer, isPet);
	}
	
	public Creature getRandomTarget(NpcInstance npc)
	{
		final List<Creature> result = new ArrayList<>();
		final Collection<WorldObject> objs = npc.getKnownList().getKnownObjects().values();
		{
			for (WorldObject obj : objs)
			{
				if ((obj instanceof Creature) && (((((Creature) obj).getZ() < (npc.getZ() - 100)) && (((Creature) obj).getZ() > (npc.getZ() + 100))) || !GeoEngine.getInstance().canSeeTarget(obj, npc)))
				{
					continue;
				}
				if ((obj instanceof PlayerInstance) && Util.checkIfInRange(9000, npc, obj, true) && !((Creature) obj).isDead())
				{
					result.add((PlayerInstance) obj);
				}
				if ((obj instanceof Summon) && Util.checkIfInRange(9000, npc, obj, true) && !((Creature) obj).isDead())
				{
					result.add((Summon) obj);
				}
			}
		}
		if (result.isEmpty())
		{
			for (NpcInstance minion : _minions)
			{
				if (minion != null)
				{
					result.add(minion);
				}
			}
		}
		
		if (result.isEmpty())
		{
			return null;
		}
		
		final Object[] characters = result.toArray();
		final QuestTimer timer = getQuestTimer("clean_player", npc, null);
		if (timer != null)
		{
			timer.cancel();
		}
		startQuestTimer("clean_player", 20000, npc, null);
		return (Creature) characters[Rnd.get(characters.length)];
	}
	
	public synchronized void callSkillAI(NpcInstance npc)
	{
		if (npc.isInvul() || npc.isCastingNow())
		{
			return;
		}
		
		if ((_target == null) || _target.isDead() || !(_zone.isInsideZone(_target)))
		{
			_target = getRandomTarget(npc);
			if (_target != null)
			{
				_skill = SkillTable.getInstance().getInfo(getRandomSkill(npc), 1);
			}
		}
		
		final Creature target = _target;
		Skill skill = _skill;
		if (skill == null)
		{
			skill = SkillTable.getInstance().getInfo(getRandomSkill(npc), 1);
		}
		if ((target == null) || target.isDead() || !(_zone.isInsideZone(target)))
		{
			// npc.setCastingNow(false);
			return;
		}
		
		if (Util.checkIfInRange(skill.getCastRange(), npc, target, true))
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			npc.setTarget(target);
			// npc.setCastingNow(true);
			if (getDist(skill.getCastRange()) > 0)
			{
				npc.broadcastPacket(new MoveToPawn(npc, target, getDist(skill.getCastRange())));
			}
			try
			{
				wait(1000);
				npc.stopMove(null);
				npc.doCast(skill);
			}
			catch (Exception e)
			{
				LOGGER.warning(e.getMessage());
			}
		}
		else
		{
			npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null);
			// npc.setCastingNow(false);
		}
	}
	
	public int getRandomSkill(NpcInstance npc)
	{
		int skill;
		if (npc.getCurrentHp() > ((npc.getMaxHp() * 3) / 4.0))
		{
			if (Rnd.get(100) < 10)
			{
				skill = 4128;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4129;
			}
			else
			{
				skill = 4127;
			}
		}
		else if (npc.getCurrentHp() > ((npc.getMaxHp() * 2) / 4.0))
		{
			if (Rnd.get(100) < 10)
			{
				skill = 4131;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4128;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4129;
			}
			else
			{
				skill = 4127;
			}
		}
		else if (npc.getCurrentHp() > ((npc.getMaxHp() * 1) / 4.0))
		{
			if (Rnd.get(100) < 10)
			{
				skill = 4130;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4131;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4128;
			}
			else if (Rnd.get(100) < 10)
			{
				skill = 4129;
			}
			else
			{
				skill = 4127;
			}
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4130;
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4131;
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4128;
		}
		else if (Rnd.get(100) < 10)
		{
			skill = 4129;
		}
		else
		{
			skill = 4127;
		}
		return skill;
	}
	
	@Override
	public String onSkillUse(NpcInstance npc, PlayerInstance caster, Skill skill)
	{
		if (npc.isInvul())
		{
			npc.getAI().setIntention(AI_INTENTION_IDLE);
			return null;
		}
		npc.setTarget(caster);
		return super.onSkillUse(npc, caster, skill);
	}
	
	public int getDist(int range)
	{
		int dist = 0;
		switch (range)
		{
			case -1:
			{
				break;
			}
			case 100:
			{
				dist = 85;
				break;
			}
			default:
			{
				dist = range - 85;
				break;
			}
		}
		return dist;
	}
	
	public static void main(String[] args)
	{
		new Baium();
	}
}

Pequena correção no game\data\scripts\ai\bosses

Obrigado!
Git updated

  • Like 2

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

Lineage 2 Interlude & High Five
L2STUDIO, seu servidor está aqui!

Share this post


Link to post
Share on other sites



  • Recently Browsing

    No registered users viewing this page.

  • Similar Content

    • By KhayrusS
      A um tempo atrás, Kelvin falou comigo sobre a possibilidade de termos um projeto classic, visto a escassez desse tipo de servidor,   com mais visibilidade para a comunidade.
      A ideia é termos um projeto Classic utilizável e estável, e o melhor de tudo: open source!
       
      Sobre o projeto:
      No inicio, eu tinha o projeto era apenas para testes de implementações pessoais, basicamente para me manter atualizado com o Java devido a política de atualização semestral adotada.  O projeto está ativo há mais ou menos um ano, com atualizações diárias. Existem 3 colaboradores direto no projeto, e mais alguns indiretos.
      Hoje estamos dando suporte ao protocolo 272, a versão atual do servidores NA.
      Requisitos:
      Java 14 MySql 8 Client protocolo 272 Caracteristícas
      Projeto open source sob licença GPL 3; Disponível em https://github.com/JoeAlisson/L2jOrg Atualizações diárias, porém depende. Tem dia que são muitas, tem dias que são poucas, às vezes nem tem;😛 Pretendo manter o ciclo de atualização da branch master a cada 3 semanas com uma versão um pouco mais estável; Para os mais apressados por atualização, as atualizações diárias ocorrem na branch development (Lembrando que essa branch é de desenvolvimento ativo, então em uma ou outra atualização pode ocorrer algum erro no build ou para iniciar o servidor)  
      A participação da comunidade é essencial para o desenvolvimento de qualquer projeto open source. Eu sei que muitas pessoas, ainda hoje, têm uma visão um pouco deturbada de projetos open source, então vou listar alguns projetos como referência de que um projeto open source pode ser tão bom ou melhor que um projeto privado:
      Java https://github.com/openjdk; MySql https://github.com/mysql; Hirakicp https://github.com/brettwooldridge/HikariCP; EhCache https://github.com/ehcache/ehcache3; Log4J https://github.com/apache/logging-log4j2; e por último mas não menos importante: async-mmocore https://github.com/JoeAlisson/async-mmocore 😛 Claro que existem muitos outros relevantes, mas me restringir a listar projetos que são usados como dependência do L2j ORG.
       
      Não é necessário ser expert em Java ou conhecer tudo de L2j para ajudar no projeto, você pode contribuir com o que puder. Para os interessados no projeto que querem ter uma participação mais ativa, estamos em busca de alguns talentos.
      A participação no projeto vai ser dividida nas categorias:

      Desenvolvedor de Core: É necessário ter conhecimento em programação para implementar e corrigir códigos.
      Desenvolvedor de Datapack: É necessário ter conhecimento em L2J no geral, HTML e XML para trabalhar com shops, npcs, quests.
      Contribuidor: Membro que contribua com os testes do projeto, reporte de bugs, suporte aos usuários e contribuições em geral para o projeto.
      É só entrar em contato comigo por MP e fornecer algumas informações básicas:
      Nome Real:
      Interesse e experiência na área: (Core, Datapack ou Contribuidor)
      Quanto tempo possui para se dedicar ao projeto?
      Possui algum trabalho disponível que possa enviar como referência ? (se tiver mande junto por  MP.) 
       
      Para quem já tiver interesse imediato eu criei um tutorial básico de como compilar o projeto:
       
      Sobre o cliente
      É necessário utilizar o cliente oficial do servidor americano. Para utilizar localmente sem modificação do cliente baixe o launch e coloque dentro da system:
      https://github.com/JoeAlisson/L2jOrg/wiki/files/launchL2.zip
      O post ficou mais extenso do que queria, então qualquer dúvida que tiverem é só perguntar.
      []'s
       
    • By Cardoso
      Alguém poderia me dizer porque os farm da party Farm só vai pro líder da pt, mesmo mudando pra by turn ?
    • By ILMosTriky
      Experience: 500x Cliente Interlude PvP Server Dificuldade farm: Médio Status Noblesse: Quest / Last Hit / Farm Comandos: .menu / .info / .raidinfo Máximo Slots de Buffs: 32+4 (Divine Inspiration free) Tempo dos Buffs: 4 Horas Scheme Buffs: Yes Todos os buffs no NPC: Yes Siege System: 7 in 7 days Only registered clans can join the siege  
       
      Safe: +5 Máximo: +16 Blessed Scroll - Fácil de obter Chance de sucesso: 65% Encante Máximo +12 Caso falhe retorna pro +3 Golden Scroll - Médio de obter Chance de sucesso até +12: 100% Chance de sucesso até +16: 40% (diminuindo 5% em cada enchante) Encante Máximo +16 Caso falhe retorna pro +12  
      • Raid Boss Zone Limite: (27) 3 Partys por Clan/Ally. • Raid Boss Zone Limite: (27) 3 Partys por Clan/Ally. • Grand Boss Zone Limite: (27) 3 Partys por Clan/Ally. • Party Zone Limite: (36) 4 Partys por Clan/Ally. • Você só pode ir para o farm com 1 cliente por (PC). • Número máximo de 2 janelas do cliente em execução (PC). • Proteção contra ataques DDOS. • Proteção contra L2Tower / L2Adrenaline / L2Walker / L2Net.  
      Período: 7 em 7 Dias Tempo de Batalha: 17:00 - 23:00 (GMT -3) Lutas separadas por classe base: Desativado Mínimo de lutas para se tornar HERO: 9 Lutas Mínimo de pontos para se tornar HERO: 4 Pontos Olimpíadas Grade: A/S Grade Max Enchant Status: +6 EVENTOS
      Team vs Team 3 em 3 Horas Tournament 1x1 2x2 5x5 9x9 12:00 / 21:00 (1Hora de Duração)  
       
       
    • By UndergrOund cOdes
      Creditos: Vanglorious
       
      Eu compartilho aqui porque na seção Downloads não me dá a opção

      Link: Click here :)


       


       



       
    • By AikoN~
      Salve. 
      Um colega nosso da L2JDream @ThypS compartilhou recentemente um arquivo Env.int desenvolvido por algum Russo da vida, que deixa a aura Hero do Interlude (que é bem estouradona) igual a do atual Classic. 
      Na minha opinião muito mais linda, leve e "super show de bola" kk
      Não sei se só com o print da para tirar uma conclusão, por favor baixem ela, joguem dentro da system e testem por vocês mesmo e me digam o que acham??? :D 

       
       
      DOWNLOAD
      Senha:
      byAikoN
       
      Créditos:
       
       
      Glow Hero Classic by AikoN.rar
  • Posts

×
×
  • Create New...