
l2fire
Members-
Posts
87 -
Credits
0 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Articles
Profiles
Forums
Store
Everything posted by l2fire
-
Help Max skill enchant limit
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Fixed lock it please. -
Yes, i tried it. In some places this work perfect in some places npc going under floor. Height realy is okay cuz not only teleporter doing that.
-
Help Max skill enchant limit
l2fire replied to l2fire's question in Request Server Development Help [L2J]
And delete another skills level ? -
Hello, i back with this topic again Mr SweeTs said insert geodata i have added Stazis geodata. and same shit. who can help me. Who help me i pay 5 euro
-
Help Max skill enchant limit
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Dont work. Nothing to show about my message i can enchant till +12 +13 -
Help Max skill enchant limit
l2fire replied to l2fire's question in Request Server Development Help [L2J]
dont work this Photo -
Hello, how to make max skill enchant for l2jfrozen?I want to make max skill enchant to +12I have found code for l2jserver but i dont know where can add code to l2pcinstance.java +++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -15769,6 +15769,31 @@ for (int id : getSkills().keySet()) { int level = getSkillLevel(id); + if (Config.ENABLE_SKILL_MAX_ENCHANT_LIMIT) + { + L2Skill fixedSkill = null; + int oldLevel = level % 100; + if (Config.SKILL_MAX_ENCHANT_LIMIT_LEVEL > 0) // Nerf enchantment + { + if (oldLevel > Config.SKILL_MAX_ENCHANT_LIMIT_LEVEL) + { + level = ((level / 100) * 100) + Config.SKILL_MAX_ENCHANT_LIMIT_LEVEL; + fixedSkill = SkillTable.getInstance().getInfo(id, level); + } + } + else if (Config.SKILL_MAX_ENCHANT_LIMIT_LEVEL == 0) // Remove enchantment + { + level = SkillTable.getInstance().getMaxLevel(id); + fixedSkill = SkillTable.getInstance().getInfo(id, level); + } + // Setting the new level enchat for the skill. + if (fixedSkill != null) + { + _log.info("Decreasing skill enchantment from " + oldLevel + " to " + level + " on skill " + id + " from Player: " + getName() + "!"); + addSkill(fixedSkill, true); + } + } + if (level >= 100) { level = SkillTable.getInstance().getMaxLevel(id);
-
I'll try. I think about geodata too.
-
some time they stay normal, sometimes under floor . And when i try to spawn npc they going under floor. there isn't navicat problem. pack: l2jfrozen
-
Hello, anyone can help me, when i try to teleport with npc Teleporter i'll get error in GS console: WARN Bad RequestBypassToServer: java.lang.IndexOutOfBoundsException: index: -1 at javolution.util.FastList.get(FastList.java:196) at com.l2jfrozen.gameserver.managers.TownManager.townHasCastleInSiege(To wnManager.java:228) at com.l2jfrozen.gameserver.model.actor.instance.L2TeleporterInstance.do Teleport(L2TeleporterInstance.java:247) at com.l2jfrozen.gameserver.model.actor.instance.L2TeleporterInstance.on BypassFeedback(L2TeleporterInstance.java:145) at com.l2jfrozen.gameserver.network.clientpackets.RequestBypassToServer. runImpl(RequestBypassToServer.java:243) at com.l2jfrozen.gameserver.network.clientpackets.L2GameClientPacket.run (L2GameClientPacket.java:77) at com.l2jfrozen.gameserver.network.L2GameClient.run(L2GameClient.java:1 213) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) // FROM JAVA at com.l2jfrozen.gameserver.managers.TownManager.townHasCastleInSiege(To wnManager.java:228) 228 Line: final Castle castle = CastleManager.getInstance().getCastles().get(CastleManager.getInstance().getCastleIndex(castleIndex)); at com.l2jfrozen.gameserver.model.actor.instance.L2TeleporterInstance.do Teleport(L2TeleporterInstance.java:247) 247 Line: else if (!SiegeManager.getInstance().is_teleport_to_siege_town_allowed() && TownManager.getInstance().townHasCastleInSiege(list.getLocX(), list.getLocY()) && !player.isNoble()) in class doTeleport at com.l2jfrozen.gameserver.model.actor.instance.L2TeleporterInstance.on BypassFeedback(L2TeleporterInstance.java:145) Line 145: doTeleport(player, whereTo); In class public void onBypassFeedback This error will show when i deleted others castles from sql just leave Giran. Siege not started Pack: l2jfrozen
-
Help Castle Siege and augment
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Fixed. Lock this topic. -
Help Castle Siege and augment
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Maybe is another way to turn off others castles? -
Help Castle Siege and augment
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Anyway thanks for your time. I will try to do something. ;/ -
Help Castle Siege and augment
l2fire replied to l2fire's question in Request Server Development Help [L2J]
A lot of error in gs :D after if (_castle != null) before the 62th line -
Help Castle Siege and augment
l2fire replied to l2fire's question in Request Server Development Help [L2J]
ERROR Error while loading zones. java.lang.NullPointerException at com.l2jfrozen.gameserver.model.zone.type.L2CastleZone.setParameter(L2 CastleZone.java:62) at com.l2jfrozen.gameserver.datatables.xml.ZoneData.load(ZoneData.java:5 00) at com.l2jfrozen.gameserver.datatables.xml.ZoneData.<init>(ZoneData.java :107) at com.l2jfrozen.gameserver.datatables.xml.ZoneData.getInstance(ZoneData .java:92) at com.l2jfrozen.gameserver.GameServer.main(GameServer.java:342) 62 line in L2CastleZone.java public void setParameter(final String name, final String value) { switch (name) { case "castleId": _castleId = Integer.parseInt(value); // Register self to the correct castle _castle = CastleManager.getInstance().getCastleById(_castleId); This is 62 Line : _castle.setZone(this); break; -
Hello, how to make only Giran castle siege and how to remove Chance Augment skills leave just passive/active?
-
solved Heal npc and doors
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Thank you very much for help, fixed. Thank u too. Lock this post. -
solved Heal npc and doors
l2fire replied to l2fire's question in Request Server Development Help [L2J]
I said fixed this. Players cant heal npc , doors any any . But when player try to heal another player ingame or self GS console shows warn no skill found with id 1218 and level 33 !! -
solved Heal npc and doors
l2fire replied to l2fire's question in Request Server Development Help [L2J]
Maybe you can help me ? Its Heal.java /* * L2jFrozen Project - www.l2jfrozen.com * * 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 2, 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ package com.l2jfrozen.gameserver.handler.skillhandlers; import com.l2jfrozen.Config; import com.l2jfrozen.gameserver.handler.ISkillHandler; import com.l2jfrozen.gameserver.handler.SkillHandler; import com.l2jfrozen.gameserver.managers.GrandBossManager; import com.l2jfrozen.gameserver.model.L2Character; import com.l2jfrozen.gameserver.model.L2Object; import com.l2jfrozen.gameserver.model.L2Skill; import com.l2jfrozen.gameserver.model.L2Skill.SkillType; import com.l2jfrozen.gameserver.model.actor.instance.L2DoorInstance; import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance; import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance; import com.l2jfrozen.gameserver.network.SystemMessageId; import com.l2jfrozen.gameserver.network.serverpackets.StatusUpdate; import com.l2jfrozen.gameserver.network.serverpackets.SystemMessage; import com.l2jfrozen.gameserver.skills.Stats; /** * This class ... * @version $Revision: 1.1.2.2.2.4 $ $Date: 2005/04/06 16:13:48 $ */ public class Heal implements ISkillHandler { // all the items ids that this handler knowns // private static Logger LOGGER = Logger.getLogger(Heal.class); /* * (non-Javadoc) * @see com.l2jfrozen.gameserver.handler.IItemHandler#useItem(com.l2jfrozen.gameserver.model.L2PcInstance, com.l2jfrozen.gameserver.model.L2ItemInstance) */ private static final SkillType[] SKILL_IDS = { SkillType.HEAL, SkillType.HEAL_PERCENT, SkillType.HEAL_STATIC }; /* * (non-Javadoc) * @see com.l2jfrozen.gameserver.handler.IItemHandler#useItem(com.l2jfrozen.gameserver.model.L2PcInstance, com.l2jfrozen.gameserver.model.L2ItemInstance) */ @Override public void useSkill(final L2Character activeChar, final L2Skill skill, final L2Object[] targets) { L2PcInstance player = null; if (activeChar instanceof L2PcInstance) player = (L2PcInstance) activeChar; final boolean bss = activeChar.checkBss(); final boolean sps = activeChar.checkSps(); // check for other effects try { ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(SkillType.BUFF); if (handler != null) handler.useSkill(activeChar, skill, targets); handler = null; } catch (final Exception e) { if (Config.ENABLE_ALL_EXCEPTIONS) e.printStackTrace(); } L2Character target = null; for (final L2Object target2 : targets) { target = (L2Character) target2; if (target == null || target.isDead() || target.isInvul()) continue; // Avoid players heal inside Baium lair from outside if ((activeChar.isInsideZone(12007) || target.isInsideZone(12007)) && ((GrandBossManager.getInstance().getZone(player) == null && GrandBossManager.getInstance().getZone(target) != null) || (GrandBossManager.getInstance().getZone(target) == null && GrandBossManager.getInstance().getZone(activeChar) != null))) { continue; } // We should not heal walls and door if (target instanceof L2DoorInstance) continue; // We should not heal siege flags if (target instanceof L2NpcInstance && ((L2NpcInstance) target).getNpcId() == 35062) { activeChar.getActingPlayer().sendMessage("You cannot heal siege flags!"); continue; } // Player holding a cursed weapon can't be healed and can't heal if (target != activeChar) { if (target instanceof L2PcInstance && ((L2PcInstance) target).isCursedWeaponEquiped()) continue; else if (player != null && player.isCursedWeaponEquiped()) continue; } double hp = skill.getPower(); if (skill.getSkillType() == SkillType.HEAL_PERCENT) { hp = target.getMaxHp() * hp / 100.0; } else { if (bss) { hp *= 1.5; } else if (sps) { hp *= 1.3; } } if (skill.getSkillType() == SkillType.HEAL_STATIC) hp = skill.getPower(); else if (skill.getSkillType() != SkillType.HEAL_PERCENT) hp *= target.calcStat(Stats.HEAL_EFFECTIVNESS, 100, null, null) / 100; target.setCurrentHp(hp + target.getCurrentHp()); target.setLastHealAmount((int) hp); StatusUpdate su = new StatusUpdate(target.getObjectId()); su.addAttribute(StatusUpdate.CUR_HP, (int) target.getCurrentHp()); target.sendPacket(su); su = null; if (target instanceof L2PcInstance) { if (skill.getId() == 4051) { SystemMessage sm = new SystemMessage(SystemMessageId.REJUVENATING_HP); target.sendPacket(sm); sm = null; } else { if (activeChar instanceof L2PcInstance && activeChar != target) { SystemMessage sm = new SystemMessage(SystemMessageId.S2_HP_RESTORED_BY_S1); sm.addString(activeChar.getName()); sm.addNumber((int) hp); target.sendPacket(sm); sm = null; } else { SystemMessage sm = new SystemMessage(SystemMessageId.S1_HP_RESTORED); sm.addNumber((int) hp); target.sendPacket(sm); sm = null; } } } target = null; } } @Override public SkillType[] getSkillIds() { return SKILL_IDS; } } -
solved Heal npc and doors
l2fire replied to l2fire's question in Request Server Development Help [L2J]
And GS show warning about skills just after code when i add in RequestMagicSKillUse.java -
solved Heal npc and doors
l2fire replied to l2fire's question in Request Server Development Help [L2J]
I using l2jfrozen but i will check -
solved Heal npc and doors
l2fire replied to l2fire's question in Request Server Development Help [L2J]
I fixed this on, but when i try to heal player that's fine but in gs console i get warning: warn no skill found with id 1218 and level 33 !! warn no skill found with id 1218 and level 33 !! -
Hello how to fix this bug? Players can heal clan doors and u see which range is Photo prnt.sc RequestMagicSkillUse.java if ((skill.getSkillType() == SkillType.HEAL || skill.getSkillType() == SkillType.HEAL_PERCENT || skill.getSkillType() == SkillType.HEAL_STATIC) && activeChar.getTarget() instanceof L2DoorInstance) { return; } EDITED: Forgot to add skill name: Greater Battle Heal id: 1218
-
Help .AI Loader problem
l2fire replied to l2fire's question in Request Server Development Help [L2J]
I think there isn't problem with baium.java or atharas.java and etc.. cuz with everyone .java file of rb got error INFO Initializing QuestManager Exception in thread "main" java.lang.NullPointerException at com.l2jfrozen.gameserver.ai.special.Antharas.init(Antharas.java:246) at com.l2jfrozen.gameserver.ai.special.Antharas.<init>(Antharas.java:151 ) at com.l2jfrozen.gameserver.ai.special.manager.AILoader.init(AILoader.ja va:59) at com.l2jfrozen.gameserver.GameServer.main(GameServer.java:480) -
Help .AI Loader problem
l2fire replied to l2fire's question in Request Server Development Help [L2J]
/* * 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 com.l2jfrozen.gameserver.ai.special; import static com.l2jfrozen.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW; import static com.l2jfrozen.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javolution.util.FastList; import com.l2jfrozen.Config; import com.l2jfrozen.gameserver.datatables.SkillTable; import com.l2jfrozen.gameserver.geo.GeoData; import com.l2jfrozen.gameserver.managers.GrandBossManager; import com.l2jfrozen.gameserver.model.L2Character; import com.l2jfrozen.gameserver.model.L2Effect; import com.l2jfrozen.gameserver.model.L2Object; import com.l2jfrozen.gameserver.model.L2Skill; import com.l2jfrozen.gameserver.model.L2Summon; import com.l2jfrozen.gameserver.model.actor.instance.L2GrandBossInstance; import com.l2jfrozen.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance; import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance; import com.l2jfrozen.gameserver.model.entity.Announcements; import com.l2jfrozen.gameserver.model.quest.Quest; import com.l2jfrozen.gameserver.model.quest.QuestTimer; import com.l2jfrozen.gameserver.model.zone.type.L2BossZone; import com.l2jfrozen.gameserver.network.serverpackets.Earthquake; import com.l2jfrozen.gameserver.network.serverpackets.MoveToPawn; import com.l2jfrozen.gameserver.network.serverpackets.PlaySound; import com.l2jfrozen.gameserver.network.serverpackets.SocialAction; import com.l2jfrozen.gameserver.templates.StatsSet; import com.l2jfrozen.gameserver.thread.ThreadPoolManager; import com.l2jfrozen.gameserver.util.Util; import com.l2jfrozen.util.random.Rnd; /** * 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 implements Runnable { protected static final Logger _log = Logger.getLogger(Baium.class.getName()); private L2Character _target; private L2Skill _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 // fixed archangel spawnloc private final static int ANGEL_LOCATION[][] = { { 114239, 17168, 10080, 63544 }, { 115780, 15564, 10080, 13620 }, { 114880, 16236, 10080, 5400 }, { 115168, 17200, 10080, 0 }, { 115792, 16608, 10080, 0 }, }; private long _LastAttackVsBaiumTime = 0; private List<L2NpcInstance> _Minions = new ArrayList<>(5); protected L2BossZone _Zone; public Baium (int questId, String name, String descr) { super(questId, name, descr); int[] mob = {LIVE_BAIUM}; this.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); StatsSet info = GrandBossManager.getInstance().getStatsSet(LIVE_BAIUM); Integer status = GrandBossManager.getInstance().getBossStatus(LIVE_BAIUM); if (status == DEAD) { // load the unlock date and time for baium from DB 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) { int loc_x = info.getInteger("loc_x"); int loc_y = info.getInteger("loc_y"); int loc_z = info.getInteger("loc_z"); int heading = info.getInteger("heading"); final int hp = info.getInteger("currentHP"); final int mp = info.getInteger("currentMP"); L2GrandBossInstance baium = (L2GrandBossInstance) 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); final L2NpcInstance _baium = baium; ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { @Override public void run() { try { _baium.setCurrentHpMp(hp,mp); _baium.setIsInvul(true); //_baium.setIsImobilised(true); _baium.broadcastPacket(new SocialAction(_baium.getObjectId(),2)); startQuestTimer("baium_wakeup",15000, _baium, null); } catch (Exception e) { e.printStackTrace(); } } },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, L2NpcInstance npc, L2PcInstance player) { if (event.equalsIgnoreCase("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.equalsIgnoreCase("skill_range") && npc != null) { callSkillAI(npc); } else if (event.equalsIgnoreCase("clean_player")) { _target = getRandomTarget(npc); } else if (event.equalsIgnoreCase("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(); if (!npc.getSpawn().is_customBossInstance()) startQuestTimer("baium_despawn", 60000, npc, null, true); if (player != null) { player.reduceCurrentHp(99999999, player); } npc.setRunning(); startQuestTimer("skill_range", 500, npc, null, true); final L2NpcInstance baium = npc; ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { @Override public void run() { try { baium.setIsInvul(false); // baium.setIsImobilised(false); // for (L2NpcInstance minion : _Minions) // minion.setShowSummonAnimation(false); baium.getAttackByList().addAll(_Zone.getCharactersInside().values()); } catch (Exception e) { _log.log(Level.WARNING, "", e); } } }, 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 i = 0; i < ANGEL_LOCATION.length; i++) { L2MonsterInstance angel = (L2MonsterInstance) addSpawn(ARCHANGEL, ANGEL_LOCATION[i][0], ANGEL_LOCATION[i][1], ANGEL_LOCATION[i][2], ANGEL_LOCATION[i][3], false, 0); angel.setIsInvul(true); _Minions.add(angel); angel.getAttackByList().addAll(_Zone.getCharactersInside().values()); 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.equalsIgnoreCase("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 (L2NpcInstance 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.setIsCastingNow(false); //just in case npc.setTarget(npc); npc.doCast(SkillTable.getInstance().getInfo(4135, 1)); // npc.setIsCastingNow(true); } } } return super.onAdvEvent(event, npc, player); } @Override public String onTalk(L2NpcInstance npc,final L2PcInstance player) { 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>"; 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(); L2GrandBossInstance baium = (L2GrandBossInstance) addSpawn(LIVE_BAIUM, npc); GrandBossManager.getInstance().addBoss(baium); final L2NpcInstance _baium = baium; ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { @Override public void run() { try { _baium.setIsInvul(true); _baium.setRunning(); _baium.broadcastPacket(new SocialAction(_baium.getObjectId(),2)); startQuestTimer("baium_wakeup",15000, _baium, player); //_baium.setShowSummonAnimation(false); } catch (Throwable e) { _log.log(Level.WARNING, "", e); } } },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("baium").getQuestItemsCount(4295) > 0) // bloody fabric { player.getQuestState("baium").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(L2NpcInstance npc, L2PcInstance player, L2Skill 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 (L2NpcInstance npc, L2PcInstance 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 sk_4258 = 0; L2Effect[] effects = attacker.getAllEffects(); if (effects != null && effects.length != 0) { for (L2Effect e : effects) { if (e.getSkill().getId() == 4258) sk_4258 = 1; } } if (sk_4258 == 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 (L2NpcInstance npc, L2PcInstance killer, boolean isPet) { npc.broadcastPacket(new PlaySound(1, "BS01_D", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ())); if(!npc.getSpawn().is_customBossInstance()){ 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] 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 StatsSet info = GrandBossManager.getInstance().getStatsSet(LIVE_BAIUM); info.set("respawn_time", System.currentTimeMillis() + respawnTime); GrandBossManager.getInstance().setStatsSet(LIVE_BAIUM,info); } for (L2NpcInstance 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 L2Character getRandomTarget(L2NpcInstance npc) { FastList<L2Character> result = new FastList<>(); Collection<L2Object> objs = npc.getKnownList().getKnownObjects().values(); { /* for (L2Object obj : objs) { if (obj instanceof L2Playable || obj instanceof L2DecoyInstance) { if (obj instanceof L2PcInstance) { if (((L2PcInstance) obj).getAppearance().getInvisible()) continue; } if (((L2Character) obj).getZ() < ( npc.getZ() - 100 ) && ((L2Character) obj).getZ() > ( npc.getZ() + 100 ) || !(GeoData.getInstance().canSeeTarget(((L2Character) obj).getX(), ((L2Character) obj).getY(), ((L2Character) obj).getZ(), npc.getX(), npc.getY(), npc.getZ()))) continue; } if (obj instanceof L2Playable || obj instanceof L2DecoyInstance) { if (Util.checkIfInRange(9000, npc, obj, true) && !((L2Character) obj).isDead()) result.add((L2Character) obj); } } */ for(L2Object obj : objs) { if(obj instanceof L2Character) { if(((L2Character) obj).getZ() < npc.getZ() - 100 && ((L2Character) obj).getZ() > npc.getZ() + 100 || !GeoData.getInstance().canSeeTarget(obj, npc)) { continue; } } if(obj instanceof L2PcInstance) { if(Util.checkIfInRange(9000, npc, obj, true) && !((L2Character) obj).isDead()) { result.add((L2PcInstance) obj); } } if(obj instanceof L2Summon) { if(Util.checkIfInRange(9000, npc, obj, true) && !((L2Character) obj).isDead()) { result.add((L2Summon) obj); } } } } if (result.isEmpty()) { for (L2NpcInstance minion : _Minions) if (minion != null) result.add(minion); } if (result.isEmpty()) { FastList.recycle(result); return null; } Object[] characters = result.toArray(); QuestTimer timer = getQuestTimer("clean_player", npc, null); if (timer != null) timer.cancel(); startQuestTimer("clean_player", 20000, npc, null); L2Character target = (L2Character) characters[Rnd.get(characters.length)]; FastList.recycle(result); return target; } public synchronized void callSkillAI(L2NpcInstance 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); } L2Character target = _target; L2Skill skill = _skill; if (skill == null) skill = SkillTable.getInstance().getInfo(getRandomSkill(npc),1); if (target == null || target.isDead() || !(_Zone.isInsideZone(target))) { //npc.setIsCastingNow(false); return; } if (Util.checkIfInRange(skill.getCastRange(), npc, target, true)) { npc.getAI().setIntention(AI_INTENTION_IDLE); npc.setTarget(target); //npc.setIsCastingNow(true); _target = null; _skill = null; 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) {e.printStackTrace();} } else { npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null); //npc.setIsCastingNow(false); } } public int getRandomSkill(L2NpcInstance 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(L2NpcInstance npc, L2PcInstance caster, L2Skill 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; } @Override public void run() {} }