SHOW:
|
|
- or go back to the newest paste.
| 1 | ### Eclipse Workspace Patch 1.0 | |
| 2 | #P aCis | |
| 3 | diff --git aCis_data/data/html/default/29061.htm aCis_data/data/html/default/29061.htm | |
| 4 | new file mode 100644 | |
| 5 | index 0000000..ab9388d | |
| 6 | --- /dev/null | |
| 7 | +++ aCis_data/data/html/default/29061.htm | |
| 8 | @@ -0,0 +1,3 @@ | |
| 9 | +<html><body>Teleportation Cubic:<br> | |
| 10 | +<a action="bypass -h npc_%objectId%_Quest GrandBossTeleporter">Exit the Last Imperial Tomb</a><br> | |
| 11 | +</body></html> | |
| 12 | diff --git aCis_data/data/html/default/32011.htm aCis_data/data/html/default/32011.htm | |
| 13 | index 2341448..1c7c641 100644 | |
| 14 | --- aCis_data/data/html/default/32011.htm | |
| 15 | +++ aCis_data/data/html/default/32011.htm | |
| 16 | @@ -1,7 +1,7 @@ | |
| 17 | <html><body> | |
| 18 | I feel an invisible barrier... Some sort of Magic Force Field has been put in place...<br> | |
| 19 | ...? The guide of the Imperial mausoleum seems to have something to say.<br><br> | |
| 20 | -<a action="bypass -h npc_%objectId%_Quest FinalEmperialTomb">Enter the Magic Force Field</a><br> | |
| 21 | +<a action="bypass -h npc_%objectId%_Quest GrandBossTeleporter">Enter the Magic Force Field</a><br> | |
| 22 | <a action="bypass -h npc_%objectId%_Chat 1">Listen to Imperial Tomb Guide</a><br> | |
| 23 | <a action="bypass -h npc_%objectId%_Quest">Quest</a> | |
| 24 | </body></html> | |
| 25 | \ No newline at end of file | |
| 26 | diff --git aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-01.htm aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-01.htm | |
| 27 | new file mode 100644 | |
| 28 | index 0000000..ef3f436 | |
| 29 | --- /dev/null | |
| 30 | +++ aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-01.htm | |
| 31 | @@ -0,0 +1,2 @@ | |
| 32 | +<html><body>There is nothing beyond the Magic Force Field. Come back later.<br>(You may not enter because Frintezza is not inside the Imperial Tomb.) | |
| 33 | +</body></html> | |
| 34 | \ No newline at end of file | |
| 35 | diff --git aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-02.htm aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-02.htm | |
| 36 | new file mode 100644 | |
| 37 | index 0000000..7904d4e | |
| 38 | --- /dev/null | |
| 39 | +++ aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-02.htm | |
| 40 | @@ -0,0 +1,3 @@ | |
| 41 | +<html><body>There is big battle beyond the Magic Force Field. Come back later.<br> | |
| 42 | +(You may not enter becouse someone is already in a battle with Frintezza.) | |
| 43 | +</body></html> | |
| 44 | \ No newline at end of file | |
| 45 | diff --git aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-03.htm aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-03.htm | |
| 46 | new file mode 100644 | |
| 47 | index 0000000..2e5ec6f | |
| 48 | --- /dev/null | |
| 49 | +++ aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-03.htm | |
| 50 | @@ -0,0 +1 @@ | |
| 51 | +<html><body>No reaction. Contact must be initiated by the Command Channel Leader.</body></html> | |
| 52 | \ No newline at end of file | |
| 53 | diff --git aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-04.htm aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-04.htm | |
| 54 | new file mode 100644 | |
| 55 | index 0000000..9fd5d88 | |
| 56 | --- /dev/null | |
| 57 | +++ aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-04.htm | |
| 58 | @@ -0,0 +1 @@ | |
| 59 | +<html><body>Your command channel needs to have at least 2 parties and a maximum of 5.</body></html> | |
| 60 | \ No newline at end of file | |
| 61 | diff --git aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-05.htm aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-05.htm | |
| 62 | new file mode 100644 | |
| 63 | index 0000000..1c29d9e | |
| 64 | --- /dev/null | |
| 65 | +++ aCis_data/data/html/script/teleport/GrandBossTeleporter/32011-05.htm | |
| 66 | @@ -0,0 +1 @@ | |
| 67 | +<html><body>You dont have required item.</body></html> | |
| 68 | \ No newline at end of file | |
| 69 | diff --git aCis_data/data/xml/items/8100-8199.xml aCis_data/data/xml/items/8100-8199.xml | |
| 70 | index 79540e3..eafa3ac 100644 | |
| 71 | --- aCis_data/data/xml/items/8100-8199.xml | |
| 72 | +++ aCis_data/data/xml/items/8100-8199.xml | |
| 73 | @@ -1566,6 +1566,7 @@ | |
| 74 | <set name="material" val="GOLD" /> | |
| 75 | <set name="weight" val="3" /> | |
| 76 | <set name="is_stackable" val="true" /> | |
| 77 | + <set name="handler" val="ItemSkills" /> | |
| 78 | <set name="item_skill" val="2234-1" /> | |
| 79 | </item> | |
| 80 | <item id="8193" type="EtcItem" name="Fisherman's Potion - Green"> | |
| 81 | diff --git aCis_data/data/xml/items/8500-8599.xml aCis_data/data/xml/items/8500-8599.xml | |
| 82 | index 95d3e27..ae2dcf5 100644 | |
| 83 | --- aCis_data/data/xml/items/8500-8599.xml | |
| 84 | +++ aCis_data/data/xml/items/8500-8599.xml | |
| 85 | @@ -549,6 +549,7 @@ | |
| 86 | <set name="material" val="GOLD" /> | |
| 87 | <set name="weight" val="3" /> | |
| 88 | <set name="is_stackable" val="true" /> | |
| 89 | + <set name="handler" val="ItemSkills" /> | |
| 90 | <set name="item_skill" val="2276-1" /> | |
| 91 | </item> | |
| 92 | <item id="8557" type="Armor" name="Blue Party Hat"> | |
| 93 | diff --git aCis_data/data/xml/npcs/29000-29999.xml aCis_data/data/xml/npcs/29000-29999.xml | |
| 94 | index 40f963f..a8f62b3 100644 | |
| 95 | --- aCis_data/data/xml/npcs/29000-29999.xml | |
| 96 | +++ aCis_data/data/xml/npcs/29000-29999.xml | |
| 97 | @@ -2317,7 +2317,7 @@ | |
| 98 | </skills> | |
| 99 | </npc> | |
| 100 | <npc id="29045" name="Frintezza" title=""> | |
| 101 | - <set name="level" val="90"/> | |
| 102 | + <set name="level" val="85"/> | |
| 103 | <set name="radius" val="45"/> | |
| 104 | <set name="height" val="42.7"/> | |
| 105 | <set name="rHand" val="0"/> | |
| 106 | @@ -2338,7 +2338,7 @@ | |
| 107 | <set name="str" val="60"/> | |
| 108 | <set name="int" val="76"/> | |
| 109 | <set name="dex" val="73"/> | |
| 110 | - <set name="wit" val="70"/> | |
| 111 | + <set name="wit" val="30"/> | |
| 112 | <set name="con" val="57"/> | |
| 113 | <set name="men" val="80"/> | |
| 114 | <set name="corpseTime" val="7"/> | |
| 115 | @@ -2352,7 +2352,7 @@ | |
| 116 | </skills> | |
| 117 | </npc> | |
| 118 | <npc id="29046" name="Scarlet van Halisha" title=""> | |
| 119 | - <set name="level" val="85"/> | |
| 120 | + <set name="level" val="80"/> | |
| 121 | <set name="radius" val="45"/> | |
| 122 | <set name="height" val="90.7"/> | |
| 123 | <set name="rHand" val="8204"/> | |
| 124 | @@ -2387,7 +2387,7 @@ | |
| 125 | </skills> | |
| 126 | </npc> | |
| 127 | <npc id="29047" name="Scarlet van Halisha" title=""> | |
| 128 | - <set name="level" val="90"/> | |
| 129 | + <set name="level" val="85"/> | |
| 130 | <set name="radius" val="92"/> | |
| 131 | <set name="height" val="112.8"/> | |
| 132 | <set name="rHand" val="8222"/> | |
| 133 | diff --git aCis_data/data/xml/scripts.xml aCis_data/data/xml/scripts.xml | |
| 134 | index 3e38b21..e44c739 100644 | |
| 135 | --- aCis_data/data/xml/scripts.xml | |
| 136 | +++ aCis_data/data/xml/scripts.xml | |
| 137 | @@ -366,7 +366,7 @@ | |
| 138 | <script path="script.ai.boss.Benom"/> | |
| 139 | <script path="script.ai.boss.Core"/> | |
| 140 | <script path="script.ai.boss.DrChaos"/> | |
| 141 | -<!-- <script path="script.ai.boss.Frintezza"/> --> | |
| 142 | + <script path="script.ai.boss.Frintezza"/> | |
| 143 | <script path="script.ai.boss.Gordon"/> | |
| 144 | <!-- <script path="script.ai.boss.IceFairySirra"/> --> | |
| 145 | <script path="script.ai.boss.Orfen"/> | |
| 146 | diff --git aCis_data/data/xml/skills/5000-5099.xml aCis_data/data/xml/skills/5000-5099.xml | |
| 147 | index b958bd0..d268c96 100644 | |
| 148 | --- aCis_data/data/xml/skills/5000-5099.xml | |
| 149 | +++ aCis_data/data/xml/skills/5000-5099.xml | |
| 150 | @@ -104,22 +104,25 @@ | |
| 151 | <set name="target" val="SELF" /> | |
| 152 | </skill> | |
| 153 | <skill id="5008" levels="5" name="Frintezza's Songs"> | |
| 154 | - <table name="#aggroPoints"> 100 100 100 0 0 </table> | |
| 155 | + <table name="#aggroPoints"> 100 100 110 0 0 </table> | |
| 156 | <table name="#isDebuff"> false false false true true </table> | |
| 157 | <table name="#isMagic"> true false false true true </table> | |
| 158 | <table name="#power"> 3 0 0 10 10 </table> | |
| 159 | - <table name="#skillType"> HEAL_PERCENT DUMMY BUFF DEBUFF STUN </table> | |
| 160 | + <table name="#skillType"> HEAL_PERCENT BUFF BUFF DEBUFF STUN </table> | |
| 161 | <table name="#stackOrder"> 0 0 1 1 1 </table> | |
| 162 | <table name="#stackType"> none none ultimate_buff heal_effect_down stun </table> | |
| 163 | <table name="#attackAndSpeed"> 1 1 1.2 1 1 </table> | |
| 164 | - <table name="#time"> 0 0 5 5 5 </table> | |
| 165 | + <table name="#time"> 0 30 30 15 8 </table> | |
| 166 | <table name="#gainHp"> 1 1 1 0.5 1 </table> | |
| 167 | <table name="#lvlDepend"> 0 0 0 1 1 </table> | |
| 168 | - <table name="#effectname1"> Buff Buff Buff Buff Stun </table> | |
| 169 | - <table name="#effectname2"> Buff Buff Buff Buff Cancel </table> | |
| 170 | + <table name="#effectname1"> Buff Buff Buff Debuff DanceStun </table><!-- EffectDanceStun.java --> | |
| 171 | + <table name="#effectname2"> Buff Buff Buff Buff Stun </table> | |
| 172 | <table name="#effectPower"> 0 0 0 0 20 </table> | |
| 173 | - <table name="#effectType"> BUFF BUFF BUFF BUFF CANCEL </table> | |
| 174 | + <table name="#effectType"> BUFF BUFF BUFF DEBUFF STUN </table> | |
| 175 | + <table name="#effectRange"> 6000 6000 6000 -1 -1 </table> | |
| 176 | <table name="#maxNegated"> 0 0 0 0 10 </table> | |
| 177 | + <table name="#target"> SELF SELF SELF AURA AURA </table> | |
| 178 | + <table name="#skillRadius"> -1 -1 -1 8000 8000 </table> | |
| 179 | <set name="aggroPoints" val="#aggroPoints" /> | |
| 180 | <set name="isDebuff" val="#isDebuff" /> | |
| 181 | <set name="isMagic" val="#isMagic" /> | |
| 182 | @@ -127,9 +130,11 @@ | |
| 183 | <set name="magicLvl" val="85" /> | |
| 184 | <set name="maxNegated" val="#maxNegated" /> | |
| 185 | <set name="operateType" val="ACTIVE" /> | |
| 186 | + <set name="effectRange" val="#effectRange" /> | |
| 187 | <set name="power" val="#power" /> | |
| 188 | <set name="skillType" val="#skillType" /> | |
| 189 | - <set name="target" val="SELF" /> | |
| 190 | + <set name="target" val="#target" /> | |
| 191 | + <set name="skillRadius" val="#skillRadius" /> | |
| 192 | <for> | |
| 193 | <effect name="#effectname1" time="#time" val="0" stackOrder="1" stackType="#stackType"> | |
| 194 | <mul stat="pAtk" val="#attackAndSpeed" /> | |
| 195 | @@ -139,7 +144,7 @@ | |
| 196 | <add stat="runSpd" val="#attackAndSpeed" /> | |
| 197 | <mul stat="gainHp" val="#gainHp" /> | |
| 198 | </effect> | |
| 199 | - <effect name="#effectname2" noicon="1" val="0" effectPower="#effectPower" effectType="#effectType" /> | |
| 200 | + <effect name="#effectname2" val="0" effectPower="#effectPower" effectType="#effectType" /> | |
| 201 | </for> | |
| 202 | </skill> | |
| 203 | <skill id="5009" levels="1" name="Frintezza's Ghostly Fighter"> | |
| 204 | @@ -170,6 +175,8 @@ | |
| 205 | <skill id="5011" levels="1" name="Frintezza's Bomber Ghost"> | |
| 206 | <set name="element" val="DARK" /> | |
| 207 | <set name="hitTime" val="1000" /> | |
| 208 | + <set name="coolTime" val="2000" /> | |
| 209 | + <set name="isMagic" val="false" /> | |
| 210 | <set name="isSuicideAttack" val="true" /> | |
| 211 | <set name="magicLvl" val="85" /> | |
| 212 | <set name="operateType" val="ACTIVE" /> | |
| 213 | @@ -223,12 +230,14 @@ | |
| 214 | <set name="target" val="FRONT_AREA" /> | |
| 215 | </skill> | |
| 216 | <skill id="5015" levels="6" name="Frintezza's Daemon Charge"> | |
| 217 | + <table name="#baseCritRate"> 10 12 12 10 12 12 </table> | |
| 218 | <table name="#coolTime"> 0 0 0 1500 1500 1500 </table> | |
| 219 | <table name="#radius"> 400 500 700 400 500 700 </table> | |
| 220 | <table name="#power"> 48761 52970 68074 48761 52970 68074 </table> | |
| 221 | - <set name="castRange" val="150" /> | |
| 222 | + <set name="baseCritRate" val="#baseCritRate" /> | |
| 223 | + <set name="castRange" val="250" /> | |
| 224 | <set name="coolTime" val="#coolTime" /> | |
| 225 | - <set name="effectRange" val="650" /> | |
| 226 | + <set name="effectRange" val="925" /> | |
| 227 | <set name="element" val="DARK" /> | |
| 228 | <set name="flyRadius" val="#radius" /> | |
| 229 | <set name="flyType" val="CHARGE" /> | |
| 230 | @@ -239,6 +248,10 @@ | |
| 231 | <set name="skillRadius" val="#radius" /> | |
| 232 | <set name="skillType" val="PDAM" /> | |
| 233 | <set name="target" val="FRONT_AREA" /> | |
| 234 | + <set name="flyCourse" val="180" /> | |
| 235 | + <for> | |
| 236 | + <effect self="1" name="Warp" val="0" noicon="1" /> | |
| 237 | + </for> | |
| 238 | </skill> | |
| 239 | <skill id="5016" levels="1" name="Yoke of Scarlet"> | |
| 240 | <set name="castRange" val="500" /> | |
| 241 | @@ -254,7 +267,7 @@ | |
| 242 | <set name="skillType" val="PARALYZE" /> | |
| 243 | <set name="target" val="AREA" /> | |
| 244 | <for> | |
| 245 | - <effect name="Paralyze" time="20" val="0" abnormal="floatroot" stackOrder="1" stackType="paralyze" /> | |
| 246 | + <effect name="FloatStun" time="15" val="0" stackOrder="1" stackType="stun" abnormal="floatroot" effectPower="80" effectType="STUN" /> | |
| 247 | </for> | |
| 248 | </skill> | |
| 249 | <skill id="5017" levels="1" name="Frintezza's Daemon Morph"> | |
| 250 | @@ -278,6 +291,7 @@ | |
| 251 | <set name="coolTime" val="1000" /> | |
| 252 | <set name="element" val="DARK" /> | |
| 253 | <set name="hitTime" val="7000" /> | |
| 254 | + <set name="isMagic" val="false" /> | |
| 255 | <set name="magicLvl" val="85" /> | |
| 256 | <set name="operateType" val="ACTIVE" /> | |
| 257 | <set name="power" val="#power" /> | |
| 258 | diff --git aCis_data/data/xml/zones/BossZone.xml aCis_data/data/xml/zones/BossZone.xml | |
| 259 | index 8dddd01..e620733 100644 | |
| 260 | --- aCis_data/data/xml/zones/BossZone.xml | |
| 261 | +++ aCis_data/data/xml/zones/BossZone.xml | |
| 262 | @@ -109,12 +109,10 @@ | |
| 263 | <node x="26846" y="-8117"/> | |
| 264 | <node x="28231" y="-8163"/> | |
| 265 | </zone> | |
| 266 | - <zone id="110012" shape="NPoly" minZ="-5200" maxZ="-4680"><!-- Frintezza --> | |
| 267 | - <stat name="InvadeTime" val="1800000"/> | |
| 268 | - <node x="172031" y="-90127"/> | |
| 269 | - <node x="176428" y="-90089"/> | |
| 270 | - <node x="176428" y="-74051"/> | |
| 271 | - <node x="172057" y="-74108"/> | |
| 272 | + <zone id="110012" shape="Cuboid" minZ="-5150" maxZ="-4000"><!-- Frintezza --> | |
| 273 | + <stat name="InvadeTime" val="1800000" /> | |
| 274 | + <node x="172176" y="-74106" /> | |
| 275 | + <node x="176284" y="-90033" /> | |
| 276 | </zone> | |
| 277 | <zone id="110013" shape="NPoly" minZ="-5136" maxZ="864"><!-- Ice Fairy 1 --> | |
| 278 | <stat name="InvadeTime" val="1800000"/> | |
| 279 | diff --git aCis_data/data/xml/zones/ScriptZone.xml aCis_data/data/xml/zones/ScriptZone.xml | |
| 280 | index e0dbb43..8962e1b 100644 | |
| 281 | --- aCis_data/data/xml/zones/ScriptZone.xml | |
| 282 | +++ aCis_data/data/xml/zones/ScriptZone.xml | |
| 283 | @@ -22,4 +22,8 @@ | |
| 284 | <node x="88759" y="-108195"/> | |
| 285 | <node x="88677" y="-108275"/> | |
| 286 | </zone> | |
| 287 | + <zone id="100004" shape="Cuboid" minZ="-5140" maxZ="-2319"> <!-- Frintezza.java# Frintezza's Concert Hall --> | |
| 288 | + <node x="172176" y="-86081" /> | |
| 289 | + <node x="176284" y="-90033" /> | |
| 290 | + </zone> | |
| 291 | </list> | |
| 292 | \ No newline at end of file | |
| 293 | diff --git aCis_game/java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java aCis_game/java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java | |
| 294 | index a707ce5..28c1129 100644 | |
| 295 | --- aCis_game/java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java | |
| 296 | +++ aCis_game/java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java | |
| 297 | @@ -1,5 +1,6 @@ | |
| 298 | package net.sf.l2j.gameserver.handler.chathandlers; | |
| 299 | ||
| 300 | +import net.sf.l2j.gameserver.data.xml.ScriptData; | |
| 301 | import net.sf.l2j.gameserver.enums.FloodProtector; | |
| 302 | import net.sf.l2j.gameserver.enums.SayType; | |
| 303 | import net.sf.l2j.gameserver.handler.IChatHandler; | |
| 304 | @@ -18,7 +19,14 @@ | |
| 305 | {
| |
| 306 | if (!player.getClient().performAction(FloodProtector.GLOBAL_CHAT)) | |
| 307 | return; | |
| 308 | - | |
| 309 | + | |
| 310 | + if (player.isGM()) | |
| 311 | + if (text.equalsIgnoreCase(".frintezza"))
| |
| 312 | + {
| |
| 313 | + ScriptData.getInstance().getQuest("Frintezza").startQuestTimer("start", null, null, 1000);
| |
| 314 | + return; | |
| 315 | + } | |
| 316 | + | |
| 317 | final CreatureSay cs = new CreatureSay(player, type, text); | |
| 318 | for (Player knownPlayer : player.getKnownTypeInRadius(Player.class, 1250)) | |
| 319 | knownPlayer.sendPacket(cs); | |
| 320 | diff --git aCis_game/java/net/sf/l2j/gameserver/model/actor/Npc.java aCis_game/java/net/sf/l2j/gameserver/model/actor/Npc.java | |
| 321 | index 23723ee..728cf87 100644 | |
| 322 | --- aCis_game/java/net/sf/l2j/gameserver/model/actor/Npc.java | |
| 323 | +++ aCis_game/java/net/sf/l2j/gameserver/model/actor/Npc.java | |
| 324 | @@ -1486,4 +1486,15 @@ | |
| 325 | {
| |
| 326 | startRandomAnimationTimer(); | |
| 327 | } | |
| 328 | + private boolean isFlying = false; | |
| 329 | + @Override | |
| 330 | + public boolean isFlying() | |
| 331 | + {
| |
| 332 | + return isFlying; | |
| 333 | + } | |
| 334 | + | |
| 335 | + public void setIsFlying(boolean a) | |
| 336 | + {
| |
| 337 | + isFlying = a; | |
| 338 | + } | |
| 339 | } | |
| 340 | \ No newline at end of file | |
| 341 | diff --git aCis_game/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Frintezza.java aCis_game/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Frintezza.java | |
| 342 | new file mode 100644 | |
| 343 | index 0000000..472c122 | |
| 344 | --- /dev/null | |
| 345 | +++ aCis_game/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Frintezza.java | |
| 346 | @@ -0,0 +1,1167 @@ | |
| 347 | +package net.sf.l2j.gameserver.scripting.script.ai.boss; | |
| 348 | + | |
| 349 | +import java.util.List; | |
| 350 | +import java.util.Map; | |
| 351 | +import java.util.concurrent.ConcurrentHashMap; | |
| 352 | +import java.util.concurrent.CopyOnWriteArrayList; | |
| 353 | + | |
| 354 | +import net.sf.l2j.commons.data.StatSet; | |
| 355 | +import net.sf.l2j.commons.math.MathUtil; | |
| 356 | +import net.sf.l2j.commons.random.Rnd; | |
| 357 | + | |
| 358 | +import net.sf.l2j.Config; | |
| 359 | +import net.sf.l2j.gameserver.data.manager.GrandBossManager; | |
| 360 | +import net.sf.l2j.gameserver.data.manager.ZoneManager; | |
| 361 | +import net.sf.l2j.gameserver.data.xml.DoorData; | |
| 362 | +import net.sf.l2j.gameserver.enums.SayType; | |
| 363 | +import net.sf.l2j.gameserver.enums.skills.FlyType; | |
| 364 | +import net.sf.l2j.gameserver.model.actor.Creature; | |
| 365 | +import net.sf.l2j.gameserver.model.actor.Npc; | |
| 366 | +import net.sf.l2j.gameserver.model.actor.Player; | |
| 367 | +import net.sf.l2j.gameserver.model.actor.instance.GrandBoss; | |
| 368 | +import net.sf.l2j.gameserver.model.actor.instance.Monster; | |
| 369 | +import net.sf.l2j.gameserver.model.holder.IntIntHolder; | |
| 370 | +import net.sf.l2j.gameserver.model.location.Location; | |
| 371 | +import net.sf.l2j.gameserver.model.zone.type.BossZone; | |
| 372 | +import net.sf.l2j.gameserver.model.zone.type.ScriptZone; | |
| 373 | +import net.sf.l2j.gameserver.network.SystemMessageId; | |
| 374 | +import net.sf.l2j.gameserver.network.serverpackets.AbstractNpcInfo.NpcInfo; | |
| 375 | +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay; | |
| 376 | +import net.sf.l2j.gameserver.network.serverpackets.Earthquake; | |
| 377 | +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; | |
| 378 | +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS; | |
| 379 | +import net.sf.l2j.gameserver.network.serverpackets.FlyToLocation; | |
| 380 | +import net.sf.l2j.gameserver.network.serverpackets.L2GameServerPacket; | |
| 381 | +import net.sf.l2j.gameserver.network.serverpackets.MagicSkillCanceled; | |
| 382 | +import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; | |
| 383 | +import net.sf.l2j.gameserver.network.serverpackets.NpcSay; | |
| 384 | +import net.sf.l2j.gameserver.network.serverpackets.SocialAction; | |
| 385 | +import net.sf.l2j.gameserver.network.serverpackets.SpecialCamera; | |
| 386 | +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage; | |
| 387 | +import net.sf.l2j.gameserver.network.serverpackets.ValidateLocation; | |
| 388 | +import net.sf.l2j.gameserver.scripting.script.ai.AttackableAIScript; | |
| 389 | +import net.sf.l2j.gameserver.skills.AbstractEffect; | |
| 390 | +import net.sf.l2j.gameserver.skills.L2Skill; | |
| 391 | + | |
| 392 | +public class Frintezza extends AttackableAIScript | |
| 393 | +{
| |
| 394 | + private static final ScriptZone FRINTEZZA_LAIR = ZoneManager.getInstance().getZoneById(100004, ScriptZone.class); | |
| 395 | + private static final BossZone lastImperialTomp = ZoneManager.getInstance().getZoneById(110012, BossZone.class); | |
| 396 | + | |
| 397 | + public static final int FRINTEZZA = 29045; | |
| 398 | + private static final int SCARLET1 = 29046; | |
| 399 | + private static final int SCARLET2 = 29047; | |
| 400 | + | |
| 401 | + private static final int ALARM_DEVICE = 18328; | |
| 402 | + private static final int CHOIR_CAPTAIN = 18334; | |
| 403 | + private static final int CHOIR_PRAYER = 18339; | |
| 404 | + | |
| 405 | + // Frintezza Status Tracking : | |
| 406 | + public static final byte DORMANT = 0; // No one has entered yet. Entry is unlocked | |
| 407 | + public static final byte WAITING = 1; // Someone has entered, triggering a 35 minute window for additional people to enter before he unleashes his attack. Entry is unlocked | |
| 408 | + public static final byte FIGHTING = 2; // Frintezza is engaged in battle, annihilating his foes. Entry is locked | |
| 409 | + public static final byte DEAD = 3; // Frintezza has been killed. Entry is locked | |
| 410 | + | |
| 411 | + private Player _actualVictim; // Actual target of Scarlet. | |
| 412 | + private static long _lastAttackTime = 0; | |
| 413 | + private static int _killMobs = 0; | |
| 414 | + | |
| 415 | + private static GrandBoss scarlet, frintezza; | |
| 416 | + | |
| 417 | + private final List<Npc> _dummys = new CopyOnWriteArrayList<>(); | |
| 418 | + private final List<Monster> demons = new CopyOnWriteArrayList<>(); | |
| 419 | + private final Map<Monster, Integer> portraits = new ConcurrentHashMap<>(); | |
| 420 | + private final List<Npc> _mobs = new CopyOnWriteArrayList<>(); | |
| 421 | + | |
| 422 | + //features unconfirmed retail | |
| 423 | + // Cinematic initial and Alarm Device open doors | |
| 424 | + private static boolean not_confirmed = true; | |
| 425 | + | |
| 426 | + // Skills | |
| 427 | + private static final int DEWDROP_OF_DESTRUCTION_SKILL_ID = 2276; | |
| 428 | + private static final int BREAKING_ARROW_SKILL_ID = 2234; | |
| 429 | + private static final IntIntHolder Bomber_Ghost = new IntIntHolder(5011, 1); | |
| 430 | + | |
| 431 | + private L2Skill songEffect = null; | |
| 432 | + private static int[][] scarletSkills; | |
| 433 | + | |
| 434 | + // Items | |
| 435 | + //private static final int FRINTEZZA_SCROLL = 8073; // Frintezza's Magic Force Field Removal Scroll. | |
| 436 | + //http://legacy.lineage2.com/news/chronicle5_07.html | |
| 437 | + private static final int DEWDROP_OF_DESTRUCTION = 8556; // Dewdrop of Destruction | |
| 438 | + // Clicking the Dewdrop of Destruction will make the portrait disappear. It will disappear when one enters the Last Imperial Sepulcher. | |
| 439 | + private static final int BREAKING_ARROW = 8192; // Breaking Arrow | |
| 440 | + // Double-click the arrow to temporarily stop Frintezza's musical performance. This gets deleted when one enters the Tomb of the Last Emperor. | |
| 441 | + | |
| 442 | + protected static final int[][] PORTRAIT_GHOST = | |
| 443 | + {
| |
| 444 | + {29048, 175833, -87165, -5126, 35048, 175833, -87165, -5100, 35048},
| |
| 445 | + {29048, 172634, -87165, -5126, 57730, 172634, -87165, -5100, 57730},
| |
| 446 | + {29049, 175876, -88713, -5126, 28205, 175876, -88713, -5100, 28205},
| |
| 447 | + {29049, 172608, -88702, -5126, 64817, 172608, -88702, -5100, 64817}
| |
| 448 | + }; | |
| 449 | + | |
| 450 | + protected static final int[][] DUMMY_SPAWNS = | |
| 451 | + {
| |
| 452 | + {29052, 174240, -89805, -5022, 16048},
| |
| 453 | + {29052, 174232, -88020, -5110, 16384},
| |
| 454 | + {29052, 172450, -87890, -5100, 16048},
| |
| 455 | + {29052, 176012, -87890, -5100, 16048},
| |
| 456 | + {29053, 174232, -88020, -5110, 16384}
| |
| 457 | + }; | |
| 458 | + | |
| 459 | + private static final int[][] ROOM1_SPAWN = | |
| 460 | + {
| |
| 461 | + { 18328,172894,-76019,-5107,243 },
| |
| 462 | + { 18328,174095,-77279,-5107,16216 },
| |
| 463 | + { 18328,174111,-74833,-5107,49043 },
| |
| 464 | + { 18328,175344,-76042,-5107,32847 },
| |
| 465 | + { 18330,173489,-76227,-5134,63565 },
| |
| 466 | + { 18330,173498,-75724,-5107,58498 },
| |
| 467 | + { 18330,174365,-76745,-5107,22424 },
| |
| 468 | + { 18330,174570,-75584,-5107,31968 },
| |
| 469 | + { 18330,174613,-76179,-5107,31471 },
| |
| 470 | + { 18332,173620,-75981,-5107,4588 },
| |
| 471 | + { 18332,173630,-76340,-5107,62454 },
| |
| 472 | + { 18332,173755,-75613,-5107,57892 },
| |
| 473 | + { 18332,173823,-76688,-5107,2411 },
| |
| 474 | + { 18332,174000,-75411,-5107,54718 },
| |
| 475 | + { 18332,174487,-75555,-5107,33861 },
| |
| 476 | + { 18332,174517,-76471,-5107,21893 },
| |
| 477 | + { 18332,174576,-76122,-5107,31176 },
| |
| 478 | + { 18332,174600,-75841,-5134,35927 }
| |
| 479 | + }; | |
| 480 | + // Hall Keeper Captain | |
| 481 | + private static final int[][] ROOM1_CAPTAIN = | |
| 482 | + {
| |
| 483 | + { 18329,173481,-76043,-5107,61312 },
| |
| 484 | + { 18329,173539,-75678,-5107,59524 },
| |
| 485 | + { 18329,173584,-76386,-5107,3041 },
| |
| 486 | + { 18329,173773,-75420,-5107,51115 },
| |
| 487 | + { 18329,173777,-76650,-5107,12588 },
| |
| 488 | + { 18329,174585,-76510,-5107,21704 },
| |
| 489 | + { 18329,174623,-75571,-5107,40141 },
| |
| 490 | + { 18329,174744,-76240,-5107,29202 },
| |
| 491 | + { 18329,174769,-75895,-5107,29572 }
| |
| 492 | + }; | |
| 493 | + // Hall Keeper Suicidal Soldier | |
| 494 | + private static final int[][] ROOM1_SUICIDAL_SOLDIER = | |
| 495 | + {
| |
| 496 | + { 18333,173861,-76011,-5107,383 },
| |
| 497 | + { 18333,173872,-76461,-5107,8041 },
| |
| 498 | + { 18333,173898,-75668,-5107,51856 },
| |
| 499 | + { 18333,174422,-75689,-5107,42878 },
| |
| 500 | + { 18333,174460,-76355,-5107,27311 },
| |
| 501 | + { 18333,174483,-76041,-5107,30947 }
| |
| 502 | + }; | |
| 503 | + // Hall Keeper Guard | |
| 504 | + private static final int[][] ROOM1_GUARD = | |
| 505 | + {
| |
| 506 | + { 18331,173515,-76184,-5107,6971 },
| |
| 507 | + { 18331,173516,-75790,-5134,3142 },
| |
| 508 | + { 18331,173696,-76675,-5107,6757 },
| |
| 509 | + { 18331,173766,-75502,-5134,60827 },
| |
| 510 | + { 18331,174473,-75321,-5107,37147 },
| |
| 511 | + { 18331,174493,-76505,-5107,34503 },
| |
| 512 | + { 18331,174568,-75654,-5134,41661 },
| |
| 513 | + { 18331,174584,-76263,-5107,31729 }
| |
| 514 | + }; | |
| 515 | + // Dark Choir Player | |
| 516 | + private static final int[][] ROOM2_SPAWN = | |
| 517 | + {
| |
| 518 | + { 18339,173892,-81592,-5123,50849 },
| |
| 519 | + { 18339,173958,-81820,-5123,7459 },
| |
| 520 | + { 18339,174128,-81805,-5150,21495 },
| |
| 521 | + { 18339,174245,-81566,-5123,41760 }
| |
| 522 | + }; | |
| 523 | + private static final int[][] ROOM2_SPAWN2 = | |
| 524 | + {
| |
| 525 | + { 18334,173264,-81529,-5072,1646 },
| |
| 526 | + { 18334,173265,-81656,-5072,441 },
| |
| 527 | + { 18334,173267,-81889,-5072,0 },
| |
| 528 | + { 18334,173271,-82015,-5072,65382 },
| |
| 529 | + { 18334,174867,-81655,-5073,32537 },
| |
| 530 | + { 18334,174868,-81890,-5073,32768 },
| |
| 531 | + { 18334,174869,-81485,-5073,32315 },
| |
| 532 | + { 18334,174871,-82017,-5073,33007 },
| |
| 533 | + { 18335,173074,-80817,-5107,8353 },
| |
| 534 | + { 18335,173128,-82702,-5107,5345 },
| |
| 535 | + { 18335,173181,-82544,-5107,65135 },
| |
| 536 | + { 18335,173191,-80981,-5107,6947 },
| |
| 537 | + { 18335,174859,-80889,-5134,24103 },
| |
| 538 | + { 18335,174924,-82666,-5107,38710 },
| |
| 539 | + { 18335,174947,-80733,-5107,22449 },
| |
| 540 | + { 18335,175096,-82724,-5107,42205 },
| |
| 541 | + { 18336,173435,-80512,-5107,65215 },
| |
| 542 | + { 18336,173440,-82948,-5107,417 },
| |
| 543 | + { 18336,173443,-83120,-5107,1094 },
| |
| 544 | + { 18336,173463,-83064,-5107,286 },
| |
| 545 | + { 18336,173465,-80453,-5107,174 },
| |
| 546 | + { 18336,173465,-83006,-5107,2604 },
| |
| 547 | + { 18336,173468,-82889,-5107,316 },
| |
| 548 | + { 18336,173469,-80570,-5107,65353 },
| |
| 549 | + { 18336,173469,-80628,-5107,166 },
| |
| 550 | + { 18336,173492,-83121,-5107,394 },
| |
| 551 | + { 18336,173493,-80683,-5107,0 },
| |
| 552 | + { 18336,173497,-80510,-5134,417 },
| |
| 553 | + { 18336,173499,-82947,-5107,0 },
| |
| 554 | + { 18336,173521,-83063,-5107,316 },
| |
| 555 | + { 18336,173523,-82889,-5107,128 },
| |
| 556 | + { 18336,173524,-80627,-5134,65027 },
| |
| 557 | + { 18336,173524,-83007,-5107,0 },
| |
| 558 | + { 18336,173526,-80452,-5107,64735 },
| |
| 559 | + { 18336,173527,-80569,-5134,65062 },
| |
| 560 | + { 18336,174602,-83122,-5107,33104 },
| |
| 561 | + { 18336,174604,-82949,-5107,33184 },
| |
| 562 | + { 18336,174609,-80514,-5107,33234 },
| |
| 563 | + { 18336,174609,-80684,-5107,32851 },
| |
| 564 | + { 18336,174629,-80627,-5107,33346 },
| |
| 565 | + { 18336,174632,-80570,-5107,32896 },
| |
| 566 | + { 18336,174632,-83066,-5107,32768 },
| |
| 567 | + { 18336,174635,-82893,-5107,33594 },
| |
| 568 | + { 18336,174636,-80456,-5107,32065 },
| |
| 569 | + { 18336,174639,-83008,-5107,33057 },
| |
| 570 | + { 18336,174660,-80512,-5107,33057 },
| |
| 571 | + { 18336,174661,-83121,-5107,32768 },
| |
| 572 | + { 18336,174663,-82948,-5107,32768 },
| |
| 573 | + { 18336,174664,-80685,-5107,32676 },
| |
| 574 | + { 18336,174687,-83008,-5107,32520 },
| |
| 575 | + { 18336,174691,-83066,-5107,32961 },
| |
| 576 | + { 18336,174692,-80455,-5107,33202 },
| |
| 577 | + { 18336,174692,-80571,-5107,32768 },
| |
| 578 | + { 18336,174693,-80630,-5107,32994 },
| |
| 579 | + { 18336,174693,-82889,-5107,32622 },
| |
| 580 | + { 18337,172837,-82382,-5107,58363 },
| |
| 581 | + { 18337,172867,-81123,-5107,64055 },
| |
| 582 | + { 18337,172883,-82495,-5107,64764 },
| |
| 583 | + { 18337,172916,-81033,-5107,7099 },
| |
| 584 | + { 18337,172940,-82325,-5107,58998 },
| |
| 585 | + { 18337,172946,-82435,-5107,58038 },
| |
| 586 | + { 18337,172971,-81198,-5107,14768 },
| |
| 587 | + { 18337,172992,-81091,-5107,9438 },
| |
| 588 | + { 18337,173032,-82365,-5107,59041 },
| |
| 589 | + { 18337,173064,-81125,-5107,5827 },
| |
| 590 | + { 18337,175014,-81173,-5107,26398 },
| |
| 591 | + { 18337,175061,-82374,-5107,43290 },
| |
| 592 | + { 18337,175096,-81080,-5107,24719 },
| |
| 593 | + { 18337,175169,-82453,-5107,37672 },
| |
| 594 | + { 18337,175172,-80972,-5107,32315 },
| |
| 595 | + { 18337,175174,-82328,-5107,41760 },
| |
| 596 | + { 18337,175197,-81157,-5107,27617 },
| |
| 597 | + { 18337,175245,-82547,-5107,40275 },
| |
| 598 | + { 18337,175249,-81075,-5107,28435 },
| |
| 599 | + { 18337,175292,-82432,-5107,42225 },
| |
| 600 | + { 18338,173014,-82628,-5107,11874 },
| |
| 601 | + { 18338,173033,-80920,-5107,10425 },
| |
| 602 | + { 18338,173095,-82520,-5107,49152 },
| |
| 603 | + { 18338,173115,-80986,-5107,9611 },
| |
| 604 | + { 18338,173144,-80894,-5107,5345 },
| |
| 605 | + { 18338,173147,-82602,-5107,51316 },
| |
| 606 | + { 18338,174912,-80825,-5107,24270 },
| |
| 607 | + { 18338,174935,-80899,-5107,18061 },
| |
| 608 | + { 18338,175016,-82697,-5107,39533 },
| |
| 609 | + { 18338,175041,-80834,-5107,25420 },
| |
| 610 | + { 18338,175071,-82549,-5107,39163 },
| |
| 611 | + { 18338,175154,-82619,-5107,36345 }
| |
| 612 | + }; | |
| 613 | + | |
| 614 | + public Frintezza() | |
| 615 | + {
| |
| 616 | + super("ai/boss");
| |
| 617 | + | |
| 618 | + StatSet info = GrandBossManager.getInstance().getStatSet(FRINTEZZA); | |
| 619 | + if (GrandBossManager.getInstance().getBossStatus(FRINTEZZA) == DEAD) | |
| 620 | + {
| |
| 621 | + long temp = (info.getLong("respawn_time") - System.currentTimeMillis());
| |
| 622 | + if (temp > 0) | |
| 623 | + startQuestTimer("frintezza_unlock", null, null, temp);
| |
| 624 | + else | |
| 625 | + GrandBossManager.getInstance().setBossStatus(FRINTEZZA, DORMANT); | |
| 626 | + } | |
| 627 | + else if (GrandBossManager.getInstance().getBossStatus(FRINTEZZA) != DORMANT) | |
| 628 | + GrandBossManager.getInstance().setBossStatus(FRINTEZZA, DORMANT); | |
| 629 | + } | |
| 630 | + | |
| 631 | + @Override | |
| 632 | + protected void registerNpcs() | |
| 633 | + {
| |
| 634 | + addAttackId(SCARLET1, SCARLET2, FRINTEZZA, 29048, 29049); | |
| 635 | + addSpawnId(FRINTEZZA, SCARLET1, SCARLET2, ALARM_DEVICE, CHOIR_CAPTAIN); | |
| 636 | + addKillId(SCARLET2, 29048, 29049, 29050, 29051, ALARM_DEVICE, 18329, 18330, 18331, 18332, 18333, CHOIR_CAPTAIN, 18335, 18336, 18337, 18338, CHOIR_PRAYER); | |
| 637 | + addSkillSeeId(29050, 29051); | |
| 638 | + addSpellFinishedId(FRINTEZZA, 29050, 29051); | |
| 639 | + addExitZoneId(100004); | |
| 640 | + } | |
| 641 | + | |
| 642 | + @Override | |
| 643 | + public String onSpawn(Npc npc) | |
| 644 | + {
| |
| 645 | + switch(npc.getNpcId()) | |
| 646 | + {
| |
| 647 | + case ALARM_DEVICE: | |
| 648 | + case CHOIR_CAPTAIN: | |
| 649 | + if (not_confirmed) | |
| 650 | + lastImperialTomp.broadcastPacket(new NpcSay(npc.getObjectId(), SayType.SHOUT, npc.getNpcId() == ALARM_DEVICE ? "Intruders! Sound the alarm!" : "How dare you ruin the performance of the Dark Choir... Unforgivable!")); | |
| 651 | + npc.setIsImmobilized(true); | |
| 652 | + npc.disableCoreAi(true); | |
| 653 | + break; | |
| 654 | + case FRINTEZZA: | |
| 655 | + case SCARLET1: | |
| 656 | + case SCARLET2: | |
| 657 | + npc.disableCoreAi(true); | |
| 658 | + break; | |
| 659 | + } | |
| 660 | + return super.onSpawn(npc); | |
| 661 | + } | |
| 662 | + | |
| 663 | + @Override | |
| 664 | + public String onTimer(String event, Npc npc, Player player) | |
| 665 | + {
| |
| 666 | + if (event.equalsIgnoreCase("start"))
| |
| 667 | + {
| |
| 668 | + broadcastPacket(new Earthquake(getKnownInside(), 45, 27, false)); | |
| 669 | + clean(WAITING); | |
| 670 | + dropTimers(); | |
| 671 | + startQuestTimer("beginning", null, null, 4000);
| |
| 672 | + } | |
| 673 | + else if (event.equalsIgnoreCase("beginning")) //TODO: beginning
| |
| 674 | + {
| |
| 675 | + startQuestTimer("camera_00", null, null, 29000);
| |
| 676 | + startQuestTimer("camera_01", null, null, 30000);
| |
| 677 | + startQuestTimer("camera_02", null, null, 31000); //100
| |
| 678 | + startQuestTimer("camera_03", null, null, 37500); //6500
| |
| 679 | + startQuestTimer("camera_04", null, null, 38400); //900
| |
| 680 | + startQuestTimer("camera_05", null, null, 42400); //4000 ex - cam5b
| |
| 681 | + startQuestTimer("camera_06", null, null, 43750); //1350
| |
| 682 | + startQuestTimer("camera_07", null, null, 51750); //7000
| |
| 683 | + startQuestTimer("camera_08", null, null, 52150); //1000
| |
| 684 | + startQuestTimer("camera_09", null, null, 54150); //2000
| |
| 685 | + startQuestTimer("camera_10", null, null, 58650); //4500
| |
| 686 | + startQuestTimer("camera_11", null, null, 59350); //700
| |
| 687 | + startQuestTimer("camera_12", null, null, 60650); //1300 -15
| |
| 688 | + startQuestTimer("camera_13", null, null, 62150); //1500 -16
| |
| 689 | + startQuestTimer("camera_14", null, null, 69650); //7500 -17
| |
| 690 | + startQuestTimer("camera_15", null, null, 79150); //9500 -16 //79350//200
| |
| 691 | + startQuestTimer("camera_16", null, null, 81750); //2400 //81550 //81150
| |
| 692 | + startQuestTimer("camera_17", null, null, 84150); //5000
| |
| 693 | + startQuestTimer("camera_18", null, null, 84850); //6300 -85450 -throw_up
| |
| 694 | + startQuestTimer("camera_19", null, null, 87650); //3500
| |
| 695 | + startQuestTimer("camera_20", null, null, 89650); //2000
| |
| 696 | + startQuestTimer("camera_21", null, null, 92650); //3000
| |
| 697 | + startQuestTimer("camera_22", null, null, 94650); //2000
| |
| 698 | + } | |
| 699 | + else if (event.equalsIgnoreCase("despawn"))
| |
| 700 | + {
| |
| 701 | + if (GrandBossManager.getInstance().getBossStatus(FRINTEZZA) == FIGHTING && (System.currentTimeMillis() - _lastAttackTime) >= 900000) | |
| 702 | + {
| |
| 703 | + clean(DORMANT); | |
| 704 | + dropTimers(); | |
| 705 | + } | |
| 706 | + } | |
| 707 | + else if (event.equalsIgnoreCase("camera_00")) //TODO: camera 00
| |
| 708 | + {
| |
| 709 | + for (int[] loc : DUMMY_SPAWNS) | |
| 710 | + {
| |
| 711 | + Npc dummy = addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 62650, false); | |
| 712 | + dummy.setIsImmobilized(true); | |
| 713 | + dummy.setIsParalyzed(true); | |
| 714 | + dummy.disableCoreAi(true); | |
| 715 | + _dummys.add(dummy); | |
| 716 | + } | |
| 717 | + _dummys.get(2).setIsFlying(true); | |
| 718 | + _dummys.get(3).setIsFlying(true); | |
| 719 | + _dummys.get(1).setCollisionHeight(600); | |
| 720 | + setPrepareRoom(true); | |
| 721 | + } | |
| 722 | + else if (event.equalsIgnoreCase("camera_01"))
| |
| 723 | + {
| |
| 724 | + GrandBossManager.getInstance().setBossStatus(FRINTEZZA, FIGHTING); | |
| 725 | + frintezza = (GrandBoss) addSpawn(FRINTEZZA, 174240, -89805, -5022, 16048, false, 0, false); | |
| 726 | + frintezza.setInvul(true); | |
| 727 | + frintezza.decayMe(); | |
| 728 | + } | |
| 729 | + else if (event.equalsIgnoreCase("camera_02"))
| |
| 730 | + {
| |
| 731 | + for (int[] ghosts : PORTRAIT_GHOST) | |
| 732 | + {
| |
| 733 | + Monster demon = (Monster) addSpawn(ghosts[0] + 2, ghosts[5], ghosts[6], ghosts[7], ghosts[8], false, 0, false); | |
| 734 | + demon.setIsImmobilized(true); | |
| 735 | + demon.disableAllSkills(); | |
| 736 | + demons.add(demon); | |
| 737 | + } | |
| 738 | + frintezza.spawnMe(); | |
| 739 | + _dummys.get(1).decayMe(); | |
| 740 | + broadcastPacket(new NpcInfo(_dummys.get(1), null)); | |
| 741 | + GrandBossManager.getInstance().addBoss(frintezza); | |
| 742 | + broadcastPacket(new SpecialCamera(_dummys.get(1).getObjectId(), 0, 75, -89, 0, 100, 0, 0, 1, 0), new SpecialCamera(_dummys.get(1).getObjectId(), 0, 75, -89, 0, 100, 0, 0, 1, 0), new ValidateLocation(frintezza), new SpecialCamera(_dummys.get(1).getObjectId(), 300, 90, -10, 6500, 7000, 0, 0, 1, 0)); | |
| 743 | + } | |
| 744 | + else if (event.equalsIgnoreCase("camera_03"))
| |
| 745 | + broadcastPacket(new SpecialCamera(_dummys.get(0).getObjectId(), 1800, 90, 8, 6500, 7000, 0, 0, 1, 0)); | |
| 746 | + else if (event.equalsIgnoreCase("camera_04"))
| |
| 747 | + broadcastPacket(new SpecialCamera(_dummys.get(0).getObjectId(), 140, 90, 10, 2500, 4500, 0, 0, 1, 0)); | |
| 748 | + else if (event.equalsIgnoreCase("camera_05"))
| |
| 749 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 40, 75, -10, 0, 1000, 0, 0, 1, 0), new SpecialCamera(frintezza.getObjectId(), 40, 75, -10, 0, 12000, 0, 0, 1, 0)); | |
| 750 | + else if (event.equalsIgnoreCase("camera_06"))
| |
| 751 | + broadcastPacket(new SocialAction(frintezza, 2)); | |
| 752 | + else if (event.equalsIgnoreCase("camera_07"))
| |
| 753 | + {}//broadcastPacket(new SocialAction(demons.get(1), 1), new SocialAction(demons.get(3), 1)); // TODO: 1 y 3
| |
| 754 | + else if (event.equalsIgnoreCase("camera_08"))
| |
| 755 | + {
| |
| 756 | + broadcastPacket(new SocialAction(demons.get(1), 1), new SocialAction(demons.get(3), 1), new SocialAction(demons.get(0), 1), new SocialAction(demons.get(2), 1)); | |
| 757 | + _dummys.get(2).instantTeleportTo(172450, -87890, -5100, 0); | |
| 758 | + _dummys.get(3).instantTeleportTo(176012, -87890, -5100, 0); | |
| 759 | + boolean locX = getKnownInside().getX() < 174232; | |
| 760 | + broadcastPacket(new SpecialCamera(_dummys.get(locX ? 2 : 3).getObjectId(), 1000, locX ? 118 : 62, 0, 0, 1000, 0, 0, 1, 0), new SpecialCamera(_dummys.get(locX ? 2 : 3).getObjectId(), 1000, locX ? 118 : 62, 0, 0, 10000, 0, 0, 1, 0)); | |
| 761 | + } | |
| 762 | + else if (event.equalsIgnoreCase("camera_09"))
| |
| 763 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 240, 90, 0, 0, 1000, 0, 0, 1, 0), new SpecialCamera(frintezza.getObjectId(), 240, 90, 25, 5500, 10000, 0, 0, 1, 0), new SocialAction(frintezza, 3)); | |
| 764 | + else if (event.equalsIgnoreCase("camera_10"))
| |
| 765 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 100, 195, 35, 0, 10000, 0, 0, 1, 0)); | |
| 766 | + else if (event.equalsIgnoreCase("camera_11"))
| |
| 767 | + {
| |
| 768 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 100, 195, 35, 0, 10000, 0, 0, 1, 0)); | |
| 769 | + if (not_confirmed) | |
| 770 | + playFrintezzaMelody(); | |
| 771 | + } | |
| 772 | + else if (event.equalsIgnoreCase("camera_12"))
| |
| 773 | + {
| |
| 774 | + scarlet = (GrandBoss) addSpawn(SCARLET1, 174232, -88020, -5110, 16384, false, 0, true); | |
| 775 | + scarlet.setRightHandItemId(8204); | |
| 776 | + scarlet.decayMe(); | |
| 777 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 120, 180, 45, 1500, 10000, 0, 0, 1, 0)); | |
| 778 | + if (!not_confirmed) | |
| 779 | + playFrintezzaMelody(); | |
| 780 | + } | |
| 781 | + else if (event.equalsIgnoreCase("camera_13"))
| |
| 782 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 520, 135, 45, 8000, 10000, 0, 0, 1, 0)); | |
| 783 | + else if (event.equalsIgnoreCase("camera_14"))
| |
| 784 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 1500, 110, 25, 10000, 13000, 0, 0, 1, 0)); | |
| 785 | + else if (event.equalsIgnoreCase("camera_15"))
| |
| 786 | + broadcastPacket(new SpecialCamera(_dummys.get(1).getObjectId(), 930, 160, -20, 0, 1000, 0, 0, 1, 0), new MagicSkillUse(_dummys.get(4), _dummys.get(4), 5004, 1, 5800, 0), new SpecialCamera(_dummys.get(1).getObjectId(), 600, 180, -25, 0, 10000, 0, 0, 1, 0)); | |
| 787 | + else if (event.equalsIgnoreCase("camera_16"))
| |
| 788 | + scarlet.spawnMe(); | |
| 789 | + else if (event.equalsIgnoreCase("camera_17"))
| |
| 790 | + broadcastPacket(new SocialAction(_dummys.get(4), 3), new SpecialCamera(_dummys.get(4).getObjectId(), 800, 180, 10, 1000, 10000, 0, 0, 1, 0)); | |
| 791 | + else if (event.equalsIgnoreCase("camera_18")) // TODO: throw_up
| |
| 792 | + throwUp(_dummys.get(4), 500, SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT).addSkillName(5004, 1)); | |
| 793 | + else if (event.equalsIgnoreCase("camera_19"))
| |
| 794 | + broadcastPacket(new SpecialCamera(_dummys.get(4).getObjectId(), 300, 60, 8, 0, 10000, 0, 0, 1, 0)); | |
| 795 | + else if (event.equalsIgnoreCase("camera_20"))
| |
| 796 | + broadcastPacket(new SpecialCamera(scarlet.getObjectId(), 500, 90, 10, 1000, 5000, 0, 0, 1, 0), new SpecialCamera(scarlet.getObjectId(), 500, 90, 10, 3000, 5000, 0, 0, 1, 0)); | |
| 797 | + else if (event.equalsIgnoreCase("camera_21"))
| |
| 798 | + {
| |
| 799 | + for (int i = 0; i < PORTRAIT_GHOST.length; i++) | |
| 800 | + {
| |
| 801 | + Monster portrait = (Monster) addSpawn(PORTRAIT_GHOST[i][0], PORTRAIT_GHOST[i][1], PORTRAIT_GHOST[i][2], PORTRAIT_GHOST[i][3], PORTRAIT_GHOST[i][4], false, 0, false); | |
| 802 | + //portrait.setIsFlying(true); | |
| 803 | + portrait.setIsImmobilized(true); | |
| 804 | + portrait.disableCoreAi(true); | |
| 805 | + portraits.put(portrait, i); | |
| 806 | + } | |
| 807 | + if (!_dummys.isEmpty()) | |
| 808 | + {
| |
| 809 | + for (Npc n : _dummys) | |
| 810 | + deleteNpc(n); | |
| 811 | + _dummys.clear(); | |
| 812 | + } | |
| 813 | + } | |
| 814 | + else if (event.equalsIgnoreCase("camera_22")) //TODO: camera_22
| |
| 815 | + {
| |
| 816 | + roomTasks(); | |
| 817 | + setPrepareRoom(false); | |
| 818 | + frintezza.setInvul(false); | |
| 819 | + startQuestTimerAtFixedRate("spawn_minion", null, null, 20000);
| |
| 820 | + } | |
| 821 | + else if (event.equalsIgnoreCase("spawn_minion")) //TODO: spawn_minion
| |
| 822 | + {
| |
| 823 | + if (frintezza != null && !frintezza.isDead() && !portraits.isEmpty()) | |
| 824 | + {
| |
| 825 | + if (!frintezza.isInvul()) | |
| 826 | + for (int i : portraits.values()) | |
| 827 | + {
| |
| 828 | + if (demons.size() > 24) | |
| 829 | + break; | |
| 830 | + Monster demon = (Monster) addSpawn(PORTRAIT_GHOST[i][0] + 2, PORTRAIT_GHOST[i][5], PORTRAIT_GHOST[i][6], PORTRAIT_GHOST[i][7], PORTRAIT_GHOST[i][8], false, 0, false); | |
| 831 | + demon.setMinion(true); | |
| 832 | + demon.forceRunStance(); | |
| 833 | + demons.add(demon); | |
| 834 | + demon.disableSkill(Bomber_Ghost.getSkill(), -1); // Bomb | |
| 835 | + startQuestTimer("action", demon, null, 200);
| |
| 836 | + } | |
| 837 | + } | |
| 838 | + else | |
| 839 | + cancelQuestTimers("spawn_minion");
| |
| 840 | + } | |
| 841 | + else if (event.equalsIgnoreCase("end_camera"))
| |
| 842 | + npc.setInvul(false); | |
| 843 | + else if (event.equalsIgnoreCase("first_morph_01")) //TODO: first_morph
| |
| 844 | + {
| |
| 845 | + npc.stopSkillEffects(5008); | |
| 846 | + setPrepareRoom(true); | |
| 847 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 250, calcCameraAngle(npc), 12, 2000, 15000, 0, 0, 1, 0)); | |
| 848 | + } | |
| 849 | + else if (event.equalsIgnoreCase("first_morph_02"))
| |
| 850 | + {
| |
| 851 | + broadcastPacket(new SocialAction(npc, 1)); | |
| 852 | + npc.setRightHandItemId(7903); | |
| 853 | + } | |
| 854 | + else if (event.equalsIgnoreCase("first_morph_03"))
| |
| 855 | + daemonMorph(npc, 1); | |
| 856 | + else if (event.equalsIgnoreCase("second_morph_01"))
| |
| 857 | + {
| |
| 858 | + setPrepareRoom(true); | |
| 859 | + broadcastPacket(new SocialAction(frintezza, 4)); | |
| 860 | + } | |
| 861 | + else if (event.equalsIgnoreCase("second_morph_02"))
| |
| 862 | + {
| |
| 863 | + broadcastPacket(new SpecialCamera(frintezza.getObjectId(), 250, 120, 15, 0, 1000, 0, 0, 1, 0), new SpecialCamera(frintezza.getObjectId(), 250, 120, 15, 0, 10000, 0, 0, 1, 0)); | |
| 864 | + npc.setIsImmobilized(true); | |
| 865 | + } | |
| 866 | + else if (event.equalsIgnoreCase("second_morph_03"))
| |
| 867 | + {
| |
| 868 | + playFrintezzaMelody(); | |
| 869 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 500, 70, 15, 3000, 10000, 0, 0, 1, 0)); | |
| 870 | + } | |
| 871 | + else if (event.equalsIgnoreCase("second_morph_04"))
| |
| 872 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 2500, 90, 12, 6000, 10000, 0, 0, 1, 0)); | |
| 873 | + else if (event.equalsIgnoreCase("second_morph_05"))
| |
| 874 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 250, calcCameraAngle(npc), 12, 0, 1000, 0, 0, 1, 0), new SpecialCamera(npc.getObjectId(), 250, calcCameraAngle(npc), 12, 0, 10000, 0, 0, 1, 0)); | |
| 875 | + else if (event.equalsIgnoreCase("second_morph_06"))
| |
| 876 | + {
| |
| 877 | + npc.doDie(npc); | |
| 878 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 450, calcCameraAngle(npc), 14, 8000, 8000, 0, 0, 1, 0)); | |
| 879 | + scarlet = null; | |
| 880 | + } | |
| 881 | + else if (event.equalsIgnoreCase("second_morph_07"))
| |
| 882 | + deleteNpc(npc); | |
| 883 | + else if (event.equalsIgnoreCase("second_morph_08"))
| |
| 884 | + {
| |
| 885 | + scarlet = (GrandBoss) addSpawn(SCARLET2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, false); | |
| 886 | + broadcastPacket(new SpecialCamera(scarlet.getObjectId(), 450, calcCameraAngle(npc), 12, 500, 14000, 0, 0, 1, 0)); | |
| 887 | + } | |
| 888 | + else if (event.equalsIgnoreCase("second_morph_09"))
| |
| 889 | + daemonMorph(scarlet, 2); | |
| 890 | + else if (event.equalsIgnoreCase("start_room"))
| |
| 891 | + setPrepareRoom(false); | |
| 892 | + else if (event.equalsIgnoreCase("die_01")) //TODO: die_01
| |
| 893 | + npc.doDie(npc); | |
| 894 | + else if (event.equalsIgnoreCase("die_02"))
| |
| 895 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 100, 120, 5, 0, 7000, 0, 0, 1, 0), new SpecialCamera(npc.getObjectId(), 100, 90, 5, 5000, 15000, 0, 0, 1, 0)); | |
| 896 | + else if (event.equalsIgnoreCase("die_03"))
| |
| 897 | + {
| |
| 898 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 900, 90, 25, 7000, 10000, 0, 0, 1, 0)); | |
| 899 | + addSpawn(29061, 174232, -88020, -5114, 16384, false, 900000, false); | |
| 900 | + startQuestTimer("remove_players", null, null, 900000);
| |
| 901 | + } | |
| 902 | + else if (event.equalsIgnoreCase("die_04"))
| |
| 903 | + {
| |
| 904 | + cancelQuestTimers("spawn_minion");
| |
| 905 | + clean(DEAD); | |
| 906 | + long respawnTime = (long) Config.SPAWN_INTERVAL_FRINTEZZA + Rnd.get(-Config.RANDOM_SPAWN_TIME_FRINTEZZA, Config.RANDOM_SPAWN_TIME_FRINTEZZA); | |
| 907 | + respawnTime *= 3600000; | |
| 908 | + startQuestTimer("frintezza_unlock", npc, null, respawnTime);
| |
| 909 | + // also save the respawn time so that the info is maintained past reboots | |
| 910 | + StatSet info = GrandBossManager.getInstance().getStatSet(FRINTEZZA); | |
| 911 | + info.set("respawn_time", System.currentTimeMillis() + respawnTime);
| |
| 912 | + GrandBossManager.getInstance().setStatSet(FRINTEZZA, info); | |
| 913 | + } | |
| 914 | + else if (event.equalsIgnoreCase("songs_play")) //TODO: play song
| |
| 915 | + callSongAI(); | |
| 916 | + else if (event.equalsIgnoreCase("skill_task")) //TODO: skill_task
| |
| 917 | + {
| |
| 918 | + if (npc.isInvul() || npc.getCast().isCastingNow() || npc.isDead() || frintezza.isInvul()) | |
| 919 | + return super.onTimer(event, npc, player); | |
| 920 | + | |
| 921 | + final L2Skill skill = getRandomSkill(); | |
| 922 | + int rnd = Rnd.get(10); | |
| 923 | + | |
| 924 | + if (_actualVictim == null || _actualVictim.isDead() || !npc.knows(_actualVictim) || npc.getScriptValue() != 1 && !npc.isMoving() || rnd == 0 && npc.isMoving()) | |
| 925 | + _actualVictim = getRandomPlayer(npc); | |
| 926 | + if (_actualVictim == null) | |
| 927 | + return super.onTimer(event, npc, player); | |
| 928 | + | |
| 929 | + int range = skill.getCastRange(); | |
| 930 | + if (_actualVictim.isMoving()) | |
| 931 | + range = range * 80 / 100; | |
| 932 | + if (MathUtil.checkIfInRange((int) (range + npc.getCollisionRadius()), npc, _actualVictim, true)) | |
| 933 | + {
| |
| 934 | + npc.getAI().tryToIdle(); //.getAI().setIntention(CtrlIntention.IDLE); | |
| 935 | + npc.getAI().tryToCast(_actualVictim, skill); // npc.doCast(skill); npc.setTarget(_actualVictim); | |
| 936 | + npc.setScriptValue(0); | |
| 937 | + if (rnd < 0) // 90% he decides to reconsiders his new target. | |
| 938 | + _actualVictim = null; | |
| 939 | + } | |
| 940 | + else | |
| 941 | + {
| |
| 942 | + npc.forceRunStance(); | |
| 943 | + npc.setScriptValue(1); | |
| 944 | + npc.getAI().tryToMoveTo(new Location(_actualVictim.getX(), _actualVictim.getY(), _actualVictim.getZ()), null);//npc.getAI().setIntention(CtrlIntention.FOLLOW, _actualVictim, null); | |
| 945 | + } | |
| 946 | + } | |
| 947 | + else if (event.equalsIgnoreCase("songs_effect"))
| |
| 948 | + {
| |
| 949 | + if (scarlet == null || frintezza == null || scarlet.isDead() || scarlet.isInvul() || frintezza.isDead() || frintezza.isInvul() || songEffect == null) | |
| 950 | + return super.onTimer(event, npc, player); | |
| 951 | + | |
| 952 | + if (frintezza.getScriptValue() == 1) | |
| 953 | + frintezza.getCast().doCast(songEffect, songEffect.getLevel() < 4 ? getKnownInside() : scarlet, null); | |
| 954 | + else | |
| 955 | + cancelQuestTimers("songs_effect");
| |
| 956 | + } | |
| 957 | + else if (event.equalsIgnoreCase("end_song")) // Stop effect song
| |
| 958 | + npc.setScriptValue(3); | |
| 959 | + else if (event.equalsIgnoreCase("timeNextSong")) // BreakingArrow - time next song
| |
| 960 | + npc.setScriptValue(0); | |
| 961 | + else if (event.equalsIgnoreCase("action"))
| |
| 962 | + broadcastPacket(new SocialAction(npc, 1)); | |
| 963 | + else if (event.equalsIgnoreCase("frintezza_unlock"))
| |
| 964 | + GrandBossManager.getInstance().setBossStatus(FRINTEZZA, DORMANT); | |
| 965 | + else if (event.equalsIgnoreCase("waiting"))
| |
| 966 | + {
| |
| 967 | + startQuestTimer("close", npc, null, 2700);
| |
| 968 | + startQuestTimer("beginning", null, null, 3000);//_LastImperialTomp.broadcastPacket(new Earthquake(174232, -88020, -5116, 45, 27));
| |
| 969 | + for (Creature cha : lastImperialTomp.getKnownTypeInside(Player.class)) | |
| 970 | + if (cha instanceof Player) | |
| 971 | + cha.broadcastPacket(new Earthquake(cha, 45, 27, false)); //174232, -88020, -5116, 45, 27)); | |
| 972 | + } | |
| 973 | + else if (event.equalsIgnoreCase("room1_spawn"))
| |
| 974 | + for (int[] loc : ROOM1_SPAWN) | |
| 975 | + _mobs.add(addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 0, false)); | |
| 976 | + else if (event.equalsIgnoreCase("room1_spawn2"))
| |
| 977 | + for (int[] loc : ROOM1_CAPTAIN) | |
| 978 | + _mobs.add(addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 0, false)); | |
| 979 | + else if (event.equalsIgnoreCase("room1_spawn3"))
| |
| 980 | + for (int[] loc : ROOM1_SUICIDAL_SOLDIER) | |
| 981 | + _mobs.add(addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 0, false)); | |
| 982 | + else if (event.equalsIgnoreCase("room1_spawn4"))
| |
| 983 | + for (int[] loc : ROOM1_GUARD) | |
| 984 | + _mobs.add(addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 0, false)); | |
| 985 | + else if (event.equalsIgnoreCase("room2_spawn"))
| |
| 986 | + for (int[] loc : ROOM2_SPAWN) | |
| 987 | + _mobs.add(addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 0, false)); | |
| 988 | + else if (event.equalsIgnoreCase("room2_spawn2"))
| |
| 989 | + for (int[] loc : ROOM2_SPAWN2) | |
| 990 | + _mobs.add(addSpawn(loc[0], loc[1], loc[2], loc[3], loc[4], false, 0, false)); | |
| 991 | + else if (event.equalsIgnoreCase("mobs_del"))
| |
| 992 | + {
| |
| 993 | + for (Npc mob : _mobs) | |
| 994 | + if (mob != null) | |
| 995 | + mob.deleteMe(); | |
| 996 | + _mobs.clear(); | |
| 997 | + } | |
| 998 | + else if (event.equalsIgnoreCase("clean"))
| |
| 999 | + _killMobs = 0; | |
| 1000 | + else if (event.equalsIgnoreCase("close"))
| |
| 1001 | + {
| |
| 1002 | + for (int i = 25150051; i <= 25150058; i++) | |
| 1003 | + openCloseDoor(false, i); | |
| 1004 | + | |
| 1005 | + for (int i = 25150061; i <= 25150070; i++) | |
| 1006 | + openCloseDoor(false, i); | |
| 1007 | + | |
| 1008 | + openCloseDoor(false, 25150042, 25150043, 25150045, 25150046); | |
| 1009 | + } | |
| 1010 | + else if (event.equalsIgnoreCase("enter"))
| |
| 1011 | + {
| |
| 1012 | + startQuestTimer("clean", null, null, 100);
| |
| 1013 | + startQuestTimer("close", null, null, 100);
| |
| 1014 | + startQuestTimer("room1_spawn", null, null, 4000);
| |
| 1015 | + startQuestTimer("room_final", null, null, 2100000); // 35min
| |
| 1016 | + } | |
| 1017 | + else if (event.equalsIgnoreCase("room_final"))
| |
| 1018 | + {
| |
| 1019 | + lastImperialTomp.broadcastPacket(new CreatureSay(npc.getObjectId(), SayType.SHOUT, npc.getName(), "Exceeded his time limit, challenge failed!")); | |
| 1020 | + startQuestTimer("remove_players", null, null, 0);
| |
| 1021 | + | |
| 1022 | + cancelQuestTimers("waiting");
| |
| 1023 | + startQuestTimer("clean", null, null, 1000);
| |
| 1024 | + startQuestTimer("close", null, null, 1000);
| |
| 1025 | + startQuestTimer("mobs_del", null, null, 1000);
| |
| 1026 | + | |
| 1027 | + GrandBossManager.getInstance().setBossStatus(Frintezza.FRINTEZZA, Frintezza.DORMANT); | |
| 1028 | + } | |
| 1029 | + else if (event.equalsIgnoreCase("remove_players"))
| |
| 1030 | + lastImperialTomp.oustAllPlayers(); | |
| 1031 | + | |
| 1032 | + return super.onTimer(event, npc, player); | |
| 1033 | + } | |
| 1034 | + | |
| 1035 | + private static void playFrintezzaMelody() | |
| 1036 | + {
| |
| 1037 | + // frintezza.getCast().doCast(Frintezza_Melody.getSkill(), frintezza, null); // frintezza.getAI().tryToCast(frintezza, Frintezza_Melody.getSkill()); | |
| 1038 | + L2Skill skill = new IntIntHolder(5006, 1).getSkill(); // If tryToCast or doCast is used in the last acis, it looks like a speen run, Frintezza's casting stats are wrong? | |
| 1039 | + broadcastPacket(new MagicSkillUse(frintezza, frintezza, skill.getId(), skill.getLevel(), skill.getHitTime(), skill.getReuseDelay())); | |
| 1040 | + } | |
| 1041 | + | |
| 1042 | + private void callSongAI() | |
| 1043 | + {
| |
| 1044 | + if (frintezza == null || frintezza.isDead() || frintezza.isInvul() || frintezza.getScriptValue() == 1) | |
| 1045 | + return; | |
| 1046 | + else if (frintezza.getScriptValue() == 0) | |
| 1047 | + {
| |
| 1048 | + boolean isRequiem = getState() == 3 && scarlet != null && scarlet.getStatus().getHp() < scarlet.getStatus().getMaxHp() * 0.6 && 100 < Rnd.get(80); | |
| 1049 | + // new song play | |
| 1050 | + int rnd = Rnd.get(100); | |
| 1051 | + for (FrintezzaSong song : FRINTEZZA_SONG_LIST) | |
| 1052 | + {
| |
| 1053 | + int songLvl = song.skill.getSkill().getLevel(); | |
| 1054 | + if (rnd < song.chance || isRequiem && songLvl == 1) | |
| 1055 | + {
| |
| 1056 | + L2Skill dummySkill = song.skill.getSkill(); | |
| 1057 | + songEffect = song.effectSkill.getSkill(); | |
| 1058 | + int hitTime = dummySkill.getHitTime(); | |
| 1059 | + broadcastPacket(new ExShowScreenMessage(1, -1, SMPOS.TOP_CENTER, false, 0, 0, 0, true, 4000, false, song.songName)); | |
| 1060 | + broadcastPacket(new MagicSkillUse(frintezza, frintezza, dummySkill.getId(), songLvl, hitTime, dummySkill.getReuseDelay())); | |
| 1061 | + startQuestTimer("songs_effect", scarlet, null, 10000);
| |
| 1062 | + startQuestTimer("endSong", frintezza, null, hitTime);
| |
| 1063 | + startQuestTimer("timeNextSong", frintezza, null, hitTime + Rnd.get(10000, 15000)/*Rnd.get(30000, 120000)*/);
| |
| 1064 | + frintezza.setScriptValue(1); | |
| 1065 | + return; | |
| 1066 | + } | |
| 1067 | + } | |
| 1068 | + } | |
| 1069 | + else if (frintezza.getScriptValue() == 2) | |
| 1070 | + {
| |
| 1071 | + frintezza.setScriptValue(3); | |
| 1072 | + startQuestTimer("timeNextSong", frintezza, null, Rnd.get(30000, 120000));
| |
| 1073 | + } | |
| 1074 | + } | |
| 1075 | + | |
| 1076 | + @Override | |
| 1077 | + public String onAttack(Npc npc, Creature attacker, int damage, L2Skill skill) | |
| 1078 | + {
| |
| 1079 | + if (GrandBossManager.getInstance().getBossStatus(FRINTEZZA) != FIGHTING || npc.isInvul()) | |
| 1080 | + return null; | |
| 1081 | + | |
| 1082 | + if (!FRINTEZZA_LAIR.isInsideZone(attacker)) | |
| 1083 | + {
| |
| 1084 | + attacker.teleportTo(150037 + Rnd.get(500), -57720 + Rnd.get(500), -2976, 0); | |
| 1085 | + return null; | |
| 1086 | + } | |
| 1087 | + if (npc.getNpcId() != FRINTEZZA && !FRINTEZZA_LAIR.isInsideZone(npc) || npc.getX() < 171932 || npc.getX() > 176532 || npc.getY() < -90320 || npc.getY() > -85720 || npc.getZ() < -5130) | |
| 1088 | + {
| |
| 1089 | + npc.enableAllSkills(); | |
| 1090 | + npc.setIsImmobilized(false); | |
| 1091 | + npc.teleportTo(174232, -88020, -5116, 0); | |
| 1092 | + return null; | |
| 1093 | + } | |
| 1094 | + | |
| 1095 | + switch (npc.getNpcId()) | |
| 1096 | + {
| |
| 1097 | + // When Dewdrop of Destruction is used on Portraits they suicide. | |
| 1098 | + case 29048: | |
| 1099 | + case 29049: | |
| 1100 | + if (skill != null && (skill.getId() == DEWDROP_OF_DESTRUCTION_SKILL_ID)) | |
| 1101 | + if (attacker.getTarget() == npc) | |
| 1102 | + npc.doDie(attacker); | |
| 1103 | + break; | |
| 1104 | + case 29050: | |
| 1105 | + case 29051: | |
| 1106 | + double hp = npc.getStatus().getHp(); | |
| 1107 | + double mm = npc.getStatus().getMaxHp() * 0.10; | |
| 1108 | + if (hp >= mm && hp - damage > 0 && hp - damage < mm) | |
| 1109 | + npc.enableSkill(Bomber_Ghost.getSkill()); | |
| 1110 | + break; | |
| 1111 | + case FRINTEZZA: | |
| 1112 | + if (skill != null && skill.getId() == BREAKING_ARROW_SKILL_ID) | |
| 1113 | + {
| |
| 1114 | + npc.setScriptValue(2); | |
| 1115 | + npc.abortAll(true); | |
| 1116 | + npc.getAI().tryToIdle(); | |
| 1117 | + getKnownInside().stopSkillEffects(5008); | |
| 1118 | + if (scarlet != null) | |
| 1119 | + scarlet.stopSkillEffects(5008); | |
| 1120 | + broadcastPacket(new MagicSkillCanceled(frintezza.getObjectId())); | |
| 1121 | + } | |
| 1122 | + npc.getStatus().setHp(npc.getStatus().getMaxHp(), true); | |
| 1123 | + break; | |
| 1124 | + case SCARLET1: | |
| 1125 | + synchronized (this) | |
| 1126 | + {
| |
| 1127 | + taskCameraMorph(getState(), npc); | |
| 1128 | + break; | |
| 1129 | + } | |
| 1130 | + } | |
| 1131 | + _lastAttackTime = System.currentTimeMillis(); | |
| 1132 | + return super.onAttack(npc, attacker, damage, skill); | |
| 1133 | + } | |
| 1134 | + | |
| 1135 | + @Override | |
| 1136 | + public String onSpellFinished(Npc npc, Player player, L2Skill skill) | |
| 1137 | + {
| |
| 1138 | + if (skill.isSuicideAttack() && npc.getNpcId() != FRINTEZZA) | |
| 1139 | + this.onKill(npc, null); | |
| 1140 | + return super.onSpellFinished(npc, player, skill); | |
| 1141 | + } | |
| 1142 | + | |
| 1143 | + @Override | |
| 1144 | + public String onKill(Npc npc, Creature killer) | |
| 1145 | + {
| |
| 1146 | + int StatusBoss = GrandBossManager.getInstance().getBossStatus(FRINTEZZA); | |
| 1147 | + if (StatusBoss == FIGHTING) | |
| 1148 | + {
| |
| 1149 | + if (npc.getNpcId() == SCARLET2) | |
| 1150 | + taskCameraMorph(getState(), npc); | |
| 1151 | + if (portraits.containsKey(npc)) | |
| 1152 | + portraits.remove(npc); | |
| 1153 | + if (demons.contains(npc)) | |
| 1154 | + demons.remove(npc); | |
| 1155 | + return null; | |
| 1156 | + } | |
| 1157 | + else if (StatusBoss == WAITING) | |
| 1158 | + {
| |
| 1159 | + switch(npc.getNpcId()) | |
| 1160 | + {
| |
| 1161 | + case 18329: | |
| 1162 | + case 18330: | |
| 1163 | + case 18331: | |
| 1164 | + case 18332: | |
| 1165 | + case 18333: | |
| 1166 | + if (Rnd.get(100) < 10) | |
| 1167 | + killer.getInventory().addItem("Quest", DEWDROP_OF_DESTRUCTION, 1, null, null);
| |
| 1168 | + break; | |
| 1169 | + case ALARM_DEVICE: | |
| 1170 | + if (Rnd.get(100) < 33) | |
| 1171 | + killer.getInventory().addItem("Quest", DEWDROP_OF_DESTRUCTION, 1, null, null);
| |
| 1172 | + _killMobs++; | |
| 1173 | + | |
| 1174 | + if (not_confirmed) | |
| 1175 | + if (_killMobs <= 3 && Rnd.get(100) < _killMobs * 5) // 5% chance first alarm, 10% in the second alarm | |
| 1176 | + for (int i = 25150051; i <= 25150058; i++) | |
| 1177 | + openCloseDoor(true, i); | |
| 1178 | + if (_killMobs == 1) | |
| 1179 | + startQuestTimer("room1_spawn2", npc, null, 200);
| |
| 1180 | + if (_killMobs == 2) | |
| 1181 | + startQuestTimer("room1_spawn3", npc, null, 200);
| |
| 1182 | + if (_killMobs == 3) | |
| 1183 | + startQuestTimer("room1_spawn4", npc, null, 200);
| |
| 1184 | + if (_killMobs == 4) | |
| 1185 | + {
| |
| 1186 | + for (int i = 25150051; i <= 25150058; i++) | |
| 1187 | + openCloseDoor(true, i); | |
| 1188 | + startQuestTimer("mobs_del", npc, null, 100);
| |
| 1189 | + startQuestTimer("room2_spawn", npc, null, 200);
| |
| 1190 | + | |
| 1191 | + openCloseDoor(true, 25150042, 25150043); //, 25150045, 25150046 | |
| 1192 | + } | |
| 1193 | + break; | |
| 1194 | + case 18339: | |
| 1195 | + if (_killMobs <= 6) | |
| 1196 | + _killMobs++; | |
| 1197 | + if (_killMobs == 6) | |
| 1198 | + {
| |
| 1199 | + openCloseDoor(false, 25150042, 25150043, 25150045, 25150046); | |
| 1200 | + for (int i = 25150061; i <= 25150070; i++) | |
| 1201 | + openCloseDoor(true, i); | |
| 1202 | + | |
| 1203 | + startQuestTimer("room2_spawn2", npc, null, 1000);
| |
| 1204 | + } | |
| 1205 | + break; | |
| 1206 | + case 18334: | |
| 1207 | + if (Rnd.get(100) < 33) | |
| 1208 | + killer.getInventory().addItem("Quest", BREAKING_ARROW, 1, null, null); // Breaking Arrow
| |
| 1209 | + if (_killMobs <= 14) | |
| 1210 | + _killMobs++; | |
| 1211 | + if (_killMobs == 14) | |
| 1212 | + {
| |
| 1213 | + startQuestTimer("mobs_del", npc, null, 100);
| |
| 1214 | + | |
| 1215 | + openCloseDoor(true, 25150045, 25150046); | |
| 1216 | + startQuestTimer("waiting", npc, null, Config.WAIT_TIME_FRINTEZZA * 3);
| |
| 1217 | + cancelQuestTimers("room_final");
| |
| 1218 | + startQuestTimer("clean", npc, null, 1000);
| |
| 1219 | + } | |
| 1220 | + break; | |
| 1221 | + } | |
| 1222 | + return null; | |
| 1223 | + } | |
| 1224 | + return super.onKill(npc, killer); | |
| 1225 | + } | |
| 1226 | + | |
| 1227 | + private static void openCloseDoor(boolean open, int... doorIds) | |
| 1228 | + {
| |
| 1229 | + for (int doorId : doorIds) | |
| 1230 | + if (open) | |
| 1231 | + DoorData.getInstance().getDoor(doorId).openMe(); | |
| 1232 | + else | |
| 1233 | + DoorData.getInstance().getDoor(doorId).closeMe(); | |
| 1234 | + } | |
| 1235 | + | |
| 1236 | + private static L2Skill getRandomSkill() //TODO: getRandomSkill() | |
| 1237 | + {
| |
| 1238 | + int[][] FIRST_SCARLET_SKILLS = | |
| 1239 | + {
| |
| 1240 | + { 5014, 1, 100}, // Frintezza's Daemon Attack 1
| |
| 1241 | + { 5015, 1, 5 }, // Frintezza's Daemon Charge 1
| |
| 1242 | + { 5015, 4, 5 }, // Frintezza's Daemon Charge 4
| |
| 1243 | + }; | |
| 1244 | + int[][] SECOND_SCARLET_SKILLS = | |
| 1245 | + {
| |
| 1246 | + { 5014, 2, 100}, // Frintezza's Daemon Attack
| |
| 1247 | + { 5015, 2, 5 }, // Frintezza's Daemon Charge 2
| |
| 1248 | + { 5015, 5, 5 }, // Frintezza's Daemon Charge 5
| |
| 1249 | + { 5018, 1, 10 }, // Frintezza's Daemon Field 1
| |
| 1250 | + { 5016, 1, 10 }, // Yoke of Scarlet
| |
| 1251 | + }; | |
| 1252 | + int[][] THIRD_SCARLET_SKILLS = | |
| 1253 | + {
| |
| 1254 | + { 5014, 3, 100}, // Frintezza's Daemon Attack
| |
| 1255 | + { 5015, 3, 5 }, // Frintezza's Daemon Charge 3
| |
| 1256 | + { 5015, 6, 5 }, // Frintezza's Daemon Charge 6
| |
| 1257 | + { 5018, 2, 10 }, // Frintezza's Daemon Field 2
| |
| 1258 | + { 5019, 1, 10 }, // Frintezza's Daemon Drain
| |
| 1259 | + { 5016, 1, 10 }, // Yoke of Scarlet
| |
| 1260 | + }; | |
| 1261 | + int skillLvl = getState(); | |
| 1262 | + if (skillLvl == 1) | |
| 1263 | + scarletSkills = FIRST_SCARLET_SKILLS; | |
| 1264 | + else if (skillLvl == 2) | |
| 1265 | + scarletSkills = SECOND_SCARLET_SKILLS; | |
| 1266 | + else if (skillLvl == 3) | |
| 1267 | + scarletSkills = THIRD_SCARLET_SKILLS; | |
| 1268 | + | |
| 1269 | + int rnd = Rnd.get(100); | |
| 1270 | + for (int i = scarletSkills.length; --i >= 0;) | |
| 1271 | + {
| |
| 1272 | + int[] sk = scarletSkills[i]; | |
| 1273 | + int chance = sk[2]; | |
| 1274 | + if ((rnd -= chance) <= 0) | |
| 1275 | + return new IntIntHolder(sk[0], sk[1]).getSkill(); | |
| 1276 | + } | |
| 1277 | + return null; | |
| 1278 | + } | |
| 1279 | + | |
| 1280 | + private static int calcCameraAngle(Creature npc) | |
| 1281 | + {
| |
| 1282 | + final int heading = npc.getHeading(); | |
| 1283 | + return Math.abs((heading < 32768 ? 180 : 540) - (int)(heading / 182.044444444)); | |
| 1284 | + } | |
| 1285 | + | |
| 1286 | + private static void throwUp(Creature attacker, final double range, SystemMessage msg) | |
| 1287 | + {
| |
| 1288 | + final int mx = attacker.getX(), my = attacker.getY(); | |
| 1289 | + for (Creature target : FRINTEZZA_LAIR.getKnownTypeInside(Creature.class))//.getCharactersInside()) | |
| 1290 | + {
| |
| 1291 | + if (target == attacker) | |
| 1292 | + continue; | |
| 1293 | + if (target instanceof Npc && ((Npc) target).getNpcId() >= 29045 && ((Npc) target).getNpcId() <= 29053) | |
| 1294 | + continue; | |
| 1295 | + double dx = target.getX() - mx; | |
| 1296 | + double dy = target.getY() - my; | |
| 1297 | + if (dx == 0 && dy == 0) | |
| 1298 | + dx = dy = range / 2; | |
| 1299 | + double aa = range / Math.sqrt(dx * dx + dy * dy); | |
| 1300 | + if (aa > 1.0) | |
| 1301 | + {
| |
| 1302 | + int x = mx + (int) (dx * aa); | |
| 1303 | + int y = my + (int) (dy * aa); | |
| 1304 | + int z = target.getZ(); | |
| 1305 | + | |
| 1306 | + target.abortAll(true); //cha.abortAttack(); //cha.abortCast(); | |
| 1307 | + target.getAI().tryToIdle(); //target.getAI().setIntention(CtrlIntention.IDLE); | |
| 1308 | + | |
| 1309 | + target.broadcastPacket(new FlyToLocation(target, x, y, z, FlyType.THROW_UP)); | |
| 1310 | + target.setXYZ(x, y, z); | |
| 1311 | + target.getPosition().setHeading(MathUtil.calculateHeadingFrom(x, y, mx, my)); | |
| 1312 | + target.broadcastPacket(new ValidateLocation(target)); | |
| 1313 | + if (msg != null) | |
| 1314 | + target.sendPacket(msg); | |
| 1315 | + if (target instanceof Player) | |
| 1316 | + ((Player) target).standUp(); | |
| 1317 | + } | |
| 1318 | + } | |
| 1319 | + } | |
| 1320 | + | |
| 1321 | + private static class FrintezzaSong | |
| 1322 | + {
| |
| 1323 | + public IntIntHolder skill; | |
| 1324 | + public IntIntHolder effectSkill; | |
| 1325 | + public String songName; | |
| 1326 | + public int chance; | |
| 1327 | + | |
| 1328 | + public FrintezzaSong(IntIntHolder sk, IntIntHolder esk, String sn, int ch) | |
| 1329 | + {
| |
| 1330 | + skill = sk; | |
| 1331 | + effectSkill = esk; | |
| 1332 | + songName = sn; | |
| 1333 | + chance = ch; | |
| 1334 | + } | |
| 1335 | + } | |
| 1336 | + | |
| 1337 | + private final FrintezzaSong[] FRINTEZZA_SONG_LIST = | |
| 1338 | + {
| |
| 1339 | + new FrintezzaSong(new IntIntHolder(5007, 1), new IntIntHolder(5008, 1), "Requiem of Hatred", 5), | |
| 1340 | + new FrintezzaSong(new IntIntHolder(5007, 2), new IntIntHolder(5008, 2), "Rondo of Solitude", 50), | |
| 1341 | + new FrintezzaSong(new IntIntHolder(5007, 3), new IntIntHolder(5008, 3), "Frenetic Toccata", 70), | |
| 1342 | + new FrintezzaSong(new IntIntHolder(5007, 4), new IntIntHolder(5008, 4), "Fugue of Jubilation", 90), | |
| 1343 | + new FrintezzaSong(new IntIntHolder(5007, 5), new IntIntHolder(5008, 5), "Hypnotic Mazurka", 100), | |
| 1344 | + }; | |
| 1345 | + | |
| 1346 | + private static void broadcastPacket(L2GameServerPacket... packets) | |
| 1347 | + {
| |
| 1348 | + for (L2GameServerPacket packet : packets) | |
| 1349 | + FRINTEZZA_LAIR.broadcastPacket(packet); | |
| 1350 | + } | |
| 1351 | + | |
| 1352 | + private void daemonMorph(Npc npc, int stage) | |
| 1353 | + {
| |
| 1354 | + npc.setCollisionHeight(stage == 1 ? 110 : 130); | |
| 1355 | + broadcastPacket(new SocialAction(npc, stage == 1 ? 4 : 2)); | |
| 1356 | + final IntIntHolder Daemon_Morph = new IntIntHolder(5017, 1); | |
| 1357 | + npc.getCast().doCast(Daemon_Morph.getSkill(), npc, null); | |
| 1358 | + broadcastPacket(new NpcInfo(npc, null)); | |
| 1359 | + roomTasks(); | |
| 1360 | + } | |
| 1361 | + | |
| 1362 | + private void setPrepareRoom(boolean move) | |
| 1363 | + {
| |
| 1364 | + for (Creature cha : FRINTEZZA_LAIR.getKnownTypeInside(Creature.class)) | |
| 1365 | + {
| |
| 1366 | + if (cha != null) | |
| 1367 | + {
| |
| 1368 | + if (frintezza != cha || frintezza == null) | |
| 1369 | + cha.setInvul(move); | |
| 1370 | + if (move) | |
| 1371 | + {
| |
| 1372 | + cha.getAI().tryToIdle(); | |
| 1373 | + cha.abortAll(true); | |
| 1374 | + if (frintezza != null) | |
| 1375 | + {
| |
| 1376 | + if (move) | |
| 1377 | + cha.setInvul(true); | |
| 1378 | + dropTimers(); | |
| 1379 | + frintezza.setScriptValue(1); | |
| 1380 | + broadcastPacket(new MagicSkillCanceled(frintezza.getObjectId())); | |
| 1381 | + } | |
| 1382 | + } | |
| 1383 | + if (!(cha instanceof GrandBoss)) | |
| 1384 | + {
| |
| 1385 | + if (move) | |
| 1386 | + {
| |
| 1387 | + cha.disableAllSkills(); | |
| 1388 | + if (cha instanceof Monster) | |
| 1389 | + cha.forceRunStance();//cha.setRunning(true); | |
| 1390 | + } | |
| 1391 | + else | |
| 1392 | + cha.enableAllSkills(); | |
| 1393 | + cha.setIsImmobilized(move); | |
| 1394 | + cha.setIsParalyzed(move); | |
| 1395 | + } | |
| 1396 | + } | |
| 1397 | + } | |
| 1398 | + } | |
| 1399 | + | |
| 1400 | + private void roomTasks() | |
| 1401 | + {
| |
| 1402 | + _lastAttackTime = System.currentTimeMillis(); | |
| 1403 | + startQuestTimerAtFixedRate("songs_play", frintezza, null, 5000);
| |
| 1404 | + startQuestTimerAtFixedRate("skill_task", scarlet, null, 2500);
| |
| 1405 | + startQuestTimerAtFixedRate("spawn_minion", null, null, 20000);
| |
| 1406 | + startQuestTimer("despawn", scarlet, null, 60000);
| |
| 1407 | + frintezza.setScriptValue(0); | |
| 1408 | + } | |
| 1409 | + | |
| 1410 | + private static void deleteNpc(Npc... npcs) | |
| 1411 | + {
| |
| 1412 | + for (Npc npc : npcs) | |
| 1413 | + {
| |
| 1414 | + if (npc != null) | |
| 1415 | + npc.deleteMe(); | |
| 1416 | + npc = null; | |
| 1417 | + } | |
| 1418 | + } | |
| 1419 | + | |
| 1420 | + private void clean(int status) | |
| 1421 | + {
| |
| 1422 | + if (!demons.isEmpty()) | |
| 1423 | + for (Npc mobs : demons) | |
| 1424 | + deleteNpc(mobs); | |
| 1425 | + if (!portraits.isEmpty()) | |
| 1426 | + for (Monster portrait : portraits.keySet()) | |
| 1427 | + deleteNpc(portrait); | |
| 1428 | + deleteNpc(scarlet, frintezza); | |
| 1429 | + demons.clear(); | |
| 1430 | + portraits.clear(); | |
| 1431 | + GrandBossManager.getInstance().setBossStatus(FRINTEZZA, status); | |
| 1432 | + | |
| 1433 | + _lastAttackTime = 0; | |
| 1434 | + songEffect = null; | |
| 1435 | + } | |
| 1436 | + | |
| 1437 | + private static int getState() | |
| 1438 | + {
| |
| 1439 | + final IntIntHolder Daemon_Morph = new IntIntHolder(5017, 1); | |
| 1440 | + if (scarlet != null) | |
| 1441 | + {
| |
| 1442 | + if (scarlet.getNpcId() == SCARLET2) | |
| 1443 | + return 3; | |
| 1444 | + AbstractEffect[] effects = scarlet.getAllEffects(); | |
| 1445 | + if (effects.length != 0) | |
| 1446 | + for (AbstractEffect e : effects) | |
| 1447 | + if (e.getSkill() == Daemon_Morph.getSkill()) | |
| 1448 | + return 2; | |
| 1449 | + return 1; | |
| 1450 | + } | |
| 1451 | + return 0; | |
| 1452 | + } | |
| 1453 | + | |
| 1454 | + private void dropTimers() | |
| 1455 | + {
| |
| 1456 | + cancelQuestTimers("despawn");
| |
| 1457 | + cancelQuestTimers("spawn_minion");
| |
| 1458 | + cancelQuestTimers("skill_task");
| |
| 1459 | + cancelQuestTimers("songs_play");
| |
| 1460 | + cancelQuestTimers("songs_effect");
| |
| 1461 | + cancelQuestTimers("end_song");
| |
| 1462 | + cancelQuestTimers("timeNextSong");
| |
| 1463 | + } | |
| 1464 | + | |
| 1465 | + private void taskCameraMorph(int state, Npc npc) | |
| 1466 | + {
| |
| 1467 | + if (frintezza.isInvul()) | |
| 1468 | + return; | |
| 1469 | + final double hpRatio = npc.getStatus().getHp() / npc.getStatus().getMaxHp(); | |
| 1470 | + if (state == 1 && hpRatio < 0.75) | |
| 1471 | + {
| |
| 1472 | + setPrepareRoom(true); | |
| 1473 | + startQuestTimer("first_morph_01", npc, null, 1100);
| |
| 1474 | + startQuestTimer("first_morph_02", npc, null, 4100);
| |
| 1475 | + startQuestTimer("first_morph_03", npc, null, 8100);
| |
| 1476 | + startQuestTimer("start_room", npc, null, 11100);
| |
| 1477 | + startQuestTimer("end_camera", frintezza, null, 14100);
| |
| 1478 | + } | |
| 1479 | + else if (state == 2 && hpRatio < 0.5) | |
| 1480 | + {
| |
| 1481 | + setPrepareRoom(true); | |
| 1482 | + startQuestTimer("second_morph_01", npc, null, 2000);
| |
| 1483 | + startQuestTimer("second_morph_02", npc, null, 2100);
| |
| 1484 | + startQuestTimer("second_morph_03", frintezza, null, 6300);
| |
| 1485 | + startQuestTimer("second_morph_04", frintezza, null, 9300);
| |
| 1486 | + startQuestTimer("second_morph_05", npc, null, 12300);
| |
| 1487 | + startQuestTimer("second_morph_06", npc, null, 12800);
| |
| 1488 | + startQuestTimer("second_morph_07", npc, null, 19050);
| |
| 1489 | + startQuestTimer("second_morph_08", npc, null, 20000);
| |
| 1490 | + startQuestTimer("second_morph_09", npc, null, 28100);
| |
| 1491 | + startQuestTimer("start_room", npc, null, 34100);
| |
| 1492 | + startQuestTimer("end_camera", frintezza, null, 37100);
| |
| 1493 | + } | |
| 1494 | + if (state == 3 && npc.getNpcId() == SCARLET2) | |
| 1495 | + {
| |
| 1496 | + setPrepareRoom(true); | |
| 1497 | + broadcastPacket(new SpecialCamera(npc.getObjectId(), 300, calcCameraAngle(npc) - 180, 5, 0, 7000, 0, 0, 1, 0), new SpecialCamera(npc.getObjectId(), 200, calcCameraAngle(npc), 85, 4000, 10000, 0, 0, 1, 0)); | |
| 1498 | + startQuestTimer("die_01", frintezza, null, 7400);
| |
| 1499 | + startQuestTimer("die_02", frintezza, null, 7500);
| |
| 1500 | + startQuestTimer("die_03", frintezza, null, 14500);
| |
| 1501 | + startQuestTimer("die_04", frintezza, null, 22500);
| |
| 1502 | + startQuestTimer("start_room", frintezza, null, 21500);
| |
| 1503 | + } | |
| 1504 | + } | |
| 1505 | + | |
| 1506 | + private static Creature getKnownInside() | |
| 1507 | + {
| |
| 1508 | + for (Creature ch : FRINTEZZA_LAIR.getKnownTypeInside(Creature.class)) | |
| 1509 | + if (ch instanceof Player) | |
| 1510 | + return ch; | |
| 1511 | + return null; | |
| 1512 | + } | |
| 1513 | +} | |
| 1514 | \ No newline at end of file | |
| 1515 | diff --git aCis_game/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java aCis_game/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java | |
| 1516 | index cee8e32..c6de41b 100644 | |
| 1517 | --- aCis_game/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java | |
| 1518 | +++ aCis_game/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java | |
| 1519 | @@ -12,11 +12,14 @@ | |
| 1520 | import net.sf.l2j.gameserver.data.xml.ScriptData; | |
| 1521 | import net.sf.l2j.gameserver.model.actor.Npc; | |
| 1522 | import net.sf.l2j.gameserver.model.actor.Player; | |
| 1523 | +import net.sf.l2j.gameserver.model.group.CommandChannel; | |
| 1524 | +import net.sf.l2j.gameserver.model.group.Party; | |
| 1525 | import net.sf.l2j.gameserver.model.location.Location; | |
| 1526 | import net.sf.l2j.gameserver.model.zone.type.BossZone; | |
| 1527 | import net.sf.l2j.gameserver.scripting.Quest; | |
| 1528 | import net.sf.l2j.gameserver.scripting.script.ai.boss.Antharas; | |
| 1529 | import net.sf.l2j.gameserver.scripting.script.ai.boss.Baium; | |
| 1530 | +import net.sf.l2j.gameserver.scripting.script.ai.boss.Frintezza; | |
| 1531 | import net.sf.l2j.gameserver.scripting.script.ai.boss.Sailren; | |
| 1532 | import net.sf.l2j.gameserver.scripting.script.ai.boss.Valakas; | |
| 1533 | ||
| 1534 | @@ -47,6 +50,18 @@ | |
| 1535 | new Location(115488, 22096, -5168) | |
| 1536 | }; | |
| 1537 | ||
| 1538 | + private static final Location[] FRINTEZZA_IN = | |
| 1539 | + {
| |
| 1540 | + new Location(174102, -76039, -5105), | |
| 1541 | + new Location(173235, -76884, -5105), | |
| 1542 | + new Location(175003, -76933, -5105), | |
| 1543 | + new Location(174196, -76190, -5105), | |
| 1544 | + new Location(174013, -76120, -5105), | |
| 1545 | + new Location(173263, -75161, -5105) | |
| 1546 | + }; | |
| 1547 | + | |
| 1548 | + private static final Location FRINTEZZA_OUT = new Location(150037, -57720, -2976); | |
| 1549 | + | |
| 1550 | private static final Location SAILREN_IN = new Location(27333, -6835, -1970); | |
| 1551 | private static final Location[] SAILREN_OUT = | |
| 1552 | {
| |
| 1553 | @@ -62,7 +77,7 @@ | |
| 1554 | super(-1, "teleport"); | |
| 1555 | ||
| 1556 | addFirstTalkId(29055, 31862); | |
| 1557 | - addTalkId(13001, 29055, 31859, 31384, 31385, 31540, 31686, 31687, 31759, 31862, 32107, 32109); | |
| 1558 | + addTalkId(13001, 29055, 31859, 31384, 31385, 31540, 31686, 31687, 31759, 31862, 32107, 32109, 32011, 29061); | |
| 1559 | } | |
| 1560 | ||
| 1561 | @Override | |
| 1562 | @@ -169,6 +184,10 @@ | |
| 1563 | htmltext = "13001-03.htm"; | |
| 1564 | } | |
| 1565 | break; | |
| 1566 | + | |
| 1567 | + case 29061: | |
| 1568 | + player.teleportTo(FRINTEZZA_OUT.getX() + Rnd.get(500), FRINTEZZA_OUT.getY() + Rnd.get(500), FRINTEZZA_OUT.getZ(), 0); | |
| 1569 | + break; | |
| 1570 | ||
| 1571 | case 31859: | |
| 1572 | player.teleportTo(79800 + Rnd.get(600), 151200 + Rnd.get(1100), -3534, 0); | |
| 1573 | @@ -232,7 +251,88 @@ | |
| 1574 | case 31759: | |
| 1575 | player.teleportTo(150037, -57720, -2976, 250); | |
| 1576 | break; | |
| 1577 | - | |
| 1578 | + | |
| 1579 | + case 32011: | |
| 1580 | + status = GrandBossManager.getInstance().getBossStatus(Frintezza.FRINTEZZA); | |
| 1581 | + if (status == Frintezza.DORMANT) | |
| 1582 | + {
| |
| 1583 | + final BossZone tomb = ZoneManager.getInstance().getZoneById(110012, BossZone.class); | |
| 1584 | + if (player.isGM()) | |
| 1585 | + {
| |
| 1586 | + ScriptData.getInstance().getQuest("Frintezza").startQuestTimer("enter", null, player, 1000);
| |
| 1587 | + GrandBossManager.getInstance().setBossStatus(Frintezza.FRINTEZZA, Frintezza.WAITING); | |
| 1588 | + byte locCycle = 0; | |
| 1589 | + final List<Player> party = player.getParty().getMembers(); | |
| 1590 | + if (player.getParty() != null) | |
| 1591 | + {
| |
| 1592 | + for (Player member : party) | |
| 1593 | + {
| |
| 1594 | + if (tomb != null) | |
| 1595 | + {
| |
| 1596 | + tomb.allowPlayerEntry(member, 30); | |
| 1597 | + member.teleportTo(FRINTEZZA_IN[locCycle], 100); | |
| 1598 | + } | |
| 1599 | + locCycle++; | |
| 1600 | + if (locCycle >= 6) | |
| 1601 | + locCycle = 1; | |
| 1602 | + } | |
| 1603 | + } | |
| 1604 | + else | |
| 1605 | + player.teleportTo(FRINTEZZA_IN[locCycle], 100); | |
| 1606 | + break; | |
| 1607 | + } | |
| 1608 | + if ((!player.isInParty() || !player.getParty().isLeader(player)) || (player.getParty().getCommandChannel() == null) || (player.getParty().getCommandChannel().getLeader() != player)) | |
| 1609 | + htmltext = "32011-03.htm"; | |
| 1610 | + else if (player.getParty().getCommandChannel().getParties().size() < 2 || player.getParty().getCommandChannel().getParties().size() > 5) | |
| 1611 | + htmltext = "32011-04.htm"; | |
| 1612 | + else | |
| 1613 | + {
| |
| 1614 | + if (!player.destroyItemByItemId("Quest", 8073, 1, player, true))
| |
| 1615 | + return "32011-05.htm"; | |
| 1616 | + | |
| 1617 | + byte locCycle = 0; | |
| 1618 | + ScriptData.getInstance().getQuest("Frintezza").startQuestTimer("enter", null, player, 1000);
| |
| 1619 | + GrandBossManager.getInstance().setBossStatus(Frintezza.FRINTEZZA, Frintezza.WAITING); | |
| 1620 | + | |
| 1621 | + if (player.getParty() != null) | |
| 1622 | + {
| |
| 1623 | + CommandChannel CommandChannel = player.getParty().getCommandChannel(); | |
| 1624 | + if (CommandChannel != null) | |
| 1625 | + for (Party party : CommandChannel.getParties()) | |
| 1626 | + {
| |
| 1627 | + if (party == null) | |
| 1628 | + continue; | |
| 1629 | + for (Player member : party.getMembers()) | |
| 1630 | + {
| |
| 1631 | + if (member == null || member.getStatus().getLevel() < 74 || !MathUtil.checkIfInRange(700, npc, member, true)) | |
| 1632 | + continue; | |
| 1633 | + if (CommandChannel.getMembersCount() > 45) | |
| 1634 | + {
| |
| 1635 | + member.sendMessage("The number of challenges have been full, so can not enter.");
| |
| 1636 | + break; | |
| 1637 | + } | |
| 1638 | + | |
| 1639 | + if (tomb != null) | |
| 1640 | + {
| |
| 1641 | + tomb.allowPlayerEntry(member, 30); | |
| 1642 | + member.teleportTo(FRINTEZZA_IN[locCycle], 100); | |
| 1643 | + } | |
| 1644 | + member.destroyItemByItemId(getName(), 8556, member.getInventory().getItemCount(8556, -1), null, true); | |
| 1645 | + member.destroyItemByItemId(getName(), 8192, member.getInventory().getItemCount(8192, -1), null, true); | |
| 1646 | + } | |
| 1647 | + locCycle++; | |
| 1648 | + if (locCycle >= 6) | |
| 1649 | + locCycle = 1; | |
| 1650 | + } | |
| 1651 | + } | |
| 1652 | + } | |
| 1653 | + } | |
| 1654 | + if (status == Frintezza.DEAD) | |
| 1655 | + htmltext = "32011-01.htm"; | |
| 1656 | + else | |
| 1657 | + htmltext = "32011-02.htm"; | |
| 1658 | + break; | |
| 1659 | + | |
| 1660 | case 32107: | |
| 1661 | player.teleportTo(Rnd.get(SAILREN_OUT), 100); | |
| 1662 | break; | |
| 1663 | diff --git aCis_game/java/net/sf/l2j/gameserver/skills/effects/EffectDanceStun.java aCis_game/java/net/sf/l2j/gameserver/skills/effects/EffectDanceStun.java | |
| 1664 | new file mode 100644 | |
| 1665 | index 0000000..8a6a80a | |
| 1666 | --- /dev/null | |
| 1667 | +++ aCis_game/java/net/sf/l2j/gameserver/skills/effects/EffectDanceStun.java | |
| 1668 | @@ -0,0 +1,74 @@ | |
| 1669 | +/* | |
| 1670 | + * This program is free software: you can redistribute it and/or modify it under | |
| 1671 | + * the terms of the GNU General Public License as published by the Free Software | |
| 1672 | + * Foundation, either version 3 of the License, or (at your option) any later | |
| 1673 | + * version. | |
| 1674 | + * | |
| 1675 | + * This program is distributed in the hope that it will be useful, but WITHOUT | |
| 1676 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 1677 | + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 1678 | + * details. | |
| 1679 | + * | |
| 1680 | + * You should have received a copy of the GNU General Public License along with | |
| 1681 | + * this program. If not, see <http://www.gnu.org/licenses/>. | |
| 1682 | + */ | |
| 1683 | +package net.sf.l2j.gameserver.skills.effects; | |
| 1684 | + | |
| 1685 | +import net.sf.l2j.gameserver.enums.skills.AbnormalEffect; | |
| 1686 | +import net.sf.l2j.gameserver.enums.skills.EffectType; | |
| 1687 | +import net.sf.l2j.gameserver.model.actor.Creature; | |
| 1688 | +import net.sf.l2j.gameserver.skills.AbstractEffect; | |
| 1689 | +import net.sf.l2j.gameserver.skills.L2Skill; | |
| 1690 | + | |
| 1691 | +/** | |
| 1692 | + * Copy from http://www.l2jserver.com/forum/viewtopic.php?f=69&t=13999 | |
| 1693 | + * @author KKnD | |
| 1694 | + */ | |
| 1695 | +public class EffectDanceStun extends AbstractEffect | |
| 1696 | +{
| |
| 1697 | + public EffectDanceStun(EffectTemplate template, L2Skill skill, Creature effected, Creature effector) | |
| 1698 | + {
| |
| 1699 | + super(template, skill, effected, effector); | |
| 1700 | + } | |
| 1701 | + | |
| 1702 | + @Override | |
| 1703 | + public EffectType getEffectType() | |
| 1704 | + {
| |
| 1705 | + return EffectType.STUN; | |
| 1706 | + } | |
| 1707 | + | |
| 1708 | + /** Notify started */ | |
| 1709 | + @Override | |
| 1710 | + public boolean onStart() | |
| 1711 | + {
| |
| 1712 | + if (getEffected().isStunned() || getEffected().isImmobilized()) | |
| 1713 | + return false; | |
| 1714 | + int e = getEffected().getAbnormalEffect(); | |
| 1715 | + if ((e & AbnormalEffect.FLOATING_ROOT.getMask()) != 0 || (e & AbnormalEffect.DANCE_STUNNED.getMask()) != 0) | |
| 1716 | + return false; | |
| 1717 | + | |
| 1718 | + // Abort attack, cast and move. | |
| 1719 | + getEffected().abortAll(false); | |
| 1720 | + | |
| 1721 | + getEffected().startAbnormalEffect(AbnormalEffect.DANCE_STUNNED); | |
| 1722 | + getEffected().setIsImmobilized(true); | |
| 1723 | + getEffected().disableAllSkills(); | |
| 1724 | + return true; | |
| 1725 | + } | |
| 1726 | + | |
| 1727 | + /** Notify exited */ | |
| 1728 | + @Override | |
| 1729 | + public void onExit() | |
| 1730 | + {
| |
| 1731 | + getEffected().stopAbnormalEffect(AbnormalEffect.DANCE_STUNNED); | |
| 1732 | + getEffected().setIsImmobilized(false); | |
| 1733 | + getEffected().enableAllSkills(); | |
| 1734 | + } | |
| 1735 | + | |
| 1736 | + @Override | |
| 1737 | + public boolean onActionTime() | |
| 1738 | + {
| |
| 1739 | + // just stop this effect | |
| 1740 | + return false; | |
| 1741 | + } | |
| 1742 | +} | |
| 1743 | \ No newline at end of file | |
| 1744 | diff --git aCis_game/java/net/sf/l2j/gameserver/skills/effects/EffectFloatStun.java aCis_game/java/net/sf/l2j/gameserver/skills/effects/EffectFloatStun.java | |
| 1745 | new file mode 100644 | |
| 1746 | index 0000000..221b06e | |
| 1747 | --- /dev/null | |
| 1748 | +++ aCis_game/java/net/sf/l2j/gameserver/skills/effects/EffectFloatStun.java | |
| 1749 | @@ -0,0 +1,59 @@ | |
| 1750 | +package net.sf.l2j.gameserver.skills.effects; | |
| 1751 | + | |
| 1752 | +import net.sf.l2j.gameserver.enums.skills.AbnormalEffect; | |
| 1753 | +import net.sf.l2j.gameserver.enums.skills.EffectType; | |
| 1754 | +import net.sf.l2j.gameserver.model.actor.Creature; | |
| 1755 | +import net.sf.l2j.gameserver.skills.AbstractEffect; | |
| 1756 | +import net.sf.l2j.gameserver.skills.L2Skill; | |
| 1757 | + | |
| 1758 | +/** | |
| 1759 | + * Copy from EffectDanceStun.java | |
| 1760 | + */ | |
| 1761 | +public class EffectFloatStun extends AbstractEffect | |
| 1762 | +{
| |
| 1763 | + public EffectFloatStun(EffectTemplate template, L2Skill skill, Creature effected, Creature effector) | |
| 1764 | + {
| |
| 1765 | + super(template, skill, effected, effector); | |
| 1766 | + } | |
| 1767 | + | |
| 1768 | + @Override | |
| 1769 | + public EffectType getEffectType() | |
| 1770 | + {
| |
| 1771 | + return EffectType.STUN; | |
| 1772 | + } | |
| 1773 | + | |
| 1774 | + @Override | |
| 1775 | + public boolean onStart() | |
| 1776 | + {
| |
| 1777 | + if (getEffected().isStunned() || getEffected().isImmobilized()) | |
| 1778 | + return false; | |
| 1779 | + int e = getEffected().getAbnormalEffect(); | |
| 1780 | + if ((e & AbnormalEffect.FLOATING_ROOT.getMask()) != 0 || (e & AbnormalEffect.DANCE_STUNNED.getMask()) != 0) | |
| 1781 | + return false; | |
| 1782 | + | |
| 1783 | + // Abort attack, cast and move. | |
| 1784 | + getEffected().abortAll(false); | |
| 1785 | + | |
| 1786 | + getEffected().getAI().tryToIdle(); | |
| 1787 | + | |
| 1788 | + getEffected().startAbnormalEffect(AbnormalEffect.FLOATING_ROOT); | |
| 1789 | + getEffected().setIsImmobilized(true); | |
| 1790 | + getEffected().disableAllSkills(); | |
| 1791 | + return true; | |
| 1792 | + } | |
| 1793 | + | |
| 1794 | + @Override | |
| 1795 | + public void onExit() | |
| 1796 | + {
| |
| 1797 | + getEffected().stopAbnormalEffect(AbnormalEffect.FLOATING_ROOT); | |
| 1798 | + getEffected().setIsImmobilized(false); | |
| 1799 | + getEffected().enableAllSkills(); | |
| 1800 | + } | |
| 1801 | + | |
| 1802 | + @Override | |
| 1803 | + public boolean onActionTime() | |
| 1804 | + {
| |
| 1805 | + // just stop this effect | |
| 1806 | + return false; | |
| 1807 | + } | |
| 1808 | +} | |
| 1809 | \ No newline at end of file | |
| 1810 |