Jump to content


⭐ Links Úteis




⚔️ Servers Apoiadores



🎁 Ofertas







  • Recently Browsing

    No registered users viewing this page.

  • Similar Content

    • By SGERfjs
      Info:
      General size 900x600 (background)
      htmlviewer size 861x561
      download: http://www.mediafire.com/file/fopm6nrau8rqtlo/CommunityBoardWithoutFrames.rar/file
      PSD: http://www.mediafire.com/file/wza9sgm6d0zhim3/communityboard2.rar/file
      preview: https://i.imgur.com/T2Z4QXh.jpg
      example: html/communityboard/top/index.html
       
    • By Arcadeh3r0
      Beta Opening : 21 November at 20:00 GMT+2
      Grand Opening : 28 November at 20:00 GTM+2
      Server Info
       
      Basic Information
       Experience Rates: x1000  
       SP Rates: x1000  
       Adena: x 1000  
       Starting Level 52
       PvP Server x1000 Easy xp to level 80
       
      Enchant Rates
       Safe +3  
       Max +20
       Normal Enchant Scrolls 65%  
       Blessed Max Enchant +14 -> 100%
       Crystal max +16 -> 50% (on break enchant still the same)  
       Custom Scroll max +20 -> (+17 -> 95% , +18 -> 90% , +19 -> 85% , +20 -> 80% )
       
      Augmentation Rates
       Augment Skills 1 Active + 1 Passive 
       High grade life stone - 10%   
       Top grade life stone - 15%   
       Custom life stone - 30% : dropped by Raid,Party,Dungeon Zones
       
      Augment System
      Custom Ls System that makes your life easier
      Double Click to Lifestone will augment your weapon
      If you get any Active/Passive/Chance skill, The Weapon will be unequipped
      and you will be informed with the succeed skill
      f you dont like this system , you can use the NPC to do your augments
       
      Custom Features
       Custom Weapons: Gold weapons, Ancient gold weapons
       Custom Armors: Apella, Dynasty, Rykros  
       Custom Jewels: Normal Rb Jewels, Pvp Rb Jewels
       Custom Mask
       Custom Tattoo
       Custom Items can be divided to Classic And Pvp
       Classic Customs gear can be obtained by farm
       Pvp Custom gear can be Upgraded from Classic + Materials
      Upgrating Weapon/Armor will keep your augment/enchant
       Custom boss scrolls: Increasing speacial status for 1hour
       Cancellation System , after 10 sec you get buffs back 
       Healers have a small change to get Pvp's from their party

      Vip System
       Custom Name / Title colors (via .vip)
       x2 Mass Vote Reward
       x2 Pvp Reward
       +5% chance to enchant items
       More Drops to Farm zones,Party zone , Raid bosses
       Less chance to drop Item's from Pk's
       .vip command
       Vip Chat System(public chat,you can talk with ^ )

      Pk System
       You can drop items by PK's.You are safe until 10 PK's
       After 10 you have big chance to drop Items
       If You are VIP you are safe until 20 PK's
       1 item can be dropped each time
       There are 70% chance to drop
       If you are VIP there are 30% chance to drop

      Bosses
       Special Boss every 4 Hour's.
       Epic Bosses every 3 Hour's.
       Normal Bosses every 1 Hour.
       
      Events
       TVT  
       DM  
       CTF  
       Party Farm every 6 hour's with 1 event hour duration  
       Dungeon
       Tournaments every 6 Hour's.
       
      Pvp System
      Every hour most Pvp killer from Pvp Zone will be rewarded with extra Pvp medal
      Every 24 Hour's Top Pvp/Pk Killer will be rewarded with Event medal
       
      Party Farm 
       Opens every 6 hour's
       Duration 1 hour  
       Custom Mini Bosses with special drops  
       Minimum players for enter is 3 
       Every member must have at least 10 Pvp's to join
       1 player per PC are allowed
       
      Dungeons
       An instanced zone with 5 stages with Custom Mobs-Bosses
      Drops Farm-Ls-Event medal and a temporary Grand Jewel for 6 Hour's
       You can enter every 12 hours
       You can enter solo or with a party (at least 4 players)
       Only 1 player Per PC allowed to registered
       
      Olympiad
       Olympiad period every 1 week  
       Heroes will be given 2 hour after period ends
       No custom items allowed (Allowed: tattoo level 1)
       Max enchant is +6
      Over enchanted items will be automatically counted as +6
      Ranking update after every match
       The Olympiad begins every day at 18:00 and ends at 00:00 AM (GMT+2)

      For much more info please visit our website.
      Server Info
    • By L2It
      L2IT - Break into our fabulous world of Lineage 2 Interlude and show everything you are capable of.
      WE ARE ALLOWED TO USE A BOT!
      Start: November 28 at 16:00 GMT +3.

       
      Chronicles: Interlude
      Rates: X10
      Direction: LowRate+PvP

      GAME FEATURES:
      BOT allowed
      Unique sharpening system
      Beginner Buffer from level 6 to 40
      Buffs / Tanzi / Songs of 20 minutes each
      The number of slots in the recipe book - 75/75
      The number of slots in the inventory - 120/140
      Carried weight limit x3 from the standard
      Number of sub-classes - 3
      Mana Potion Restores 500 MP
      Autoloot from the start
      Global chat from level 20
      Siege of castles and purchase of clan halls are available with clan level 6
      Fortress Siege Available from Clan Level 5
      Announcement of the appearance of Noble / Sabb and Epic RB - 60 min. to resp
      Auto-learn skills
      Buff Slots - 22 + 4 Divine Inspiration
      Offline trade / craft for Adena
      Sharpening and LS stack
      Hight Grade Life Stone 76 lvl with a 0.01% chance added to all monsters of level 76+
      / unstuck - 30 sec
      Removed S Grade drop from all RB / Epic RB
      Multi Mammon is Game Shop
      Auto restart of the server at 4:30 Moscow time

      RATES:
      Exp: X10
      SP: X10
      Adena: X3(chance 30%)
      Drop: X3
      Spoil: X3
      Quest Reward: x1
      Quest Reward(Adena): X3
      PB Drop: X5
      Epic Boss Drop: x1
      Quest: X3

      PA RATES:
      Exp: X12
      Sp: X12
      Adena: X6
      Drop: X6
      Spoil: X6

      RB:
      REP Epic RB standard
      REP RB 12-36 hours

      PROFESSIONS:
      1,2 and 3 professions can be purchased for Coin of Luck and Adena
      The price of the first profession - 200 000 Adena - 30 Coin of Luck
      Price of the second profession-1.200.000 Adena-100 Coin of Luck
      The price of the third profession - 500 Coin of Luck or quest

      SHARPENING:
      Weapons-safe +3, maximum +16
      Armor / costume Jewelry-safe +3, maximum +14
      Solid armor-safe +4, maximum +14
      Chance of regular sharpening:
      Weapons - +4-+16=50-10%
      Armor / Costume Jewelry - +4-+14=50-10%
      If the sharpening is unsuccessful it is broken into crystals
      Chance of Blessed sharpening:
      Weapons - +4-+16=60-20%
      Armor / Costume Jewelry - +4-+14=60-20%
      If the sharpening is unsuccessful, it is divided into +0
      Chance of Crystal sharpening:
      Weapons - +4-+8=0%, +9-+16=100%
      Armor / Costume Jewelry - +4-+8=0%, +9-+14=100%
      Crystal Scroll can be purchased in the game store for Coin of Luck (D/C) and Bonus Coin(B/A/S)

      TvT:
      Running time-14 hours after restarting the server
      Registration and working time-10 minutes
      Number of participants-4-100
      Levels for registration - 76-80
      Reward for winning - 3 Bonus Coin
      The award is given to players who have committed at least 1 murder

      SUB-CLASS AND NOBLESS:
      Complete the quest
      You can buy quest items for Coin of Luck
      REP sub and nubl RB 12-36 hours

      OLYMPIAD:
      Working hours-18: 00-00: 00
      Period-month
      Number of participants-5/5
      The reward for winning is 300 points
      Without any HWID / IP restrictions

      OFFLINE TRADING / CRAFTING:
      Trading or crafting in offline mode is available for 10,000 Adena
      It is possible to sit on offline trading / crafting for 30 days

      BONUS COIN:
      Knocks out 76 + level monsters with a 0.01 chance%
      Get a reward for winning on TvT(3 Bonus Coins.)
      Buy at the exchange rate 1 Bonus Coin=5 Coin of Luck/1 Gold Bar/50,000 AA/144 Points online

      ONLINE POINTS:
      With 76+ level every 60 minutes of online character is awarded 60 points online
      During the day of the game you can accumulate 1440 Points online

      VOICE COMMAND:
      The list and use of commands are available via the menu command
      .classmaster-calling the profession Manager window
      .offline-activation of offline trading / crafting
      .premium - check your premium status
      .epic - information about Grand Bosses

      Server info: https://top.l2jbrasil.com/index.php?a=stats&u=la2it
    • By ferdsnp
      Ola galerinha, to com algums problema na hora de add npc com efeitos tirados aqui do fórum para Interlude
      Quando tento adicionar no npcgrp.dat com o FilEedit clássico (FileEdit_Interlude V6.5) da erro e o arquivo .dat desaparece
      Baixei outro FileEdit (File Editor ++ V1.0.0.31a)  e nele no log da de ver o seguinte erro

      Este último e da gk, mais o erro e o memo para todos os npc básicamente
       
      Erro: FileEdit_Interlude V6.5
      [img=https://i.imgur.com/jSGjD9o.jpg]
      Erro: File Editor ++ V1.0.0.31a
      C:\Users\Gul Dan\Desktop\L2 FileEdit\temp>"c:\users\gul dan\desktop\l2 fileedit\data\l2asm-disasm\l2asm.exe" -d npcgrp-new.ddf npcgrp.txt dec-npcgrp.dat  L2 asm 1.4.1 by M.Soltys (aka DStuff). Reading row error:   row: 6584   field: 8 / 29 (name: dtab1) se alguem souber qual e o problema por favor me dar umas ideias de como resolver
    • By SGERfjs
      http://www.mediafire.com/file/euhszz8mng18u27/FX_RankingSkills.7z/file
      [L2JMobius] -> ../data/stats/skills
      <?xml version='1.0' encoding='utf-8'?> <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/skills.xsd"> <skill id="500" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="501" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="502" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="503" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="504" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="505" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="506" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> <skill id="507" levels="1" name="Chant of Victory"> <!-- The spirits of ancient heroes temporarily possess one's party members. Consumes 40 spirit ores. --> <!-- <set name="itemConsumeId" val="3031"/> --> <!-- Spirit Ore --> <!-- <set name="itemConsumeCount" val="40"/> --> <set name="mpInitialConsume" val="0"/> <set name="mpConsume" val="0"/> <set name="target" val="TARGET_PARTY"/> <set name="skillRadius" val="1000"/> <set name="reuseDelay" val="0"/> <set name="hitTime" val="0"/> <set name="power" val="20"/> <set name="isMagic" val="true"/> <set name="skillType" val="HEAL_PERCENT"/> <set name="operateType" val="OP_ACTIVE"/> <set name="aggroPoints" val="669"/> <for> <effect count="1" name="Buff" time="300" val="0"> <!-- stackOrder="1" stackType="CoV"> --> <mul order="0x30" stat="pAtk" val="1.1"/> <mul order="0x30" stat="pDef" val="1.2"/> <basemul order="0x30" stat="rCrit" val="0.2"/> <add order="0x40" stat="accCombat" val="4"/> <mul order="0x30" stat="pAtkSpd" val="1.2"/> <mul order="0x30" stat="mAtkSpd" val="1.2"/> <mul order="0x30" stat="cAtk" val="1.2"/> <mul order="0x30" stat="mAtk" val="1.2"/> <mul order="0x30" stat="mDef" val="1.2"/> <!-- <mul order="0x30" stat="runSpd" val="0.8"/> --> <mul order="0x30" stat="maxHp" val="1.2"/> <!-- <mul order="0x30" stat="debuffVuln" val="0.8"/> --> </effect> </for> </skill> </list> Stats for reference only.
  • Posts

Recommended Posts

  • Replies 71
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

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:

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 ne

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

Posted Images

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
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 4

Em breve novo servidor Classic PvP

www.l2prime.co

Private Classic 150x

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

Link to post
Share on other sites
Posted (edited)
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 2
  • I love it 1

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

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

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!

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
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!

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

  • Like 1
  • Thanks 2

PYKlyRG.jpg&key=822e505460230a53f5b13227467836b3217127e6dec74c5c3b3701e6d02541d8

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

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

Link to post
Share on other sites
  • Kelvin pinned this topic
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 2
  • Thanks 1
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
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!

Link to post
Share on other sites
×
×
  • Create New...