Some syncs with l2jserver.

Also QuestState cleanup.
This commit is contained in:
MobiusDev 2017-08-15 12:36:39 +00:00
parent 84f82612cf
commit c4f94bcc0f
652 changed files with 12410 additions and 4435 deletions

View File

@ -26480,7 +26480,7 @@ INSERT INTO `spawnlist` VALUES
-- Separated Soul
("dragon_valley", 1, 32870, 146014, 111226, -3560, 0, 0, 2366, 60, 0, 0, 0),
-- Dragon Vortex
("dragon_valley", 1, 32871, 92225, 113873, -3062, 0, 0, 34000, 60, 0, 0, 0),
("dragon_valley", 1, 32871, 92225, 113873, -3062, 0, 0, 0, 60, 0, 0, 0),
-- [22_22]
@ -32367,9 +32367,9 @@ INSERT INTO `spawnlist` VALUES
-- Separated Soul
("dragon_valley", 1, 32867, 116946, 113555, -3056, 0, 0, 2002, 60, 0, 0, 0),
-- Dragon Vortex
("dragon_valley", 1, 32871, 108924, 111992, -3028, 0, 0, 34000, 60, 0, 0, 0),
("dragon_valley", 1, 32871, 110116, 125500, -3664, 0, 0, 34000, 60, 0, 0, 0),
("dragon_valley", 1, 32871, 121172, 113348, -3776, 0, 0, 34000, 60, 0, 0, 0),
("dragon_valley", 1, 32871, 108924, 111992, -3028, 0, 0, 0, 60, 0, 0, 0),
("dragon_valley", 1, 32871, 110116, 125500, -3664, 0, 0, 0, 60, 0, 0, 0),
("dragon_valley", 1, 32871, 121172, 113348, -3776, 0, 0, 0, 60, 0, 0, 0),
-- Ruiman
("dragon_valley", 1, 32890, 99434, 109868, -3664, 0, 0, 21929, 60, 0, 0, 0),

View File

@ -1287,6 +1287,22 @@
<id>16068</id> <!-- Guardian's Strider -->
<id>16071</id> <!-- Maguen -->
<id>16072</id> <!-- Elite Maguen -->
<id>1601</id> <!-- Super Feline Queen Z -->
<id>1602</id> <!-- Super Kat the Cat Z -->
<id>1603</id> <!-- Super Mew the Cat Z -->
<id>1561</id> <!-- Baby Rudolph -->
<id>1562</id> <!-- Desheloph -->
<id>1563</id> <!-- Hyum -->
<id>1564</id> <!-- Lekang -->
<id>1565</id> <!-- Lilias -->
<id>1566</id> <!-- Lapham -->
<id>1567</id> <!-- Mafum -->
<id>1568</id> <!-- Desheloph -->
<id>1569</id> <!-- Hyum -->
<id>1570</id> <!-- Lekang -->
<id>1571</id> <!-- Lilias -->
<id>1572</id> <!-- Lapham -->
<id>1573</id> <!-- Mafum -->
</category>
<category name="KNIGHT_GROUP">
<id>4</id> <!-- Human Knight -->
@ -1441,20 +1457,23 @@
<id>16052</id> <!-- Toy Knight -->
<id>16053</id> <!-- Turtle Ascetic -->
<id>16067</id> <!-- Deinonychus -->
<id>1601</id> <!-- Super Feline Queen Z -->
<id>1602</id> <!-- Super Kat the Cat Z -->
<id>1603</id> <!-- Super Mew the Cat Z -->
<id>16068</id> <!-- Guardian's Strider -->
<id>16071</id> <!-- Maguen -->
<id>16072</id> <!-- Elite Maguen -->
<id>1561</id> <!-- Baby Rudolph -->
<id>1538</id> <!-- Baby Rudolph -->
<id>1562</id> <!-- Deseloph -->
<id>1562</id> <!-- Desheloph -->
<id>1563</id> <!-- Hyum -->
<id>1564</id> <!-- Rekang -->
<id>1564</id> <!-- Lekang -->
<id>1565</id> <!-- Lilias -->
<id>1566</id> <!-- Lapham -->
<id>1567</id> <!-- Mafum -->
<id>1568</id> <!-- Deseloph -->
<id>1568</id> <!-- Desheloph -->
<id>1569</id> <!-- Hyum -->
<id>1570</id> <!-- Rekang -->
<id>1570</id> <!-- Lekang -->
<id>1571</id> <!-- Lilias -->
<id>1572</id> <!-- Lapham -->
<id>1573</id> <!-- Mafum -->
@ -1575,10 +1594,11 @@
<id>12</id> <!-- Sorcerer -->
<id>13</id> <!-- Necromancer -->
<id>14</id> <!-- Warlock -->
<id>10</id> <!-- Human Mystic -->
<id>15</id> <!-- Cleric -->
<id>16</id> <!-- Bishop -->
<id>17</id> <!-- Prophet -->
<id>94</id> <!-- Archmage -->
<id>95</id> <!-- Soultaker -->
<id>96</id> <!-- Arcana Lord -->
<id>97</id> <!-- Cardinal -->
@ -2043,6 +2063,8 @@
<id>96</id> <!-- Arcana Lord -->
<id>104</id> <!-- Elemental Master -->
<id>111</id> <!-- Spectral Master -->
<id>13</id> <!-- Necromancer -->
<id>95</id> <!-- Soultaker -->
</category>
<category name="SUB_GROUP_WARRIOR">
<id>3</id> <!-- Warlord -->

View File

@ -1,41 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<item id="2375" price="0" /> <!-- Wolf Collar -->
<item id="3500" price="0" /> <!-- Dragonflute of Wind -->
<item id="3501" price="0" /> <!-- Dragonflute of Star -->
<item id="3502" price="0" /> <!-- Dragonflute of Twilight -->
<item id="4422" price="0" /> <!-- Dragon Bugle of Wind -->
<item id="4423" price="0" /> <!-- Dragon Bugle of Star -->
<item id="4424" price="0" /> <!-- Dragon Bugle of Twilight -->
<item id="4425" price="0" /> <!-- Penitent's Manacles -->
<item id="6648" price="0" /> <!-- Baby Buffalo Panpipe -->
<item id="6649" price="0" /> <!-- Baby Cougar Chime -->
<item id="6650" price="0" /> <!-- Baby Kookaburra Ocarina -->
<item id="10311" price="0" /> <!-- Improved Buffalo Panpipe -->
<item id="10312" price="0" /> <!-- Improved Cougar Chime -->
<item id="10312" price="0" /> <!-- Improved Cougar Chime -->
<item id="10313" price="0" /> <!-- Improved Kookaburra Ocarina -->
<item id="6649" price="0" /> <!-- Baby Cougar Chime -->
<item id="9882" price="0" /> <!-- Great Wolf Necklace -->
<item id="10307" price="0" /> <!-- Great Snow Wolf Necklace -->
<item id="10308" price="0" /> <!-- Red Dragon Bugle of Wind -->
<item id="10309" price="0" /> <!-- Red Dragon Bugle of Star -->
<item id="10310" price="0" /> <!-- Red Dragon Bugle of Twilight -->
<item id="10311" price="0" /> <!-- Improved Buffalo Panpipe -->
<item id="10313" price="0" /> <!-- Improved Kookaburra Ocarina -->
<item id="10312" price="0" /> <!-- Improved Cougar Chime -->
<item id="10426" price="0" /> <!-- Fenrir Necklace -->
<item id="10611" price="0" /> <!-- Snow Fenrir Necklace -->
<item id="10307" price="0" /> <!-- Great Snow Wolf Necklace -->
<item id="2375" price="0" /> <!-- Wolf Collar -->
<item id="14828" price="0" /> <!-- Deinonychus Mesozoic Stone -->
<item id="14819" price="0" /> <!-- Guardian's Dragon Bugle -->
<item id="13020" price="0" /> <!-- Fox Shaman Hunting Helper Necklace -->
<item id="13019" price="0" /> <!-- Wild Beast Fighter Hunting Helper Necklace -->
<item id="13017" price="0" /> <!-- White Weasel Hunting Helper Necklace -->
<item id="13018" price="0" /> <!-- Fairy Princess Hunting Helper Necklace -->
<item id="13019" price="0" /> <!-- Wild Beast Fighter Hunting Helper Necklace -->
<item id="13020" price="0" /> <!-- Fox Shaman Hunting Helper Necklace -->
<item id="14061" price="0" /> <!-- Toy Knight Summon Whistle -->
<item id="14062" price="0" /> <!-- Spirit Shaman Summon Whistle -->
<item id="14063" price="0" /> <!-- Owl Monk Summon Whistle -->
<item id="14064" price="0" /> <!-- Turtle Ascetic Summon Whistle -->
<item id="13548" price="0" /> <!-- Toy Knight Summon Whistle -->
<item id="13549" price="0" /> <!-- Soul Monk Summon Whistle -->
<item id="13550" price="0" /> <!-- Owl Monk Summon Whistle -->
<item id="13551" price="0" /> <!-- Turtle Ascetic Summon Whistle -->
<item id="20760" price="0" /> <!-- Rudolph Necklace (Event) -->
<item id="20761" price="0" /> <!-- Rudolph Necklace -->
<item id="14063" price="0" /> <!-- Owl Monk Summon Whistle -->
<item id="14828" price="0" /> <!-- Deinonychus Mesozoic Stone -->
<item id="14819" price="0" /> <!-- Guardian's Dragon Bugle -->
<item id="15488" price="0" /> <!-- Maguen Pet Collar -->
<item id="15489" price="0" /> <!-- Elite Maguen Pet Collar -->
</list>
<item id="20760" price="0" /> <!-- Rudolph Necklace (Event) -->
<item id="20761" price="0" /> <!-- Rudolph Necklace -->
<item id="20908" price="0" /> <!-- Deseloph Rose Necklace (Event) - Summon duration - 3 hours -->
<item id="20909" price="0" /> <!-- Hyum Rose Necklace (Event) - Summon duration - 3 hours -->
<item id="20910" price="0" /> <!-- Rekang Rose Necklace (Event) - Summon duration - 3 hours -->
<item id="20911" price="0" /> <!-- Lilias Rose Necklace (Event) - Summon duration - 3 hours -->
<item id="20912" price="0" /> <!-- Lapham Rose Necklace (Event) - Summon duration - 3 hours -->
<item id="20913" price="0" /> <!-- Mafum Rose Necklace (Event) - Summon duration - 3 hours -->
<item id="20915" price="0" /> <!-- Improved Deseloph Rose Necklace (Event) - Summon duration - 5 hours -->
<item id="20916" price="0" /> <!-- Improved Hyum Rose Necklace (Event) - Summon duration - 5 hours -->
<item id="20917" price="0" /> <!-- Improved Rekang Rose Necklace (Event) - Summon duration - 5 hours -->
<item id="20918" price="0" /> <!-- Improved Lilias Rose Necklace (Event) - Summon duration - 5 hours -->
<item id="20919" price="0" /> <!-- Improved Lapham Rose Necklace (Event) - Summon duration - 5 hours -->
<item id="20920" price="0" /> <!-- Improved Mafum Rose Necklace (Event) - Summon duration - 5 hours -->
<item id="21916" price="0" /> <!-- Super Kat the Cat Z Summon Necklace -->
<item id="21917" price="0" /> <!-- Super Feline Queen Z Summon Necklace -->
<item id="21918" price="0" /> <!-- Super Mew the Cat Z Summon Necklace -->
</list>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<npcs>
<npc>35628</npc> <!-- Quigby -->
</npcs>
<item id="6902" /> <!-- Pledge Shield -->
<item id="6643" /> <!-- Old Golden Spice -->
<item id="1829" count="5" restock_delay="60" /> <!-- Scroll of Escape: Clan Hall -->
<item id="5169" count="5" restock_delay="60" /> <!-- Deluxe Food for Strider -->
</list>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<npcs>
<npc>35640</npc> <!-- Bandello -->
</npcs>
<item id="6902" /> <!-- Pledge Shield -->
<item id="6316" /> <!-- Food for Wyvern -->
<item id="1829" count="5" restock_delay="60" /> <!-- Scroll of Escape: Clan Hall -->
<item id="5169" count="5" restock_delay="60" /> <!-- Deluxe Food for Strider -->
</list>

View File

@ -10,8 +10,10 @@
<item id="952" count="1" restock_delay="240" /> <!-- Scroll: Enchant Armor (C-Grade) -->
<item id="7133" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Goddard -->
<item id="7132" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Aden -->
<item id="8644" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (A-Grade) (100%) -->
<item id="8650" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (A-Grade) (100%) -->
<item id="8645" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="9952" count="2" restock_delay="120" /> <!-- Orange Talisman - Hot Springs CP Potion -->
<item id="10166" count="1" restock_delay="120" /> <!-- Hot Springs CP Potion -->
<item id="8751" count="1" restock_delay="120" /> <!-- High-Grade Life Stone - Level 70 -->
<item id="948" count="1" restock_delay="240" /> <!-- Scroll: Enchant Armor (B-Grade) -->
<item id="17018" count="1" restock_delay="60" /> <!-- Hot Springs Potion -->
</list>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<npcs>
<npc>35628</npc> <!-- Quigby -->
</npcs>
<item id="6902" /> <!-- Pledge Shield -->
<item id="6643" /> <!-- Old Golden Spice -->
<item id="1829" count="5" restock_delay="60" /> <!-- Scroll of Escape: Clan Hall -->
<item id="5858" count="2" restock_delay="60" /> <!-- Blessed Scroll of Escape: Clan Hall -->
<item id="5169" count="10" restock_delay="60" /> <!-- Deluxe Food for Strider -->
<item id="952" count="1" restock_delay="120" /> <!-- Scroll: Enchant Armor (C-Grade) -->
<item id="7133" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Goddard -->
<item id="7132" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Aden -->
<item id="8645" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="8751" count="1" restock_delay="120" /> <!-- High-Grade Life Stone - Level 70 -->
<item id="948" count="1" restock_delay="240" /> <!-- Scroll: Enchant Armor (B-Grade) -->
</list>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<npcs>
<npc>35640</npc> <!-- Bandello -->
</npcs>
<item id="6902" /> <!-- Pledge Shield -->
<item id="6316" /> <!-- Food for Wyvern -->
<item id="1829" count="5" restock_delay="60" /> <!-- Scroll of Escape: Clan Hall -->
<item id="5858" count="3" restock_delay="60" /> <!-- Blessed Scroll of Escape: Clan Hall -->
<item id="5169" count="10" restock_delay="60" /> <!-- Deluxe Food for Strider -->
<item id="956" count="1" restock_delay="120" /> <!-- Scroll: Enchant Armor (D-Grade) -->
<item id="952" count="1" restock_delay="300" /> <!-- Scroll: Enchant Armor (C-Grade) -->
<item id="948" count="1" restock_delay="150" /> <!-- Scroll: Enchant Armor (B-Grade) -->
<item id="7134" count="1" restock_delay="60" /> <!-- Scroll of Escape: Rune Township -->
<item id="7126" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Giran -->
<item id="8645" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="8751" count="1" restock_delay="120" /> <!-- High-Grade Life Stone - Level 70 -->
</list>

View File

@ -17,7 +17,6 @@
<item id="6930" count="1" restock_delay="60" /> <!-- Recipe: Greater Antidote (100%) -->
<item id="6932" count="1" restock_delay="60" /> <!-- Recipe: Emergency Dressing (100%) -->
<item id="6937" count="1" restock_delay="60" /> <!-- Recipe: Magic Haste Potion (100%) -->
<item id="6930" count="1" restock_delay="60" /> <!-- Recipe: Greater Antidote (100%) -->
<item id="6920" count="1" restock_delay="60" /> <!-- Recipe: Greater Fish Oil (100%) -->
<item id="8364" count="1" restock_delay="60" /> <!-- Recipe: Party Hat (100%) -->
<item id="6925" count="1" restock_delay="60" /> <!-- Recipe: Monocle (100%) -->
@ -37,16 +36,22 @@
<item id="6999" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of MEN (100%) -->
<item id="7000" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of WIT (100%) -->
<item id="7001" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of WIT (100%) -->
<item id="8645" count="1" restock_delay="60" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="60" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="9605" count="1" restock_delay="60" /> <!-- Agathion Seal Bracelet - Rainbow Clan Hall -->
<item id="10141" count="1" restock_delay="60" /> <!-- Grey Talisman - Yeti Transform -->
<item id="8645" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="9605" /> <!-- Agathion Seal Bracelet - Rainbow Clan Hall -->
<item id="10141" count="1" restock_delay="120" /> <!-- Grey Talisman - Yeti Transform -->
<item id="9952" count="2" restock_delay="120" /> <!-- Orange Talisman - Hot Springs CP Potion -->
<item id="8751" count="1" restock_delay="120" /> <!-- High-Grade Life Stone - Level 70 -->
<item id="8762" count="1" restock_delay="720" /> <!-- Top-Grade Life Stone - Level 76 -->
<item id="16117" /> <!-- Recipe - Refined Penguin Hat (10%) -->
<item id="16120" /> <!-- Recipe - Refined Turtle Hat (10%) -->
<item id="8752" count="1" restock_delay="240" /> <!-- High-Grade Life Stone - Level 76 -->
<item id="8761" count="1" restock_delay="361" /> <!-- Top-Grade Life Stone - Level 70 -->
<item id="948" count="1" restock_delay="240" /> <!-- Scroll: Enchant Armor (B-Grade) -->
<item id="947" count="1" restock_delay="361" /> <!-- Scroll: Enchant Weapon (B-Grade) -->
<item id="730" count="1" restock_delay="361" /> <!-- Scroll: Enchant Armor (A-Grade) -->
<item id="9898" count="1" restock_delay="480" /> <!-- SP Scroll: Highest Grade -->
<item id="16117" count="1" restock_delay="1428" /> <!-- Recipe - Refined Penguin Hat (10%) -->
<item id="16120" count="1" restock_delay="1428" /> <!-- Recipe - Refined Turtle Hat (10%) -->
<item id="8762" count="1" restock_delay="722" /> <!-- Top-Grade Life Stone - Level 76 -->
<item id="16129" count="10" restock_delay="60" /> <!-- Fabric of Refined Penguin Hat -->
<item id="16132" count="10" restock_delay="60" /> <!-- Fabric of Refined Turtle Hat -->
<item id="10166" count="1" restock_delay="120" /> <!-- Hot Springs CP Potion -->
<item id="17018" count="1" restock_delay="60" /> <!-- Hot Springs Potion -->
</list>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<npcs>
<npc>35628</npc> <!-- Quigby -->
</npcs>
<item id="6902" /> <!-- Pledge Shield -->
<item id="6643" /> <!-- Old Golden Spice -->
<item id="1829" count="5" restock_delay="60" /> <!-- Scroll of Escape: Clan Hall -->
<item id="5858" count="2" restock_delay="60" /> <!-- Blessed Scroll of Escape: Clan Hall -->
<item id="5169" count="10" restock_delay="60" /> <!-- Deluxe Food for Strider -->
<item id="952" count="1" restock_delay="120" /> <!-- Scroll: Enchant Armor (C-Grade) -->
<item id="7133" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Goddard -->
<item id="7132" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Aden -->
<item id="7583" count="1" restock_delay="120" /> <!-- Pet Exchange Ticket: Buffalo -->
<item id="6927" count="1" restock_delay="60" /> <!-- Recipe: Healing Potion (100%) -->
<item id="6933" count="1" restock_delay="60" /> <!-- Recipe: Haste Potion (100%) -->
<item id="6934" count="1" restock_delay="60" /> <!-- Recipe: Alacrity Potion (100%) -->
<item id="6930" count="1" restock_delay="60" /> <!-- Recipe: Greater Antidote (100%) -->
<item id="6932" count="1" restock_delay="60" /> <!-- Recipe: Emergency Dressing (100%) -->
<item id="6937" count="1" restock_delay="60" /> <!-- Recipe: Magic Haste Potion (100%) -->
<item id="6920" count="1" restock_delay="60" /> <!-- Recipe: Greater Fish Oil (100%) -->
<item id="8368" count="1" restock_delay="60" /> <!-- Recipe: Artisan's Goggles (100%) -->
<item id="6924" count="1" restock_delay="60" /> <!-- Recipe: Pirate's Eye Patch (100%) -->
<item id="6943" count="1" restock_delay="60" /> <!-- Recipe: Dye Potion - A (100%) -->
<item id="6944" count="1" restock_delay="60" /> <!-- Recipe: Dye Potion - B (100%) -->
<item id="6945" count="1" restock_delay="60" /> <!-- Recipe: Dye Potion - C (100%) -->
<item id="6946" count="1" restock_delay="60" /> <!-- Recipe: Dye Potion - D (100%) -->
<item id="6990" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of STR <Str+3 Con-3> (100%) -->
<item id="6991" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of STR <Str+3 Dex-3> (100%) -->
<item id="6992" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of CON <Con+3 Str-3> (100%) -->
<item id="6993" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of CON <Con+3 Dex-3> (100%) -->
<item id="6994" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of DEX <Dex+3 Str-3> (100%) -->
<item id="6995" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of DEX <Dex+3 Con-3> (100%) -->
<item id="6996" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of INT <Int+3 Men-3> (100%) -->
<item id="6997" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of INT <Int+3 Wit-3> (100%) -->
<item id="6998" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of MEN <Men+3 Int-3> (100%) -->
<item id="6999" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of MEN <Men+3 Wit-3> (100%) -->
<item id="7000" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of WIT <Wit+3 Int-3> (100%) -->
<item id="7001" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of WIT <Wit+3 Men-3> (100%) -->
<item id="8645" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="9606" /> <!-- Agathion Seal Bracelet - Wild Beast Reserve -->
<item id="10142" count="1" restock_delay="120" /> <!-- Grey Talisman - Buffalo Transform -->
<item id="8751" count="1" restock_delay="120" /> <!-- High-Grade Life Stone - Level 70 -->
<item id="8752" count="1" restock_delay="240" /> <!-- High-Grade Life Stone - Level 76 -->
<item id="8761" count="1" restock_delay="361" /> <!-- Top-Grade Life Stone - Level 70 -->
<item id="948" count="1" restock_delay="240" /> <!-- Scroll: Enchant Armor (B-Grade) -->
<item id="947" count="1" restock_delay="361" /> <!-- Scroll: Enchant Weapon (B-Grade) -->
<item id="730" count="1" restock_delay="361" /> <!-- Scroll: Enchant Armor (A-Grade) -->
<item id="9898" count="1" restock_delay="480" /> <!-- SP Scroll: Highest Grade -->
<item id="16121" count="1" restock_delay="1428" /> <!-- Recipe - Refined Cow Hat (10%) -->
<item id="8762" count="1" restock_delay="722" /> <!-- Top-Grade Life Stone - Level 76 -->
<item id="16133" count="10" restock_delay="60" /> <!-- Fabric of Refined Cow Hat -->
</list>

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/buylist.xsd">
<npcs>
<npc>35640</npc> <!-- Bandello -->
</npcs>
<item id="6902" /> <!-- Pledge Shield -->
<item id="6316" /> <!-- Food for Wyvern -->
<item id="1829" count="5" restock_delay="60" /> <!-- Scroll of Escape: Clan Hall -->
<item id="5858" count="3" restock_delay="60" /> <!-- Blessed Scroll of Escape: Clan Hall -->
<item id="5169" count="10" restock_delay="60" /> <!-- Deluxe Food for Strider -->
<item id="952" count="1" restock_delay="120" /> <!-- Scroll: Enchant Armor (C-Grade) -->
<item id="948" count="1" restock_delay="300" /> <!-- Scroll: Enchant Armor (B-Grade) -->
<item id="730" count="1" restock_delay="150" /> <!-- Scroll: Enchant Armor (A-Grade) -->
<item id="7134" count="1" restock_delay="60" /> <!-- Scroll of Escape: Rune Township -->
<item id="7126" count="1" restock_delay="60" /> <!-- Scroll of Escape: Town of Giran -->
<item id="7584" count="1" restock_delay="120" /> <!-- Pet Exchange Ticket: Cougar -->
<item id="6928" count="1" restock_delay="60" /> <!-- Recipe: Greater Healing Potion (100%) -->
<item id="6935" count="1" restock_delay="60" /> <!-- Recipe: Greater Haste Potion (100%) -->
<item id="6936" count="1" restock_delay="60" /> <!-- Recipe: Greater Swift Attack Potion (100%) -->
<item id="6938" count="1" restock_delay="60" /> <!-- Recipe: Greater Magic Haste Potion (100%) -->
<item id="6921" count="1" restock_delay="60" /> <!-- Recipe: Premium Fish Oil(100%) -->
<item id="8366" count="1" restock_delay="60" /> <!-- Recipe: Feathered Hat (100%) -->
<item id="7699" count="1" restock_delay="60" /> <!-- Recipe: Forget-me-not Hairpin (100%) -->
<item id="6939" count="1" restock_delay="60" /> <!-- Recipe: Mystery Potion (100%) -->
<item id="6947" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - A (100%) -->
<item id="6948" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - B (100%) -->
<item id="6949" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - C (100%) -->
<item id="6950" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - D (100%) -->
<item id="6951" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - E (100%) -->
<item id="6952" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - F (100%) -->
<item id="6953" count="1" restock_delay="60" /> <!-- Recipe: Hair Style Change Potion - G (100%) -->
<item id="7002" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of STR <Str+4 Con-4> (100%) -->
<item id="7003" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of STR <Str+4 Dex-4> (100%) -->
<item id="7004" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of CON <Con+4 Str-4> (100%) -->
<item id="7005" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of CON <Con+4 Dex-4> (100%) -->
<item id="7006" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of DEX <Dex+4 Str-4> (100%) -->
<item id="7007" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of DEX <Dex+4 Con-4> (100%) -->
<item id="7008" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of INT <Int+4 Men-4> (100%) -->
<item id="7009" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of INT <Int+4 Wit-4> (100%) -->
<item id="7010" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of MEN <Men+4 Int-4> (100%) -->
<item id="7011" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of MEN <Men+4 Wit-4> (100%) -->
<item id="7012" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of WIT <Wit+4 Int-4> (100%) -->
<item id="7013" count="1" restock_delay="60" /> <!-- Recipe: Greater Dye of WIT <Wit+4 Men-4> (100%) -->
<item id="8645" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Life (S-Grade) (100%) -->
<item id="8651" count="1" restock_delay="120" /> <!-- Recipe: Elixir of Mental Strength (S-Grade) (100%) -->
<item id="8751" count="1" restock_delay="120" /> <!-- High-Grade Life Stone - Level 70 -->
<item id="8752" count="1" restock_delay="240" /> <!-- High-Grade Life Stone - Level 76 -->
<item id="8761" count="1" restock_delay="361" /> <!-- Top-Grade Life Stone - Level 70 -->
<item id="729" count="1" restock_delay="722" /> <!-- Scroll: Enchant Weapon (A-Grade) -->
<item id="960" count="1" restock_delay="1428" /> <!-- Scroll: Enchant Armor (S-Grade) -->
<item id="9898" count="1" restock_delay="480" /> <!-- SP Scroll: Highest Grade -->
<item id="16118" count="1" restock_delay="1428" /> <!-- Recipe - Refined Brown Turban (10%) -->
<item id="16119" count="1" restock_delay="1428" /> <!-- Recipe - Refined Yellow Turban (10%) -->
<item id="8762" count="1" restock_delay="722" /> <!-- Top-Grade Life Stone - Level 76 -->
<item id="16130" count="10" restock_delay="60" /> <!-- Fabric of Refined Brown Turban -->
<item id="16131" count="10" restock_delay="60" /> <!-- Fabric of Refined Yellow Turban -->
</list>

View File

@ -0,0 +1,4 @@
<html><body>Ark Guardian's Corpse:<br>
What an odd-looking corpse. Who could have done this?<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,5 @@
<html><html>Eris' Evil Thoughts:<br>
Finally we meet, Successors of Fate. At last, this endless cycle may be given a chance to end.<br>
<a action="bypass -h Quest MonasteryOfSilence1 EXIT">"I'd like to go outside."</a><br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Elmore-Aden's Saintess Solina:<br>
<html><body>Elmoreden's Saintess Solina:<br>
For an eternity, I've been waiting for you.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Elmoreden's Saintess Solina:<br>
I am Solina!<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Solina's Disciple Eris:<br>
I am Eris!!<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Priest of Splendor Anais:<br>
I am Anais!!!!<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Jude van Etina:<br>
What we need now is silence, I care not for any truth or confession.<br>
What we need now is silence, I care not for any truth nor confession.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>You hear a low vibrating sound from the giant Movement Control Device.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
You hear a low vibrating sound from the giant Teleport Control Device.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>There's a book shaped hole in the giant Barrier Device.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
There's a book shaped hole in the giant Barrier Device.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>There's a shield-shaped hole in the giant Barrier Device.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
There's a shield-shaped hole in the giant Barrier Device.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>There's a small hole in the giant Barrier Device. It looks like you can place a sword shaped relic in there.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
There's a small hole in the giant Barrier Device. It looks like you can place a sword shaped relic in there.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>There's a cain shaped hole in the giant Barrier Device. It looks like you can put a cain relic in here to activate it.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
There's a cain shaped hole in the giant Barrier Device. It looks like you can put a cain relic in here to activate it.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>Movement Control Device:<br>Only Solina's disciples may enter.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>Teleport Control Device:<br>
Only Solina's disciples may enter.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>This is a lavishly decorated tomb.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
This is a lavishly decorated tomb.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>
The Teleport Control Device gives off a subtle and mysterious light.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>A sacred object, shaped like a huge staff, floats effortlessly above the altar.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
A sacred object, shaped like a huge staff, floats effortlessly above the altar.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>A sacred object shaped like a large sword hovers gently above the altar.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
A sacred object shaped like a large sword hovers gently above the altar.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>There's a large book looking relic floating in the air above the altar.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
There's a large book-looking relic floating in the air above the altar.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,4 @@
<html><body>A sacred object in the shape of a huge shield floats above the altar, slowly rotating.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
<html><body>
A sacred object in the shape of a huge shield floats above the altar, slowly rotating.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance name="Dungeon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<activityTime val="60" />
<allowSummon val="false" />
<emptyDestroyTime val="240" />
<reenter additionStyle="ON_INSTANCE_ENTER">
<reset time="14400000" />
</reenter>
</instance>

View File

@ -9,4 +9,5 @@
<reset day="Wednesday" hour="6" minute="30" />
<reset day="Friday" hour="6" minute="30" />
</reenter>
<removeBuffs type="ALL" />
</instance>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance name="Elcadia's Tent" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<activityTime val="30" />
<activityTime val="45" />
<allowSummon val="false" />
<emptyDestroyTime val="1" />
<exitPoint x="43275" y="-87928" z="-2835" />
<exitPoint x="43347" y="-87923" z="-2820" />
<spawnlist>
<group name="general">
<!-- Elcadia -->

View File

@ -1,47 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance name="Monastery Of Silence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<activityTime val="30" />
<activityTime val="60" />
<allowSummon val="false" />
<emptyDestroyTime val="1" />
<exitPoint x="115983" y="-87351" z="-3397" />
<removeBuffs type="ALL" />
<doorlist>
<door doorId="21100001" /><!-- opened="true"-->
<door doorId="21100002" /><!-- opened="true"-->
<door doorId="21100003" /><!-- opened="true"-->
<door doorId="21100004" /><!-- opened="true"-->
<door doorId="21100005" /><!-- opened="true"-->
<door doorId="21100006" /><!-- opened="true"-->
<door doorId="21100007" /><!-- opened="true"-->
<door doorId="21100008" /><!-- opened="true"-->
<door doorId="21100009" /><!-- opened="true"-->
<door doorId="21100010" /><!-- opened="true"-->
<door doorId="21100011" /><!-- opened="true"-->
<door doorId="21100012" /><!-- opened="true"-->
<door doorId="21100013" /><!-- opened="true"-->
<door doorId="21100014" /><!-- opened="true"-->
<door doorId="21100015" /><!-- opened="true"-->
<door doorId="21100016" /><!-- opened="true"-->
<door doorId="21100018" /><!-- opened="false"-->
<door doorId="21100101" /><!-- opened="false"-->
<door doorId="21100102" /><!-- opened="false"-->
<door doorId="21100103" /><!-- opened="false"-->
<door doorId="21100104" /><!-- opened="false"-->
<door doorId="21100001" />
<door doorId="21100002" />
<door doorId="21100003" />
<door doorId="21100004" />
<door doorId="21100005" />
<door doorId="21100006" />
<door doorId="21100007" />
<door doorId="21100008" />
<door doorId="21100009" />
<door doorId="21100010" />
<door doorId="21100011" />
<door doorId="21100012" />
<door doorId="21100013" />
<door doorId="21100014" />
<door doorId="21100015" />
<door doorId="21100016" />
<door doorId="21100018" />
<door doorId="21100101" />
<door doorId="21100102" />
<door doorId="21100103" />
<door doorId="21100104" />
</doorlist>
<spawnlist>
<group name="general">
<!-- Eris's Evil Thoughts -->
<spawn npcId="32792" x="120881" y="-86496" z="-3392" heading="49080" respawn="0" />
<spawn npcId="32792" x="120881" y="-86496" z="-3399" heading="-16456" respawn="0" />
<!-- Relic Guardian -->
<spawn npcId="32803" x="85792" y="-249624" z="-8296" heading="0" respawn="0" />
<!-- Teleport Control Device -->
<spawn npcId="32817" x="86674" y="-249624" z="-8296" heading="32960" respawn="0" />
<spawn npcId="32818" x="84909" y="-249625" z="-8296" heading="0" respawn="0" />
<spawn npcId="32819" x="85792" y="-250512" z="-8296" heading="16400" respawn="0" />
<spawn npcId="32820" x="85792" y="-248739" z="-8296" heading="49212" respawn="0" />
<spawn npcId="32817" x="86674" y="-249624" z="-8308" heading="-32576" respawn="0" />
<spawn npcId="32818" x="84909" y="-249625" z="-8311" heading="0" respawn="0" />
<spawn npcId="32819" x="85792" y="-250512" z="-8310" heading="16400" respawn="0" />
<spawn npcId="32820" x="85792" y="-248739" z="-8308" heading="-16324" respawn="0" />
<!-- Relic Watcher -->
<spawn npcId="32804" x="88672" y="-249625" z="-8296" heading="32592" respawn="0" />
<spawn npcId="32805" x="82528" y="-249616" z="-8296" heading="0" respawn="0" />
<spawn npcId="32805" x="82528" y="-249616" z="-8304" heading="0" respawn="0" />
<spawn npcId="32806" x="85788" y="-252497" z="-8296" heading="16852" respawn="0" />
<spawn npcId="32807" x="85790" y="-246730" z="-8296" heading="48120" respawn="0" />
<!-- Reading Desk -->
@ -61,91 +61,96 @@
<spawn npcId="32834" x="86888" y="-246734" z="-8320" heading="0" respawn="0" />
<spawn npcId="32835" x="85793" y="-245640" z="-8320" heading="0" respawn="0" />
<spawn npcId="32836" x="84705" y="-246730" z="-8320" heading="0" respawn="0" />
<!-- Spawn: Seven Signs, Solina's Tomb -->
<spawn npcId="18949" x="76625" y="-240824" z="-10832" heading="0" respawn="0" />
<spawn npcId="18956" x="55498" y="-252781" z="-6760" heading="0" respawn="0" />
<spawn npcId="18957" x="55520" y="-252160" z="-6760" heading="0" respawn="0" />
<spawn npcId="18958" x="56635" y="-252776" z="-6760" heading="0" respawn="0" />
<spawn npcId="18959" x="56672" y="-252156" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44269" y="-251082" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="43811" y="-248086" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44314" y="-250726" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44246" y="-248658" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44197" y="-251121" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44371" y="-248136" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44314" y="-250726" z="-6760" heading="0" respawn="0" />
<spawn npcId="27407" x="44210" y="-248554" z="-6760" heading="0" respawn="0" />
<spawn npcId="27409" x="46844" y="-248629" z="-6760" heading="0" respawn="0" />
<spawn npcId="27409" x="46933" y="-248040" z="-6760" heading="0" respawn="0" />
<spawn npcId="27410" x="46412" y="-248590" z="-6760" heading="0" respawn="0" />
<spawn npcId="27410" x="46376" y="-248447" z="-6760" heading="0" respawn="0" />
<spawn npcId="27410" x="46952" y="-248499" z="-6760" heading="0" respawn="0" />
<spawn npcId="27410" x="47053" y="-248080" z="-6760" heading="0" respawn="0" />
<spawn npcId="27410" x="46933" y="-248180" z="-6760" heading="0" respawn="0" />
<spawn npcId="27410" x="46613" y="-248050" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="43590" y="-249404" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45280" y="-251316" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45285" y="-247479" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="43584" y="-249935" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45469" y="-247502" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45584" y="-251289" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="47438" y="-249349" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="43356" y="-249461" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45218" y="-251733" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="47142" y="-249793" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45183" y="-247956" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="43254" y="-249948" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45548" y="-251690" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="47582" y="-249770" z="-6760" heading="0" respawn="0" />
<spawn npcId="27412" x="45533" y="-247983" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="47224" y="-249486" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="43710" y="-249384" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45220" y="-251386" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45255" y="-247569" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45554" y="-251309" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="47458" y="-249439" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45519" y="-247442" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="43326" y="-249451" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45258" y="-251763" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="47222" y="-249823" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45203" y="-247896" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45568" y="-251690" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="47522" y="-249920" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="45563" y="-247923" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="43724" y="-249935" z="-6760" heading="0" respawn="0" />
<spawn npcId="27413" x="43214" y="-249908" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="44125" y="-251134" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="43945" y="-251134" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="44331" y="-248096" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="44211" y="-248106" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="43994" y="-250706" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="44154" y="-250736" z="-6760" heading="0" respawn="0" />
<spawn npcId="27414" x="44210" y="-250736" z="-6760" heading="0" respawn="0" />
<spawn npcId="27417" x="47005" y="-250679" z="-6760" heading="0" respawn="0" />
<spawn npcId="27417" x="46365" y="-250819" z="-6760" heading="0" respawn="0" />
<spawn npcId="27417" x="46872" y="-251280" z="-6760" heading="0" respawn="0" />
<spawn npcId="27417" x="46368" y="-251176" z="-6760" heading="0" respawn="0" />
<spawn npcId="27418" x="46405" y="-250739" z="-6760" heading="0" respawn="0" />
<spawn npcId="27418" x="46725" y="-250809" z="-6760" heading="0" respawn="0" />
<spawn npcId="27418" x="46728" y="-251267" z="-6760" heading="0" respawn="0" />
<spawn npcId="27418" x="46512" y="-251072" z="-6760" heading="0" respawn="0" />
<spawn npcId="32793" x="56097" y="-250576" z="-6757" heading="0" respawn="0" />
<spawn npcId="32794" x="56430" y="-239226" z="-7224" heading="0" respawn="0" />
<spawn npcId="32795" x="56379" y="-239233" z="-7224" heading="0" respawn="0" />
<spawn npcId="32796" x="56495" y="-239445" z="-7224" heading="0" respawn="0" />
<spawn npcId="32797" x="56347" y="-239448" z="-7224" heading="0" respawn="0" />
<spawn npcId="32820" x="85792" y="-248739" z="-8296" heading="0" respawn="0" />
<spawn npcId="32837" x="45398" y="-249639" z="-6728" heading="0" respawn="0" />
<spawn npcId="32838" x="45413" y="-251556" z="-6744" heading="0" respawn="0" />
<spawn npcId="32839" x="47333" y="-249648" z="-6744" heading="0" respawn="0" />
<spawn npcId="32840" x="45392" y="-247720" z="-6744" heading="0" respawn="0" />
<spawn npcId="32841" x="43472" y="-249632" z="-6744" heading="0" respawn="0" />
<spawn npcId="32842" x="56080" y="-251648" z="-6760" heading="0" respawn="0" />
<spawn npcId="32843" x="56116" y="-252480" z="-6736" heading="0" respawn="0" />
<spawn npcId="32857" x="44123" y="-248367" z="-6720" heading="0" respawn="0" />
<spawn npcId="32858" x="46672" y="-248368" z="-6720" heading="0" respawn="0" />
<spawn npcId="32859" x="44114" y="-250912" z="-6720" heading="0" respawn="0" />
<spawn npcId="32860" x="46672" y="-250915" z="-6720" heading="0" respawn="0" />
<!-- Q10295 -->
<!-- Altar of Hallows -->
<spawn npcId="32857" x="44123" y="-248367" z="-6715" heading="0" respawn="0" />
<spawn npcId="32858" x="46672" y="-248368" z="-6724" heading="0" respawn="0" />
<spawn npcId="32859" x="44114" y="-250912" z="-6718" heading="0" respawn="0" />
<spawn npcId="32860" x="46672" y="-250915" z="-6722" heading="0" respawn="0" />
<!-- Teleport Control Device -->
<spawn npcId="32837" x="45398" y="-249639" z="-6694" heading="0" respawn="0" />
<spawn npcId="32842" x="56080" y="-251648" z="-6768" heading="0" respawn="0" />
<spawn npcId="32844" x="56080" y="-253232" z="-6768" heading="0" respawn="0" />
<!-- Tomb of the Saintess -->
<spawn npcId="32843" x="56116" y="-252480" z="-6730" heading="0" respawn="0" />
<!-- Solina's Evil Thoughts -->
<spawn npcId="32793" x="56097" y="-250576" z="-6757" heading="0" respawn="0" />
<!-- Jude van Etina -->
<spawn npcId="32797" x="56347" y="-239448" z="-7228" heading="6992" respawn="0" />
<!-- Anais -->
<spawn npcId="32796" x="56495" y="-239445" z="-7216" heading="31196" respawn="0" />
<!-- Solina -->
<spawn npcId="32794" x="56430" y="-239226" z="-7232" heading="-15832" respawn="0" />
<!-- Eris -->
<spawn npcId="32795" x="56379" y="-239233" z="-7232" heading="-5760" respawn="0" />
<!-- Powerful Device -->
<spawn npcId="32838" x="45413" y="-251556" z="-6734" heading="0" respawn="0" />
<spawn npcId="32839" x="47333" y="-249648" z="-6687" heading="0" respawn="0" />
<spawn npcId="32840" x="45392" y="-247720" z="-6680" heading="0" respawn="0" />
<spawn npcId="32841" x="43472" y="-249632" z="-6710" heading="0" respawn="0" />
<!-- Monsters -->
<spawn npcId="27417" x="43778" y="-248710" z="-6799" heading="-6599" respawn="0" />
<spawn npcId="27407" x="44367" y="-248710" z="-6799" heading="-6599" respawn="0" />
<spawn npcId="27414" x="44510" y="-248433" z="-6799" heading="-6599" respawn="0" />
<spawn npcId="27414" x="43780" y="-248436" z="-6799" heading="-6599" respawn="0" />
<spawn npcId="27405" x="43731" y="-248246" z="-6802" heading="-6602" respawn="0" />
<spawn npcId="27407" x="44531" y="-248246" z="-6802" heading="-6602" respawn="0" />
<spawn npcId="27414" x="44529" y="-248046" z="-6802" heading="-6602" respawn="0" />
<spawn npcId="27414" x="43739" y="-248046" z="-6802" heading="-6602" respawn="0" />
<spawn npcId="27420" x="46340" y="-248694" z="-6789" heading="-6589" respawn="0" />
<spawn npcId="27410" x="46929" y="-248694" z="-6789" heading="-6589" respawn="0" />
<spawn npcId="27410" x="47072" y="-248417" z="-6789" heading="-6589" respawn="0" />
<spawn npcId="27410" x="46342" y="-248420" z="-6789" heading="-6589" respawn="0" />
<spawn npcId="27420" x="46293" y="-248230" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27410" x="47093" y="-248230" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27410" x="47091" y="-248030" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27410" x="46301" y="-248030" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27417" x="46332" y="-251293" z="-6797" heading="-6597" respawn="0" />
<spawn npcId="27418" x="46921" y="-251293" z="-6797" heading="-6597" respawn="0" />
<spawn npcId="27417" x="47064" y="-251016" z="-6797" heading="-6597" respawn="0" />
<spawn npcId="27418" x="46334" y="-251019" z="-6797" heading="-6597" respawn="0" />
<spawn npcId="27417" x="46285" y="-250829" z="-6800" heading="-6600" respawn="0" />
<spawn npcId="27418" x="47085" y="-250829" z="-6800" heading="-6600" respawn="0" />
<spawn npcId="27417" x="47083" y="-250629" z="-6800" heading="-6600" respawn="0" />
<spawn npcId="27418" x="46293" y="-250629" z="-6800" heading="-6600" respawn="0" />
<spawn npcId="27405" x="43801" y="-251290" z="-6791" heading="-6591" respawn="0" />
<spawn npcId="27407" x="44390" y="-251290" z="-6791" heading="-6591" respawn="0" />
<spawn npcId="27414" x="44533" y="-251013" z="-6791" heading="-6591" respawn="0" />
<spawn npcId="27414" x="43803" y="-251016" z="-6791" heading="-6591" respawn="0" />
<spawn npcId="27405" x="43754" y="-250826" z="-6798" heading="-6598" respawn="0" />
<spawn npcId="27407" x="44554" y="-250826" z="-6798" heading="-6598" respawn="0" />
<spawn npcId="27414" x="44552" y="-250626" z="-6798" heading="-6598" respawn="0" />
<spawn npcId="27414" x="43762" y="-250626" z="-6798" heading="-6598" respawn="0" />
<spawn npcId="27412" x="45473" y="-248033" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27413" x="45673" y="-248033" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27412" x="45459" y="-247622" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27413" x="45659" y="-247622" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27412" x="45095" y="-247619" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27413" x="45295" y="-247619" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27412" x="45083" y="-248026" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27413" x="45283" y="-248026" z="-6794" heading="-6594" respawn="0" />
<spawn npcId="27412" x="47442" y="-249940" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27413" x="47642" y="-249940" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27412" x="47428" y="-249529" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27413" x="47628" y="-249529" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27412" x="47064" y="-249526" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27413" x="47264" y="-249526" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27412" x="47052" y="-249933" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27413" x="47252" y="-249933" z="-6790" heading="-6590" respawn="0" />
<spawn npcId="27412" x="45488" y="-251880" z="-6793" heading="-6593" respawn="0" />
<spawn npcId="27413" x="45688" y="-251880" z="-6793" heading="-6593" respawn="0" />
<spawn npcId="27412" x="45474" y="-251469" z="-6793" heading="-6593" respawn="0" />
<spawn npcId="27413" x="45674" y="-251469" z="-6793" heading="-6593" respawn="0" />
<spawn npcId="27412" x="45110" y="-251466" z="-6793" heading="-6593" respawn="0" />
<spawn npcId="27413" x="45310" y="-251466" z="-6793" heading="-6593" respawn="0" />
<spawn npcId="27412" x="43544" y="-249975" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27413" x="43744" y="-249975" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27412" x="43530" y="-249564" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27413" x="43730" y="-249564" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27412" x="43166" y="-249561" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27413" x="43366" y="-249561" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27412" x="43154" y="-249968" z="-6792" heading="-6592" respawn="0" />
<spawn npcId="27413" x="43354" y="-249968" z="-6792" heading="-6592" respawn="0" />
</group>
</spawnlist>
</instance>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance name="Rim Pailaka: Castle Dungeon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<activityTime val="60" />
<allowSummon val="false" />
<emptyDestroyTime val="300" />
</instance>

View File

@ -4,6 +4,10 @@
<allowSummon val="false" />
<emptyDestroyTime val="900" />
<exitPoint x="-248717" y="250260" z="4337" />
<reenter additionStyle="ON_INSTANCE_FINISH" >
<reset day="Wednesday" hour="6" minute="30" />
<reset day="Saturday" hour="6" minute="30" />
</reenter>
<doorlist>
<door doorId="12240001" />
<door doorId="12240002" />

View File

@ -15,6 +15,7 @@ ai/npc/Abercrombie/Abercrombie.java
ai/npc/Alarm/Alarm.java
ai/npc/Alexandria/Alexandria.java
ai/npc/ArenaManager/ArenaManager.java
ai/npc/Asamah/Asamah.java
ai/npc/AvantGarde/AvantGarde.java
ai/npc/BlackJudge/BlackJudge.java
ai/npc/BlackMarketeerOfMammon/BlackMarketeerOfMammon.java
@ -39,6 +40,7 @@ ai/npc/FreyasSteward/FreyasSteward.java
ai/npc/Jinia/Jinia.java
ai/npc/Katenar/Katenar.java
ai/npc/KetraOrcSupport/KetraOrcSupport.java
ai/npc/Kier/Kier.java
ai/npc/ManorManager/ManorManager.java
ai/npc/MercenaryCaptain/MercenaryCaptain.java
ai/npc/Minigame/Minigame.java
@ -55,6 +57,7 @@ ai/npc/Summons/MerchantGolem/GolemTrader.java
ai/npc/Summons/Servitors/Servitors.java
ai/npc/SupportUnitCaptain/SupportUnitCaptain.java
ai/npc/SymbolMaker/SymbolMaker.java
ai/npc/Teleports/Asher/Asher.java
ai/npc/Teleports/CrumaTower/CrumaTower.java
ai/npc/Teleports/DelusionTeleport/DelusionTeleport.java
ai/npc/Teleports/ElrokiTeleporters/ElrokiTeleporters.java
@ -137,16 +140,21 @@ ai/individual/Venom/Venom.java
ai/individual/Anais.java
ai/individual/Ballista.java
ai/individual/Beleth.java
ai/individual/BlackdaggerWing.java
ai/individual/BleedingFly.java
ai/individual/CrimsonHatuOtis.java
ai/individual/Core.java
ai/individual/DarkWaterDragon.java
ai/individual/DivineBeast.java
ai/individual/DrChaos.java
ai/individual/DustRider.java
ai/individual/EmeraldHorn.java
ai/individual/Epidos.java
ai/individual/EvasGiftBox.java
ai/individual/FrightenedRagnaOrc.java
ai/individual/Gordon.java
ai/individual/GraveRobbers.java
ai/individual/MuscleBomber.java
ai/individual/Orfen.java
ai/individual/QueenAnt.java
ai/individual/QueenShyeed.java
@ -154,6 +162,7 @@ ai/individual/RagnaOrcCommander.java
ai/individual/RagnaOrcHero.java
ai/individual/RagnaOrcSeer.java
ai/individual/ScarletVanHalisha.java
ai/individual/ShadowSummoner.java
ai/individual/SinEater.java
ai/individual/SinWardens.java
ai/individual/Valakas.java
@ -189,11 +198,6 @@ hellbound/HellboundLoader.java
# Quests Section
quests/QuestMasterHandler.java
quests/TerritoryWarScripts/TerritoryWarSuperClass.java
#quests/335_TheSongOfTheHunter/__init__.py
#quests/348_ArrogantSearch/__init__.py
#quests/384_WarehouseKeepersPastime/__init__.py
#quests/620_FourGoblets/__init__.py
#quests/663_SeductiveWhispers/__init__.py
# Features
features/SkillTransfer/SkillTransfer.java

View File

@ -0,0 +1,122 @@
/*
* 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.individual;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* Blackdagger Wing AI.
* @author Zoey76
* @since 2.6.0.0
*/
public class BlackdaggerWing extends AbstractNpcAI
{
// NPCs
private static final int BLACKDAGGER_WING = 25721;
// Skills
private static final SkillHolder POWER_STRIKE = new SkillHolder(6833, 1);
private static final SkillHolder RANGE_MAGIC_ATTACK = new SkillHolder(6834, 1);
// Variables
private static final String MID_HP_FLAG = "MID_HP_FLAG";
private static final String POWER_STRIKE_CAST_COUNT = "POWER_STRIKE_CAST_COUNT";
// Timers
private static final String DAMAGE_TIMER = "DAMAGE_TIMER";
// Misc
private static final int MAX_CHASE_DIST = 2500;
private static final double MID_HP_PERCENTAGE = 0.50;
public BlackdaggerWing()
{
super(BlackdaggerWing.class.getSimpleName(), "ai/individual");
addAttackId(BLACKDAGGER_WING);
addSeeCreatureId(BLACKDAGGER_WING);
addSpellFinishedId(BLACKDAGGER_WING);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
{
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
}
if ((npc.getCurrentHp() < (npc.getMaxHp() * MID_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(MID_HP_FLAG, false))
{
npc.getVariables().set(MID_HP_FLAG, true);
startQuestTimer(DAMAGE_TIMER, 10000, npc, attacker);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
{
if (npc.getVariables().getBoolean(MID_HP_FLAG, false))
{
final L2Character mostHated = ((L2Attackable) npc).getMostHated();
if ((mostHated != null) && mostHated.isPlayer() && (mostHated != creature))
{
if (getRandom(5) < 1)
{
addSkillCastDesire(npc, creature, RANGE_MAGIC_ATTACK, 99999);
}
}
}
return super.onSeeCreature(npc, creature, isSummon);
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
if (skill.getId() == POWER_STRIKE.getSkillId())
{
npc.getVariables().set(POWER_STRIKE_CAST_COUNT, npc.getVariables().getInt(POWER_STRIKE_CAST_COUNT) + 1);
if (npc.getVariables().getInt(POWER_STRIKE_CAST_COUNT) > 3)
{
addSkillCastDesire(npc, player, RANGE_MAGIC_ATTACK, 99999);
npc.getVariables().set(POWER_STRIKE_CAST_COUNT, 0);
}
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (DAMAGE_TIMER.equals(event))
{
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK);
startQuestTimer(DAMAGE_TIMER, 30000, npc, player);
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new BlackdaggerWing();
}
}

View File

@ -0,0 +1,136 @@
/*
* 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.individual;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* Bleeding Fly AI.
* @author Zoey76
* @since 2.6.0.0
*/
public class BleedingFly extends AbstractNpcAI
{
// NPCs
private static final int BLEEDING_FLY = 25720;
private static final int PARASITIC_LEECH = 25734;
// Skills
private static final SkillHolder SUMMON_PARASITE_LEECH = new SkillHolder(6832, 1);
private static final SkillHolder NPC_ACUMEN_LVL_3 = new SkillHolder(6915, 3);
// Variables
private static final String MID_HP_FLAG = "MID_HP_FLAG";
private static final String LOW_HP_FLAG = "LOW_HP_FLAG";
private static final String MID_HP_MINION_COUNT = "MID_HP_MINION_COUNT";
private static final String LOW_HP_MINION_COUNT = "LOW_HP_MINION_COUNT";
// Timers
private static final String TIMER_MID_HP = "TIMER_MID_HP";
private static final String TIMER_LOW_HP = "TIMER_LOW_HP";
// Misc
private static final int MAX_CHASE_DIST = 2500;
private static final double MID_HP_PERCENTAGE = 0.50;
private static final double MIN_HP_PERCENTAGE = 0.25;
public BleedingFly()
{
super(BleedingFly.class.getSimpleName(), "ai/individual");
addAttackId(BLEEDING_FLY);
addSpawnId(BLEEDING_FLY);
}
@Override
public String onSpawn(L2Npc npc)
{
npc.getVariables().set(MID_HP_MINION_COUNT, 5);
npc.getVariables().set(LOW_HP_MINION_COUNT, 10);
return super.onSpawn(npc);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
{
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
}
if ((npc.getCurrentHp() < (npc.getMaxHp() * MID_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(MID_HP_FLAG, false))
{
npc.getVariables().set(MID_HP_FLAG, true);
startQuestTimer(TIMER_MID_HP, 1000, npc, null);
}
if ((npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(LOW_HP_FLAG, false))
{
npc.getVariables().set(MID_HP_FLAG, false);
npc.getVariables().set(LOW_HP_FLAG, true);
startQuestTimer(TIMER_LOW_HP, 1000, npc, null);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (npc.isDead())
{
return super.onAdvEvent(event, npc, player);
}
if (TIMER_MID_HP.equals(event))
{
if (npc.getVariables().getInt(MID_HP_MINION_COUNT) > 0)
{
npc.getVariables().set(MID_HP_MINION_COUNT, npc.getVariables().getInt(MID_HP_MINION_COUNT) - 1);
addSkillCastDesire(npc, npc, SUMMON_PARASITE_LEECH, 99999);
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
if (npc.getVariables().getBoolean(MID_HP_FLAG, false))
{
startQuestTimer(TIMER_MID_HP, 140000, npc, null);
}
}
}
else if (TIMER_LOW_HP.equals(event))
{
if (npc.getVariables().getInt(LOW_HP_MINION_COUNT) > 0)
{
npc.getVariables().set(LOW_HP_MINION_COUNT, npc.getVariables().getInt(LOW_HP_MINION_COUNT) - 1);
addSkillCastDesire(npc, npc, SUMMON_PARASITE_LEECH, 99999);
addSkillCastDesire(npc, npc, NPC_ACUMEN_LVL_3, 99999);
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
if (npc.getVariables().getBoolean(LOW_HP_FLAG, false))
{
startQuestTimer(TIMER_LOW_HP, 80000, npc, null);
}
}
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new BleedingFly();
}
}

View File

@ -0,0 +1,68 @@
/*
* 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.individual;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* Dust Rider AI.
* @author Zoey76
* @since 2.6.0.0
*/
public class DustRider extends AbstractNpcAI
{
private static final int DUST_RIDER = 25719;
// Skills
private static final SkillHolder NPC_HASTE_LVL_3 = new SkillHolder(6914, 3);
// Variables
private static final String CAST_FLAG = "CAST_FLAG";
// Misc
private static final int MAX_CHASE_DIST = 2500;
private static final double MIN_HP_PERCENTAGE = 0.30;
public DustRider()
{
super(DustRider.class.getSimpleName(), "ai/individual");
addAttackId(DUST_RIDER);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
{
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
}
if (!npc.getVariables().getBoolean(CAST_FLAG, false) && (npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)))
{
npc.getVariables().set(CAST_FLAG, true);
addSkillCastDesire(npc, npc, NPC_HASTE_LVL_3, 99999);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
public static void main(String[] args)
{
new DustRider();
}
}

View File

@ -0,0 +1,134 @@
/*
* 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.individual;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* Emerald Horn AI.
* @author Zoey76
* @since 2.6.0.0
*/
public class EmeraldHorn extends AbstractNpcAI
{
private static final int EMERALD_HORN = 25718;
// Skills
private static final SkillHolder REFLECT_ATTACK = new SkillHolder(6823, 1);
private static final SkillHolder PIERCING_STORM = new SkillHolder(6824, 1);
private static final SkillHolder BLEED_LVL_1 = new SkillHolder(6825, 1);
private static final SkillHolder BLEED_LVL_2 = new SkillHolder(6825, 2);
// Variables
private static final String HIGH_DAMAGE_FLAG = "HIGH_DAMAGE_FLAG";
private static final String TOTAL_DAMAGE_COUNT = "TOTAL_DAMAGE_COUNT";
private static final String CAST_FLAG = "CAST_FLAG";
// Timers
private static final String DAMAGE_TIMER_15S = "DAMAGE_TIMER_15S";
// Misc
private static final int MAX_CHASE_DIST = 2500;
public EmeraldHorn()
{
super(EmeraldHorn.class.getSimpleName(), "ai/individual");
addAttackId(EMERALD_HORN);
addSpellFinishedId(EMERALD_HORN);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
{
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
}
if (npc.isAffectedBySkill(REFLECT_ATTACK.getSkillId()))
{
if (npc.getVariables().getBoolean(CAST_FLAG, false))
{
npc.getVariables().set(TOTAL_DAMAGE_COUNT, npc.getVariables().getInt(TOTAL_DAMAGE_COUNT) + damage);
}
}
if (npc.getVariables().getInt(TOTAL_DAMAGE_COUNT) > 5000)
{
addSkillCastDesire(npc, attacker, BLEED_LVL_2, 99999);
npc.getVariables().set(TOTAL_DAMAGE_COUNT, 0);
npc.getVariables().set(CAST_FLAG, false);
npc.getVariables().set(HIGH_DAMAGE_FLAG, true);
}
if (npc.getVariables().getInt(TOTAL_DAMAGE_COUNT) > 10000)
{
addSkillCastDesire(npc, attacker, BLEED_LVL_1, 99999);
npc.getVariables().set(TOTAL_DAMAGE_COUNT, 0);
npc.getVariables().set(CAST_FLAG, false);
npc.getVariables().set(HIGH_DAMAGE_FLAG, true);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
if (getRandom(5) < 1)
{
npc.getVariables().set(TOTAL_DAMAGE_COUNT, 0);
npc.getVariables().set(CAST_FLAG, true);
addSkillCastDesire(npc, npc, REFLECT_ATTACK, 99999);
startQuestTimer(DAMAGE_TIMER_15S, 15 * 1000, npc, player);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (DAMAGE_TIMER_15S.equals(event))
{
if (!npc.getVariables().getBoolean(HIGH_DAMAGE_FLAG, false))
{
final L2Character mostHated = ((L2Attackable) npc).getMostHated();
if (mostHated != null)
{
if (mostHated.isDead())
{
((L2Attackable) npc).stopHating(mostHated);
}
else
{
addSkillCastDesire(npc, mostHated, PIERCING_STORM, 99999);
}
}
}
npc.getVariables().set(CAST_FLAG, false);
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new EmeraldHorn();
}
}

View File

@ -0,0 +1,112 @@
/*
* 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.individual;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* Muscle Bomber AI.
* @author Zoey76
* @since 2.6.0.0
*/
public class MuscleBomber extends AbstractNpcAI
{
// NPC
private static final int MUSCLE_BOMBER = 25724;
private static final int DRAKOS_ASSASSIN = 22823;
// Skills
private static final SkillHolder ENHANCE_LVL_1 = new SkillHolder(6842, 1);
private static final SkillHolder ENHANCE_LVL_2 = new SkillHolder(6842, 2);
// Variables
private static final String HIGH_HP_FLAG = "HIGH_HP_FLAG";
private static final String MED_HP_FLAG = "MED_HP_FLAG";
private static final String LIMIT_FLAG = "LIMIT_FLAG";
// Timers
private static final String TIMER_SUMMON = "TIMER_SUMMON";
private static final String TIMER_LIMIT = "TIMER_LIMIT";
// Misc
private static final int MAX_CHASE_DIST = 2500;
private static final double HIGH_HP_PERCENTAGE = 0.80;
private static final double MED_HP_PERCENTAGE = 0.50;
public MuscleBomber()
{
super(MuscleBomber.class.getSimpleName(), "ai/individual");
addAttackId(MUSCLE_BOMBER);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
{
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
}
if ((npc.getCurrentHp() < (npc.getMaxHp() * HIGH_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(HIGH_HP_FLAG, false))
{
npc.getVariables().set(HIGH_HP_FLAG, true);
addSkillCastDesire(npc, npc, ENHANCE_LVL_1, 99999);
}
if ((npc.getCurrentHp() < (npc.getMaxHp() * MED_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(MED_HP_FLAG, false))
{
npc.getVariables().set(MED_HP_FLAG, true);
addSkillCastDesire(npc, npc, ENHANCE_LVL_2, 99999);
startQuestTimer(TIMER_SUMMON, 60000, npc, attacker);
startQuestTimer(TIMER_LIMIT, 300000, npc, attacker);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
switch (event)
{
case TIMER_LIMIT:
{
npc.getVariables().set(LIMIT_FLAG, true);
break;
}
case TIMER_SUMMON:
{
if (!npc.isDead() && !npc.getVariables().getBoolean(LIMIT_FLAG, false))
{
if (player != null)
{
addAttackDesire(addSpawn(DRAKOS_ASSASSIN, npc.getX() + getRandom(100), npc.getY() + getRandom(10), npc.getZ(), npc.getHeading(), false, 0), player);
addAttackDesire(addSpawn(DRAKOS_ASSASSIN, npc.getX() + getRandom(100), npc.getY() + getRandom(10), npc.getZ(), npc.getHeading(), false, 0), player);
}
startQuestTimer(TIMER_SUMMON, 60000, npc, player);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new MuscleBomber();
}
}

View File

@ -0,0 +1,134 @@
/*
* 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.individual;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* Shadow Summoner AI.
* @author Zoey76
* @since 2.6.0.0
*/
public class ShadowSummoner extends AbstractNpcAI
{
// NPCs
private static final int SHADOW_SUMMONER = 25722;
private static final int DEMONS_BANQUET_1 = 25730;
private static final int DEMONS_BANQUET_2 = 25731;
// Skills
private static final SkillHolder SUMMON_SKELETON = new SkillHolder(6835, 1);
// Variables
private static final String LOW_HP_FLAG = "LOW_HP_FLAG";
private static final String LIMIT_FLAG = "LIMIT_FLAG";
// Timers
private static final String SUMMON_TIMER = "SUMMON_TIMER";
private static final String FEED_TIMER = "FEED_TIMER";
private static final String LIMIT_TIMER = "LIMIT_TIMER";
private static final String DELAY_TIMER = "DELAY_TIMER";
// Misc
private static final int MAX_CHASE_DIST = 2500;
private static final double MIN_HP_PERCENTAGE = 0.25;
public ShadowSummoner()
{
super(ShadowSummoner.class.getSimpleName(), "ai/individual");
addAttackId(SHADOW_SUMMONER);
addSeeCreatureId(SHADOW_SUMMONER);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
{
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
}
if ((npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(LOW_HP_FLAG, false))
{
npc.getVariables().set(LOW_HP_FLAG, true);
startQuestTimer(SUMMON_TIMER, 1000, npc, attacker);
startQuestTimer(FEED_TIMER, 30000, npc, attacker);
startQuestTimer(LIMIT_TIMER, 600000, npc, attacker);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
{
if (!creature.isPlayer())
{
if (creature.getId() == DEMONS_BANQUET_2)
{
((L2Attackable) npc).clearAggroList();
addAttackDesire(npc, creature, 99999);
}
}
return super.onSeeCreature(npc, creature, isSummon);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (npc.isDead())
{
return super.onAdvEvent(event, npc, player);
}
if (SUMMON_TIMER.equals(event))
{
if (!npc.getVariables().getBoolean(LIMIT_FLAG, false))
{
startQuestTimer(DELAY_TIMER, 5000, npc, player);
startQuestTimer(SUMMON_TIMER, 30000, npc, player);
}
}
else if (FEED_TIMER.equals(event))
{
if (!npc.getVariables().getBoolean(LIMIT_FLAG, false))
{
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK);
startQuestTimer(FEED_TIMER, 30000, npc, player);
}
}
else if (LIMIT_TIMER.equals(event))
{
npc.getVariables().set(LIMIT_FLAG, true);
}
else if (DELAY_TIMER.equals(event))
{
addSkillCastDesire(npc, npc, SUMMON_SKELETON, 99999);
final L2Npc demonsBanquet = addSpawn(getRandom(2) < 1 ? DEMONS_BANQUET_1 : DEMONS_BANQUET_2, npc.getX() + 150, npc.getY() + 150, npc.getZ(), npc.getHeading(), false, 0);
addAttackDesire(demonsBanquet, player, 10000);
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new ShadowSummoner();
}
}

View File

@ -39,13 +39,13 @@ public final class Alexandria extends AbstractNpcAI
// Items
private static final ItemHolder[] REQUIRED_ITEMS = new ItemHolder[]
{
new ItemHolder(57, 3550000),
new ItemHolder(5094, 400),
new ItemHolder(6471, 200),
new ItemHolder(9814, 40),
new ItemHolder(9815, 30),
new ItemHolder(9816, 50),
new ItemHolder(9817, 50),
new ItemHolder(57, 7500000),
new ItemHolder(5094, 50),
new ItemHolder(6471, 25),
new ItemHolder(9814, 4),
new ItemHolder(9815, 3),
new ItemHolder(9816, 5),
new ItemHolder(9817, 5),
};
// Agathions
private static final QuestItemHolder[] LITTLE_DEVILS = new QuestItemHolder[]
@ -97,7 +97,7 @@ public final class Alexandria extends AbstractNpcAI
for (QuestItemHolder agathion : AGATHIONS.get(event))
{
chance3 += agathion.getChance();
if ((chance >= chance2) && (chance2 < chance3))
if ((chance2 <= chance) && (chance < chance3))
{
if (takeAllItems(player, REQUIRED_ITEMS))
{

View File

@ -0,0 +1,8 @@
<html><body>Asamah:<br>
I am Asamah, son of Mushika, chief of the Elroki tribe. These are our lands. In them lies perhaps our last hope to return to our ancient ancestral home. But these days are evil, and our hope is waning before this threat.<br>
Our strength has run out like water from a broken pot, and although my ancestors would be shamed to ask for aid, I believe only an outsider like yourself can save us now.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a><br>
<a action="bypass -h Quest Asamah 32115-03.htm">Find out how to use the capture skill.</a><br>
<a action="bypass -h npc_%objectId%_multisell 577">Equip the trap.</a><br>
<a action="bypass -h npc_%objectId%_multisell 578">Buy</a>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Asamah:<br>
I am Asamah, son of Mushika, chief of the Elroki tribe. These are our lands. In them lies perhaps our last hope to return to our ancient ancestral home. But these days are evil, and our hope is waning before this threat.<br>
Our strength has run out like water from a broken pot, and although my ancestors would be shamed to ask for aid, I believe only an outsider like yourself can save us now.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a><br>
<a action="bypass -h Quest Asamah 32115-03.htm">Find out how to use the capture skill.</a><br>
<a action="bypass -h npc_%objectId%_multisell 578">Buy</a>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Asamah:<br>
If you have a trap, then you may use at least 3 types of capture skills. You can only use a capture skill on the predatory Tyrannosaurus.<br>
If you are capturing a Tyrannosaurus for the first time, you will use the <font color="LEVEL">Kabokula</font> technique most among the three capture skills. But you cannot completely capture this powerful predatory dinosaur with just one skill type!<br>
At this point, watch the Tyrannosaurus' reactions and use the proper skill to maintain its state of captivity. Nothing is a better teacher than your own experience, but since you have come all this way, I will tell you the traditional capture method of the Elkrohki. Listen carefully.<br>
<a action="bypass -h Quest Asamah 32115-04.htm">Next.</a>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Asamah:<br>
You must know which action to use when a Tyrannosaurus tries to cancel a capture skill. When the beast <font color="LEVEL">roars, shakes and writhes</font>, the appropriate capture skills to use are <font color="LEVEL">kabokula, tapirawa and shabonoba</font>. Watch each action of the Tyrannosaurus carefully and respond with the correct skill.<br>
Remember that using a capture skill consumes both capture stones and MP. Be sure to prepare enough of them both! May Shilen bless your efforts!
</body></html>

View File

@ -0,0 +1,65 @@
/*
* 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.npc.Asamah;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.quest.QuestState;
import ai.AbstractNpcAI;
import quests.Q00111_ElrokianHuntersProof.Q00111_ElrokianHuntersProof;
/**
* Asamah AI.
* @author Adry_85
* @since 2.6.0.0
*/
public final class Asamah extends AbstractNpcAI
{
// NPC
private static final int ASAMAH = 32115;
public Asamah()
{
super(Asamah.class.getSimpleName(), "ai/npc");
addFirstTalkId(ASAMAH);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
String htmltext = null;
if (event.equals("32115-03.htm") || event.equals("32115-04.htm"))
{
htmltext = event;
}
return htmltext;
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
final QuestState st = player.getQuestState(Q00111_ElrokianHuntersProof.class.getSimpleName());
return ((st != null) && (st.isCompleted())) ? "32115-01.htm" : "32115-02.htm";
}
public static void main(String[] args)
{
new Asamah();
}
}

View File

@ -0,0 +1,3 @@
<html><body>Dragon Vortex:<br>
You can't summon the monster this soon. Please wait a little.
</body></html>

View File

@ -1,3 +0,0 @@
<html><body>Dragon Vortex:<br>
No high commanding dragon can be summoned at this time, since they are already summoned.
</body></html>

View File

@ -1,5 +1,6 @@
<html><body>Dragon Vortex:<br>
A mysterious vortex which has the power to summon one of Antharas's high commanding dragons. To call forth one of these creatures you must use a <font color="LEVEL">Large Dragon Bone</font> to entice it.<br>
Summoned Dragons: <font color="LEVEL">Emerald Horn, Dust Rider, Bleeding Fly, Blackdagger Wing, Shadow Summoner, Spike Slasher, & Muscle Bomber</font><br>
<a action="bypass -h Quest DragonVortex Spawn">Use a Large Dragon Bone</a>
A mysterious vortex which has the power to summon one of Antharas' high commanding dragons.<br>
To call forth one of these creatures, you must use a <font color="LEVEL">Large Dragon Bone</font>.<br>
Dragons to be summoned: <font color="LEVEL">Emerald Horn Dust Rider Bleeding Fly Blackdagger Wing Shadow Summoner Spike Slasher Muscle Bomber</font><br>
<a action="bypass -h Quest DragonVortex RAIDBOSS">Use a Large Dragon Bone</a>
</body></html>

View File

@ -16,11 +16,7 @@
*/
package ai.npc.DragonVortex;
import java.util.ArrayList;
import java.util.List;
import com.l2jmobius.gameserver.datatables.SpawnTable;
import com.l2jmobius.gameserver.model.L2Spawn;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
@ -28,158 +24,131 @@ import ai.AbstractNpcAI;
/**
* Dragon Vortex AI.
* @author UnAfraid, improved by Adry_85 & DreamStage
* @author Adry_85
* @since 2.6.0.0
*/
public final class DragonVortex extends AbstractNpcAI
{
// NPC
private static final int VORTEX = 32871;
private static final int DRAGON_VORTEX = 32871;
// Raids
private static final int[][] RAIDS =
{
{
25718, // Emerald Horn 29.2%
292
},
{
25719, // Dust Rider 22.4%
224
},
{
25720, // Bleeding Fly 17.6%
176
},
{
25721, // Blackdagger Wing 11.6%
116
},
{
25723, // Spike Slasher 9.2%
92
},
{
25722, // Shadow Summoner 5.6%
56
},
{
25724, // Muscle Bomber 4.4%
44
}
};
private static final int EMERALD_HORN = 25718;
private static final int DUST_RIDER = 25719;
private static final int BLEEDING_FLY = 25720;
private static final int BLACKDAGGER_WING = 25721;
private static final int SHADOW_SUMMONER = 25722;
private static final int SPIKE_SLASHER = 25723;
private static final int MUSCLE_BOMBER = 25724;
// Item
private static final int LARGE_DRAGON_BONE = 17248;
// Misc
private static final int DESPAWN_DELAY = 1800000; // 30min
// Variables
private static final String I_QUEST0 = "I_QUEST0";
// Locations
private static final Location SPOT_1 = new Location(92744, 114045, -3072);
private static final Location SPOT_2 = new Location(110112, 124976, -3624);
private static final Location SPOT_3 = new Location(121637, 113657, -3792);
private static final Location SPOT_4 = new Location(109346, 111849, -3040);
private DragonVortex()
{
super(DragonVortex.class.getSimpleName(), "ai/npc");
addStartNpc(VORTEX);
addFirstTalkId(VORTEX);
addTalkId(VORTEX);
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
return "32871.html";
addStartNpc(DRAGON_VORTEX);
addFirstTalkId(DRAGON_VORTEX);
addTalkId(DRAGON_VORTEX);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if ("Spawn".equals(event))
switch (event)
{
if (hasQuestItems(player, LARGE_DRAGON_BONE))
case "RAIDBOSS":
{
final int chance = getRandom(1000);
final List<int[]> unspawnedRaids = new ArrayList<>();
final List<int[]> unspawnedCandidates = new ArrayList<>();
int raidChanceIncrease = 0;
// Iterate over all Raids and check which ones are currently spawned, sum spawned Raids chance for unspawnedRaids List distribution
for (int[] raidsList : RAIDS)
if (hasQuestItems(player, LARGE_DRAGON_BONE))
{
final int raidChance = raidsList[1];
if (checkIfNpcSpawned(raidsList[0]))
if (!npc.getVariables().getBoolean(I_QUEST0, false))
{
raidChanceIncrease += raidChance;
takeItems(player, LARGE_DRAGON_BONE, 1);
final int random = getRandom(100);
int raid = 0;
if (random < 3)
{
raid = MUSCLE_BOMBER;
}
else if (random < 8)
{
raid = SHADOW_SUMMONER;
}
else if (random < 15)
{
raid = SPIKE_SLASHER;
}
else if (random < 25)
{
raid = BLACKDAGGER_WING;
}
else if (random < 45)
{
raid = BLEEDING_FLY;
}
else if (random < 67)
{
raid = DUST_RIDER;
}
else
{
raid = EMERALD_HORN;
}
Location LOC = null;
switch (npc.getX())
{
case 92225:
{
LOC = SPOT_1;
break;
}
case 110116:
{
LOC = SPOT_2;
break;
}
case 121172:
{
LOC = SPOT_3;
break;
}
case 108924:
{
LOC = SPOT_4;
break;
}
}
npc.getVariables().set(I_QUEST0, true);
addSpawn(raid, LOC, false, 0, true);
startQuestTimer("CANSPAWN", 60000, npc, null);
}
else
{
unspawnedRaids.add(new int[]
{
raidsList[0],
raidChance
});
return "32871-02.html";
}
}
// If there are unspawnedRaids onto the new List, distribute the amount of increased chances for each one and spawn a new Raid from the new chances
if (!unspawnedRaids.isEmpty())
else
{
final int unspawnedRaidsSize = unspawnedRaids.size();
final int chanceIncrease = (raidChanceIncrease / unspawnedRaidsSize);
int raidChanceValue = 0;
for (int[] unspawnedRaidsList : unspawnedRaids)
{
raidChanceValue += unspawnedRaidsList[1] + chanceIncrease;
unspawnedCandidates.add(new int[]
{
unspawnedRaidsList[0],
raidChanceValue
});
}
for (int[] unspawnedCandidatesList : unspawnedCandidates)
{
if (chance <= unspawnedCandidatesList[1])
{
spawnRaid(unspawnedCandidatesList[0], npc, player);
break;
}
}
return null;
return "32871-01.html";
}
return "32871-noboss.html";
break;
}
case "CANSPAWN":
{
npc.getVariables().set(I_QUEST0, false);
break;
}
return "32871-no.html";
}
return super.onAdvEvent(event, npc, player);
}
/**
* Method used for spawning a Dragon Vortex Raid and take a Large Dragon Bone from the Player
* @param raidId
* @param npc
* @param player
*/
public void spawnRaid(int raidId, L2Npc npc, L2PcInstance player)
{
final L2Spawn spawnDat = addSpawn(raidId, npc.getX() + getRandom(-500, 500), npc.getY() + getRandom(-500, 500), npc.getZ() + 10, 0, false, DESPAWN_DELAY, true).getSpawn();
SpawnTable.getInstance().addNewSpawn(spawnDat, false);
takeItems(player, LARGE_DRAGON_BONE, 1);
}
/**
* Method used for checking if npc is spawned
* @param npcId
* @return if npc is spawned
*/
public boolean checkIfNpcSpawned(int npcId)
{
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
{
final L2Npc spawnedWarpgate = spawn.getLastSpawn();
if ((spawnedWarpgate != null))
{
return true;
}
}
return false;
}
public static void main(String[] args)
{
new DragonVortex();

View File

@ -0,0 +1,4 @@
<html><body>
(This one is different than the ones I saw before. This one is isolated, and somehow sad looking.<br>
<a action="bypass -h npc_%objectId%_Quest">Look around.</a>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>
(It's a stone statue that looks like a human being. Otherwise it looks normal.)
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>
(This is Kier, a member of Jinia Guild who was turned into an ice sculpture by the Ice Queen Freya.)<br>
<a action="bypass -h npc_%objectId%_Quest">Look around the ice sculpture.</a>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>
(A former member of the Jinia Guild. Now he's an ice sculpture of Kier by the Ice Queen.)
</body></html>

View File

@ -0,0 +1,76 @@
/*
* 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.npc.Kier;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.quest.QuestState;
import ai.AbstractNpcAI;
import quests.Q00115_TheOtherSideOfTruth.Q00115_TheOtherSideOfTruth;
import quests.Q10283_RequestOfIceMerchant.Q10283_RequestOfIceMerchant;
/**
* Kier AI.
* @author Adry_85
* @since 2.6.0.0
*/
public final class Kier extends AbstractNpcAI
{
// NPC
private static final int KIER = 32022;
private Kier()
{
super(Kier.class.getSimpleName(), "ai/npc");
addFirstTalkId(KIER);
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
String htmltext = null;
final QuestState st_Q00115 = player.getQuestState(Q00115_TheOtherSideOfTruth.class.getSimpleName());
if (st_Q00115 == null)
{
htmltext = "32022-02.html";
}
else if (!st_Q00115.isCompleted())
{
htmltext = "32022-01.html";
}
final QuestState st_Q10283 = player.getQuestState(Q10283_RequestOfIceMerchant.class.getSimpleName());
if (st_Q10283 != null)
{
if (st_Q10283.isMemoState(2))
{
htmltext = "32022-03.html";
}
else if (st_Q10283.isCompleted())
{
htmltext = "32022-04.html";
}
}
return htmltext;
}
public static void main(String[] args)
{
new Kier();
}
}

View File

@ -0,0 +1,4 @@
<html><body>Gatekeeper Asher:<br>
Since the the seal was broken, various trees on the island have begun to "leak" large amounts of Mana, drawing it out from reserves far underground.<br>
It is now possible to regenerate MP simply by standing near some of these large trees!
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Gatekeeper Asher:<br>
You don't have enough money.<br>
Teleporting to Rune Township requires 50,000 Adena.
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Gatekeeper Asher:<br>
For thousands of years, Primeval Isle had been sealed to prevent its inhabitants from leaving through this Gate. Now, however, adventurers' activities seem to have finally weakened the seal enough to permit departures.<br>
You may now teleport to the mainland, but only to Rune Township. Would you like to do so?<br>
<a action="bypass -h Quest Asher teleport">Teleport to Rune Township (50,000 Adena).</a><br>
<a action="bypass -h Quest Asher 32714-01.html">Ask about the effects of the weakened seal.</a><br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,73 @@
/*
* 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.npc.Teleports.Asher;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
import ai.AbstractNpcAI;
/**
* Asher AI.
* @author Adry_85
* @since 2.6.0.0
*/
public class Asher extends AbstractNpcAI
{
// NPC
private static final int ASHER = 32714;
// Location
private static final Location LOCATION = new Location(43835, -47749, -792);
// Misc
private static final int ADENA = 50000;
private Asher()
{
super(Asher.class.getSimpleName(), "ai/npc/Teleports");
addFirstTalkId(ASHER);
addStartNpc(ASHER);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (event.equals("teleport"))
{
if (player.getAdena() >= ADENA)
{
player.teleToLocation(LOCATION);
takeItems(player, Inventory.ADENA_ID, ADENA);
}
else
{
return "32714-02.html";
}
}
else if (event.equals("32714-01.html"))
{
return event;
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new Asher();
}
}

View File

@ -196,6 +196,11 @@ public abstract class AbstractInstance extends AbstractNpcAI
protected abstract void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance);
protected boolean checkConditions(L2PcInstance player, int templateId)
{
return checkConditions(player);
}
protected boolean checkConditions(L2PcInstance player)
{
return true;

View File

@ -0,0 +1,3 @@
<html><body>
One of your party members is not a member of the clan who owns the castle...
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>
It is already in use. Once training has begun, you must wait 4 hours before entering.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>
You cannot enter the Prison 2 hours prior to a siege. Access will be granted once the siege ends. Also, you can't access the underground dungeon until a castle lord announces the siege after the battle.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>
The threat to civic order in the territory is a great deal more pressing than a training session in the prison.<br> (You cannot enter the prison without a contract with the fortress.)
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Prison Manager:<br>
This is a dangerous place. Don't come around here unless you're ready for a fight!<br><br>
<a action="bypass -h npc_%objectId%_Chat 0">"I heard a rumor about Rim Pailaka."</a><br>
<a action="bypass -h Quest CastleDungeon">"I want to enter the prison."</a><br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -0,0 +1,233 @@
/*
* 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 instances.CastleDungeon;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.l2jmobius.gameserver.instancemanager.FortManager;
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
import com.l2jmobius.gameserver.model.L2Party;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.entity.Castle;
import com.l2jmobius.gameserver.model.entity.Fort;
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import com.l2jmobius.gameserver.util.Util;
import instances.AbstractInstance;
/**
* Castle Dungeon instance zone.
* @author Adry_85
* @since 2.6.0.0
*/
public final class CastleDungeon extends AbstractInstance
{
protected class CDWorld extends InstanceWorld
{
}
// Locations
private static final Location[] ENTER_LOC =
{
new Location(12188, -48770, -3008),
new Location(12218, -48770, -3008),
new Location(12248, -48770, -3008),
};
private static final Location RAIDS_LOC = new Location(11793, -49190, -3008, 0);
// Misc
private static final Map<Integer, Integer> CASTLE_DUNGEON = new HashMap<>();
private static final Map<Integer, List<Integer>> FORTRESS = new HashMap<>();
static
{
CASTLE_DUNGEON.put(36403, 13); // Gludio
CASTLE_DUNGEON.put(36404, 14); // Dion
CASTLE_DUNGEON.put(36405, 15); // Giran
CASTLE_DUNGEON.put(36406, 16); // Oren
CASTLE_DUNGEON.put(36407, 17); // Aden
CASTLE_DUNGEON.put(36408, 18); // Innadril
CASTLE_DUNGEON.put(36409, 19); // Goddard
CASTLE_DUNGEON.put(36410, 20); // Rune
CASTLE_DUNGEON.put(36411, 21); // Schuttgart
FORTRESS.put(1, Arrays.asList(101, 102, 112, 113)); // Gludio Castle
FORTRESS.put(2, Arrays.asList(103, 112, 114, 115)); // Dion Castle
FORTRESS.put(3, Arrays.asList(104, 114, 116, 118, 119)); // Giran Castle
FORTRESS.put(4, Arrays.asList(105, 113, 115, 116, 117)); // Oren Castle
FORTRESS.put(5, Arrays.asList(106, 107, 117, 118)); // Aden Castle
FORTRESS.put(6, Arrays.asList(108, 119)); // Innadril Castle
FORTRESS.put(7, Arrays.asList(109, 117, 120)); // Goddard Castle
FORTRESS.put(8, Arrays.asList(110, 120, 121)); // Rune Castle
FORTRESS.put(9, Arrays.asList(111, 121)); // Schuttgart Castle
}
// Raid Bosses
protected static final int[] RAIDS1 =
{
25546, // Rhianna the Traitor
25549, // Tesla the Deceiver
25552, // Soul Hunter Chakundel
};
protected static final int[] RAIDS2 =
{
25553, // Durango the Crusher
25554, // Brutus the Obstinate
25557, // Ranger Karankawa
25560, // Sargon the Mad
};
protected static final int[] RAIDS3 =
{
25563, // Beautiful Atrielle
25566, // Nagen the Tomboy
25569, // Jax the Destroyer
};
public CastleDungeon()
{
super(CastleDungeon.class.getSimpleName());
addFirstTalkId(CASTLE_DUNGEON.keySet());
addStartNpc(CASTLE_DUNGEON.keySet());
addTalkId(CASTLE_DUNGEON.keySet());
addKillId(RAIDS1);
addKillId(RAIDS2);
addKillId(RAIDS3);
}
@Override
public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance)
{
if (firstEntrance)
{
if (player.getParty() == null)
{
teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId());
world.addAllowed(player.getObjectId());
}
else
{
for (L2PcInstance partyMember : player.getParty().getMembers())
{
teleportPlayer(partyMember, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId());
world.addAllowed(partyMember.getObjectId());
}
}
world.setStatus(0);
spawnRaid((CDWorld) world);
}
else
{
teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId());
}
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
return "36403.html";
}
@Override
public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
{
InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
if (tmpworld instanceof CDWorld)
{
CDWorld world = (CDWorld) tmpworld;
if (Util.contains(RAIDS3, npc.getId()))
{
finishInstance(world);
}
else
{
world.incStatus();
spawnRaid(world);
}
}
return null;
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
final L2Party party = player.getParty();
if (party == null)
{
return "36403-01.html";
}
final Castle castle = npc.getCastle();
if (castle.getSiege().isInProgress())
{
return "36403-04.html";
}
if ((npc.isMyLord(player) || ((player.getClan() != null) && (npc.getCastle().getResidenceId() == player.getClan().getCastleId()) && (player.getClan().getCastleId() > 0))))
{
final int numFort = ((castle.getResidenceId() == 1) || (castle.getResidenceId() == 5)) ? 2 : 1;
final List<Integer> fort = FORTRESS.get(castle.getResidenceId());
for (int i = 0; i < numFort; i++)
{
final Fort fortress = FortManager.getInstance().getFortById(fort.get(i));
if (fortress.getFortState() == 0)
{
return "36403-05.html";
}
}
}
for (L2PcInstance partyMember : party.getMembers())
{
if ((partyMember.getClan() == null) || (partyMember.getClan().getCastleId() != castle.getResidenceId()))
{
return "36403-02.html";
}
if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), CASTLE_DUNGEON.get(npc.getId())))
{
return "36403-03.html";
}
}
enterInstance(player, new CDWorld(), "CastleDungeon.xml", CASTLE_DUNGEON.get(npc.getId()));
return super.onTalk(npc, player);
}
protected void spawnRaid(CDWorld world)
{
int spawnId;
if (world.getStatus() == 0)
{
spawnId = RAIDS1[getRandom(RAIDS1.length)];
}
else if (world.getStatus() == 1)
{
spawnId = RAIDS2[getRandom(RAIDS2.length)];
}
else
{
spawnId = RAIDS3[getRandom(RAIDS3.length)];
}
addSpawn(spawnId, RAIDS_LOC, false, 0, false, world.getInstanceId());
}
}

View File

@ -27,7 +27,7 @@ import instances.AbstractInstance;
import quests.Q10292_SevenSignsGirlOfDoubt.Q10292_SevenSignsGirlOfDoubt;
import quests.Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom.Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom;
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
import quests.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal;
/**
* Elcadia's Tent instance zone.
@ -35,12 +35,17 @@ import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
*/
public final class ElcadiasTent extends AbstractInstance
{
protected class ETWorld extends InstanceWorld
{
}
// NPCs
private static final int ELCADIA = 32784;
private static final int GRUFF_LOOKING_MAN = 32862;
// Locations
private static final Location START_LOC = new Location(89706, -238074, -9632, 0, 0);
private static final Location EXIT_LOC = new Location(43316, -87986, -2832, 0, 0);
private static final Location START_LOC = new Location(89797, -238081, -9632);
private static final Location EXIT_LOC = new Location(43347, -87923, -2820);
// Misc
private static final int TEMPLATE_ID = 158;
@ -57,17 +62,17 @@ public final class ElcadiasTent extends AbstractInstance
{
if (npc.getId() == GRUFF_LOOKING_MAN)
{
final QuestState GirlOfDoubt = talker.getQuestState(Q10292_SevenSignsGirlOfDoubt.class.getSimpleName());
final QuestState ForbiddenBook = talker.getQuestState(Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom.class.getSimpleName());
final QuestState Monastery = talker.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
final QuestState PowerOfSeal = talker.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName());
if (((GirlOfDoubt != null) && GirlOfDoubt.isStarted()) //
|| ((GirlOfDoubt != null) && GirlOfDoubt.isCompleted() && (ForbiddenBook == null)) //
|| ((ForbiddenBook != null) && ForbiddenBook.isStarted()) //
|| ((ForbiddenBook != null) && ForbiddenBook.isCompleted() && (Monastery == null)) //
|| ((PowerOfSeal != null) && PowerOfSeal.isStarted()))
final QuestState Q10292 = talker.getQuestState(Q10292_SevenSignsGirlOfDoubt.class.getSimpleName());
final QuestState Q10293 = talker.getQuestState(Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom.class.getSimpleName());
final QuestState Q10294 = talker.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
final QuestState Q10296 = talker.getQuestState(Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.class.getSimpleName());
if (((Q10292 != null) && Q10292.isStarted()) //
|| ((Q10292 != null) && Q10292.isCompleted() && (Q10293 == null)) //
|| ((Q10293 != null) && Q10293.isStarted()) //
|| ((Q10293 != null) && Q10293.isCompleted() && (Q10294 == null)) //
|| ((Q10296 != null) && (Q10296.getMemoState() > 2) && (Q10296.getMemoState() < 4)))
{
enterInstance(talker, "ElcadiasTent.xml", TEMPLATE_ID);
enterInstance(talker, new ETWorld(), "ElcadiasTent.xml", TEMPLATE_ID);
}
else
{

View File

@ -19,6 +19,7 @@ package instances;
import java.util.logging.Level;
import java.util.logging.Logger;
import instances.CastleDungeon.CastleDungeon;
import instances.CavernOfThePirateCaptain.CavernOfThePirateCaptain;
import instances.ChambersOfDelusion.ChamberOfDelusionEast;
import instances.ChambersOfDelusion.ChamberOfDelusionNorth;
@ -42,12 +43,10 @@ import instances.Kamaloka.Kamaloka;
import instances.LibraryOfSages.LibraryOfSages;
import instances.MithrilMine.MithrilMine;
import instances.MonasteryOfSilence1.MonasteryOfSilence1;
import instances.MonasteryOfSilence2.MonasteryOfSilence2;
import instances.NornilsGarden.NornilsGarden;
import instances.NornilsGardenQuest.NornilsGardenQuest;
import instances.PailakaDevilsLegacy.PailakaDevilsLegacy;
import instances.PailakaSongOfIceAndFire.PailakaSongOfIceAndFire;
import instances.RimKamaloka.RimKamaloka;
import instances.SanctumOftheLordsOfDawn.SanctumOftheLordsOfDawn;
/**
@ -60,6 +59,7 @@ public final class InstanceLoader
private static final Class<?>[] SCRIPTS =
{
CastleDungeon.class,
CavernOfThePirateCaptain.class,
CrystalCaverns.class,
DarkCloudMansion.class,
@ -83,12 +83,10 @@ public final class InstanceLoader
LibraryOfSages.class,
MithrilMine.class,
MonasteryOfSilence1.class,
MonasteryOfSilence2.class,
NornilsGarden.class,
NornilsGardenQuest.class,
PailakaDevilsLegacy.class,
PailakaSongOfIceAndFire.class,
RimKamaloka.class,
SanctumOftheLordsOfDawn.class,
};

View File

@ -1,5 +0,0 @@
<html><html>Sister of Silence Eris:<br>
Finally we meet, Successors of Fate. In the end, the endless Bridle of Eternity will be back where it belongs.<br>
<a action="bypass -h Quest MonasteryOfSilence1 EXIT">"I'd like to go outside."</a><br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@ -1,3 +1,3 @@
<html><body>Teleportation Device: Move to East Watcher's Room.<br><br>
<html><body>Teleportation Device: Move to East Watcher's Room.<br>
<a action="bypass -h Quest MonasteryOfSilence1 EAST">Move to East Watcher's Room</a>
</body></html>

View File

@ -1,3 +1,3 @@
<html><body>Teleportation Device: Move to West Watcher's Room.<br><br>
<html><body>Teleportation Device: Move to West Watcher's Room.<br>
<a action="bypass -h Quest MonasteryOfSilence1 WEST">Move to West Watcher's Room</a>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Tomb of Saintess:<br>
You look at the tomb, and see these words.<br>
"For the Saintess Solina, who devoted all her life to serve Einhasad and the Elmoreden Kingdom...to be remembered forever by those she saved and those who loved her...may punishing find the feet of those who ignored Solina's teachings."<br>
This is not Solina's real tomb.
</body></html>

View File

@ -16,16 +16,22 @@
*/
package instances.MonasteryOfSilence1;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.network.NpcStringId;
import instances.AbstractInstance;
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
import quests.Q10295_SevenSignsSolinasTomb.Q10295_SevenSignsSolinasTomb;
import quests.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal;
/**
* Monastery of Silence instance zone.
@ -36,6 +42,8 @@ public final class MonasteryOfSilence1 extends AbstractInstance
protected static final class MoSWorld extends InstanceWorld
{
protected L2Npc elcadia = null;
protected int deadTombGuardianCount = 0;
protected int deadSolinaGuardianCount = 0;
}
// NPCs
@ -51,6 +59,24 @@ public final class MonasteryOfSilence1 extends AbstractInstance
private static final int TELEPORT_CONTROL_DEVICE2 = 32818;
private static final int TELEPORT_CONTROL_DEVICE3 = 32819;
private static final int TELEPORT_CONTROL_DEVICE4 = 32820;
private static final int TOMB_OF_THE_SAINTESS = 32843;
// Monsters
private static final int TRAINEE_OF_REST = 27403;
private static final int SUPPLICANT_OF_REST = 27404;
private static final int ETIS_VAN_ETINA = 18949;
private static final int SOLINAS_GUARDIAN_1 = 18952;
private static final int SOLINAS_GUARDIAN_2 = 18953;
private static final int SOLINAS_GUARDIAN_3 = 18954;
private static final int SOLINAS_GUARDIAN_4 = 18955;
private static final int GUARDIAN_OF_THE_TOMB_1 = 18956;
private static final int GUARDIAN_OF_THE_TOMB_2 = 18957;
private static final int GUARDIAN_OF_THE_TOMB_3 = 18958;
private static final int GUARDIAN_OF_THE_TOMB_4 = 18959;
// Items
private static final int SCROLL_OF_ABSTINENCE = 17228;
private static final int SHIELD_OF_SACRIFICE = 17229;
private static final int SWORD_OF_HOLY_SPIRIT = 17230;
private static final int STAFF_OF_BLESSING = 17231;
// Skills
private static final SkillHolder[] BUFFS =
{
@ -59,28 +85,109 @@ public final class MonasteryOfSilence1 extends AbstractInstance
new SkillHolder(6730, 1), // Greater Battle Heal of Elcadia
};
// Locations
private static final Location START_LOC = new Location(120710, -86971, -3392);
private static final Location EXIT_LOC = new Location(115983, -87351, -3397, 0, 0);
private static final Location START_LOC = new Location(120717, -86879, -3424);
private static final Location EXIT_LOC = new Location(115983, -87351, -3397);
private static final Location CENTRAL_ROOM_LOC = new Location(85794, -249788, -8320);
private static final Location SOUTH_WATCHERS_ROOM_LOC = new Location(85798, -246566, -8320);
private static final Location WEST_WATCHERS_ROOM_LOC = new Location(82531, -249405, -8320);
private static final Location EAST_WATCHERS_ROOM_LOC = new Location(88665, -249784, -8320);
private static final Location NORTH_WATCHERS_ROOM_LOC = new Location(85792, -252336, -8320);
private static final Location BACK_LOC = new Location(120710, -86971, -3392);
// NpcString
private static final NpcStringId[] ELCADIA_DIALOGS =
private static final Location START_LOC_Q10295 = new Location(45545, -249423, -6788);
private static final Location CASKET_ROOM_LOC = new Location(56033, -252944, -6792);
private static final Location SOLINAS_RESTING_PLACE_LOC = new Location(55955, -250394, -6792);
private static final Location DIRECTORS_ROOM_LOC = new Location(120717, -86879, -3424);
private static final Location GUARDIAN_OF_THE_TOMB_1_LOC = new Location(55498, -252781, -6752, 0);
private static final Location GUARDIAN_OF_THE_TOMB_2_LOC = new Location(55520, -252160, -6752, 0);
private static final Location GUARDIAN_OF_THE_TOMB_3_LOC = new Location(56635, -252776, -6752, -32180);
private static final Location GUARDIAN_OF_THE_TOMB_4_LOC = new Location(56672, -252156, -6754, 32252);
private static final Location SOLINAS_GUARDIAN_1_LOC = new Location(45399, -253051, -6765, 16584);
private static final Location SOLINAS_GUARDIAN_2_LOC = new Location(48736, -249632, -6768, -32628);
private static final Location SOLINAS_GUARDIAN_3_LOC = new Location(45392, -246303, -6768, -16268);
private static final Location SOLINAS_GUARDIAN_4_LOC = new Location(42016, -249648, -6764, 0);
private static final Location ELCADIA_LOC = new Location(115927, -87005, -3392);
private static final Location SPACE_LOC = new Location(76736, -241021, -10780);
private static final Location ETIS_VAN_ETINA_LOC = new Location(76625, -240824, -10832, 0);
private static final Location[] SLAVE_SPAWN_1_LOC =
{
new Location(55680, -252832, -6752),
new Location(55825, -252792, -6752),
new Location(55687, -252718, -6752),
new Location(55824, -252679, -6752),
};
private static final Location[] SLAVE_SPAWN_2_LOC =
{
new Location(55672, -252099, -6751),
new Location(55810, -252262, -6752),
new Location(55824, -252112, -6752),
new Location(55669, -252227, -6752),
};
private static final Location[] SLAVE_SPAWN_3_LOC =
{
new Location(56480, -252833, -6751),
new Location(56481, -252725, -6752),
new Location(56368, -252787, -6752),
new Location(56368, -252669, -6752),
};
private static final Location[] SLAVE_SPAWN_4_LOC =
{
new Location(56463, -252225, -6751),
new Location(56469, -252108, -6752),
new Location(56336, -252168, -6752),
new Location(56336, -252288, -6752),
};
// NpcString
private static final NpcStringId[] ELCADIA_DIALOGS_Q010294 =
{
NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK,
NpcStringId.WE_MUST_SEARCH_HIGH_AND_LOW_IN_EVERY_ROOM_FOR_THE_READING_DESK_THAT_CONTAINS_THE_BOOK_WE_SEEK,
NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU
NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU,
NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK
};
private static final NpcStringId[] ELCADIA_DIALOGS_Q010295 =
{
NpcStringId.THE_GUARDIAN_OF_THE_SEAL_DOESN_T_SEEM_TO_GET_INJURED_AT_ALL_UNTIL_THE_BARRIER_IS_DESTROYED,
NpcStringId.THE_DEVICE_LOCATED_IN_THE_ROOM_IN_FRONT_OF_THE_GUARDIAN_OF_THE_SEAL_IS_DEFINITELY_THE_BARRIER_THAT_CONTROLS_THE_GUARDIAN_S_POWER,
NpcStringId.TO_REMOVE_THE_BARRIER_YOU_MUST_FIND_THE_RELICS_THAT_FIT_THE_BARRIER_AND_ACTIVATE_THE_DEVICE
};
// Misc
private static final int TEMPLATE_ID = 151;
// Doors
private static final int TOMB_DOOR = 21100018;
private static final int[] DOORS =
{
21100014,
21100001,
21100006,
21100010,
21100003,
21100008,
21100012,
21100016,
21100002,
21100015,
21100005,
21100004,
21100009,
21100007,
21100013,
21100011
};
private static final int[] FAKE_TOMB_DOORS =
{
21100101,
21100102,
21100103,
21100104
};
public MonasteryOfSilence1()
{
super(MonasteryOfSilence1.class.getSimpleName());
addFirstTalkId(TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4, ERIS_EVIL_THOUGHTS);
addFirstTalkId(TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4);
addKillId(SOLINAS_GUARDIAN_1, SOLINAS_GUARDIAN_2, SOLINAS_GUARDIAN_3, SOLINAS_GUARDIAN_4, GUARDIAN_OF_THE_TOMB_1, GUARDIAN_OF_THE_TOMB_2, GUARDIAN_OF_THE_TOMB_3, GUARDIAN_OF_THE_TOMB_4, ETIS_VAN_ETINA);
addSpawnId(ERIS_EVIL_THOUGHTS, TOMB_OF_THE_SAINTESS);
addStartNpc(ODD_GLOBE, TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4, ERIS_EVIL_THOUGHTS);
addTalkId(ODD_GLOBE, ERIS_EVIL_THOUGHTS, RELIC_GUARDIAN, RELIC_WATCHER1, RELIC_WATCHER2, RELIC_WATCHER3, RELIC_WATCHER4, TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4, ERIS_EVIL_THOUGHTS);
}
@ -99,91 +206,338 @@ public final class MonasteryOfSilence1 extends AbstractInstance
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final InstanceWorld tmpworld = InstanceManager.getInstance().getPlayerWorld(player);
if (!(tmpworld instanceof MoSWorld))
final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
if (tmpworld instanceof MoSWorld)
{
return null;
}
final MoSWorld world = (MoSWorld) tmpworld;
switch (event)
{
case "TELE2":
final MoSWorld world = (MoSWorld) tmpworld;
switch (event)
{
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, 0, world.getInstanceId());
startQuestTimer("START_MOVIE", 2000, npc, player);
break;
}
case "EXIT":
{
cancelQuestTimer("FOLLOW", npc, player);
teleportPlayer(player, EXIT_LOC, 0);
world.elcadia.deleteMe();
break;
}
case "START_MOVIE":
{
player.showQuestMovie(24);
break;
}
case "BACK":
{
teleportPlayer(player, BACK_LOC, world.getInstanceId());
world.elcadia.teleToLocation(BACK_LOC, 0, world.getInstanceId());
break;
}
case "EAST":
{
teleportPlayer(player, EAST_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(EAST_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
break;
}
case "WEST":
{
teleportPlayer(player, WEST_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(WEST_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
break;
}
case "NORTH":
{
teleportPlayer(player, NORTH_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(NORTH_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
break;
}
case "SOUTH":
{
teleportPlayer(player, SOUTH_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(SOUTH_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
break;
}
case "CENTER":
{
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, 0, world.getInstanceId());
break;
}
case "FOLLOW":
{
npc.setIsRunning(true);
npc.getAI().startFollow(player);
if (player.isInCombat())
case "TELE2":
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.YOUR_WORK_HERE_IS_DONE_SO_RETURN_TO_THE_CENTRAL_GUARDIAN);
npc.setTarget(player);
npc.doCast(BUFFS[getRandom(BUFFS.length)].getSkill());
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, world.getInstanceId(), 0);
startQuestTimer("START_MOVIE", 2000, npc, player);
break;
}
else
case "EXIT":
{
npc.broadcastSay(ChatType.NPC_GENERAL, ELCADIA_DIALOGS[getRandom(ELCADIA_DIALOGS.length)]);
cancelQuestTimer("FOLLOW", npc, player);
cancelQuestTimer("DIALOG", npc, player);
teleportPlayer(player, EXIT_LOC, 0);
world.elcadia.deleteMe();
break;
}
case "START_MOVIE":
{
player.showQuestMovie(24);
break;
}
case "BACK":
{
teleportPlayer(player, BACK_LOC, world.getInstanceId());
world.elcadia.teleToLocation(BACK_LOC, world.getInstanceId(), 0);
break;
}
case "EAST":
{
teleportPlayer(player, EAST_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(EAST_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "WEST":
{
teleportPlayer(player, WEST_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(WEST_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "NORTH":
{
teleportPlayer(player, NORTH_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(NORTH_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "SOUTH":
{
teleportPlayer(player, SOUTH_WATCHERS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(SOUTH_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "CENTER":
{
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "FOLLOW":
{
npc.setIsRunning(true);
npc.getAI().startFollow(player);
if (player.isInCombat())
{
npc.doCast(BUFFS[getRandom(BUFFS.length)].getSkill());
}
startQuestTimer("FOLLOW", 5000, npc, player);
break;
}
case "DIALOG":
{
final QuestState st_Q10294 = player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
final QuestState st_Q10295 = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
if ((st_Q10294 != null) && st_Q10294.isStarted())
{
npc.broadcastSay(ChatType.NPC_GENERAL, ELCADIA_DIALOGS_Q010294[getRandom(ELCADIA_DIALOGS_Q010294.length)]);
}
if ((st_Q10295 != null) && st_Q10295.isMemoState(1))
{
npc.broadcastSay(ChatType.NPC_GENERAL, ELCADIA_DIALOGS_Q010295[getRandom(ELCADIA_DIALOGS_Q010295.length)]);
}
startQuestTimer("DIALOG", 10000, npc, player);
break;
}
case "ENTER_Q10295":
{
teleportPlayer(player, START_LOC_Q10295, world.getInstanceId());
world.elcadia.teleToLocation(START_LOC_Q10295, world.getInstanceId(), 0);
startQuestTimer("START_MOVIE_Q10295", 2000, npc, player);
break;
}
case "START_MOVIE_Q10295":
{
player.showQuestMovie(26);
break;
}
case "CASKET_ROOM":
{
teleportPlayer(player, CASKET_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(CASKET_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "SOLINAS_RESTING_PLACE":
{
teleportPlayer(player, SOLINAS_RESTING_PLACE_LOC, world.getInstanceId());
world.elcadia.teleToLocation(SOLINAS_RESTING_PLACE_LOC, world.getInstanceId(), 0);
break;
}
case "ERIS_OFFICE":
{
teleportPlayer(player, START_LOC, world.getInstanceId());
world.elcadia.teleToLocation(START_LOC, world.getInstanceId(), 0);
break;
}
case "OPEN_DOORS":
{
for (int doorId : DOORS)
{
openDoor(doorId, world.getInstanceId());
}
break;
}
case "DIRECTORS_ROOM":
{
teleportPlayer(player, DIRECTORS_ROOM_LOC, world.getInstanceId());
world.elcadia.teleToLocation(DIRECTORS_ROOM_LOC, world.getInstanceId(), 0);
break;
}
case "USE_SCROLL":
{
// TODO (Adry_85): Missing area debuff
if (hasQuestItems(player, SCROLL_OF_ABSTINENCE))
{
takeItems(player, SCROLL_OF_ABSTINENCE, 1);
addSpawn(SOLINAS_GUARDIAN_1, SOLINAS_GUARDIAN_1_LOC, false, 0, false, world.getInstanceId());
}
break;
}
case "USE_SHIELD":
{
// TODO (Adry_85): Missing area debuff
if (hasQuestItems(player, SHIELD_OF_SACRIFICE))
{
takeItems(player, SHIELD_OF_SACRIFICE, 1);
addSpawn(SOLINAS_GUARDIAN_2, SOLINAS_GUARDIAN_2_LOC, false, 0, false, world.getInstanceId());
}
break;
}
case "USE_SWORD":
{
// TODO (Adry_85): Missing area debuff
if (hasQuestItems(player, SWORD_OF_HOLY_SPIRIT))
{
takeItems(player, SWORD_OF_HOLY_SPIRIT, 1);
addSpawn(SOLINAS_GUARDIAN_3, SOLINAS_GUARDIAN_3_LOC, false, 0, false, world.getInstanceId());
}
break;
}
case "USE_STAFF":
{
// TODO (Adry_85): Missing area debuff
if (hasQuestItems(player, STAFF_OF_BLESSING))
{
takeItems(player, STAFF_OF_BLESSING, 1);
addSpawn(SOLINAS_GUARDIAN_4, SOLINAS_GUARDIAN_4_LOC, false, 0, false, world.getInstanceId());
}
break;
}
case "CLOSE_TOMB_DOORS":
{
for (int doorId : FAKE_TOMB_DOORS)
{
closeDoor(doorId, world.getInstanceId());
}
break;
}
case "TOMB_GUARDIAN_SPAWN":
{
for (int doorId : FAKE_TOMB_DOORS)
{
openDoor(doorId, world.getInstanceId());
}
addSpawn(GUARDIAN_OF_THE_TOMB_1, GUARDIAN_OF_THE_TOMB_1_LOC, false, 0, false, world.getInstanceId());
for (Location LOC : SLAVE_SPAWN_1_LOC)
{
L2Attackable mob = (L2Attackable) addSpawn(TRAINEE_OF_REST, LOC, false, 0, false, world.getInstanceId());
mob.setIsRunning(true);
mob.addDamageHate(player, 0, 999);
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
}
addSpawn(GUARDIAN_OF_THE_TOMB_2, GUARDIAN_OF_THE_TOMB_2_LOC, false, 0, false, world.getInstanceId());
for (Location LOC : SLAVE_SPAWN_2_LOC)
{
L2Attackable mob = (L2Attackable) addSpawn(TRAINEE_OF_REST, LOC, false, 0, false, world.getInstanceId());
mob.setIsRunning(true);
mob.addDamageHate(player, 0, 999);
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
}
addSpawn(GUARDIAN_OF_THE_TOMB_3, GUARDIAN_OF_THE_TOMB_3_LOC, false, 0, false, world.getInstanceId());
for (Location LOC : SLAVE_SPAWN_3_LOC)
{
L2Attackable mob = (L2Attackable) addSpawn(SUPPLICANT_OF_REST, LOC, false, 0, false, world.getInstanceId());
mob.setIsRunning(true);
mob.addDamageHate(player, 0, 999);
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
}
addSpawn(GUARDIAN_OF_THE_TOMB_4, GUARDIAN_OF_THE_TOMB_4_LOC, false, 0, false, world.getInstanceId());
for (Location LOC : SLAVE_SPAWN_4_LOC)
{
L2Attackable mob = (L2Attackable) addSpawn(SUPPLICANT_OF_REST, LOC, false, 0, false, world.getInstanceId());
mob.setIsRunning(true);
mob.addDamageHate(player, 0, 999);
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
}
return "32843-01.html";
}
case "START_MOVIE_Q10296":
{
player.showQuestMovie(29);
startQuestTimer("TELEPORT_SPACE", 60000, npc, player);
world.elcadia.teleToLocation(ELCADIA_LOC, world.getInstanceId(), 0);
break;
}
case "TELEPORT_SPACE":
{
teleportPlayer(player, SPACE_LOC, world.getInstanceId());
world.elcadia.teleToLocation(SPACE_LOC, world.getInstanceId(), 0);
addSpawn(ETIS_VAN_ETINA, ETIS_VAN_ETINA_LOC, false, 0, false, world.getInstanceId());
break;
}
case "TELEPORT_TO_PLAYER":
{
world.elcadia.teleToLocation(player.getX(), player.getY(), player.getZ(), 0, world.getInstanceId());
break;
}
startQuestTimer("FOLLOW", 10000, npc, player);
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
{
InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
if (tmpworld instanceof MoSWorld)
{
MoSWorld world = (MoSWorld) tmpworld;
switch (npc.getId())
{
case GUARDIAN_OF_THE_TOMB_1:
case GUARDIAN_OF_THE_TOMB_2:
case GUARDIAN_OF_THE_TOMB_3:
case GUARDIAN_OF_THE_TOMB_4:
{
world.deadTombGuardianCount++;
if (world.deadTombGuardianCount == 4)
{
openDoor(TOMB_DOOR, world.getInstanceId());
final QuestState st = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
if ((st != null) && st.isMemoState(2))
{
st.setMemoState(3);
}
}
break;
}
case SOLINAS_GUARDIAN_1:
case SOLINAS_GUARDIAN_2:
case SOLINAS_GUARDIAN_3:
case SOLINAS_GUARDIAN_4:
{
world.deadSolinaGuardianCount++;
if (world.deadSolinaGuardianCount == 4)
{
player.showQuestMovie(27);
final QuestState st = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
if ((st != null) && st.isMemoState(1))
{
st.setMemoState(2);
}
}
break;
}
case ETIS_VAN_ETINA:
{
player.showQuestMovie(30);
world.elcadia.teleToLocation(ELCADIA_LOC, world.getInstanceId(), 0);
startQuestTimer("TELEPORT_TO_PLAYER", 63000, npc, player);
final QuestState st = player.getQuestState(Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.class.getSimpleName());
if ((st != null) && st.isMemoState(2))
{
st.setMemoState(3);
}
break;
}
}
}
return null;
}
@Override
public String onSpawn(L2Npc npc)
{
switch (npc.getId())
{
case ERIS_EVIL_THOUGHTS:
{
startQuestTimer("OPEN_DOORS", 1000, npc, null);
break;
}
case TOMB_OF_THE_SAINTESS:
{
startQuestTimer("CLOSE_TOMB_DOORS", 1000, npc, null);
break;
}
}
return super.onSpawn(npc);
}
@Override
public String onTalk(L2Npc npc, L2PcInstance talker)
{
@ -200,7 +554,8 @@ public final class MonasteryOfSilence1 extends AbstractInstance
{
world.elcadia.deleteMe();
}
world.elcadia = addSpawn(ELCADIA_INSTANCE, player.getX(), player.getY(), player.getZ(), 0, false, 0, false, player.getInstanceId());
startQuestTimer("FOLLOW", 3000, world.elcadia, player);
world.elcadia = addSpawn(ELCADIA_INSTANCE, player.getX(), player.getY(), player.getZ(), 0, false, 0, false, world.getInstanceId());
startQuestTimer("FOLLOW", 5000, world.elcadia, player);
startQuestTimer("DIALOG", 10000, world.elcadia, player);
}
}

View File

@ -1,535 +0,0 @@
/*
* 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 instances.MonasteryOfSilence2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.datatables.SkillData;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.entity.Instance;
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.network.NpcStringId;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.NpcSay;
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import ai.AbstractNpcAI;
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
import quests.Q10295_SevenSignsSolinasTomb.Q10295_SevenSignsSolinasTomb;
import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
public class MonasteryOfSilence2 extends AbstractNpcAI
{
// Values
private static final int INSTANCE_ID = 151;
// NPC's
private static final int OddGlobe = 32815;
private static final int Elcadia_First_Room = 32787;
private static final int Elcadia_Support = 32785;
private static final int ErissEvilThoughts = 32792;
private static final int SolinasEvilThoughts = 32793;
private static final int RelicGuardian = 32803;
private static final int WestRelicWatcher = 32804;
private static final int NorthRelicWatcher = 32805;
private static final int EastRelicWatcher = 32806;
private static final int SouthRelicWatcher = 32807;
private static final int EtisVanEtina = 32808;
private static final int WestTeleportControlDevice = 32816;
private static final int NorthTeleportControlDevice = 32817;
private static final int EastTeleportControlDevice = 32818;
private static final int SouthTeleportControlDevice = 32819;
private static final int JudeVanEtinasEvilThoughts = 32888;
private static final int TeleportControlDevice1 = 32837;
private static final int TeleportControlDevice2 = 32842;
private static final int TombOfTheSaintess = 32843;
private static final int AltarOfHallows_Staff = 32857;
private static final int AltarOfHallows_Sword = 32858;
private static final int AltarOfHallows_Scroll = 32859;
private static final int AltarOfHallows_Shield = 32860;
// Teleport's
private static final int ENTER = 0;
private static final int HOLYGRAL = 1;
private static final int EXIT = 2;
private static final int TW = 3;
private static final int TN = 4;
private static final int TE = 5;
private static final int TS = 6;
private static final int RTE = 7;
private static final int RTG = 8;
private static final int ENTER1 = 9;
private static final int MTS = 10;
private static final int MTS2 = 11;
private static final int EE = 12;
private static final int[][] TELEPORTS =
{
{
120664,
-86968,
-3392
}, // Enter
{
85937,
-249618,
-8320
}, // HolyBurailOpen
{
115944,
-86952,
-3392
}, // ExitInstance
{
82434,
-249546,
-8320
}, // TeleWest
{
85691,
-252426,
-8320
}, // TeleNorth
{
88573,
-249556,
-8320
}, // TeleEast
{
85675,
-246630,
-8320
}, // TeleSouth
{
120727,
-86868,
-3392
}, // ReturnToEris
{
85937,
-249618,
-8320
}, // ReturnToGuardian
{
45545,
-249423,
-6760
}, // Enter1
{
56033,
-252944,
-6760
}, // MoveToSaintness
{
55955,
-250394,
-6760
}, // MoveToSaintness2
{
76707,
-241022,
-10832
}
// EtisEtina
};
private static final int[] TALK =
{
OddGlobe,
Elcadia_Support,
WestTeleportControlDevice,
NorthTeleportControlDevice,
EastTeleportControlDevice,
SouthTeleportControlDevice,
RelicGuardian,
WestRelicWatcher,
NorthRelicWatcher,
EastRelicWatcher,
SouthRelicWatcher,
ErissEvilThoughts,
EtisVanEtina,
JudeVanEtinasEvilThoughts,
SolinasEvilThoughts,
TeleportControlDevice1,
TeleportControlDevice2,
TombOfTheSaintess,
AltarOfHallows_Staff,
AltarOfHallows_Sword,
AltarOfHallows_Scroll,
AltarOfHallows_Shield
};
private static final int[] MageBuff =
{
6725,
6721,
6722,
6717
};
private static final int[] FighterBuff =
{
6714,
6715,
6716,
6717
};
private final HashMap<Integer, InstanceHolder> instanceWorlds = new HashMap<>();
public static class InstanceHolder
{
List<L2Npc> mobs = new ArrayList<>();
}
private class MoSWorld2 extends InstanceWorld
{
public MoSWorld2()
{
}
}
public MonasteryOfSilence2()
{
super(MonasteryOfSilence2.class.getSimpleName(), "instances");
addStartNpc(OddGlobe);
addStartNpc(WestTeleportControlDevice);
addStartNpc(NorthTeleportControlDevice);
addStartNpc(EastTeleportControlDevice);
addStartNpc(SouthTeleportControlDevice);
for (int NPC : TALK)
{
addTalkId(NPC);
}
}
private void teleportPlayer(L2Npc npc, L2PcInstance player, int[] coords, int instanceId)
{
for (L2Character cha : player.getKnownList().getKnownCharacters())
{
if (cha.isNpc() && ((((L2Npc) cha).getId() == Elcadia_Support) || (((L2Npc) cha).getId() == Elcadia_First_Room)))
{
cha.deleteMe();
}
}
InstanceHolder holder = instanceWorlds.get(instanceId);
if ((holder == null) && (instanceId > 0))
{
holder = new InstanceHolder();
instanceWorlds.put(Integer.valueOf(instanceId), holder);
}
player.stopAllEffectsExceptThoseThatLastThroughDeath();
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
player.setInstanceId(instanceId);
player.teleToLocation(coords[0], coords[1], coords[2], false);
cancelQuestTimer("check_follow", npc, player);
if (holder != null)
{
for (L2Npc h : holder.mobs)
{
h.deleteMe();
}
holder.mobs.clear();
}
if ((holder != null) && (instanceId > 0))
{
final L2Npc support = addSpawn(Elcadia_Support, player.getX(), player.getY(), player.getZ(), 0, false, 0L, false, player.getInstanceId());
holder.mobs.add(support);
startQuestTimer("check_follow", 3000, support, player);
}
}
protected void enterInstance(L2Npc npc, L2PcInstance player)
{
InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player);
if (world != null)
{
if (!(world instanceof MoSWorld2))
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON));
return;
}
final Instance inst = InstanceManager.getInstance().getInstance(world.getInstanceId());
if (inst != null)
{
teleportPlayer(npc, player, TELEPORTS[ENTER], world.getInstanceId());
}
return;
}
final int instanceId = InstanceManager.getInstance().createDynamicInstance("MonasteryOfSilence.xml");
world = new MoSWorld2();
world.setInstanceId(instanceId);
world.setTemplateId(INSTANCE_ID);
world.setStatus(0);
InstanceManager.getInstance().addWorld(world);
world.addAllowed(player.getObjectId());
teleportPlayer(npc, player, TELEPORTS[ENTER], instanceId);
return;
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final String htmltext = getNoQuestMsg(player);
QuestState st = player.getQuestState(MonasteryOfSilence2.class.getSimpleName());
final QuestState qs = player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
final QuestState qs1 = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
if (st == null)
{
st = newQuestState(player);
}
if ("check_follow".equals(event))
{
cancelQuestTimer("check_follow", npc, player);
npc.getAI().stopFollow();
npc.setIsRunning(true);
npc.getAI().startFollow(player);
if ((qs != null) && (qs.getCond() == 2))
{
if (getRandom(10) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK));
}
else
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU));
}
}
if ((qs != null) && (qs.getCond() == 3))
{
if (getRandom(8) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.YOUR_WORK_HERE_IS_DONE_SO_RETURN_TO_THE_CENTRAL_GUARDIAN));
}
}
if ((qs1 != null) && (qs1.getCond() == 1))
{
if (getRandom(5) < 1)
{
if (getRandom(10) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.TO_REMOVE_THE_BARRIER_YOU_MUST_FIND_THE_RELICS_THAT_FIT_THE_BARRIER_AND_ACTIVATE_THE_DEVICE));
}
else if (getRandom(15) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.THE_GUARDIAN_OF_THE_SEAL_DOESN_T_SEEM_TO_GET_INJURED_AT_ALL_UNTIL_THE_BARRIER_IS_DESTROYED));
}
else
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.THE_DEVICE_LOCATED_IN_THE_ROOM_IN_FRONT_OF_THE_GUARDIAN_OF_THE_SEAL_IS_DEFINITELY_THE_BARRIER_THAT_CONTROLS_THE_GUARDIAN_S_POWER));
}
}
}
if (player.getCurrentHp() < (player.getMaxHp() * 0.8D))
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(6724, 1));
}
if (player.getCurrentMp() < (player.getMaxMp() * 0.5D))
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(6728, 1));
}
startQuestTimer("check_follow", 20000, npc, player);
return "";
}
else if ("enter".equals(event))
{
enterInstance(npc, player);
return null;
}
if (npc.getId() == ErissEvilThoughts)
{
if ("Enter1".equals(event))
{
if (qs1.getInt("seal_removed") != 1)
{
qs1.startQuestTimer("StartMovie", 1000);
teleportPlayer(npc, player, TELEPORTS[ENTER1], player.getInstanceId());
}
else
{
teleportPlayer(npc, player, TELEPORTS[MTS2], player.getInstanceId());
}
return null;
}
if ("Enter3".equals(event))
{
if ((qs.getInt("book_" + 32821) + qs.getInt("book_" + 32828) + qs.getInt("book_" + 32831) + qs.getInt("book_" + 32834)) != 4)
{
qs.startQuestTimer("OpenMovie", 4000);
}
teleportPlayer(npc, player, TELEPORTS[HOLYGRAL], player.getInstanceId());
return null;
}
else if ("video".equals(event))
{
player.showQuestMovie(29);
startQuestTimer("teleport", 60000, npc, player);
cancelQuestTimer("check_follow", npc, player);
final InstanceHolder holder = instanceWorlds.get(player.getInstanceId());
if (holder != null)
{
for (L2Npc h : holder.mobs)
{
h.deleteMe();
}
holder.mobs.clear();
}
return null;
}
else if ("teleport".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[EE], player.getInstanceId());
return null;
}
}
else if ("buff".equals(event))
{
if (player.isMageClass())
{
for (int h : MageBuff)
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(h, 1));
}
}
else
{
for (int h : FighterBuff)
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(h, 1));
}
}
return null;
}
else if ("Exit".equals(event))
{
cancelQuestTimer("check_follow", npc, player);
final InstanceHolder holder = instanceWorlds.get(player.getInstanceId());
if (holder != null)
{
for (L2Npc h : holder.mobs)
{
h.deleteMe();
}
holder.mobs.clear();
}
teleportPlayer(npc, player, TELEPORTS[EXIT], 0);
return null;
}
else if ("TeleWest".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[TW], player.getInstanceId());
return null;
}
else if (event.equalsIgnoreCase("TeleNorth"))
{
teleportPlayer(npc, player, TELEPORTS[TN], player.getInstanceId());
return null;
}
else if ("TeleEast".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[TE], player.getInstanceId());
return null;
}
else if ("TeleSouth".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[TS], player.getInstanceId());
return null;
}
else if ("ReturnToEris".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[RTE], player.getInstanceId());
return null;
}
else if ("ReturnToGuardian".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[RTG], player.getInstanceId());
return null;
}
else if ("MoveToSaintess".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[MTS], player.getInstanceId());
return null;
}
else if ("MoveToSaintess2".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[MTS2], player.getInstanceId());
return null;
}
return htmltext;
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
String htmltext = getNoQuestMsg(player);
QuestState st = player.getQuestState(MonasteryOfSilence2.class.getSimpleName());
if (st == null)
{
st = newQuestState(player);
}
final int npcId = npc.getId();
if (npcId == OddGlobe)
{
if ((player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()) != null) && (player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()).getState() == State.STARTED))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()) != null) && (player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()).getState() == State.COMPLETED) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) == null))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) != null) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()).getState() != State.COMPLETED))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) != null) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()).getState() == State.COMPLETED) && (player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()) == null))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()) != null) && (player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()).getState() != State.COMPLETED))
{
enterInstance(npc, player);
return null;
}
htmltext = "<html><body>Odd Globe:<br>The huge mechanism in the form of the globe. Around silent cottons are heard and in air presence of any unknown energy, which which in a way doesn't come under to your influence is felt.</body></html>";
}
return htmltext;
}
public static void main(String[] args)
{
new MonasteryOfSilence2();
}
}

View File

@ -1,9 +0,0 @@
<html><body>Pathfinder:<br>
First, I'll tell you about the enemies. <font color="LEVEL"> Kanabion </font> - not just a monster, a creature that appeared as a result of the connection of evil and darkness.<br>
Our goal - to destroy them and prevent the spread Kamaloki the territory of Aden.<br>
If you kill enough Kanabionov, then we'll give you some ammunition. In time we'll assign you a rank <font color="LEVEL"> from D to S </font> depending on your results.<br>
Or we can return collected by you from Kanabionov <font color="LEVEL"> Essences Kanabionov </font>. But in the real world there are no places where you can take advantage of them.<br>
Give them to us, if you think that you do not need. We offer appropriate compensation.<br>
And if you die around Kamaloki, no one can help you before time runs out or stay until the moment when all will be defeated. It's your dream.<br>
Thus, our technology will allow you to be around Kamaloki within <font color="LEVEL"> 20 minutes </font>. Do not forget about it.
</body></html>

View File

@ -1,5 +0,0 @@
<html><body>Pathfinder Agent:<br>
Once you enter the Chamber of Delusion, you will find managers for each area. There are 6 total, entry to which is regulated in the individual manager. Ask each manager for more details.<br>
If you've been to the Dimensional Rift, you will understand quickly.<br>
<a action="bypass -h npc_%objectId%_Quest DelusionTeleport">Challenge the Chamber of Delusion.</a>
</body></html>

View File

@ -1,10 +0,0 @@
<html><body>Pathfinder:<br>
We trackers sent from the Ivory Tower to confront the invasion nightmare. We are waiting for a traveler like you, will challenge the Darkness around Kamaloki.<br>
Environs Kamaloki - it was an invasion of darkness through dreams. If we do not stop it, then people will die in my sleep.<br>
We have developed a way to counter. If you are brave enough challenge a outskirts Kamaloki!<br>
<a Action="bypass -h npc_%objectId%_Quest RimKamaloka"> Challenge outlying Kamaloka</a><br>
<a Action="bypass -h npc_%objectId%_Chat 1"> Ask about how to counter</a><br>
<a Action="bypass -h npc_%objectId%_multisell 324840001"> Make a contribution in the form Essences Kanabiona </a> <br>
<a Action="bypass -h npc_%objectId%_Quest 9011_KamalokaAch"> Check the list of the best achievements</a><br>
<a action="bypass -h npc_%objectId%_Quest DelusionTeleport">Go to Chamber of Delusion.</a>
</body></html>

View File

@ -1,7 +0,0 @@
<html><body>Pathfinder:<br>
Battle is finished!<br>
To you it seems strange that I appeared in you sleep? Don't warry! We, Pathfinders, are trained many skills, which heer occurs. I simply controlled your thoughts...<br>
I shall describe to you, what you reached, and I shall help to get out from here.<br>
With to know you results?<br>
<a action="bypass -h npc_%objectId%_Quest RimKamaloka">To look results.</a>
</body></html>

View File

@ -1,7 +0,0 @@
<html><body>Pathfinder Worker:<br>
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 0">Enter Hall of Abyss (20~30 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 1">Enter Hall of Abyss (25~35 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 2">Enter Hall of Abyss (30~40 levels)</a>
</body></html>

View File

@ -1,6 +0,0 @@
<html><body>Pathfinder Worker:<br>
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 0">Enter Hall of Abyss (20~30 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 1">Enter Hall of Abyss (25~35 levels)</a>
</body></html>

View File

@ -1,9 +0,0 @@
<html><body>Pathfinder:<br>
Your result:<br>
<center>Rank A</center><br>
It is magnificent. You strongly lowered the rate of the intrusion through Kamaloka.<br>
As in any other battle, the main thing to protect itself, when you inside the Environments of Kamaloka. We they must not attack rash.<br>
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
You do want to obtain the reward, which corresponds to your level?<br>
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
</body></html>

View File

@ -1,9 +0,0 @@
<html><body>Pathfinder:<br>
Your result:<br>
<center>Rank B</center><br>
Very well. Your experience will help other to the finders of adventures.<br>
Battle with Kanabions is deliberately weaker you.. You they are assured, it is worthwhile to enter precisely thus? We, pathfinders, consider that this is the simply waste of time.<br>
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
You do want to obtain the reward, which corresponds to your level?<br>
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
</body></html>

View File

@ -1,9 +0,0 @@
<html><body>Pathfinder:<br>
Your result:<br>
<center>Rank C</center><br>
Good work. If the remaining finders adventures will show such results, this it will return to us hope.<br>
It cannot be always rely on the aid of others. Sometimes for you it is necessary to act independently.<br>
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
You do want to obtain the reward, which corresponds to your level?<br>
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
</body></html>

View File

@ -1,9 +0,0 @@
<html><body>Pathfinder:<br>
Your result:<br>
<center>Rank D</center><br>
This is poor result.<br>
Me you seemed you will be better.<br>
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
Do you want to obtain the reward, which corresponds to your level?<br>
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
</body></html>

View File

@ -1,7 +0,0 @@
<html> <body>Pathfinder:<br>
Here's your reward. <br>
We were able to collect some essences Kanabionov. Here, hold. <br>
We are in the chronology of your activities. If you want, we will tell you how effective the activities around Kamaloka, and who made the biggest contribution to our common cause. <br>
First, leave the area. <br>
<a Action="bypass -h Quest RimKamaloka Exit"> Exit </a>
</body> </html>

View File

@ -1,9 +0,0 @@
<html><body>Pathfinder:<br>
Your result:<br>
<center>Rank S</center><br>
This... These are the great reaching, is worthy of the heroes legends!<br>
I see, you understood the essence of our matter and it is wonderful they managed the task assigned to you.<br>
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
You do want to obtain the reward, which corresponds to your level?<br>
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
</body></html>

View File

@ -1,7 +0,0 @@
<html><body>Pathfinder Worker:<br>
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 2">Enter Hall of Abyss (30~40 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 3">Enter Hall of Abyss (35~45 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 4">Enter Hall of Abyss (40~50 levels)</a>
</body></html>

View File

@ -1,7 +0,0 @@
<html><body>Pathfinder Worker:<br>
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 2">Enter Hall of Abyss (30~40 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 3">Enter Hall of Abyss (35~45 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 4">Enter Hall of Abyss (40~50 levels)</a>
</body></html>

View File

@ -1,8 +0,0 @@
<html><body>Pathfinder Worker:<br>
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 3">Enter Hall of Abyss (35~45 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 4">Enter Hall of Abyss (40~50 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 5">Enter Hall of Abyss (45~55 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 6">Enter Hall of Abyss (50~60 levels)</a>
</body></html>

View File

@ -1,7 +0,0 @@
<html><body>Pathfinder:<br>
Here is your reward.<br>
We succeeded in gathering a little the essences devastated by you Kanabions. Here, you hold.<br>
We conduct the chronology of your activity. If you want, we will describe to you, to what extent is effective activity in the Environments of Kamaloka, and who made the largest contribution to our common work.<br>
First leave this place.<br>
<a action="bypass -h Quest RimKamaloka Exit">To leave Kamaloka.</a>
</body></html>

View File

@ -1,8 +0,0 @@
<html><body>Pathfinder Worker:<br>
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 7">Enter Hall of Abyss (55~65 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 8">Enter Hall of Abyss (60~70 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 9">Enter Hall of Abyss (65~75 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 10">Enter Hall of Abyss (70~80 levels)</a>
</body></html>

View File

@ -1,8 +0,0 @@
<html><body>Pathfinder Worker:<br>
hey are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
<a action="bypass -h Quest RimKamaloka 5">Enter Hall of Abyss (45~55 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 6">Enter Hall of Abyss (50~60 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 7">Enter Hall of Abyss (55~65 levels)</a><br>
<a action="bypass -h Quest RimKamaloka 8">Enter Hall of Abyss (60~70 levels)</a>
</body></html>

View File

@ -139,10 +139,10 @@ public abstract class AbstractSagaQuest extends Quest
final int xx = st2.getPlayer().getX();
final int yy = st2.getPlayer().getY();
final int zz = st2.getPlayer().getZ();
final L2Npc Archon = st2.addSpawn(Mob[1], xx, yy, zz);
final L2Npc Archon = addSpawn(Mob[1], xx, yy, zz, -1);
addSpawn(st2, Archon);
st2.set("spawned", "1");
st2.startQuestTimer("Archon Hellisha has despawned", 600000, Archon);
startQuestTimer("Archon Hellisha has despawned", 600000, Archon, player);
autoChat(Archon, Text[13].replace("PLAYERNAME", st2.getPlayer().getName()));
((L2Attackable) Archon).addDamageHate(st2.getPlayer(), 0, 99999);
Archon.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, st2.getPlayer(), null);
@ -293,8 +293,8 @@ public abstract class AbstractSagaQuest extends Quest
{
final L2Npc Mob_1 = addSpawn(Mob[0], npcSpawnLocations[0], false, 0);
st.set("spawned", "1");
st.startQuestTimer("Mob_1 Timer 1", 500, Mob_1);
st.startQuestTimer("Mob_1 has despawned", 300000, Mob_1);
startQuestTimer("Mob_1 Timer 1", 500, Mob_1, player);
startQuestTimer("Mob_1 has despawned", 300000, Mob_1, player);
addSpawn(st, Mob_1);
htmltext = "7-02.htm";
}
@ -331,10 +331,10 @@ public abstract class AbstractSagaQuest extends Quest
st.set("Mob_2", String.valueOf(Mob_2.getObjectId()));
st.set("Quest0", "1");
st.set("Quest1", "45");
st.startRepeatingQuestTimer("Mob_3 Timer 1", 500, Mob_3);
st.startQuestTimer("Mob_3 has despawned", 59000, Mob_3);
st.startQuestTimer("Mob_2 Timer 1", 500, Mob_2);
st.startQuestTimer("Mob_2 has despawned", 60000, Mob_2);
startQuestTimer("Mob_3 Timer 1", 500, Mob_3, player, true);
startQuestTimer("Mob_3 has despawned", 59000, Mob_3, player);
startQuestTimer("Mob_2 Timer 1", 500, Mob_2, player);
startQuestTimer("Mob_2 has despawned", 60000, Mob_2, player);
htmltext = "10-02.htm";
}
else if (st.getInt("Quest1") == 45)
@ -387,7 +387,7 @@ public abstract class AbstractSagaQuest extends Quest
return null;
case "Mob_2 Timer 1":
autoChat(npc, Text[7].replace("PLAYERNAME", player.getName()));
st.startQuestTimer("Mob_2 Timer 2", 1500, npc);
startQuestTimer("Mob_2 Timer 2", 1500, npc, player);
if (st.getInt("Quest1") == 45)
{
st.set("Quest1", "0");
@ -395,12 +395,12 @@ public abstract class AbstractSagaQuest extends Quest
return null;
case "Mob_2 Timer 2":
autoChat(npc, Text[8].replace("PLAYERNAME", player.getName()));
st.startQuestTimer("Mob_2 Timer 3", 10000, npc);
startQuestTimer("Mob_2 Timer 3", 10000, npc, player);
return null;
case "Mob_2 Timer 3":
if (st.getInt("Quest0") == 0)
{
st.startQuestTimer("Mob_2 Timer 3", 13000, npc);
startQuestTimer("Mob_2 Timer 3", 13000, npc, player);
if (getRandomBoolean())
{
autoChat(npc, Text[9].replace("PLAYERNAME", player.getName()));
@ -429,7 +429,7 @@ public abstract class AbstractSagaQuest extends Quest
}
else
{
st.startQuestTimer("Mob_2 has despawned", 1000, npc);
startQuestTimer("Mob_2 has despawned", 1000, npc, player);
}
return null;
}

View File

@ -138,7 +138,7 @@ public class Q00021_HiddenTruth extends Quest
final L2Npc ghost = addSpawn(GHOST_OF_VON_HELLMAN, GHOST_LOC, false, 0);
ghost.broadcastPacket(new NpcSay(ghost.getObjectId(), ChatType.GENERAL, ghost.getId(), NpcStringId.WHO_AWOKE_ME));
GHOST_SPAWNED = true;
st.startQuestTimer("DESPAWN_GHOST", 1000 * 300, ghost);
startQuestTimer("DESPAWN_GHOST", 1000 * 300, ghost, player);
st.setCond(2);
playSound(player, QuestSound.SKILLSOUND_HORROR_2);
htmltext = event;
@ -297,7 +297,7 @@ public class Q00021_HiddenTruth extends Quest
if (MOVE_ENDED)
{
htmltext = "31525-02.html";
st.startQuestTimer("DESPAWN", 3000, npc);
startQuestTimer("DESPAWN", 3000, npc, player);
}
else
{
@ -449,7 +449,7 @@ public class Q00021_HiddenTruth extends Quest
final QuestState st = L2World.getInstance().getPlayer(npc.getScriptValue()).getQuestState(getName());
if (st != null)
{
st.startQuestTimer("DESPAWN", 15000, npc);
startQuestTimer("DESPAWN", 15000, npc, null);
MOVE_ENDED = true;
}
}

Some files were not shown because too many files have changed in this diff Show More