Addition of Frintezza AI.

Contributed by robikbobik.
This commit is contained in:
MobiusDevelopment 2019-11-24 14:23:58 +00:00
parent 2501070808
commit 72369a0173
25 changed files with 5417 additions and 472 deletions

View File

@ -0,0 +1,6 @@
<html><body>Imperial Tomb Guide:<br>
Frintezza is protecting the Force Field. Even though you can pass through it, you can't meet Frintezza yet. He's put some tests in place to keep anyone from interrupting his rest.<br>
These obstacles will test all of your skills, and those of your party as well!<br>
If you pass the tests within a certain amount of time, you can meet Frintezza. This should only be attempted by the brave of heart!<br>
(If you pass the tests within 35 minutes, you'll meet Frintezza.)
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>
I feel an invisible barrier... Some sort of Magic Force Field has been put in place...<br>
...? The guide of the Imperial mausoleum seems to have something to say.<br><br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Quest LastImperialTomb">Enter the Magic Force Field</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Listen to Imperial Tomb Guide</Button>
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
</body></html>

View File

@ -0,0 +1,201 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance id="205" maxWorlds="80" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<time duration="120" empty="30" />
<locations>
<enter type="FIXED">
<location x="-88015" y="-141153" z="-9168"/>
</enter>
<exit type="ORIGIN" />
</locations>
<conditions>
<condition type="Party" />
<condition type="CommandChannel" />
<condition type="CommandChannelLeader" />
<condition type="GroupMin">
<param name="limit" value="27" /> <!-- The Kamael update -->
</condition>
<condition type="GroupMax">
<param name="limit" value="300" />
</condition>
<condition type="Level">
<param name="min" value="70" />
</condition>
<condition type="Distance" />
<condition type="Reenter" />
</conditions>
<reenter apply="ON_ENTER">
<reset day="WEDNESDAY" hour="6" minute="30" />
</reenter>
<doorlist>
<door id="17130045"/>
<door id="17130051"/>
<door id="17130046"/>
<door id="17130043"/>
<door id="17130042"/>
<door id="17130052"/>
<door id="17130053"/>
<door id="17130054"/>
<door id="17130055"/>
<door id="17130056"/>
<door id="17130057"/>
<door id="17130058"/>
<door id="17130061"/>
<door id="17130062"/>
<door id="17130063"/>
<door id="17130064"/>
<door id="17130065"/>
<door id="17130066"/>
<door id="17130067"/>
<door id="17130068"/>
<door id="17130069"/>
<door id="17130070"/>
</doorlist>
<spawnlist>
<group>
<npc id="18328" x="-87904" y="-141296" z="-9168" heading="0"/><!-- Hall Alarm -->
</group>
<group name="room1" spawnByDefault="false">
<npc id="18329" x="-87361" y="-142312" z="-9176" heading="43694"/>
<npc id="18329" x="-86916" y="-142136" z="-9176" heading="47013"/>
<npc id="18329" x="-87037" y="-142185" z="-9176" heading="36781"/>
<npc id="18329" x="-86869" y="-141910" z="-9176" heading="33913"/>
<npc id="18329" x="-86787" y="-141333" z="-9176" heading="49395"/>
<npc id="18329" x="-86581" y="-141426" z="-9176" heading="61112"/>
<npc id="18329" x="-86792" y="-141119" z="-9176" heading="36773"/>
<npc id="18329" x="-86693" y="-141079" z="-9176" heading="52481"/>
<npc id="18329" x="-87002" y="-140604" z="-9176" heading="52739"/>
<npc id="18329" x="-87074" y="-140403" z="-9176" heading="62270"/>
<npc id="18329" x="-87239" y="-140163" z="-9176" heading="62482"/>
<npc id="18329" x="-87816" y="-140199" z="-9176" heading="61902"/>
<npc id="18329" x="-87281" y="-140336" z="-9176" heading="46667"/>
<npc id="18329" x="-87809" y="-140030" z="-9176" heading="15952"/>
<npc id="18329" x="-88028" y="-140122" z="-9176" heading="58845"/>
<npc id="18329" x="-88186" y="-140004" z="-9176" heading="6601"/>
<npc id="18329" x="-88746" y="-140354" z="-9176" heading="40577"/>
<npc id="18329" x="-88717" y="-140442" z="-9176" heading="2789"/>
<npc id="18329" x="-88619" y="-140236" z="-9176" heading="46506"/>
<npc id="18329" x="-88936" y="-140502" z="-9176" heading="39670"/>
<npc id="18329" x="-89022" y="-141327" z="-9176" heading="40426"/>
<npc id="18329" x="-89177" y="-141120" z="-9176" heading="31507"/>
<npc id="18329" x="-89037" y="-141137" z="-9176" heading="8243"/>
<npc id="18329" x="-89075" y="-141545" z="-9176" heading="9402"/>
<npc id="18329" x="-89147" y="-141636" z="-9176" heading="16185"/>
<npc id="18329" x="-88857" y="-141957" z="-9176" heading="14827"/>
<npc id="18329" x="-88880" y="-142110" z="-9176" heading="16669"/>
<npc id="18329" x="-88554" y="-142294" z="-9176" heading="21413"/>
<npc id="18329" x="-88693" y="-142254" z="-9176" heading="29845"/>
<npc id="18330" x="-87188" y="-142282" z="-9176" heading="31391"/>
<npc id="18330" x="-86779" y="-142056" z="-9176" heading="57028"/>
<npc id="18330" x="-87043" y="-142152" z="-9176" heading="38684"/>
<npc id="18330" x="-87075" y="-142297" z="-9176" heading="46886"/>
<npc id="18330" x="-86923" y="-141903" z="-9176" heading="8556"/>
<npc id="18330" x="-86908" y="-142066" z="-9176" heading="33147"/>
<npc id="18330" x="-86819" y="-141497" z="-9176" heading="34625"/>
<npc id="18330" x="-86669" y="-141470" z="-9176" heading="43482"/>
<npc id="18330" x="-86710" y="-141243" z="-9176" heading="57995"/>
<npc id="18330" x="-86795" y="-141168" z="-9176" heading="45501"/>
<npc id="18330" x="-86556" y="-141283" z="-9176" heading="62885"/>
<npc id="18330" x="-86825" y="-140630" z="-9176" heading="60032"/>
<npc id="18330" x="-87030" y="-140389" z="-9176" heading="48351"/>
<npc id="18330" x="-87018" y="-140233" z="-9176" heading="58404"/>
<npc id="18330" x="-87115" y="-140461" z="-9176" heading="40098"/>
<npc id="18330" x="-87402" y="-140121" z="-9176" heading="1948"/>
<npc id="18330" x="-87207" y="-140079" z="-9176" heading="2212"/>
<npc id="18330" x="-87656" y="-140169" z="-9176" heading="52562"/>
<npc id="18330" x="-87841" y="-139951" z="-9176" heading="5627"/>
<npc id="18330" x="-88008" y="-140051" z="-9176" heading="8635"/>
<npc id="18330" x="-88098" y="-140149" z="-9176" heading="57598"/>
<npc id="18330" x="-88224" y="-140029" z="-9176" heading="6984"/>
<npc id="18330" x="-88689" y="-140355" z="-9176" heading="6411"/>
<npc id="18330" x="-88859" y="-140475" z="-9176" heading="19053"/>
<npc id="18330" x="-88571" y="-140352" z="-9176" heading="265"/>
<npc id="18330" x="-88814" y="-140647" z="-9176" heading="63312"/>
<npc id="18330" x="-88911" y="-140626" z="-9176" heading="6711"/>
<npc id="18330" x="-89039" y="-141498" z="-9176" heading="56937"/>
<npc id="18330" x="-89205" y="-141444" z="-9176" heading="29487"/>
<npc id="18330" x="-89199" y="-141325" z="-9176" heading="42737"/>
<npc id="18330" x="-89110" y="-141199" z="-9176" heading="29210"/>
<npc id="18330" x="-88914" y="-141931" z="-9176" heading="12620"/>
<npc id="18330" x="-88827" y="-142052" z="-9176" heading="27582"/>
<npc id="18330" x="-89004" y="-142155" z="-9176" heading="38265"/>
<npc id="18330" x="-88665" y="-142492" z="-9176" heading="32599"/>
<npc id="18330" x="-88609" y="-142397" z="-9176" heading="10828"/>
<npc id="18330" x="-88698" y="-142122" z="-9176" heading="19648"/>
<npc id="18331" x="-86964" y="-142079" z="-9176" heading="6621"/>
<npc id="18331" x="-87260" y="-142297" z="-9176" heading="8297"/>
<npc id="18331" x="-86704" y="-141451" z="-9176" heading="15742"/>
<npc id="18331" x="-86707" y="-141175" z="-9176" heading="51507"/>
<npc id="18331" x="-86836" y="-140566" z="-9176" heading="23410"/>
<npc id="18331" x="-87025" y="-140438" z="-9176" heading="26558"/>
<npc id="18331" x="-87743" y="-139994" z="-9176" heading="31747"/>
<npc id="18331" x="-87919" y="-140013" z="-9176" heading="62621"/>
<npc id="18331" x="-88533" y="-140389" z="-9168" heading="38980"/>
<npc id="18331" x="-88668" y="-140355" z="-9176" heading="48943"/>
<npc id="18331" x="-88847" y="-140437" z="-9176" heading="37248"/>
<npc id="18331" x="-89094" y="-140991" z="-9176" heading="51142"/>
<npc id="18331" x="-89214" y="-141196" z="-9176" heading="43628"/>
<npc id="18331" x="-89167" y="-141458" z="-9176" heading="51003"/>
<npc id="18331" x="-88975" y="-142053" z="-9176" heading="58755"/>
<npc id="18331" x="-88928" y="-142081" z="-9176" heading="59768"/>
<npc id="18331" x="-88648" y="-142284" z="-9176" heading="60097"/>
</group>
<group name="room2_part1" spawnByDefault="false">
<npc id="18339" x="-87882" y="-146943" z="-9188" heading="9083"/>
<npc id="18339" x="-87914" y="-146981" z="-9188" heading="51455"/>
<npc id="18339" x="-87925" y="-146932" z="-9188" heading="15755"/>
<npc id="18339" x="-87971" y="-146885" z="-9188" heading="3538"/>
</group>
<group name="room2_part2" spawnByDefault="false">
<npc id="18334" x="-87016" y="-147940" z="-9172" heading="23515"/>
<npc id="18334" x="-86769" y="-147555" z="-9172" heading="31470"/>
<npc id="18334" x="-86723" y="-147121" z="-9172" heading="33419"/>
<npc id="18334" x="-86754" y="-146706" z="-9168" heading="32189"/>
<npc id="18334" x="-86910" y="-146366" z="-9172" heading="40265"/>
<npc id="18334" x="-89015" y="-146462" z="-9172" heading="59668"/>
<npc id="18334" x="-88879" y="-146240" z="-9172" heading="62109"/>
<npc id="18334" x="-89089" y="-147299" z="-9172" heading="50108"/>
<npc id="18334" x="-89128" y="-146746" z="-9172" heading="62663"/>
<npc id="18334" x="-88959" y="-147727" z="-9172" heading="3222"/>
<npc id="18335" x="-88899" y="-146145" z="-9172" heading="60699"/>
<npc id="18335" x="-88822" y="-147929" z="-9172" heading="5129"/>
<npc id="18335" x="-89008" y="-147561" z="-9172" heading="1691"/>
<npc id="18335" x="-89044" y="-146878" z="-9172" heading="64122"/>
<npc id="18335" x="-89005" y="-146439" z="-9172" heading="57813"/>
<npc id="18335" x="-89206" y="-147285" z="-9172" heading="61667"/>
<npc id="18335" x="-86958" y="-147939" z="-9172" heading="22983"/>
<npc id="18335" x="-86739" y="-147224" z="-9172" heading="31415"/>
<npc id="18335" x="-86770" y="-146513" z="-9172" heading="29048"/>
<npc id="18335" x="-86653" y="-146900" z="-9172" heading="22558"/>
<npc id="18335" x="-87029" y="-146250" z="-9172" heading="53805"/>
<npc id="18335" x="-86822" y="-147687" z="-9172" heading="25845"/>
<npc id="18337" x="-89000" y="-146471" z="-9172" heading="64277"/>
<npc id="18337" x="-89005" y="-146678" z="-9172" heading="61677"/>
<npc id="18337" x="-89028" y="-146997" z="-9172" heading="64285"/>
<npc id="18337" x="-89176" y="-147119" z="-9172" heading="4741"/>
<npc id="18337" x="-88994" y="-147462" z="-9172" heading="64668"/>
<npc id="18337" x="-89152" y="-147341" z="-9172" heading="65001"/>
<npc id="18337" x="-89043" y="-147812" z="-9172" heading="3894"/>
<npc id="18337" x="-88811" y="-148033" z="-9172" heading="8381"/>
<npc id="18337" x="-88648" y="-148132" z="-9172" heading="12021"/>
<npc id="18337" x="-87142" y="-146176" z="-9172" heading="40799"/>
<npc id="18337" x="-86899" y="-146535" z="-9172" heading="36449"/>
<npc id="18337" x="-86776" y="-146606" z="-9172" heading="37651"/>
<npc id="18337" x="-86812" y="-146767" z="-9172" heading="38225"/>
<npc id="18337" x="-86825" y="-146966" z="-9172" heading="28332"/>
<npc id="18337" x="-86885" y="-147227" z="-9172" heading="33807"/>
<npc id="18337" x="-86751" y="-147105" z="-9172" heading="31522"/>
<npc id="18337" x="-86873" y="-147564" z="-9172" heading="26634"/>
<npc id="18337" x="-87025" y="-147743" z="-9172" heading="27046"/>
<npc id="18337" x="-86917" y="-147672" z="-9172" heading="24575"/>
<npc id="18338" x="-86885" y="-146225" z="-9168" heading="40959"/>
<npc id="18338" x="-86885" y="-146225" z="-9168" heading="51582"/>
<npc id="18338" x="-86942" y="-147322" z="-9172" heading="44537"/>
<npc id="18338" x="-86766" y="-147622" z="-9172" heading="54685"/>
<npc id="18338" x="-86996" y="-147855" z="-9172" heading="41027"/>
<npc id="18338" x="-89035" y="-147546" z="-9172" heading="57311"/>
<npc id="18338" x="-89228" y="-146891" z="-9172" heading="50874"/>
<npc id="18338" x="-89028" y="-146502" z="-9168" heading="45888"/>
<npc id="18338" x="-88846" y="-146119" z="-9172" heading="514"/>
</group>
</spawnlist>
</instance>

View File

@ -0,0 +1,911 @@
/*
* 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.LastImperialTomb;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.Earthquake;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import org.l2jmobius.gameserver.network.serverpackets.NpcInfo;
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
import org.l2jmobius.gameserver.network.serverpackets.SpecialCamera;
import instances.AbstractInstance;
/**
* Last Imperial Tomb AI
* @author Mobius (reworked from L2J version)
* @author RobikBobik (Updated to Classic: The Kamael)
* @TODO: When halisha uses second transform, Halisha Breath need to stop attack.
*/
public class LastImperialTomb extends AbstractInstance
{
// NPCs
private static final int GUIDE = 32011;
private static final int CUBE = 29061;
private static final int HALL_ALARM = 18328;
private static final int HALL_KEEPER_SUICIDAL_SOLDIER = 18333;
private static final int DUMMY = 29052;
private static final int DUMMY2 = 29053;
private static final int[] PORTRAITS =
{
29048,
29049
};
private static final int[] DEMONS =
{
29050,
29051
};
private static final int FRINTEZZA = 29045;
private static final int SCARLET1 = 29046;
private static final int SCARLET2 = 29047;
private static final int[] ON_KILL_MONSTERS =
{
HALL_ALARM,
HALL_KEEPER_SUICIDAL_SOLDIER,
18329,
18330,
18331,
18334,
18335,
18336,
18337,
18338,
18339
};
// Items
private static final int FIRST_SCARLET_WEAPON = 8204;
private static final int SECOND_SCARLET_WEAPON = 7903;
// Doors
private static final int[] FIRST_ROOM_DOORS =
{
17130051,
17130052,
17130053,
17130054,
17130055,
17130056,
17130057,
17130058
};
private static final int[] SECOND_ROOM_DOORS =
{
17130061,
17130062,
17130063,
17130064,
17130065,
17130066,
17130067,
17130068,
17130069,
17130070
};
private static final int[] FIRST_ROUTE_DOORS =
{
17130042,
17130043
};
private static final int[] SECOND_ROUTE_DOORS =
{
17130045,
17130046
};
// Skills
private static final int DEWDROP_OF_DESTRUCTION_SKILL_ID = 2276;
private static final SkillHolder INTRO_SKILL = new SkillHolder(5004, 1);
private static final SkillHolder FIRST_MORPH_SKILL = new SkillHolder(5017, 1);
private static final Map<Integer, NpcStringId> SKILL_MSG = new HashMap<>();
static
{
SKILL_MSG.put(1, NpcStringId.REQUIEM_OF_HATRED);
SKILL_MSG.put(2, NpcStringId.RONDO_OF_SOLITUDE);
SKILL_MSG.put(3, NpcStringId.FRENETIC_TOCCATA);
SKILL_MSG.put(4, NpcStringId.FUGUE_OF_JUBILATION);
SKILL_MSG.put(5, NpcStringId.HYPNOTIC_MAZURKA);
}
// Spawns
// @formatter:off
static final int[][] PORTRAIT_SPAWNS =
{
{29048, -89381, -153981, -9168, 3368, -89378, -153968, -9168, 3368},
{29048, -86234, -152467, -9168, 37656, -86261, -152492, -9168, 37656},
{29049, -89342, -152479, -9168, -5152, -89311, -152491, -9168, -5152},
{29049, -86189, -153968, -9168, 29456, -86217, -153956, -9168, 29456},
};
// @formatter:on
// Misc
private static final int TEMPLATE_ID = 205;
private static final int FRINTEZZA_WAIT_TIME = 10; // minutes
private static final int RANDOM_SONG_INTERVAL = 90; // seconds
private static final int TIME_BETWEEN_DEMON_SPAWNS = 20; // seconds
private static final int MAX_DEMONS = 24;
public LastImperialTomb()
{
super(TEMPLATE_ID);
addTalkId(GUIDE, CUBE);
addAttackId(SCARLET1);
addKillId(ON_KILL_MONSTERS);
addKillId(HALL_ALARM, SCARLET2);
addKillId(PORTRAITS);
addKillId(DEMONS);
addSpawnId(HALL_ALARM, DUMMY, DUMMY2);
addSpellFinishedId(HALL_KEEPER_SUICIDAL_SOLDIER);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "FRINTEZZA_INTRO_START":
{
final Instance world = player.getInstanceWorld();
startQuestTimer("FRINTEZZA_INTRO_1", 17000, null, player, false);
startQuestTimer("FRINTEZZA_INTRO_2", 20000, null, player, false);
broadCastPacket(world, new Earthquake(-87784, -155083, -9087, 45, 27));
break;
}
case "FRINTEZZA_INTRO_1":
{
final Instance world = player.getInstanceWorld();
for (int doorId : FIRST_ROOM_DOORS)
{
world.openCloseDoor(doorId, false);
}
for (int doorId : FIRST_ROUTE_DOORS)
{
world.openCloseDoor(doorId, false);
}
for (int doorId : SECOND_ROOM_DOORS)
{
world.openCloseDoor(doorId, false);
}
for (int doorId : SECOND_ROUTE_DOORS)
{
world.openCloseDoor(doorId, false);
}
addSpawn(CUBE, -87904, -141296, -9168, 0, false, 0, false, world.getId());
break;
}
case "FRINTEZZA_INTRO_2":
{
final Instance world = player.getInstanceWorld();
final Npc frintezzaDummy = addSpawn(DUMMY, -87784, -155083, -9087, 16048, false, 0, false, world.getId());
world.setParameter("frintezzaDummy", frintezzaDummy);
final Npc overheadDummy = addSpawn(DUMMY, -87784, -153298, -9175, 16384, false, 0, false, world.getId());
overheadDummy.setCollisionHeight(600);
broadCastPacket(world, new NpcInfo(overheadDummy));
world.setParameter("overheadDummy", overheadDummy);
final Npc portraitDummy1 = addSpawn(DUMMY, -89566, -153168, -9165, 16048, false, 0, false, world.getId());
world.setParameter("portraitDummy1", portraitDummy1);
final Npc portraitDummy3 = addSpawn(DUMMY, -86004, -153168, -9165, 16048, false, 0, false, world.getId());
world.setParameter("portraitDummy3", portraitDummy3);
final Npc scarletDummy = addSpawn(DUMMY2, -87784, -153298, -9175, 16384, false, 0, false, world.getId());
world.setParameter("scarletDummy", scarletDummy);
disablePlayers(world);
// broadCastPacket(world, new SpecialCamera(overheadDummy, 0, 75, -89, 0, 100, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(overheadDummy, 0, 75, -89, 0, 100, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(overheadDummy, 300, 90, -10, 6500, 7000, 0, 0, 1, 0, 0));
final Npc frintezza = addSpawn(FRINTEZZA, -87780, -155086, -9080, 16384, false, 0, false, world.getId());
frintezza.setIsImmobilized(true);
frintezza.setIsInvul(true);
frintezza.disableAllSkills();
world.setParameter("frintezza", frintezza);
final List<Npc> demons = new ArrayList<>();
for (int[] element : PORTRAIT_SPAWNS)
{
final MonsterInstance demon = (MonsterInstance) addSpawn(element[0] + 2, element[5], element[6], element[7], element[8], false, 0, false, world.getId());
demon.setIsImmobilized(true);
demon.disableAllSkills();
demons.add(demon);
}
world.setParameter("demons", demons);
startQuestTimer("FRINTEZZA_INTRO_3", 6500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_3":
{
final Instance world = player.getInstanceWorld();
final Npc frintezzaDummy = world.getParameters().getObject("frintezzaDummy", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezzaDummy, 1800, 90, 8, 6500, 7000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_4", 900, null, player, false);
break;
}
case "FRINTEZZA_INTRO_4":
{
final Instance world = player.getInstanceWorld();
final Npc frintezzaDummy = world.getParameters().getObject("frintezzaDummy", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezzaDummy, 140, 90, 10, 2500, 4500, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_5", 4000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_5":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 40, 75, -10, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 40, 75, -10, 0, 12000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_6", 1350, null, player, false);
break;
}
case "FRINTEZZA_INTRO_6":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SocialAction(frintezza.getObjectId(), 2));
final Npc frintezzaDummy = world.getParameters().getObject("frintezzaDummy", Npc.class);
frintezzaDummy.deleteMe();
startQuestTimer("FRINTEZZA_INTRO_7", 8000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_7":
{
final Instance world = player.getInstanceWorld();
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
broadCastPacket(world, new SocialAction(demons.get(1).getObjectId(), 1));
broadCastPacket(world, new SocialAction(demons.get(2).getObjectId(), 1));
startQuestTimer("FRINTEZZA_INTRO_8", 400, null, player, false);
break;
}
case "FRINTEZZA_INTRO_8":
{
final Instance world = player.getInstanceWorld();
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
final Npc portraitDummy1 = world.getParameters().getObject("portraitDummy1", Npc.class);
final Npc portraitDummy3 = world.getParameters().getObject("portraitDummy3", Npc.class);
broadCastPacket(world, new SocialAction(demons.get(0).getObjectId(), 1));
broadCastPacket(world, new SocialAction(demons.get(3).getObjectId(), 1));
sendPacketX(world, new SpecialCamera(portraitDummy1, 1000, 118, 0, 0, 1000, 0, 0, 1, 0, 0), new SpecialCamera(portraitDummy3, 1000, 62, 0, 0, 1000, 0, 0, 1, 0, 0), -87784);
sendPacketX(world, new SpecialCamera(portraitDummy1, 1000, 118, 0, 0, 10000, 0, 0, 1, 0, 0), new SpecialCamera(portraitDummy3, 1000, 62, 0, 0, 10000, 0, 0, 1, 0, 0), -87784);
startQuestTimer("FRINTEZZA_INTRO_9", 2000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_9":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final Npc portraitDummy1 = world.getParameters().getObject("portraitDummy1", Npc.class);
final Npc portraitDummy3 = world.getParameters().getObject("portraitDummy3", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 240, 90, 0, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 240, 90, 25, 5500, 10000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SocialAction(frintezza.getObjectId(), 3));
portraitDummy1.deleteMe();
portraitDummy3.deleteMe();
startQuestTimer("FRINTEZZA_INTRO_10", 4500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_10":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 100, 195, 35, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_11", 700, null, player, false);
break;
}
case "FRINTEZZA_INTRO_11":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 100, 195, 35, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_12", 1300, null, player, false);
break;
}
case "FRINTEZZA_INTRO_12":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new ExShowScreenMessage(NpcStringId.MOURNFUL_CHORALE_PRELUDE, 2, 5000));
broadCastPacket(world, new SpecialCamera(frintezza, 120, 180, 45, 1500, 10000, 0, 0, 1, 0, 0));
broadCastPacket(world, new MagicSkillUse(frintezza, frintezza, 5006, 1, 34000, 0));
startQuestTimer("FRINTEZZA_INTRO_13", 1500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_13":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 520, 135, 45, 8000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_14", 7500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_14":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 1500, 110, 25, 10000, 13000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_15", 9500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_15":
{
final Instance world = player.getInstanceWorld();
final Npc overheadDummy = world.getParameters().getObject("overheadDummy", Npc.class);
final Npc scarletDummy = world.getParameters().getObject("scarletDummy", Npc.class);
broadCastPacket(world, new SpecialCamera(overheadDummy, 930, 160, -20, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(overheadDummy, 600, 180, -25, 0, 10000, 0, 0, 1, 0, 0));
broadCastPacket(world, new MagicSkillUse(scarletDummy, overheadDummy, 5004, 1, 5800, 0));
startQuestTimer("FRINTEZZA_INTRO_16", 5000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_16":
{
final Instance world = player.getInstanceWorld();
final Npc scarletDummy = world.getParameters().getObject("scarletDummy", Npc.class);
final Npc activeScarlet = addSpawn(SCARLET1, -87789, -153295, -9176, 16384, false, 0, false, world.getId());
world.setParameter("activeScarlet", activeScarlet);
activeScarlet.setRHandId(FIRST_SCARLET_WEAPON);
activeScarlet.setIsInvul(true);
activeScarlet.setIsImmobilized(true);
activeScarlet.disableAllSkills();
broadCastPacket(world, new SocialAction(activeScarlet.getObjectId(), 3));
broadCastPacket(world, new SpecialCamera(scarletDummy, 800, 180, 10, 1000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_17", 2100, null, player, false);
break;
}
case "FRINTEZZA_INTRO_17":
{
final Instance world = player.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
broadCastPacket(world, new SpecialCamera(activeScarlet, 300, 60, 8, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_18", 2000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_18":
{
final Instance world = player.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
broadCastPacket(world, new SpecialCamera(activeScarlet, 500, 90, 10, 3000, 5000, 0, 0, 1, 0, 0));
world.setParameter("isPlayingSong", false);
playRandomSong(world);
startQuestTimer("FRINTEZZA_INTRO_19", 3000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_19":
{
final Instance world = player.getInstanceWorld();
final Map<Npc, Integer> portraits = new HashMap<>();
for (int i = 0; i < PORTRAIT_SPAWNS.length; i++)
{
final Npc portrait = addSpawn(PORTRAIT_SPAWNS[i][0], PORTRAIT_SPAWNS[i][1], PORTRAIT_SPAWNS[i][2], PORTRAIT_SPAWNS[i][3], PORTRAIT_SPAWNS[i][4], false, 0, false, world.getId());
portraits.put(portrait, i);
}
world.setParameter("portraits", portraits);
final Npc overheadDummy = world.getParameters().getObject("overheadDummy", Npc.class);
final Npc scarletDummy = world.getParameters().getObject("scarletDummy", Npc.class);
overheadDummy.deleteMe();
scarletDummy.deleteMe();
startQuestTimer("FRINTEZZA_INTRO_20", 2000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_20":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
for (Npc demon : demons)
{
demon.setIsImmobilized(false);
demon.enableAllSkills();
}
activeScarlet.setIsInvul(false);
activeScarlet.setIsImmobilized(false);
activeScarlet.enableAllSkills();
activeScarlet.setRunning();
activeScarlet.doCast(INTRO_SKILL.getSkill());
frintezza.enableAllSkills();
frintezza.disableCoreAI(true);
frintezza.setIsInvul(true);
enablePlayers(world);
startQuestTimer("PLAY_RANDOM_SONG", RANDOM_SONG_INTERVAL * 1000, frintezza, null, false);
startQuestTimer("SPAWN_DEMONS", TIME_BETWEEN_DEMON_SPAWNS * 1000, null, player, false);
break;
}
case "SPAWN_DEMONS":
{
final Instance world = player.getInstanceWorld();
final Map<Npc, Integer> portraits = world.getParameters().getMap("portraits", Npc.class, Integer.class);
if (!portraits.isEmpty())
{
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
for (int i : portraits.values())
{
if (demons.size() > MAX_DEMONS)
{
break;
}
final Npc demon = addSpawn(PORTRAIT_SPAWNS[i][0] + 2, PORTRAIT_SPAWNS[i][5], PORTRAIT_SPAWNS[i][6], PORTRAIT_SPAWNS[i][7], PORTRAIT_SPAWNS[i][8], false, 0, false, world.getId());
demons.add(demon);
}
world.setParameter("demons", demons);
startQuestTimer("SPAWN_DEMONS", TIME_BETWEEN_DEMON_SPAWNS * 1000, null, player, false);
}
break;
}
case "PLAY_RANDOM_SONG":
{
if (npc != null)
{
final Instance world = npc.getInstanceWorld();
playRandomSong(world);
startQuestTimer("PLAY_RANDOM_SONG", RANDOM_SONG_INTERVAL * 1000, null, player, false);
}
break;
}
case "SCARLET_FIRST_MORPH":
{
final Instance world = npc.getInstanceWorld();
npc.doCast(FIRST_MORPH_SKILL.getSkill());
playRandomSong(world);
break;
}
case "SCARLET_SECOND_MORPH":
{
final Instance world = npc.getInstanceWorld();
disablePlayers(world);
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
activeScarlet.abortAttack();
activeScarlet.abortCast();
activeScarlet.setIsInvul(true);
activeScarlet.setIsImmobilized(true);
activeScarlet.disableAllSkills();
playRandomSong(world);
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_1", 2000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_1":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SocialAction(frintezza.getObjectId(), 4));
broadCastPacket(world, new SpecialCamera(frintezza, 250, 120, 15, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 250, 120, 15, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_2", 7000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_2":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new MagicSkillUse(frintezza, frintezza, 5006, 1, 34000, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 500, 70, 15, 3000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_3", 3000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_3":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 2500, 90, 12, 6000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_4", 3000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_4":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final Location scarletLocation = activeScarlet.getLocation();
int newHeading = 0;
if (scarletLocation.getHeading() < 32768)
{
newHeading = Math.abs(180 - (int) (scarletLocation.getHeading() / 182.044444444));
}
else
{
newHeading = Math.abs(540 - (int) (scarletLocation.getHeading() / 182.044444444));
}
world.setParameter("scarletLocation", scarletLocation);
world.setParameter("newHeading", newHeading);
broadCastPacket(world, new SpecialCamera(activeScarlet, 250, newHeading, 12, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(activeScarlet, 250, newHeading, 12, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_5", 500, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_5":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final int newHeading = world.getParameters().getInt("newHeading");
activeScarlet.doDie(activeScarlet);
broadCastPacket(world, new SpecialCamera(activeScarlet, 450, newHeading, 14, 8000, 8000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_6", 6250, npc, null, false);
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_7", 7200, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_6":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
activeScarlet.deleteMe();
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_7":
{
final Instance world = npc.getInstanceWorld();
final int newHeading = world.getParameters().getInt("newHeading");
final Location scarletLocation = world.getParameters().getLocation("scarletLocation");
final Npc activeScarlet = addSpawn(SCARLET2, scarletLocation, false, 0, false, world.getId());
world.setParameter("activeScarlet", activeScarlet);
activeScarlet.setRHandId(SECOND_SCARLET_WEAPON);
activeScarlet.setIsInvul(true);
activeScarlet.setIsImmobilized(true);
activeScarlet.disableAllSkills();
broadCastPacket(world, new SpecialCamera(activeScarlet, 450, newHeading, 12, 500, 14000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_8", 8100, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_8":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
broadCastPacket(world, new SocialAction(activeScarlet.getObjectId(), 2));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_9", 9000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_9":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
activeScarlet.setIsInvul(false);
activeScarlet.setIsImmobilized(false);
activeScarlet.enableAllSkills();
enablePlayers(world);
break;
}
case "FINISH_CAMERA_1":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final int newHeading = world.getParameters().getInt("newHeading");
broadCastPacket(world, new SpecialCamera(activeScarlet, 300, newHeading - 180, 5, 0, 7000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(activeScarlet, 200, newHeading, 85, 4000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FINISH_CAMERA_2", 7400, npc, null, false);
startQuestTimer("FINISH_CAMERA_3", 7500, npc, null, false);
break;
}
case "FINISH_CAMERA_2":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
frintezza.doDie(frintezza);
break;
}
case "FINISH_CAMERA_3":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 100, 120, 5, 0, 7000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 100, 90, 5, 5000, 15000, 0, 0, 1, 0, 0));
startQuestTimer("FINISH_CAMERA_4", 7000, npc, null, false);
break;
}
case "FINISH_CAMERA_4":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 900, 90, 25, 7000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FINISH_CAMERA_5", 9000, npc, null, false);
break;
}
case "FINISH_CAMERA_5":
{
final Instance world = npc.getInstanceWorld();
for (int doorId : FIRST_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (int doorId : FIRST_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (int doorId : SECOND_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (int doorId : SECOND_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
enablePlayers(world);
break;
}
}
return null;
}
@Override
public String onTalk(Npc npc, PlayerInstance player)
{
if (npc.getId() == GUIDE)
{
enterInstance(player, npc, TEMPLATE_ID);
}
else // Teleport Cube
{
final Instance world = getPlayerInstance(player);
if (world != null)
{
teleportPlayerOut(player, world);
}
}
return null;
}
@Override
public String onSpawn(Npc npc)
{
npc.setRandomWalking(false);
npc.setIsImmobilized(true);
if (npc.getId() == HALL_ALARM)
{
npc.disableCoreAI(true);
}
else // dummy
{
npc.setIsInvul(true);
}
return super.onSpawn(npc);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == SCARLET1)
{
if ((npc.getScriptValue() == 0) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.80)))
{
npc.setScriptValue(1);
startQuestTimer("SCARLET_FIRST_MORPH", 1000, npc, null, false);
}
if ((npc.getScriptValue() == 1) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.20)))
{
npc.setScriptValue(2);
startQuestTimer("SCARLET_SECOND_MORPH", 1000, npc, null, false);
}
}
if (skill != null)
{
// When Dewdrop of Destruction is used on Portraits they suicide.
if (CommonUtil.contains(PORTRAITS, npc.getId()) && (skill.getId() == DEWDROP_OF_DESTRUCTION_SKILL_ID))
{
npc.doDie(attacker);
}
}
return null;
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
if (skill.isSuicideAttack())
{
return onKill(npc, null, false);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
final Instance world = killer.getInstanceWorld();
if ((npc.getId() == HALL_ALARM) && (world.getStatus() == 0))
{
world.setStatus(1);
world.spawnGroup("room1");
final List<MonsterInstance> monsters = world.getAliveNpcs(MonsterInstance.class);
world.setParameter("monstersCount", monsters.size() - 1);
for (int doorId : FIRST_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (Npc monster : monsters)
{
monster.setRunning();
// monster.moveToLocation(-87959, -141247, -9168, 0);
monster.reduceCurrentHp(1, killer, null); // TODO: Find better way for attack
}
}
else if (npc.getId() == SCARLET2)
{
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new MagicSkillCanceld(frintezza.getObjectId()));
startQuestTimer("FINISH_CAMERA_1", 500, npc, null, false);
}
else if (CommonUtil.contains(DEMONS, npc.getId()))
{
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
demons.remove(npc);
}
else if (CommonUtil.contains(PORTRAITS, npc.getId()))
{
final Map<Npc, Integer> portraits = world.getParameters().getMap("portraits", Npc.class, Integer.class);
portraits.remove(npc);
}
else
{
final int killCount = world.getParameters().getInt("monstersCount");
world.setParameter("monstersCount", killCount - 1);
if (killCount <= 0)
{
switch (world.getStatus())
{
case 1:
{
world.setStatus(2);
world.spawnGroup("room2_part1");
final List<MonsterInstance> monsters = world.getAliveNpcs(MonsterInstance.class);
world.setParameter("monstersCount", monsters.size() - 1);
for (int doorId : FIRST_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
break;
}
case 2:
{
world.setStatus(3);
world.spawnGroup("room2_part2");
final List<MonsterInstance> monsters = world.getAliveNpcs(MonsterInstance.class);
world.setParameter("monstersCount", monsters.size() - 1);
for (int doorId : SECOND_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (Npc monster : monsters)
{
monster.setRunning();
// monster.moveToLocation(-87935, -147062, -9184, 0);
monster.reduceCurrentHp(1, killer, null); // TODO: Find better way for attack
}
break;
}
case 3:
{
world.setStatus(4);
for (int doorId : SECOND_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
startQuestTimer("FRINTEZZA_INTRO_START", FRINTEZZA_WAIT_TIME * 60 * 1000, null, killer, false);
break;
}
}
}
}
return super.onKill(npc, killer, isSummon);
}
private void playRandomSong(Instance world)
{
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong)
{
return;
}
world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random);
final SkillHolder skillEffect = new SkillHolder(5008, random);
broadCastPacket(world, new ExShowScreenMessage(2, -1, 2, 0, 0, 0, 0, true, 4000, false, null, SKILL_MSG.get(random), null));
broadCastPacket(world, new MagicSkillUse(frintezza, frintezza, skill.getSkillId(), skill.getSkillLevel(), skill.getSkill().getHitTime(), 0));
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
frintezza.setTarget(player);
frintezza.doCast(skillEffect.getSkill());
}
}
world.setParameter("isPlayingSong", false);
}
private void disablePlayers(Instance world)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
player.abortAttack();
player.abortCast();
player.disableAllSkills();
player.setTarget(null);
player.stopMove(null);
player.setIsImmobilized(true);
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
}
}
}
private void enablePlayers(Instance world)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
player.enableAllSkills();
player.setIsImmobilized(false);
}
}
}
void broadCastPacket(Instance world, IClientOutgoingPacket packet)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
player.sendPacket(packet);
}
}
}
private void sendPacketX(Instance world, IClientOutgoingPacket packet1, IClientOutgoingPacket packet2, int x)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
if (player.getX() < x)
{
player.sendPacket(packet1);
}
else
{
player.sendPacket(packet2);
}
}
}
}
public static void main(String[] args)
{
new LastImperialTomb();
}
}

View File

@ -0,0 +1,277 @@
/*
* 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.LastImperialTomb;
import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK;
import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW;
import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE;
import java.util.ArrayList;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DecoyInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* @author Micr0, Zerox, Mobius
*/
public class ScarletVanHalisha extends AbstractNpcAI
{
// NPCs
private static final int HALISHA2 = 29046;
private static final int HALISHA3 = 29047;
// Skills
private static final int FRINTEZZA_DAEMON_ATTACK = 5014;
private static final int FRINTEZZA_DAEMON_CHARGE = 5015;
private static final int YOKE_OF_SCARLET = 5016;
private static final int FRINTEZZA_DAEMON_MORPH = 5018;
private static final int FRINTEZZA_DAEMON_FIELD = 5019;
// Misc
private Creature _target;
private Skill _skill;
private long _lastRangedSkillTime;
private final int _rangedSkillMinCoolTime = 60000; // 1 minute
public ScarletVanHalisha()
{
addAttackId(HALISHA2, HALISHA3);
addKillId(HALISHA2, HALISHA3);
addSpellFinishedId(HALISHA2, HALISHA3);
registerMobs(HALISHA2, HALISHA3);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "ATTACK":
{
if (npc != null)
{
getSkillAI(npc);
}
break;
}
case "RANDOM_TARGET":
{
_target = getRandomTarget(npc, null);
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
getSkillAI(npc);
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
cancelQuestTimers("ATTACK");
cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon);
}
private Skill getRndSkills(Npc npc)
{
switch (npc.getId())
{
case HALISHA2:
{
if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 2);
}
else if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 5);
}
else if (getRandom(100) < 2)
{
return SkillData.getInstance().getSkill(YOKE_OF_SCARLET, 1);
}
else
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_ATTACK, 2);
}
}
case HALISHA3:
{
if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 3);
}
else if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 6);
}
else if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 2);
}
else if (((_lastRangedSkillTime + _rangedSkillMinCoolTime) < System.currentTimeMillis()) && (getRandom(100) < 10))
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_FIELD, 1);
}
else if (((_lastRangedSkillTime + _rangedSkillMinCoolTime) < System.currentTimeMillis()) && (getRandom(100) < 10))
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_MORPH, 1);
}
else if (getRandom(100) < 2)
{
return SkillData.getInstance().getSkill(YOKE_OF_SCARLET, 1);
}
else
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_ATTACK, 3);
}
}
}
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_ATTACK, 1);
}
private synchronized void getSkillAI(Npc npc)
{
if (npc.isInvul() || npc.isCastingNow())
{
return;
}
if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{
_skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill);
}
final Creature target = _target;
Skill skill = _skill;
if (skill == null)
{
skill = getRndSkills(npc);
}
if (npc.isPhysicalMuted())
{
return;
}
if ((target == null) || target.isDead())
{
// npc.setIsCastingNow(false);
return;
}
if (Util.checkIfInRange(skill.getCastRange(), npc, target, true))
{
npc.getAI().setIntention(AI_INTENTION_IDLE);
npc.setTarget(target);
// npc.setIsCastingNow(true);
_target = null;
npc.doCast(skill);
}
else
{
npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null);
npc.getAI().setIntention(AI_INTENTION_ATTACK, target, null);
// npc.setIsCastingNow(false);
}
}
private Creature getRandomTarget(Npc npc, Skill skill)
{
final ArrayList<Creature> result = new ArrayList<>();
{
for (WorldObject obj : npc.getInstanceWorld().getPlayers())
{
if (obj.isPlayable() || (obj instanceof DecoyInstance))
{
if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
{
continue;
}
if (((((Creature) obj).getZ() < (npc.getZ() - 100)) && (((Creature) obj).getZ() > (npc.getZ() + 100))) || !GeoEngine.getInstance().canSeeTarget(obj, npc))
{
continue;
}
}
if (obj.isPlayable() || (obj instanceof DecoyInstance))
{
int skillRange = 150;
if (skill != null)
{
switch (skill.getId())
{
case FRINTEZZA_DAEMON_ATTACK:
{
skillRange = 150;
break;
}
case FRINTEZZA_DAEMON_CHARGE:
{
skillRange = 400;
break;
}
case YOKE_OF_SCARLET:
{
skillRange = 200;
break;
}
case FRINTEZZA_DAEMON_MORPH:
case FRINTEZZA_DAEMON_FIELD:
{
_lastRangedSkillTime = System.currentTimeMillis();
skillRange = 550;
break;
}
}
}
if (Util.checkIfInRange(skillRange, npc, obj, true) && !((Creature) obj).isDead())
{
result.add((Creature) obj);
}
}
}
}
return getRandomEntry(result);
}
public static void main(String[] args)
{
new ScarletVanHalisha();
}
}

View File

@ -547,6 +547,7 @@
<npc id="21438" x="180495" y="-75344" z="-2728" heading="8728" respawnTime="30sec" />
<npc id="21438" x="180956" y="-75418" z="-2728" heading="55660" respawnTime="30sec" />
<npc id="21438" x="180552" y="-75371" z="-2728" heading="1395" respawnTime="30sec" />
<npc id="32011" x="181376" y="-81008" z="-2728" heading="16500" respawnTime="60sec" /> <!-- Imperial Tomb Guide -->
</group>
</spawn>
</list>

View File

@ -33,14 +33,18 @@
</stats>
</item>
<item id="8222" name="Monster Only (Follower of Frintezza Tran Calibur)" type="Weapon">
<set name="icon" val="icon.weapon_monster_i00" />
<set name="default_action" val="EQUIP" />
<set name="weapon_type" val="SWORD" />
<set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" />
<set name="weight" val="1560" />
<set name="soulshots" val="2" />
<set name="spiritshots" val="2" />
<set name="icon" val="icon.weapon_monster_i00"/>
<set name="default_action" val="EQUIP"/>
<set name="weapon_type" val="SWORD"/>
<set name="bodypart" val="rhand"/>
<set name="damage_range" val="0;0;40;120"/>
<set name="immediate_effect" val="true"/>
<set name="material" val="FINE_STEEL"/>
<set name="weight" val="1560"/>
<set name="soulshots" val="2"/>
<set name="spiritshots" val="2"/>
<set name="commissionItemType" val="ONE_HAND_SWORD"/>
<set name="isAppearanceable" val="true"/>
<stats>
<stat type="rCrit">8</stat>
<stat type="pAtkSpd">379</stat>

View File

@ -1,5 +1,759 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
<npc id="18328" level="85" type="Monster" name="Hall Alarm">
<parameters>
<param name="TDoorName1" value="grave_pathway_1" />
<param name="TDoorName2" value="grave_pathway_2" />
<param name="WallDoorName1" value="wall_door_a_center_1" />
<param name="WallDoorName2" value="wall_door_a_center_2" />
<param name="WallDoorName3" value="wall_door_a_center_3" />
<param name="WallDoorName4" value="wall_door_a_center_4" />
<param name="WallDoorName5" value="wall_door_a_center_5" />
<param name="WallDoorName6" value="wall_door_a_center_6" />
<param name="WallDoorName7" value="wall_door_a_center_7" />
<param name="WallDoorName8" value="wall_door_a_center_8" />
<param name="dmgzone" value="25_15_frintessaE_01" />
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="100000" hpRegen="8.8" mp="1846" mpRegen="3.1" />
<attack physical="1034.34087" magical="760.9193205984" random="10" critical="4" accuracy="11.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
<defence physical="378.92625" magical="277.281785" evasion="7" />
<speed>
<walk ground="50" />
<run ground="1" />
</speed>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4408" level="16" /> <!-- HP Increase (8x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="11" /> <!-- Average P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="11" /> <!-- Average P. Def. -->
<skill id="4413" level="16" /> <!-- Very Strong M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="3" /> <!-- One-handed Sword -->
<skill id="4416" level="2" /> <!-- Magic Creatures -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>8</sNpcPropHpRate>
<ai type="CORPSE" isAggressive="true" aggroRange="500" />
<collision>
<radius normal="8" />
<height normal="21" />
</collision>
</npc>
<npc id="18329" level="83" type="Monster" name="Hall Keeper Captain">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
<param name="MoveAroundSocial2" value="0" />
<skill name="PhysicalSpecial" id="4032" level="9" />
<skill name="SelfBuff" id="4028" level="3" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="78" /> <!-- Great Sword -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="100" />
</attribute>
<speed>
<walk ground="40" />
<run ground="160" />
</speed>
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4028" level="3" /> <!-- NPC Might -->
<skill id="4032" level="9" /> <!-- NPC Strike -->
<skill id="4408" level="13" /> <!-- HP Increase (5x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="1" /> <!-- Heavy Armor Type -->
<skill id="4415" level="3" /> <!-- One-handed Sword -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="35" /> <!-- Undead -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="5" /> <!-- Greater Resist Hold -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>5</sNpcPropHpRate>
<ai aggroRange="250" clanHelpRange="4000" isAggressive="true">
<clanList>
<clan>HALLGUARD</clan>
</clanList>
</ai>
<collision>
<radius normal="21" grown="25" />
<height normal="40" grown="48" />
</collision>
</npc>
<npc id="18330" level="83" type="Monster" name="Hall Keeper Wizard">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="114" />
<param name="MoveAroundSocial1" value="114" />
<param name="MoveAroundSocial2" value="114" />
<skill name="W_LongRangeDDMagic" id="4137" level="9" />
<skill name="W_ShortRangeDDMagic" id="4560" level="9" />
</parameters>
<race>DEMONIC</race>
<sex>MALE</sex>
<equipment rhand="326" /> <!-- Heathen's Book -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="100" />
</attribute>
<speed>
<walk ground="70" />
<run ground="175" />
</speed>
<hitTime>740</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4137" level="9" /> <!-- Hydro Screw -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="11" /> <!-- Average P. Atk. -->
<skill id="4411" level="16" /> <!-- Very Strong M. Atk. -->
<skill id="4412" level="11" /> <!-- Average P. Def. -->
<skill id="4413" level="15" /> <!-- Strong M. Def. -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="9" /> <!-- Demons -->
<skill id="4417" level="34" /> <!-- Undead -->
<skill id="4438" level="2" /> <!-- Greater Resist Sleep -->
<skill id="4560" level="9" /> <!-- NPC Fire Burn -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai type="MAGE" aggroRange="250" clanHelpRange="4000" isAggressive="true">
<clanList>
<clan>HALLGUARD</clan>
</clanList>
</ai>
<collision>
<radius normal="12" />
<height normal="40" />
</collision>
</npc>
<npc id="18331" level="83" type="Monster" name="Hall Keeper Guard">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="74" />
<param name="MoveAroundSocial1" value="74" />
<param name="MoveAroundSocial2" value="74" />
<skill name="PhysicalSpecial" id="4032" level="9" />
<skill name="SelfBuff" id="4028" level="3" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="142" /> <!-- Keshanberk -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="100" />
</attribute>
<speed>
<walk ground="27" />
<run ground="110" />
</speed>
<hitTime>710</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4028" level="3" /> <!-- NPC Might -->
<skill id="4032" level="9" /> <!-- NPC Strike -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="3" /> <!-- One-handed Sword -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="36" /> <!-- Undead -->
<skill id="4438" level="2" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="5" /> <!-- Greater Resist Hold -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai aggroRange="250" clanHelpRange="4000" isAggressive="true">
<clanList>
<clan>HALLGUARD</clan>
</clanList>
</ai>
<collision>
<radius normal="12" grown="14.5" />
<height normal="31" grown="36" />
</collision>
</npc>
<npc id="18332" level="83" type="Monster" name="Hall Keeper Patrol">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="110" />
<param name="MoveAroundSocial1" value="110" />
<param name="MoveAroundSocial2" value="110" />
<skill name="PhysicalSpecial" id="4101" level="9" />
<skill name="SelfBuff" id="4028" level="3" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="124" /> <!-- Two-handed Sword -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="100" />
</attribute>
<speed>
<walk ground="70" />
<run ground="170" />
</speed>
<hitTime>520</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4028" level="3" /> <!-- NPC Might -->
<skill id="4101" level="9" /> <!-- NPC Spinning Slash -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="3" /> <!-- One-handed Sword -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="36" /> <!-- Undead -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="2" /> <!-- Greater Resist Hold -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai aggroRange="250" clanHelpRange="4000" isAggressive="true">
<clanList>
<clan>HALLGUARD</clan>
</clanList>
</ai>
<collision>
<radius normal="21" grown="24" />
<height normal="31" grown="38" />
</collision>
</npc>
<npc id="18333" level="83" type="Monster" name="Hall Keeper Suicidal Soldier">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="80" />
<param name="MoveAroundSocial1" value="80" />
<param name="MoveAroundSocial2" value="111" />
<skill name="SelfRangeDDMagic" id="4614" level="9" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="150" />
</attribute>
<speed>
<walk ground="30" />
<run ground="150" />
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4256" level="1" /> <!-- 100% stun resistance. -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="13" /> <!-- Demons -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="5" /> <!-- Greater Resist Hold -->
<skill id="4614" level="9" /> <!-- NPC Death Bomb -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai aggroRange="250" clanHelpRange="4000" isAggressive="true">
<clanList>
<clan>HALLGUARD</clan>
</clanList>
</ai>
<collision>
<radius normal="9" />
<height normal="25.8" />
</collision>
</npc>
<npc id="18334" level="83" type="Monster" name="Dark Choir Captain">
<!-- Confirmed CT2.5 -->
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="20" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="31" />
<run ground="150" />
</speed>
<hitTime>480</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4246" level="1" /> <!-- Strong in "nan" activity magic DOT -->
<skill id="4256" level="1" /> <!-- 100% stun resistance. -->
<skill id="4286" level="1" /> <!-- Greater Resist Sleep -->
<skill id="4408" level="13" /> <!-- HP Increase (5x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="6" /> <!-- Blunt Weapons -->
<skill id="4416" level="9" /> <!-- Demons -->
<skill id="4417" level="14" /> <!-- Demons -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>5</sNpcPropHpRate>
<ai type="BALANCED" aggroRange="450" clanHelpRange="1500" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="21" grown="24" />
<height normal="50" grown="60" />
</collision>
</npc>
<npc id="18335" level="83" type="Monster" name="Dark Choir Prima Donna">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
<param name="MoveAroundSocial2" value="0" />
<skill name="PhysicalSpecial" id="4032" level="9" />
<skill name="SelfBuff" id="4028" level="3" />
</parameters>
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="30" />
<run ground="200" />
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4028" level="3" /> <!-- NPC Might -->
<skill id="4032" level="9" /> <!-- NPC Strike -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="3" /> <!-- Light Armor Type -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="9" /> <!-- Demons -->
<skill id="4417" level="14" /> <!-- Demons -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="2" /> <!-- Greater Resist Hold -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai type="BALANCED" aggroRange="450" clanHelpRange="1500" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="23" grown="32" />
<height normal="40" grown="50" />
</collision>
</npc>
<npc id="18336" level="83" type="Monster" name="Dark Choir Lancer">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="80" />
<param name="MoveAroundSocial1" value="80" />
<param name="MoveAroundSocial2" value="80" />
<skill name="PhysicalSpecial" id="4032" level="9" />
<skill name="SelfBuff" id="4028" level="3" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="1472" /> <!-- Dreadbane -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="100" />
<run ground="180" />
</speed>
<hitTime>450</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4028" level="3" /> <!-- NPC Might -->
<skill id="4032" level="9" /> <!-- NPC Strike -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="3" /> <!-- Light Armor Type -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="14" /> <!-- Demons -->
<skill id="4438" level="2" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="5" /> <!-- Greater Resist Hold -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai aggroRange="450" clanHelpRange="1500" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="15" grown="25" />
<height normal="45" grown="52" />
</collision>
</npc>
<npc id="18337" level="83" type="Monster" name="Dark Choir Archer">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="157" />
<param name="MoveAroundSocial1" value="157" />
<param name="MoveAroundSocial2" value="157" />
<skill name="PhysicalSpecial" id="4040" level="9" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="279" /> <!-- Reinforced Longbow -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="20" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="40" />
<run ground="140" />
</speed>
<hitTime>800</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4040" level="9" /> <!-- NPC Bow Attack -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="3" /> <!-- Light Armor Type -->
<skill id="4415" level="5" /> <!-- Blunt Weapons -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="36" /> <!-- Undead -->
<skill id="4438" level="2" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="2" /> <!-- Greater Resist Hold -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai type="ARCHER" aggroRange="450" clanHelpRange="500" dodge="15" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="13" />
<height normal="32.5" />
</collision>
</npc>
<npc id="18338" level="83" type="Monster" name="Dark Choir Shaman">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
<param name="MoveAroundSocial2" value="0" />
<skill name="W_LongRangeDDMagic" id="4137" level="9" />
<skill name="W_ShortRangeDDMagic" id="4560" level="9" />
</parameters>
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="30" />
<run ground="190" />
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4137" level="9" /> <!-- Hydro Screw -->
<skill id="4408" level="11" /> <!-- HP Increase (3x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="11" /> <!-- Average P. Atk. -->
<skill id="4411" level="16" /> <!-- Very Strong M. Atk. -->
<skill id="4412" level="11" /> <!-- Average P. Def. -->
<skill id="4413" level="15" /> <!-- Strong M. Def. -->
<skill id="4414" level="3" /> <!-- Light Armor Type -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="9" /> <!-- Demons -->
<skill id="4417" level="14" /> <!-- Demons -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="2" /> <!-- Greater Resist Hold -->
<skill id="4560" level="9" /> <!-- NPC Fire Burn -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>3</sNpcPropHpRate>
<ai type="BALANCED" aggroRange="450" clanHelpRange="500" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="23" />
<height normal="40" />
</collision>
</npc>
<npc id="18339" level="83" type="Monster" name="Dark Choir Player">
<!-- Confirmed CT2.5 -->
<parameters>
<param name="MoveAroundSocial" value="167" />
<param name="MoveAroundSocial1" value="167" />
<param name="MoveAroundSocial2" value="167" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="150" lhand="103" /> <!-- Elemental Sword / Tower Shield -->
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="60" />
<run ground="140" />
</speed>
<hitTime>300</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="3" /> <!-- One-handed Sword -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="36" /> <!-- Undead -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai type="BALANCED" aggroRange="450" clanHelpRange="1500" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="11" grown="13" />
<height normal="25" grown="31" />
</collision>
</npc>
<npc id="18340" level="83" type="Monster" name="Hall Keeper Suicidal Soldier">
<!-- Confirmed CT2.5 -->
<parameters>
<skill name="SelfRangeDDMagic" id="5042" level="9" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="30" />
<run ground="100" />
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4256" level="1" /> <!-- 100% stun resistance. -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="11" /> <!-- Average P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="11" /> <!-- Average P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="13" /> <!-- Demons -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="5" /> <!-- Greater Resist Hold -->
<skill id="5042" level="9" /> <!-- NPC Dispel Bomb -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai type="BALANCED" aggroRange="300" clanHelpRange="1000" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="9" />
<height normal="25.8" />
</collision>
</npc>
<npc id="18341" level="83" type="Monster" name="Hall Keeper Suicidal Soldier">
<!-- Confirmed CT2.5 -->
<parameters>
<skill name="SelfRangeDDMagic" id="5042" level="9" />
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3835" hpRegen="8.5" mp="1777" mpRegen="3" />
<attack physical="1099.42361669366" magical="750.763809564873" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120" />
<defence physical="353.86144" magical="258.94045" />
<attribute>
<attack type="DARK" value="100" />
<defence fire="100" water="100" wind="100" earth="100" holy="50" dark="100" default="120" />
</attribute>
<speed>
<walk ground="30" />
<run ground="150" />
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10" />
</stats>
<status undying="false" canBeSown="true" />
<skillList>
<skill id="4256" level="1" /> <!-- 100% stun resistance. -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="11" /> <!-- Average M. Atk. -->
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
<skill id="4413" level="11" /> <!-- Average M. Def. -->
<skill id="4414" level="2" /> <!-- Standard Type -->
<skill id="4415" level="1" /> <!-- Bare Hands -->
<skill id="4416" level="1" /> <!-- Undead -->
<skill id="4417" level="13" /> <!-- Demons -->
<skill id="4438" level="5" /> <!-- Greater Resist Sleep -->
<skill id="4439" level="5" /> <!-- Greater Resist Hold -->
<skill id="5042" level="9" /> <!-- NPC Dispel Bomb -->
<skill id="5467" level="1" /> <!-- Dark Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<sNpcPropHpRate>4</sNpcPropHpRate>
<ai type="BALANCED" aggroRange="300" clanHelpRange="1000" isAggressive="true">
<clanList>
<clan>DARKBAND</clan>
</clanList>
</ai>
<collision>
<radius normal="9" />
<height normal="25.8" />
</collision>
</npc>
<npc id="18342" level="1" type="Monster" name="Gremlin">
<parameters>
<param name="MoveAroundSocial" value="0" />
@ -31,4 +785,175 @@
<height normal="15" />
</collision>
</npc>
<npc id="18343" level="85" type="Npc" name="">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18344" level="85" type="Npc" name="Ol Mahum Commander">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18345" level="85" type="Npc" name="Turek Orc Prefect">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18346" level="85" type="Npc" name="Dark Lord">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18347" level="85" type="Npc" name="Nos">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18348" level="85" type="Npc" name="Carinkain">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18349" level="85" type="Npc" name="Sharp Talon Tiger">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18350" level="85" type="Npc" name="Lesser Giant Warrior">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
<npc id="18351" level="85" type="Npc" name="Blood Priest">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
</list>

View File

@ -1800,13 +1800,99 @@
<height normal="23" />
</collision>
</npc>
<npc id="29045" level="85" type="Npc" name="Frintezza">
<race>HUMANOID</race>
<sex>MALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="643059.482835" hpRegen="319.2293199" mp="38410.582" mpRegen="3"/>
<attack physical="2641.63342970569" magical="971.856593649426" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="4218.55484265502" magical="3093.6078479881"/>
<attribute>
<attack type="WIND" value="350"/>
<defence fire="300" water="300" wind="370" earth="250" holy="300" dark="300" default="300"/>
</attribute>
<speed>
<walk ground="30"/>
<run ground="31"/>
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="230" magical="230"/>
</stats>
<skillList>
<skill id="4416" level="6"/><!-- Humanoids -->
<skill id="5464" level="1"/><!-- Wind Attack -->
</skillList>
<corpseTime>15</corpseTime>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="45"/>
<height normal="42.7"/>
</collision>
</npc>
<npc id="29046" level="85" type="Monster" name="Scarlet van Halisha">
<race>DEMONIC</race>
<sex>MALE</sex>
<equipment rhand="8204"/><!-- Monster Only (Follower of Frintezza Calibur) -->
<acquire exp="130849003" sp="31403"/>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="19146585" hpRegen="248.43" mp="17588" mpRegen="109"/>
<attack physical="3135.90530099925" magical="1442.51644402476" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="1342.97453242915" magical="2089.07149518896"/>
<attribute>
<attack type="DARK" value="280"/>
<defence fire="200" water="200" wind="200" earth="200" holy="150" dark="200" default="300"/>
</attribute>
<speed>
<walk ground="240"/>
<run ground="111"/>
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="230" magical="230"/>
</stats>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4071" level="4"/><!-- Resist Bow/Crossbow Weapons -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="9"/><!-- Demons -->
<skill id="5078" level="1"/><!-- Frintezza Critical Power -->
<skill id="4494" level="1"/><!-- Raid Boss -->
<skill id="14768" level="1"/><!-- Raid Boss (Lv. 85) -->
<skill id="5467" level="1"/><!-- Dark Attacks -->
<skill id="5017" level="1"/><!-- Demon -->
<skill id="14765" level="4"/><!-- Blood Siphon Resistance -->
</skillList>
<corpseTime>18</corpseTime>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" aggroRange="3000" clanHelpRange="2000" isAggressive="true">
<skill primaryId="5014"/>
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="45" grown="54"/>
<height normal="90.7" grown="109.4"/>
</collision>
</npc>
<npc id="29047" level="85" type="RaidBoss" name="Scarlet van Halisha">
<race>DEMONIC</race>
<sex>MALE</sex>
<equipment rhand="8222" />
<acquire exp="0" sp="0" raidPoints="0" />
<stats str="60" int="76" dex="73" wit="70" con="57" men="80">
<vitals hp="22167900" hpRegen="319.2293199" mp="3440344.575" mpRegen="3" />
<vitals hp="56970000" hpRegen="319.2293199" mp="3510317.685" mpRegen="3" />
<attack physical="8184.13934" magical="2579.001338" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
<defence physical="3584.547554" magical="1748.708651" />
<speed>
@ -1927,6 +2013,255 @@
</drop>
</dropLists>
</npc>
<npc id="29048" level="85" type="Monster" name="Evil Spirit">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="82844" hpRegen="1.03" mp="2177" mpRegen="1.03"/>
<attack physical="1637.21079615435" magical="1151.5428303933" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="1637.38608949103" magical="1091.59072648368" evasion="3"/>
<attribute>
<attack type="WIND" value="280"/>
<defence fire="200" water="200" wind="200" earth="150" holy="200" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="10"/>
<run ground="1"/>
</speed>
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
<skill id="5464" level="1"/><!-- Wind Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="CORPSE" clanHelpRange="1000" isAggressive="true" aggroRange="6000">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="40"/>
<height normal="100"/>
</collision>
</npc>
<npc id="29049" level="85" type="Monster" name="Evil Spirit">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="82844" hpRegen="1.03" mp="2177" mpRegen="1.03"/>
<attack physical="1637.21079615435" magical="1151.5428303933" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="1637.38608949103" magical="1091.59072648368" evasion="3"/>
<attribute>
<attack type="WIND" value="280"/>
<defence fire="200" water="200" wind="200" earth="150" holy="200" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="10"/>
<run ground="1"/>
</speed>
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
<skill id="5464" level="1"/><!-- Wind Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="CORPSE" clanHelpRange="1000" isAggressive="true" aggroRange="6000">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="40"/>
<height normal="100"/>
</collision>
</npc>
<npc id="29050" level="85" type="Monster" name="Halisha's Breath">
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="12996" hpRegen="1.01" mp="20560" mpRegen="3.03"/>
<attack physical="1556.78628597682" magical="1073.71405840992" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="642.236873936287" magical="428.157916018841" evasion="1"/>
<attribute>
<attack type="DARK" value="280"/>
<defence fire="200" water="200" wind="200" earth="200" holy="150" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="30"/>
<run ground="200"/>
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="3"/><!-- Light Armor Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="9"/><!-- Demons -->
<skill id="5467" level="1"/><!-- Dark Attacks -->
<skill id="5009" level="1"/><!-- Frintezza Ghost Fighter -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" aggroRange="450" clanHelpRange="2000" isAggressive="true">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="23" grown="32"/>
<height normal="40" grown="50"/>
</collision>
</npc>
<npc id="29051" level="85" type="Monster" name="Halisha's Breath">
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="12996" hpRegen="1.01" mp="20560" mpRegen="3.03"/>
<attack physical="1556.78628597682" magical="1073.71405840992" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="642.236873936287" magical="428.157916018841" evasion="1"/>
<attribute>
<attack type="DARK" value="280"/>
<defence fire="200" water="200" wind="200" earth="200" holy="150" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="30"/>
<run ground="200"/>
</speed>
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="3"/><!-- Light Armor Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="9"/><!-- Demons -->
<skill id="5467" level="1"/><!-- Dark Attacks -->
<skill id="5010" level="1"/><!-- Frintezza Ghost Mage -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" aggroRange="450" clanHelpRange="2000" isAggressive="true">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="23"/>
<height normal="40"/>
</collision>
</npc>
<npc id="29052" level="85" type="Monster" name="">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="3960" hpRegen="8.585" mp="2056" mpRegen="3.03"/>
<attack physical="1216.23928591939" magical="838.839108132747" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="3864.96881246637" magical="2826.6352584085" evasion="1"/>
<speed>
<walk ground="10"/>
<run ground="1"/>
</speed>
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false"/>
<skillList>
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="1"/>
<height normal="35"/>
</collision>
</npc>
<npc id="29053" level="84" type="Monster" name="">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="5448" hpRegen="8.5" mp="2036" mpRegen="3"/>
<attack physical="1456.32495032888" magical="994.481156766258" random="10" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="383.421920892449" magical="280.571522036227"/>
<speed>
<walk ground="10"/>
<run ground="1"/>
</speed>
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false"/>
<skillList>
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
<skill id="5004" level="1"/><!-- Dimensional Stun -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="1"/>
<height normal="58"/>
</collision>
</npc>
<npc id="29066" level="1" type="GrandBoss" name="Antharas">
<parameters>
<param name="ultra_respawn_time" value="8" />
@ -2037,6 +2372,49 @@
</drop>
</dropLists>
</npc>
<npc id="29061" displayId="31842" level="70" type="Teleporter" name="Teleportation Cubic">
<race>ETC</race>
<sex>ETC</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="2444" hpRegen="7.5" mp="1345" mpRegen="2.7"/>
<attack physical="688.86373" magical="470.40463" random="10" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120"/>
<defence physical="295.91597" magical="216.53847"/>
<speed>
<walk ground="50"/>
<run ground="120"/>
</speed>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false"/>
<skillList>
<skill id="4045" level="1"/>
<!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/>
<!-- HP Increase (1x) -->
<skill id="4409" level="1"/>
<!-- MP Increase (1x) -->
<skill id="4410" level="11"/>
<!-- Average P. Atk. -->
<skill id="4411" level="11"/>
<!-- Average M. Atk. -->
<skill id="4412" level="11"/>
<!-- Average P. Def. -->
<skill id="4413" level="11"/>
<!-- Average M. Def. -->
<skill id="4414" level="2"/>
<!-- Standard Type -->
<skill id="4415" level="3"/>
<!-- One-handed Sword -->
<skill id="4416" level="19"/>
<!-- Others -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" clanHelpRange="300" isAggressive="true" aggroRange="500"/>
<collision>
<radius normal="40"/>
<height normal="80"/>
</collision>
</npc>
<npc id="29067" level="1" type="GrandBoss" name="Antharas">
<parameters>
<param name="ultra_respawn_time" value="5" />

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
<npc id="32011" level="85" type="Npc" name="Imperial Tomb Guide">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<speed>
<walk ground="60" />
<run ground="120" />
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
</stats>
<status attackable="false" />
<collision>
<radius normal="5" />
<height normal="12" />
</collision>
</npc>
</list>

View File

@ -453,6 +453,57 @@
</effect>
</effects>
</skill>
<skill id="5015" toLevel="6" name="Frintezza Charge">
<!-- Demon $s1 charge. -->
<affectRange>
<value level="1">400</value>
<value level="2">500</value>
<value level="3">700</value>
<value level="4">400</value>
<value level="5">500</value>
<value level="6">700</value>
</affectRange>
<castRange>150</castRange>
<coolTime>
<value level="1">0</value>
<value level="2">0</value>
<value level="3">0</value>
<value level="4">1500</value>
<value level="5">1500</value>
<value level="6">1500</value>
</coolTime>
<effectPoint>-100</effectPoint>
<effectRange>650</effectRange>
<attributeType>DARK</attributeType>
<attributeValue>180</attributeValue>
<fanRange>
<value level="1">0;0;400;150</value>
<value level="2">0;0;500;170</value>
<value level="3">0;0;700;200</value>
<value level="4">0;0;400;150</value>
<value level="5">0;0;500;170</value>
<value level="6">0;0;700;200</value>
</fanRange>
<hitTime>1500</hitTime>
<magicLvl>85</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>-5</magicCriticalRate>
<targetType>ENEMY</targetType>
<affectScope>SQUARE</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<effects>
<effect name="PhysicalAttack">
<power>
<value level="1">48761</value>
<value level="2">52970</value>
<value level="3">68074</value>
<value level="4">48761</value>
<value level="5">52970</value>
<value level="6">68074</value>
</power>
</effect>
</effects>
</skill>
<skill id="5016" toLevel="1" name="Yoke of Scarlet">
<!-- Yoked status. -->
<icon>icon.skill5016</icon>

View File

@ -24,4 +24,11 @@
</effect>
</effects>
</skill>
<skill id="14768" toLevel="1" name="Raid Boss (Lv. 85)">
<!-- After being killed by Frintezza, who lost his soul to the devil, it was reborn as a monster called Scarlet van Halisha. It has lost sense of self, and it only makes sacrifices for the demon Halisha. -->
<icon>icon.skillraid</icon>
<operateType>P</operateType>
<magicCriticalRate>-5</magicCriticalRate>
<magicLvl>1</magicLvl>
</skill>
</list>

View File

@ -287,21 +287,6 @@
</xs:complexType>
</xs:element>
<xs:element name="magicCriticalRate" type="xs:byte" />
<xs:element name="trait">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="targetType">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@ -412,9 +397,7 @@
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:unsignedByte">
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
@ -511,9 +494,9 @@
<xs:extension base="xs:string">
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromSubLevel" type="xs:unsignedShort" use="optional" />
<xs:attribute name="toSubLevel" type="xs:unsignedShort" use="optional" />
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
@ -618,7 +601,6 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" type="xs:string" />
<xs:element name="expMultiplier" type="xs:decimal" />
<xs:element name="halfLethal">
<xs:complexType mixed="true">
@ -969,7 +951,7 @@
</xs:complexType>
</xs:element>
<xs:element name="isAdvanced" type="xs:boolean" />
<xs:element name="DERANGEMENT">
<xs:element name="BLEED">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
@ -984,7 +966,7 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="BLEED">
<xs:element name="DERANGEMENT">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
@ -1367,6 +1349,9 @@
<xs:element name="PHYSICAL_ATTACK_SPEED" type="xs:unsignedByte" />
<xs:element name="MAGIC_ATTACK_SPEED" type="xs:unsignedByte" />
<xs:element name="transformationId" type="xs:unsignedByte" />
<xs:element name="distance" type="xs:unsignedByte" />
<xs:element name="speed" type="xs:unsignedShort" />
<xs:element name="knockDown" type="xs:boolean" />
<xs:element name="despawnDelay" type="xs:unsignedInt" />
<xs:element name="normal" type="xs:unsignedByte" />
<xs:element name="ride" type="xs:unsignedShort" />
@ -1446,6 +1431,7 @@
<xs:element name="PSYCHIC" type="xs:unsignedByte" />
<xs:element name="canKill" type="xs:boolean" />
<xs:element name="VALAKAS" type="xs:byte" />
<xs:element name="item" type="xs:string" />
<xs:element name="FIST" type="xs:unsignedByte" />
<xs:element name="ROOT_PHYSICALLY">
<xs:complexType>
@ -1464,11 +1450,8 @@
</xs:element>
<xs:element name="blockedActions" type="xs:byte" />
<xs:element name="lifeTime" type="xs:unsignedShort" />
<xs:element name="speed" type="xs:unsignedShort" />
<xs:element name="delay" type="xs:unsignedShort" />
<xs:element name="abnormalType" type="xs:string" />
<xs:element name="distance" type="xs:unsignedByte" />
<xs:element name="knockDown" type="xs:boolean" />
<xs:element name="hp" type="xs:unsignedByte" />
<xs:element name="mp" type="xs:unsignedByte" />
<xs:element name="cp" type="xs:unsignedByte" />
@ -1501,6 +1484,21 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="trait">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="abnormalVisualEffect">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@ -1564,7 +1562,21 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="fanRange" type="xs:string" />
<xs:element name="fanRange">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="itemConsumeCount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@ -1768,7 +1780,6 @@
<xs:element name="channelingStart" type="xs:decimal" />
<xs:element name="channelingTickInterval" type="xs:unsignedByte" />
<xs:element name="removedOnDamage" type="xs:boolean" />
<xs:element name="removedOnUnequipWeapon" type="xs:boolean" />
<xs:element name="removedOnAnyActionExceptMove" type="xs:boolean" />
<xs:element name="itemConsumeSteps" type="xs:unsignedByte" />
<xs:element name="soulMaxConsumeCount" type="xs:unsignedByte" />
@ -1852,26 +1863,7 @@
<xs:element maxOccurs="unbounded" name="effect">
<xs:complexType>
<xs:sequence minOccurs="0">
<xs:element minOccurs="0" name="amount">
<xs:complexType>
<xs:sequence>
<xs:element name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="required" />
<xs:attribute name="fromSubLevel" type="xs:unsignedShort" use="required" />
<xs:attribute name="toSubLevel" type="xs:unsignedShort" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="mode" type="xs:string" />
<xs:element minOccurs="0" name="power">
<xs:element name="power">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
@ -1890,10 +1882,6 @@
<xs:element minOccurs="0" name="ticks" type="xs:unsignedByte" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromSubLevel" type="xs:unsignedShort" use="optional" />
<xs:attribute name="toSubLevel" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@ -0,0 +1,6 @@
<html><body>Imperial Tomb Guide:<br>
Frintezza is protecting the Force Field. Even though you can pass through it, you can't meet Frintezza yet. He's put some tests in place to keep anyone from interrupting his rest.<br>
These obstacles will test all of your skills, and those of your party as well!<br>
If you pass the tests within a certain amount of time, you can meet Frintezza. This should only be attempted by the brave of heart!<br>
(If you pass the tests within 35 minutes, you'll meet Frintezza.)
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>
I feel an invisible barrier... Some sort of Magic Force Field has been put in place...<br>
...? The guide of the Imperial mausoleum seems to have something to say.<br><br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Quest LastImperialTomb">Enter the Magic Force Field</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Listen to Imperial Tomb Guide</Button>
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
</body></html>

View File

@ -0,0 +1,201 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance id="205" maxWorlds="80" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<time duration="120" empty="30" />
<locations>
<enter type="FIXED">
<location x="-88015" y="-141153" z="-9168"/>
</enter>
<exit type="ORIGIN" />
</locations>
<conditions>
<condition type="Party" />
<condition type="CommandChannel" />
<condition type="CommandChannelLeader" />
<condition type="GroupMin">
<param name="limit" value="27" /> <!-- The Kamael update -->
</condition>
<condition type="GroupMax">
<param name="limit" value="300" />
</condition>
<condition type="Level">
<param name="min" value="70" />
</condition>
<condition type="Distance" />
<condition type="Reenter" />
</conditions>
<reenter apply="ON_ENTER">
<reset day="WEDNESDAY" hour="6" minute="30" />
</reenter>
<doorlist>
<door id="17130045"/>
<door id="17130051"/>
<door id="17130046"/>
<door id="17130043"/>
<door id="17130042"/>
<door id="17130052"/>
<door id="17130053"/>
<door id="17130054"/>
<door id="17130055"/>
<door id="17130056"/>
<door id="17130057"/>
<door id="17130058"/>
<door id="17130061"/>
<door id="17130062"/>
<door id="17130063"/>
<door id="17130064"/>
<door id="17130065"/>
<door id="17130066"/>
<door id="17130067"/>
<door id="17130068"/>
<door id="17130069"/>
<door id="17130070"/>
</doorlist>
<spawnlist>
<group>
<npc id="18328" x="-87904" y="-141296" z="-9168" heading="0"/><!-- Hall Alarm -->
</group>
<group name="room1" spawnByDefault="false">
<npc id="18329" x="-87361" y="-142312" z="-9176" heading="43694"/>
<npc id="18329" x="-86916" y="-142136" z="-9176" heading="47013"/>
<npc id="18329" x="-87037" y="-142185" z="-9176" heading="36781"/>
<npc id="18329" x="-86869" y="-141910" z="-9176" heading="33913"/>
<npc id="18329" x="-86787" y="-141333" z="-9176" heading="49395"/>
<npc id="18329" x="-86581" y="-141426" z="-9176" heading="61112"/>
<npc id="18329" x="-86792" y="-141119" z="-9176" heading="36773"/>
<npc id="18329" x="-86693" y="-141079" z="-9176" heading="52481"/>
<npc id="18329" x="-87002" y="-140604" z="-9176" heading="52739"/>
<npc id="18329" x="-87074" y="-140403" z="-9176" heading="62270"/>
<npc id="18329" x="-87239" y="-140163" z="-9176" heading="62482"/>
<npc id="18329" x="-87816" y="-140199" z="-9176" heading="61902"/>
<npc id="18329" x="-87281" y="-140336" z="-9176" heading="46667"/>
<npc id="18329" x="-87809" y="-140030" z="-9176" heading="15952"/>
<npc id="18329" x="-88028" y="-140122" z="-9176" heading="58845"/>
<npc id="18329" x="-88186" y="-140004" z="-9176" heading="6601"/>
<npc id="18329" x="-88746" y="-140354" z="-9176" heading="40577"/>
<npc id="18329" x="-88717" y="-140442" z="-9176" heading="2789"/>
<npc id="18329" x="-88619" y="-140236" z="-9176" heading="46506"/>
<npc id="18329" x="-88936" y="-140502" z="-9176" heading="39670"/>
<npc id="18329" x="-89022" y="-141327" z="-9176" heading="40426"/>
<npc id="18329" x="-89177" y="-141120" z="-9176" heading="31507"/>
<npc id="18329" x="-89037" y="-141137" z="-9176" heading="8243"/>
<npc id="18329" x="-89075" y="-141545" z="-9176" heading="9402"/>
<npc id="18329" x="-89147" y="-141636" z="-9176" heading="16185"/>
<npc id="18329" x="-88857" y="-141957" z="-9176" heading="14827"/>
<npc id="18329" x="-88880" y="-142110" z="-9176" heading="16669"/>
<npc id="18329" x="-88554" y="-142294" z="-9176" heading="21413"/>
<npc id="18329" x="-88693" y="-142254" z="-9176" heading="29845"/>
<npc id="18330" x="-87188" y="-142282" z="-9176" heading="31391"/>
<npc id="18330" x="-86779" y="-142056" z="-9176" heading="57028"/>
<npc id="18330" x="-87043" y="-142152" z="-9176" heading="38684"/>
<npc id="18330" x="-87075" y="-142297" z="-9176" heading="46886"/>
<npc id="18330" x="-86923" y="-141903" z="-9176" heading="8556"/>
<npc id="18330" x="-86908" y="-142066" z="-9176" heading="33147"/>
<npc id="18330" x="-86819" y="-141497" z="-9176" heading="34625"/>
<npc id="18330" x="-86669" y="-141470" z="-9176" heading="43482"/>
<npc id="18330" x="-86710" y="-141243" z="-9176" heading="57995"/>
<npc id="18330" x="-86795" y="-141168" z="-9176" heading="45501"/>
<npc id="18330" x="-86556" y="-141283" z="-9176" heading="62885"/>
<npc id="18330" x="-86825" y="-140630" z="-9176" heading="60032"/>
<npc id="18330" x="-87030" y="-140389" z="-9176" heading="48351"/>
<npc id="18330" x="-87018" y="-140233" z="-9176" heading="58404"/>
<npc id="18330" x="-87115" y="-140461" z="-9176" heading="40098"/>
<npc id="18330" x="-87402" y="-140121" z="-9176" heading="1948"/>
<npc id="18330" x="-87207" y="-140079" z="-9176" heading="2212"/>
<npc id="18330" x="-87656" y="-140169" z="-9176" heading="52562"/>
<npc id="18330" x="-87841" y="-139951" z="-9176" heading="5627"/>
<npc id="18330" x="-88008" y="-140051" z="-9176" heading="8635"/>
<npc id="18330" x="-88098" y="-140149" z="-9176" heading="57598"/>
<npc id="18330" x="-88224" y="-140029" z="-9176" heading="6984"/>
<npc id="18330" x="-88689" y="-140355" z="-9176" heading="6411"/>
<npc id="18330" x="-88859" y="-140475" z="-9176" heading="19053"/>
<npc id="18330" x="-88571" y="-140352" z="-9176" heading="265"/>
<npc id="18330" x="-88814" y="-140647" z="-9176" heading="63312"/>
<npc id="18330" x="-88911" y="-140626" z="-9176" heading="6711"/>
<npc id="18330" x="-89039" y="-141498" z="-9176" heading="56937"/>
<npc id="18330" x="-89205" y="-141444" z="-9176" heading="29487"/>
<npc id="18330" x="-89199" y="-141325" z="-9176" heading="42737"/>
<npc id="18330" x="-89110" y="-141199" z="-9176" heading="29210"/>
<npc id="18330" x="-88914" y="-141931" z="-9176" heading="12620"/>
<npc id="18330" x="-88827" y="-142052" z="-9176" heading="27582"/>
<npc id="18330" x="-89004" y="-142155" z="-9176" heading="38265"/>
<npc id="18330" x="-88665" y="-142492" z="-9176" heading="32599"/>
<npc id="18330" x="-88609" y="-142397" z="-9176" heading="10828"/>
<npc id="18330" x="-88698" y="-142122" z="-9176" heading="19648"/>
<npc id="18331" x="-86964" y="-142079" z="-9176" heading="6621"/>
<npc id="18331" x="-87260" y="-142297" z="-9176" heading="8297"/>
<npc id="18331" x="-86704" y="-141451" z="-9176" heading="15742"/>
<npc id="18331" x="-86707" y="-141175" z="-9176" heading="51507"/>
<npc id="18331" x="-86836" y="-140566" z="-9176" heading="23410"/>
<npc id="18331" x="-87025" y="-140438" z="-9176" heading="26558"/>
<npc id="18331" x="-87743" y="-139994" z="-9176" heading="31747"/>
<npc id="18331" x="-87919" y="-140013" z="-9176" heading="62621"/>
<npc id="18331" x="-88533" y="-140389" z="-9168" heading="38980"/>
<npc id="18331" x="-88668" y="-140355" z="-9176" heading="48943"/>
<npc id="18331" x="-88847" y="-140437" z="-9176" heading="37248"/>
<npc id="18331" x="-89094" y="-140991" z="-9176" heading="51142"/>
<npc id="18331" x="-89214" y="-141196" z="-9176" heading="43628"/>
<npc id="18331" x="-89167" y="-141458" z="-9176" heading="51003"/>
<npc id="18331" x="-88975" y="-142053" z="-9176" heading="58755"/>
<npc id="18331" x="-88928" y="-142081" z="-9176" heading="59768"/>
<npc id="18331" x="-88648" y="-142284" z="-9176" heading="60097"/>
</group>
<group name="room2_part1" spawnByDefault="false">
<npc id="18339" x="-87882" y="-146943" z="-9188" heading="9083"/>
<npc id="18339" x="-87914" y="-146981" z="-9188" heading="51455"/>
<npc id="18339" x="-87925" y="-146932" z="-9188" heading="15755"/>
<npc id="18339" x="-87971" y="-146885" z="-9188" heading="3538"/>
</group>
<group name="room2_part2" spawnByDefault="false">
<npc id="18334" x="-87016" y="-147940" z="-9172" heading="23515"/>
<npc id="18334" x="-86769" y="-147555" z="-9172" heading="31470"/>
<npc id="18334" x="-86723" y="-147121" z="-9172" heading="33419"/>
<npc id="18334" x="-86754" y="-146706" z="-9168" heading="32189"/>
<npc id="18334" x="-86910" y="-146366" z="-9172" heading="40265"/>
<npc id="18334" x="-89015" y="-146462" z="-9172" heading="59668"/>
<npc id="18334" x="-88879" y="-146240" z="-9172" heading="62109"/>
<npc id="18334" x="-89089" y="-147299" z="-9172" heading="50108"/>
<npc id="18334" x="-89128" y="-146746" z="-9172" heading="62663"/>
<npc id="18334" x="-88959" y="-147727" z="-9172" heading="3222"/>
<npc id="18335" x="-88899" y="-146145" z="-9172" heading="60699"/>
<npc id="18335" x="-88822" y="-147929" z="-9172" heading="5129"/>
<npc id="18335" x="-89008" y="-147561" z="-9172" heading="1691"/>
<npc id="18335" x="-89044" y="-146878" z="-9172" heading="64122"/>
<npc id="18335" x="-89005" y="-146439" z="-9172" heading="57813"/>
<npc id="18335" x="-89206" y="-147285" z="-9172" heading="61667"/>
<npc id="18335" x="-86958" y="-147939" z="-9172" heading="22983"/>
<npc id="18335" x="-86739" y="-147224" z="-9172" heading="31415"/>
<npc id="18335" x="-86770" y="-146513" z="-9172" heading="29048"/>
<npc id="18335" x="-86653" y="-146900" z="-9172" heading="22558"/>
<npc id="18335" x="-87029" y="-146250" z="-9172" heading="53805"/>
<npc id="18335" x="-86822" y="-147687" z="-9172" heading="25845"/>
<npc id="18337" x="-89000" y="-146471" z="-9172" heading="64277"/>
<npc id="18337" x="-89005" y="-146678" z="-9172" heading="61677"/>
<npc id="18337" x="-89028" y="-146997" z="-9172" heading="64285"/>
<npc id="18337" x="-89176" y="-147119" z="-9172" heading="4741"/>
<npc id="18337" x="-88994" y="-147462" z="-9172" heading="64668"/>
<npc id="18337" x="-89152" y="-147341" z="-9172" heading="65001"/>
<npc id="18337" x="-89043" y="-147812" z="-9172" heading="3894"/>
<npc id="18337" x="-88811" y="-148033" z="-9172" heading="8381"/>
<npc id="18337" x="-88648" y="-148132" z="-9172" heading="12021"/>
<npc id="18337" x="-87142" y="-146176" z="-9172" heading="40799"/>
<npc id="18337" x="-86899" y="-146535" z="-9172" heading="36449"/>
<npc id="18337" x="-86776" y="-146606" z="-9172" heading="37651"/>
<npc id="18337" x="-86812" y="-146767" z="-9172" heading="38225"/>
<npc id="18337" x="-86825" y="-146966" z="-9172" heading="28332"/>
<npc id="18337" x="-86885" y="-147227" z="-9172" heading="33807"/>
<npc id="18337" x="-86751" y="-147105" z="-9172" heading="31522"/>
<npc id="18337" x="-86873" y="-147564" z="-9172" heading="26634"/>
<npc id="18337" x="-87025" y="-147743" z="-9172" heading="27046"/>
<npc id="18337" x="-86917" y="-147672" z="-9172" heading="24575"/>
<npc id="18338" x="-86885" y="-146225" z="-9168" heading="40959"/>
<npc id="18338" x="-86885" y="-146225" z="-9168" heading="51582"/>
<npc id="18338" x="-86942" y="-147322" z="-9172" heading="44537"/>
<npc id="18338" x="-86766" y="-147622" z="-9172" heading="54685"/>
<npc id="18338" x="-86996" y="-147855" z="-9172" heading="41027"/>
<npc id="18338" x="-89035" y="-147546" z="-9172" heading="57311"/>
<npc id="18338" x="-89228" y="-146891" z="-9172" heading="50874"/>
<npc id="18338" x="-89028" y="-146502" z="-9168" heading="45888"/>
<npc id="18338" x="-88846" y="-146119" z="-9172" heading="514"/>
</group>
</spawnlist>
</instance>

View File

@ -0,0 +1,911 @@
/*
* 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.LastImperialTomb;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.Earthquake;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillCanceld;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import org.l2jmobius.gameserver.network.serverpackets.NpcInfo;
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
import org.l2jmobius.gameserver.network.serverpackets.SpecialCamera;
import instances.AbstractInstance;
/**
* Last Imperial Tomb AI
* @author Mobius (reworked from L2J version)
* @author RobikBobik (Updated to Classic: The Kamael)
* @TODO: When halisha uses second transform, Halisha Breath need to stop attack.
*/
public class LastImperialTomb extends AbstractInstance
{
// NPCs
private static final int GUIDE = 32011;
private static final int CUBE = 29061;
private static final int HALL_ALARM = 18328;
private static final int HALL_KEEPER_SUICIDAL_SOLDIER = 18333;
private static final int DUMMY = 29052;
private static final int DUMMY2 = 29053;
private static final int[] PORTRAITS =
{
29048,
29049
};
private static final int[] DEMONS =
{
29050,
29051
};
private static final int FRINTEZZA = 29045;
private static final int SCARLET1 = 29046;
private static final int SCARLET2 = 29047;
private static final int[] ON_KILL_MONSTERS =
{
HALL_ALARM,
HALL_KEEPER_SUICIDAL_SOLDIER,
18329,
18330,
18331,
18334,
18335,
18336,
18337,
18338,
18339
};
// Items
private static final int FIRST_SCARLET_WEAPON = 8204;
private static final int SECOND_SCARLET_WEAPON = 7903;
// Doors
private static final int[] FIRST_ROOM_DOORS =
{
17130051,
17130052,
17130053,
17130054,
17130055,
17130056,
17130057,
17130058
};
private static final int[] SECOND_ROOM_DOORS =
{
17130061,
17130062,
17130063,
17130064,
17130065,
17130066,
17130067,
17130068,
17130069,
17130070
};
private static final int[] FIRST_ROUTE_DOORS =
{
17130042,
17130043
};
private static final int[] SECOND_ROUTE_DOORS =
{
17130045,
17130046
};
// Skills
private static final int DEWDROP_OF_DESTRUCTION_SKILL_ID = 2276;
private static final SkillHolder INTRO_SKILL = new SkillHolder(5004, 1);
private static final SkillHolder FIRST_MORPH_SKILL = new SkillHolder(5017, 1);
private static final Map<Integer, NpcStringId> SKILL_MSG = new HashMap<>();
static
{
SKILL_MSG.put(1, NpcStringId.REQUIEM_OF_HATRED);
SKILL_MSG.put(2, NpcStringId.RONDO_OF_SOLITUDE);
SKILL_MSG.put(3, NpcStringId.FRENETIC_TOCCATA);
SKILL_MSG.put(4, NpcStringId.FUGUE_OF_JUBILATION);
SKILL_MSG.put(5, NpcStringId.HYPNOTIC_MAZURKA);
}
// Spawns
// @formatter:off
static final int[][] PORTRAIT_SPAWNS =
{
{29048, -89381, -153981, -9168, 3368, -89378, -153968, -9168, 3368},
{29048, -86234, -152467, -9168, 37656, -86261, -152492, -9168, 37656},
{29049, -89342, -152479, -9168, -5152, -89311, -152491, -9168, -5152},
{29049, -86189, -153968, -9168, 29456, -86217, -153956, -9168, 29456},
};
// @formatter:on
// Misc
private static final int TEMPLATE_ID = 205;
private static final int FRINTEZZA_WAIT_TIME = 10; // minutes
private static final int RANDOM_SONG_INTERVAL = 90; // seconds
private static final int TIME_BETWEEN_DEMON_SPAWNS = 20; // seconds
private static final int MAX_DEMONS = 24;
public LastImperialTomb()
{
super(TEMPLATE_ID);
addTalkId(GUIDE, CUBE);
addAttackId(SCARLET1);
addKillId(ON_KILL_MONSTERS);
addKillId(HALL_ALARM, SCARLET2);
addKillId(PORTRAITS);
addKillId(DEMONS);
addSpawnId(HALL_ALARM, DUMMY, DUMMY2);
addSpellFinishedId(HALL_KEEPER_SUICIDAL_SOLDIER);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "FRINTEZZA_INTRO_START":
{
final Instance world = player.getInstanceWorld();
startQuestTimer("FRINTEZZA_INTRO_1", 17000, null, player, false);
startQuestTimer("FRINTEZZA_INTRO_2", 20000, null, player, false);
broadCastPacket(world, new Earthquake(-87784, -155083, -9087, 45, 27));
break;
}
case "FRINTEZZA_INTRO_1":
{
final Instance world = player.getInstanceWorld();
for (int doorId : FIRST_ROOM_DOORS)
{
world.openCloseDoor(doorId, false);
}
for (int doorId : FIRST_ROUTE_DOORS)
{
world.openCloseDoor(doorId, false);
}
for (int doorId : SECOND_ROOM_DOORS)
{
world.openCloseDoor(doorId, false);
}
for (int doorId : SECOND_ROUTE_DOORS)
{
world.openCloseDoor(doorId, false);
}
addSpawn(CUBE, -87904, -141296, -9168, 0, false, 0, false, world.getId());
break;
}
case "FRINTEZZA_INTRO_2":
{
final Instance world = player.getInstanceWorld();
final Npc frintezzaDummy = addSpawn(DUMMY, -87784, -155083, -9087, 16048, false, 0, false, world.getId());
world.setParameter("frintezzaDummy", frintezzaDummy);
final Npc overheadDummy = addSpawn(DUMMY, -87784, -153298, -9175, 16384, false, 0, false, world.getId());
overheadDummy.setCollisionHeight(600);
broadCastPacket(world, new NpcInfo(overheadDummy));
world.setParameter("overheadDummy", overheadDummy);
final Npc portraitDummy1 = addSpawn(DUMMY, -89566, -153168, -9165, 16048, false, 0, false, world.getId());
world.setParameter("portraitDummy1", portraitDummy1);
final Npc portraitDummy3 = addSpawn(DUMMY, -86004, -153168, -9165, 16048, false, 0, false, world.getId());
world.setParameter("portraitDummy3", portraitDummy3);
final Npc scarletDummy = addSpawn(DUMMY2, -87784, -153298, -9175, 16384, false, 0, false, world.getId());
world.setParameter("scarletDummy", scarletDummy);
disablePlayers(world);
// broadCastPacket(world, new SpecialCamera(overheadDummy, 0, 75, -89, 0, 100, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(overheadDummy, 0, 75, -89, 0, 100, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(overheadDummy, 300, 90, -10, 6500, 7000, 0, 0, 1, 0, 0));
final Npc frintezza = addSpawn(FRINTEZZA, -87780, -155086, -9080, 16384, false, 0, false, world.getId());
frintezza.setIsImmobilized(true);
frintezza.setIsInvul(true);
frintezza.disableAllSkills();
world.setParameter("frintezza", frintezza);
final List<Npc> demons = new ArrayList<>();
for (int[] element : PORTRAIT_SPAWNS)
{
final MonsterInstance demon = (MonsterInstance) addSpawn(element[0] + 2, element[5], element[6], element[7], element[8], false, 0, false, world.getId());
demon.setIsImmobilized(true);
demon.disableAllSkills();
demons.add(demon);
}
world.setParameter("demons", demons);
startQuestTimer("FRINTEZZA_INTRO_3", 6500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_3":
{
final Instance world = player.getInstanceWorld();
final Npc frintezzaDummy = world.getParameters().getObject("frintezzaDummy", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezzaDummy, 1800, 90, 8, 6500, 7000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_4", 900, null, player, false);
break;
}
case "FRINTEZZA_INTRO_4":
{
final Instance world = player.getInstanceWorld();
final Npc frintezzaDummy = world.getParameters().getObject("frintezzaDummy", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezzaDummy, 140, 90, 10, 2500, 4500, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_5", 4000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_5":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 40, 75, -10, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 40, 75, -10, 0, 12000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_6", 1350, null, player, false);
break;
}
case "FRINTEZZA_INTRO_6":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SocialAction(frintezza.getObjectId(), 2));
final Npc frintezzaDummy = world.getParameters().getObject("frintezzaDummy", Npc.class);
frintezzaDummy.deleteMe();
startQuestTimer("FRINTEZZA_INTRO_7", 8000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_7":
{
final Instance world = player.getInstanceWorld();
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
broadCastPacket(world, new SocialAction(demons.get(1).getObjectId(), 1));
broadCastPacket(world, new SocialAction(demons.get(2).getObjectId(), 1));
startQuestTimer("FRINTEZZA_INTRO_8", 400, null, player, false);
break;
}
case "FRINTEZZA_INTRO_8":
{
final Instance world = player.getInstanceWorld();
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
final Npc portraitDummy1 = world.getParameters().getObject("portraitDummy1", Npc.class);
final Npc portraitDummy3 = world.getParameters().getObject("portraitDummy3", Npc.class);
broadCastPacket(world, new SocialAction(demons.get(0).getObjectId(), 1));
broadCastPacket(world, new SocialAction(demons.get(3).getObjectId(), 1));
sendPacketX(world, new SpecialCamera(portraitDummy1, 1000, 118, 0, 0, 1000, 0, 0, 1, 0, 0), new SpecialCamera(portraitDummy3, 1000, 62, 0, 0, 1000, 0, 0, 1, 0, 0), -87784);
sendPacketX(world, new SpecialCamera(portraitDummy1, 1000, 118, 0, 0, 10000, 0, 0, 1, 0, 0), new SpecialCamera(portraitDummy3, 1000, 62, 0, 0, 10000, 0, 0, 1, 0, 0), -87784);
startQuestTimer("FRINTEZZA_INTRO_9", 2000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_9":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final Npc portraitDummy1 = world.getParameters().getObject("portraitDummy1", Npc.class);
final Npc portraitDummy3 = world.getParameters().getObject("portraitDummy3", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 240, 90, 0, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 240, 90, 25, 5500, 10000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SocialAction(frintezza.getObjectId(), 3));
portraitDummy1.deleteMe();
portraitDummy3.deleteMe();
startQuestTimer("FRINTEZZA_INTRO_10", 4500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_10":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 100, 195, 35, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_11", 700, null, player, false);
break;
}
case "FRINTEZZA_INTRO_11":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 100, 195, 35, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_12", 1300, null, player, false);
break;
}
case "FRINTEZZA_INTRO_12":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new ExShowScreenMessage(NpcStringId.MOURNFUL_CHORALE_PRELUDE, 2, 5000));
broadCastPacket(world, new SpecialCamera(frintezza, 120, 180, 45, 1500, 10000, 0, 0, 1, 0, 0));
broadCastPacket(world, new MagicSkillUse(frintezza, frintezza, 5006, 1, 34000, 0));
startQuestTimer("FRINTEZZA_INTRO_13", 1500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_13":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 520, 135, 45, 8000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_14", 7500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_14":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 1500, 110, 25, 10000, 13000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_15", 9500, null, player, false);
break;
}
case "FRINTEZZA_INTRO_15":
{
final Instance world = player.getInstanceWorld();
final Npc overheadDummy = world.getParameters().getObject("overheadDummy", Npc.class);
final Npc scarletDummy = world.getParameters().getObject("scarletDummy", Npc.class);
broadCastPacket(world, new SpecialCamera(overheadDummy, 930, 160, -20, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(overheadDummy, 600, 180, -25, 0, 10000, 0, 0, 1, 0, 0));
broadCastPacket(world, new MagicSkillUse(scarletDummy, overheadDummy, 5004, 1, 5800, 0));
startQuestTimer("FRINTEZZA_INTRO_16", 5000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_16":
{
final Instance world = player.getInstanceWorld();
final Npc scarletDummy = world.getParameters().getObject("scarletDummy", Npc.class);
final Npc activeScarlet = addSpawn(SCARLET1, -87789, -153295, -9176, 16384, false, 0, false, world.getId());
world.setParameter("activeScarlet", activeScarlet);
activeScarlet.setRHandId(FIRST_SCARLET_WEAPON);
activeScarlet.setIsInvul(true);
activeScarlet.setIsImmobilized(true);
activeScarlet.disableAllSkills();
broadCastPacket(world, new SocialAction(activeScarlet.getObjectId(), 3));
broadCastPacket(world, new SpecialCamera(scarletDummy, 800, 180, 10, 1000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_17", 2100, null, player, false);
break;
}
case "FRINTEZZA_INTRO_17":
{
final Instance world = player.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
broadCastPacket(world, new SpecialCamera(activeScarlet, 300, 60, 8, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FRINTEZZA_INTRO_18", 2000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_18":
{
final Instance world = player.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
broadCastPacket(world, new SpecialCamera(activeScarlet, 500, 90, 10, 3000, 5000, 0, 0, 1, 0, 0));
world.setParameter("isPlayingSong", false);
playRandomSong(world);
startQuestTimer("FRINTEZZA_INTRO_19", 3000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_19":
{
final Instance world = player.getInstanceWorld();
final Map<Npc, Integer> portraits = new HashMap<>();
for (int i = 0; i < PORTRAIT_SPAWNS.length; i++)
{
final Npc portrait = addSpawn(PORTRAIT_SPAWNS[i][0], PORTRAIT_SPAWNS[i][1], PORTRAIT_SPAWNS[i][2], PORTRAIT_SPAWNS[i][3], PORTRAIT_SPAWNS[i][4], false, 0, false, world.getId());
portraits.put(portrait, i);
}
world.setParameter("portraits", portraits);
final Npc overheadDummy = world.getParameters().getObject("overheadDummy", Npc.class);
final Npc scarletDummy = world.getParameters().getObject("scarletDummy", Npc.class);
overheadDummy.deleteMe();
scarletDummy.deleteMe();
startQuestTimer("FRINTEZZA_INTRO_20", 2000, null, player, false);
break;
}
case "FRINTEZZA_INTRO_20":
{
final Instance world = player.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
for (Npc demon : demons)
{
demon.setIsImmobilized(false);
demon.enableAllSkills();
}
activeScarlet.setIsInvul(false);
activeScarlet.setIsImmobilized(false);
activeScarlet.enableAllSkills();
activeScarlet.setRunning();
activeScarlet.doCast(INTRO_SKILL.getSkill());
frintezza.enableAllSkills();
frintezza.disableCoreAI(true);
frintezza.setIsInvul(true);
enablePlayers(world);
startQuestTimer("PLAY_RANDOM_SONG", RANDOM_SONG_INTERVAL * 1000, frintezza, null, false);
startQuestTimer("SPAWN_DEMONS", TIME_BETWEEN_DEMON_SPAWNS * 1000, null, player, false);
break;
}
case "SPAWN_DEMONS":
{
final Instance world = player.getInstanceWorld();
final Map<Npc, Integer> portraits = world.getParameters().getMap("portraits", Npc.class, Integer.class);
if (!portraits.isEmpty())
{
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
for (int i : portraits.values())
{
if (demons.size() > MAX_DEMONS)
{
break;
}
final Npc demon = addSpawn(PORTRAIT_SPAWNS[i][0] + 2, PORTRAIT_SPAWNS[i][5], PORTRAIT_SPAWNS[i][6], PORTRAIT_SPAWNS[i][7], PORTRAIT_SPAWNS[i][8], false, 0, false, world.getId());
demons.add(demon);
}
world.setParameter("demons", demons);
startQuestTimer("SPAWN_DEMONS", TIME_BETWEEN_DEMON_SPAWNS * 1000, null, player, false);
}
break;
}
case "PLAY_RANDOM_SONG":
{
if (npc != null)
{
final Instance world = npc.getInstanceWorld();
playRandomSong(world);
startQuestTimer("PLAY_RANDOM_SONG", RANDOM_SONG_INTERVAL * 1000, null, player, false);
}
break;
}
case "SCARLET_FIRST_MORPH":
{
final Instance world = npc.getInstanceWorld();
npc.doCast(FIRST_MORPH_SKILL.getSkill());
playRandomSong(world);
break;
}
case "SCARLET_SECOND_MORPH":
{
final Instance world = npc.getInstanceWorld();
disablePlayers(world);
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
activeScarlet.abortAttack();
activeScarlet.abortCast();
activeScarlet.setIsInvul(true);
activeScarlet.setIsImmobilized(true);
activeScarlet.disableAllSkills();
playRandomSong(world);
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_1", 2000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_1":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SocialAction(frintezza.getObjectId(), 4));
broadCastPacket(world, new SpecialCamera(frintezza, 250, 120, 15, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 250, 120, 15, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_2", 7000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_2":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new MagicSkillUse(frintezza, frintezza, 5006, 1, 34000, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 500, 70, 15, 3000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_3", 3000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_3":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 2500, 90, 12, 6000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_4", 3000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_4":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final Location scarletLocation = activeScarlet.getLocation();
int newHeading = 0;
if (scarletLocation.getHeading() < 32768)
{
newHeading = Math.abs(180 - (int) (scarletLocation.getHeading() / 182.044444444));
}
else
{
newHeading = Math.abs(540 - (int) (scarletLocation.getHeading() / 182.044444444));
}
world.setParameter("scarletLocation", scarletLocation);
world.setParameter("newHeading", newHeading);
broadCastPacket(world, new SpecialCamera(activeScarlet, 250, newHeading, 12, 0, 1000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(activeScarlet, 250, newHeading, 12, 0, 10000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_5", 500, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_5":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final int newHeading = world.getParameters().getInt("newHeading");
activeScarlet.doDie(activeScarlet);
broadCastPacket(world, new SpecialCamera(activeScarlet, 450, newHeading, 14, 8000, 8000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_6", 6250, npc, null, false);
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_7", 7200, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_6":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
activeScarlet.deleteMe();
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_7":
{
final Instance world = npc.getInstanceWorld();
final int newHeading = world.getParameters().getInt("newHeading");
final Location scarletLocation = world.getParameters().getLocation("scarletLocation");
final Npc activeScarlet = addSpawn(SCARLET2, scarletLocation, false, 0, false, world.getId());
world.setParameter("activeScarlet", activeScarlet);
activeScarlet.setRHandId(SECOND_SCARLET_WEAPON);
activeScarlet.setIsInvul(true);
activeScarlet.setIsImmobilized(true);
activeScarlet.disableAllSkills();
broadCastPacket(world, new SpecialCamera(activeScarlet, 450, newHeading, 12, 500, 14000, 0, 0, 1, 0, 0));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_8", 8100, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_8":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
broadCastPacket(world, new SocialAction(activeScarlet.getObjectId(), 2));
startQuestTimer("SCARLET_SECOND_MORPH_CAMERA_9", 9000, npc, null, false);
break;
}
case "SCARLET_SECOND_MORPH_CAMERA_9":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
activeScarlet.setIsInvul(false);
activeScarlet.setIsImmobilized(false);
activeScarlet.enableAllSkills();
enablePlayers(world);
break;
}
case "FINISH_CAMERA_1":
{
final Instance world = npc.getInstanceWorld();
final Npc activeScarlet = world.getParameters().getObject("activeScarlet", Npc.class);
final int newHeading = world.getParameters().getInt("newHeading");
broadCastPacket(world, new SpecialCamera(activeScarlet, 300, newHeading - 180, 5, 0, 7000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(activeScarlet, 200, newHeading, 85, 4000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FINISH_CAMERA_2", 7400, npc, null, false);
startQuestTimer("FINISH_CAMERA_3", 7500, npc, null, false);
break;
}
case "FINISH_CAMERA_2":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
frintezza.doDie(frintezza);
break;
}
case "FINISH_CAMERA_3":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 100, 120, 5, 0, 7000, 0, 0, 1, 0, 0));
broadCastPacket(world, new SpecialCamera(frintezza, 100, 90, 5, 5000, 15000, 0, 0, 1, 0, 0));
startQuestTimer("FINISH_CAMERA_4", 7000, npc, null, false);
break;
}
case "FINISH_CAMERA_4":
{
final Instance world = npc.getInstanceWorld();
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new SpecialCamera(frintezza, 900, 90, 25, 7000, 10000, 0, 0, 1, 0, 0));
startQuestTimer("FINISH_CAMERA_5", 9000, npc, null, false);
break;
}
case "FINISH_CAMERA_5":
{
final Instance world = npc.getInstanceWorld();
for (int doorId : FIRST_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (int doorId : FIRST_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (int doorId : SECOND_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (int doorId : SECOND_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
enablePlayers(world);
break;
}
}
return null;
}
@Override
public String onTalk(Npc npc, PlayerInstance player)
{
if (npc.getId() == GUIDE)
{
enterInstance(player, npc, TEMPLATE_ID);
}
else // Teleport Cube
{
final Instance world = getPlayerInstance(player);
if (world != null)
{
teleportPlayerOut(player, world);
}
}
return null;
}
@Override
public String onSpawn(Npc npc)
{
npc.setRandomWalking(false);
npc.setIsImmobilized(true);
if (npc.getId() == HALL_ALARM)
{
npc.disableCoreAI(true);
}
else // dummy
{
npc.setIsInvul(true);
}
return super.onSpawn(npc);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == SCARLET1)
{
if ((npc.getScriptValue() == 0) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.80)))
{
npc.setScriptValue(1);
startQuestTimer("SCARLET_FIRST_MORPH", 1000, npc, null, false);
}
if ((npc.getScriptValue() == 1) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.20)))
{
npc.setScriptValue(2);
startQuestTimer("SCARLET_SECOND_MORPH", 1000, npc, null, false);
}
}
if (skill != null)
{
// When Dewdrop of Destruction is used on Portraits they suicide.
if (CommonUtil.contains(PORTRAITS, npc.getId()) && (skill.getId() == DEWDROP_OF_DESTRUCTION_SKILL_ID))
{
npc.doDie(attacker);
}
}
return null;
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
if (skill.isSuicideAttack())
{
return onKill(npc, null, false);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
final Instance world = killer.getInstanceWorld();
if ((npc.getId() == HALL_ALARM) && (world.getStatus() == 0))
{
world.setStatus(1);
world.spawnGroup("room1");
final List<MonsterInstance> monsters = world.getAliveNpcs(MonsterInstance.class);
world.setParameter("monstersCount", monsters.size() - 1);
for (int doorId : FIRST_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (Npc monster : monsters)
{
monster.setRunning();
// monster.moveToLocation(-87959, -141247, -9168, 0);
monster.reduceCurrentHp(1, killer, null); // TODO: Find better way for attack
}
}
else if (npc.getId() == SCARLET2)
{
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
broadCastPacket(world, new MagicSkillCanceld(frintezza.getObjectId()));
startQuestTimer("FINISH_CAMERA_1", 500, npc, null, false);
}
else if (CommonUtil.contains(DEMONS, npc.getId()))
{
final List<Npc> demons = world.getParameters().getList("demons", Npc.class);
demons.remove(npc);
}
else if (CommonUtil.contains(PORTRAITS, npc.getId()))
{
final Map<Npc, Integer> portraits = world.getParameters().getMap("portraits", Npc.class, Integer.class);
portraits.remove(npc);
}
else
{
final int killCount = world.getParameters().getInt("monstersCount");
world.setParameter("monstersCount", killCount - 1);
if (killCount <= 0)
{
switch (world.getStatus())
{
case 1:
{
world.setStatus(2);
world.spawnGroup("room2_part1");
final List<MonsterInstance> monsters = world.getAliveNpcs(MonsterInstance.class);
world.setParameter("monstersCount", monsters.size() - 1);
for (int doorId : FIRST_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
break;
}
case 2:
{
world.setStatus(3);
world.spawnGroup("room2_part2");
final List<MonsterInstance> monsters = world.getAliveNpcs(MonsterInstance.class);
world.setParameter("monstersCount", monsters.size() - 1);
for (int doorId : SECOND_ROOM_DOORS)
{
world.openCloseDoor(doorId, true);
}
for (Npc monster : monsters)
{
monster.setRunning();
// monster.moveToLocation(-87935, -147062, -9184, 0);
monster.reduceCurrentHp(1, killer, null); // TODO: Find better way for attack
}
break;
}
case 3:
{
world.setStatus(4);
for (int doorId : SECOND_ROUTE_DOORS)
{
world.openCloseDoor(doorId, true);
}
startQuestTimer("FRINTEZZA_INTRO_START", FRINTEZZA_WAIT_TIME * 60 * 1000, null, killer, false);
break;
}
}
}
}
return super.onKill(npc, killer, isSummon);
}
private void playRandomSong(Instance world)
{
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong)
{
return;
}
world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random);
final SkillHolder skillEffect = new SkillHolder(5008, random);
broadCastPacket(world, new ExShowScreenMessage(2, -1, 2, 0, 0, 0, 0, true, 4000, false, null, SKILL_MSG.get(random), null));
broadCastPacket(world, new MagicSkillUse(frintezza, frintezza, skill.getSkillId(), skill.getSkillLevel(), skill.getSkill().getHitTime(), 0));
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
frintezza.setTarget(player);
frintezza.doCast(skillEffect.getSkill());
}
}
world.setParameter("isPlayingSong", false);
}
private void disablePlayers(Instance world)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
player.abortAttack();
player.abortCast();
player.disableAllSkills();
player.setTarget(null);
player.stopMove(null);
player.setIsImmobilized(true);
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
}
}
}
private void enablePlayers(Instance world)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
player.enableAllSkills();
player.setIsImmobilized(false);
}
}
}
void broadCastPacket(Instance world, IClientOutgoingPacket packet)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
player.sendPacket(packet);
}
}
}
private void sendPacketX(Instance world, IClientOutgoingPacket packet1, IClientOutgoingPacket packet2, int x)
{
for (PlayerInstance player : world.getPlayers())
{
if ((player != null) && player.isOnline())
{
if (player.getX() < x)
{
player.sendPacket(packet1);
}
else
{
player.sendPacket(packet2);
}
}
}
}
public static void main(String[] args)
{
new LastImperialTomb();
}
}

View File

@ -0,0 +1,277 @@
/*
* 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.LastImperialTomb;
import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK;
import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW;
import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE;
import java.util.ArrayList;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DecoyInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.util.Util;
import ai.AbstractNpcAI;
/**
* @author Micr0, Zerox, Mobius
*/
public class ScarletVanHalisha extends AbstractNpcAI
{
// NPCs
private static final int HALISHA2 = 29046;
private static final int HALISHA3 = 29047;
// Skills
private static final int FRINTEZZA_DAEMON_ATTACK = 5014;
private static final int FRINTEZZA_DAEMON_CHARGE = 5015;
private static final int YOKE_OF_SCARLET = 5016;
private static final int FRINTEZZA_DAEMON_MORPH = 5018;
private static final int FRINTEZZA_DAEMON_FIELD = 5019;
// Misc
private Creature _target;
private Skill _skill;
private long _lastRangedSkillTime;
private final int _rangedSkillMinCoolTime = 60000; // 1 minute
public ScarletVanHalisha()
{
addAttackId(HALISHA2, HALISHA3);
addKillId(HALISHA2, HALISHA3);
addSpellFinishedId(HALISHA2, HALISHA3);
registerMobs(HALISHA2, HALISHA3);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "ATTACK":
{
if (npc != null)
{
getSkillAI(npc);
}
break;
}
case "RANDOM_TARGET":
{
_target = getRandomTarget(npc, null);
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
getSkillAI(npc);
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
cancelQuestTimers("ATTACK");
cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon);
}
private Skill getRndSkills(Npc npc)
{
switch (npc.getId())
{
case HALISHA2:
{
if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 2);
}
else if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 5);
}
else if (getRandom(100) < 2)
{
return SkillData.getInstance().getSkill(YOKE_OF_SCARLET, 1);
}
else
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_ATTACK, 2);
}
}
case HALISHA3:
{
if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 3);
}
else if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 6);
}
else if (getRandom(100) < 10)
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_CHARGE, 2);
}
else if (((_lastRangedSkillTime + _rangedSkillMinCoolTime) < System.currentTimeMillis()) && (getRandom(100) < 10))
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_FIELD, 1);
}
else if (((_lastRangedSkillTime + _rangedSkillMinCoolTime) < System.currentTimeMillis()) && (getRandom(100) < 10))
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_MORPH, 1);
}
else if (getRandom(100) < 2)
{
return SkillData.getInstance().getSkill(YOKE_OF_SCARLET, 1);
}
else
{
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_ATTACK, 3);
}
}
}
return SkillData.getInstance().getSkill(FRINTEZZA_DAEMON_ATTACK, 1);
}
private synchronized void getSkillAI(Npc npc)
{
if (npc.isInvul() || npc.isCastingNow())
{
return;
}
if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{
_skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill);
}
final Creature target = _target;
Skill skill = _skill;
if (skill == null)
{
skill = getRndSkills(npc);
}
if (npc.isPhysicalMuted())
{
return;
}
if ((target == null) || target.isDead())
{
// npc.setIsCastingNow(false);
return;
}
if (Util.checkIfInRange(skill.getCastRange(), npc, target, true))
{
npc.getAI().setIntention(AI_INTENTION_IDLE);
npc.setTarget(target);
// npc.setIsCastingNow(true);
_target = null;
npc.doCast(skill);
}
else
{
npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null);
npc.getAI().setIntention(AI_INTENTION_ATTACK, target, null);
// npc.setIsCastingNow(false);
}
}
private Creature getRandomTarget(Npc npc, Skill skill)
{
final ArrayList<Creature> result = new ArrayList<>();
{
for (WorldObject obj : npc.getInstanceWorld().getPlayers())
{
if (obj.isPlayable() || (obj instanceof DecoyInstance))
{
if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
{
continue;
}
if (((((Creature) obj).getZ() < (npc.getZ() - 100)) && (((Creature) obj).getZ() > (npc.getZ() + 100))) || !GeoEngine.getInstance().canSeeTarget(obj, npc))
{
continue;
}
}
if (obj.isPlayable() || (obj instanceof DecoyInstance))
{
int skillRange = 150;
if (skill != null)
{
switch (skill.getId())
{
case FRINTEZZA_DAEMON_ATTACK:
{
skillRange = 150;
break;
}
case FRINTEZZA_DAEMON_CHARGE:
{
skillRange = 400;
break;
}
case YOKE_OF_SCARLET:
{
skillRange = 200;
break;
}
case FRINTEZZA_DAEMON_MORPH:
case FRINTEZZA_DAEMON_FIELD:
{
_lastRangedSkillTime = System.currentTimeMillis();
skillRange = 550;
break;
}
}
}
if (Util.checkIfInRange(skillRange, npc, obj, true) && !((Creature) obj).isDead())
{
result.add((Creature) obj);
}
}
}
}
return getRandomEntry(result);
}
public static void main(String[] args)
{
new ScarletVanHalisha();
}
}

View File

@ -547,6 +547,7 @@
<npc id="21438" x="180495" y="-75344" z="-2728" heading="8728" respawnTime="30sec" />
<npc id="21438" x="180956" y="-75418" z="-2728" heading="55660" respawnTime="30sec" />
<npc id="21438" x="180552" y="-75371" z="-2728" heading="1395" respawnTime="30sec" />
<npc id="32011" x="181376" y="-81008" z="-2728" heading="16500" respawnTime="60sec" /> <!-- Imperial Tomb Guide -->
</group>
</spawn>
</list>

View File

@ -33,14 +33,18 @@
</stats>
</item>
<item id="8222" name="Monster Only (Follower of Frintezza Tran Calibur)" type="Weapon">
<set name="icon" val="icon.weapon_monster_i00" />
<set name="default_action" val="EQUIP" />
<set name="weapon_type" val="SWORD" />
<set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" />
<set name="weight" val="1560" />
<set name="soulshots" val="2" />
<set name="spiritshots" val="2" />
<set name="icon" val="icon.weapon_monster_i00"/>
<set name="default_action" val="EQUIP"/>
<set name="weapon_type" val="SWORD"/>
<set name="bodypart" val="rhand"/>
<set name="damage_range" val="0;0;40;120"/>
<set name="immediate_effect" val="true"/>
<set name="material" val="FINE_STEEL"/>
<set name="weight" val="1560"/>
<set name="soulshots" val="2"/>
<set name="spiritshots" val="2"/>
<set name="commissionItemType" val="ONE_HAND_SWORD"/>
<set name="isAppearanceable" val="true"/>
<stats>
<stat type="rCrit">8</stat>
<stat type="pAtkSpd">379</stat>

File diff suppressed because it is too large Load Diff

View File

@ -1801,41 +1801,89 @@
</collision>
</npc>
<npc id="29045" level="85" type="Npc" name="Frintezza">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<race>HUMANOID</race>
<sex>MALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="643059.482835" hpRegen="319.2293199" mp="38410.582" mpRegen="3"/>
<attack physical="2641.63342970569" magical="971.856593649426" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="4218.55484265502" magical="3093.6078479881"/>
<attribute>
<attack type="WIND" value="350"/>
<defence fire="300" water="300" wind="370" earth="250" holy="300" dark="300" default="300"/>
</attribute>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="30"/>
<run ground="31"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>430</hitTime>
<abnormalResist physical="230" magical="230"/>
</stats>
<status attackable="false" />
<skillList>
<skill id="4416" level="6"/><!-- Humanoids -->
<skill id="5464" level="1"/><!-- Wind Attack -->
</skillList>
<corpseTime>15</corpseTime>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="45"/>
<height normal="42.7"/>
</collision>
</npc>
<npc id="29046" level="85" type="Npc" name="Scarlet van Halisha">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<npc id="29046" level="85" type="Monster" name="Scarlet van Halisha">
<race>DEMONIC</race>
<sex>MALE</sex>
<equipment rhand="8204"/><!-- Monster Only (Follower of Frintezza Calibur) -->
<acquire exp="130849003" sp="31403"/>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="19146585" hpRegen="248.43" mp="17588" mpRegen="109"/>
<attack physical="3135.90530099925" magical="1442.51644402476" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="1342.97453242915" magical="2089.07149518896"/>
<attribute>
<attack type="DARK" value="280"/>
<defence fire="200" water="200" wind="200" earth="200" holy="150" dark="200" default="300"/>
</attribute>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="240"/>
<run ground="111"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>430</hitTime>
<abnormalResist physical="230" magical="230"/>
</stats>
<status attackable="false" />
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4071" level="4"/><!-- Resist Bow/Crossbow Weapons -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="9"/><!-- Demons -->
<skill id="5078" level="1"/><!-- Frintezza Critical Power -->
<skill id="4494" level="1"/><!-- Raid Boss -->
<skill id="14768" level="1"/><!-- Raid Boss (Lv. 85) -->
<skill id="5467" level="1"/><!-- Dark Attacks -->
<skill id="5017" level="1"/><!-- Demon -->
<skill id="14765" level="4"/><!-- Blood Siphon Resistance -->
</skillList>
<corpseTime>18</corpseTime>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" aggroRange="3000" clanHelpRange="2000" isAggressive="true">
<skill primaryId="5014"/>
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="45" grown="54"/>
<height normal="90.7" grown="109.4"/>
</collision>
</npc>
<npc id="29047" level="85" type="RaidBoss" name="Scarlet van Halisha">
@ -1844,7 +1892,7 @@
<equipment rhand="8222" />
<acquire exp="0" sp="0" raidPoints="0" />
<stats str="60" int="76" dex="73" wit="70" con="57" men="80">
<vitals hp="22167900" hpRegen="319.2293199" mp="3440344.575" mpRegen="3" />
<vitals hp="56970000" hpRegen="319.2293199" mp="3510317.685" mpRegen="3" />
<attack physical="8184.13934" magical="2579.001338" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
<defence physical="3584.547554" magical="1748.708651" />
<speed>
@ -1965,118 +2013,253 @@
</drop>
</dropLists>
</npc>
<npc id="29048" level="85" type="Npc" name="Evil Spirit">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<npc id="29048" level="85" type="Monster" name="Evil Spirit">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<vitals hp="82844" hpRegen="1.03" mp="2177" mpRegen="1.03"/>
<attack physical="1637.21079615435" magical="1151.5428303933" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="1637.38608949103" magical="1091.59072648368" evasion="3"/>
<attribute>
<attack type="WIND" value="280"/>
<defence fire="200" water="200" wind="200" earth="150" holy="200" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="10"/>
<run ground="1"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false" />
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
<skill id="5464" level="1"/><!-- Wind Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="CORPSE" clanHelpRange="1000" isAggressive="true" aggroRange="6000">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="40"/>
<height normal="100"/>
</collision>
</npc>
<npc id="29049" level="85" type="Npc" name="Evil Spirit">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<npc id="29049" level="85" type="Monster" name="Evil Spirit">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<vitals hp="82844" hpRegen="1.03" mp="2177" mpRegen="1.03"/>
<attack physical="1637.21079615435" magical="1151.5428303933" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="1637.38608949103" magical="1091.59072648368" evasion="3"/>
<attribute>
<attack type="WIND" value="280"/>
<defence fire="200" water="200" wind="200" earth="150" holy="200" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="10"/>
<run ground="1"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false" />
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
<skill id="5464" level="1"/><!-- Wind Attacks -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="CORPSE" clanHelpRange="1000" isAggressive="true" aggroRange="6000">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="40"/>
<height normal="100"/>
</collision>
</npc>
<npc id="29050" level="85" type="Npc" name="Halisha's Breath">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<npc id="29050" level="85" type="Monster" name="Halisha's Breath">
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<vitals hp="12996" hpRegen="1.01" mp="20560" mpRegen="3.03"/>
<attack physical="1556.78628597682" magical="1073.71405840992" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="642.236873936287" magical="428.157916018841" evasion="1"/>
<attribute>
<attack type="DARK" value="280"/>
<defence fire="200" water="200" wind="200" earth="200" holy="150" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="30"/>
<run ground="200"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false" />
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="3"/><!-- Light Armor Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="9"/><!-- Demons -->
<skill id="5467" level="1"/><!-- Dark Attacks -->
<skill id="5009" level="1"/><!-- Frintezza Ghost Fighter -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" aggroRange="450" clanHelpRange="2000" isAggressive="true">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="23" grown="32"/>
<height normal="40" grown="50"/>
</collision>
</npc>
<npc id="29051" level="85" type="Npc" name="Halisha's Breath">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<npc id="29051" level="85" type="Monster" name="Halisha's Breath">
<race>DEMONIC</race>
<sex>MALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<vitals hp="12996" hpRegen="1.01" mp="20560" mpRegen="3.03"/>
<attack physical="1556.78628597682" magical="1073.71405840992" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="642.236873936287" magical="428.157916018841" evasion="1"/>
<attribute>
<attack type="DARK" value="280"/>
<defence fire="200" water="200" wind="200" earth="200" holy="150" dark="200" default="220"/>
</attribute>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="30"/>
<run ground="200"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>430</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false" />
<status undying="false"/>
<skillList>
<skill id="4045" level="1"/><!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="3"/><!-- Light Armor Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="9"/><!-- Demons -->
<skill id="5467" level="1"/><!-- Dark Attacks -->
<skill id="5010" level="1"/><!-- Frintezza Ghost Mage -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" aggroRange="450" clanHelpRange="2000" isAggressive="true">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="23"/>
<height normal="40"/>
</collision>
</npc>
<npc id="29052" level="85" type="Npc" name="">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<npc id="29052" level="85" type="Monster" name="">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<vitals hp="3960" hpRegen="8.585" mp="2056" mpRegen="3.03"/>
<attack physical="1216.23928591939" magical="838.839108132747" random="5" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="3864.96881246637" magical="2826.6352584085" evasion="1"/>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="10"/>
<run ground="1"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false" />
<status attackable="false"/>
<skillList>
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="1"/>
<height normal="35"/>
</collision>
</npc>
<npc id="29053" level="85" type="Npc" name="">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<npc id="29053" level="84" type="Monster" name="">
<race>CONSTRUCT</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
<vitals hp="5448" hpRegen="8.5" mp="2036" mpRegen="3"/>
<attack physical="1456.32495032888" magical="994.481156766258" random="10" critical="4" accuracy="5" attackSpeed="253" type="FIST" range="40" distance="80" width="120"/>
<defence physical="383.421920892449" magical="280.571522036227"/>
<speed>
<walk ground="60" />
<run ground="120" />
<walk ground="10"/>
<run ground="1"/>
</speed>
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
<defence physical="405.85106382979" magical="297.0297029703" />
<hitTime>500</hitTime>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false" />
<status attackable="false"/>
<skillList>
<skill id="4408" level="1"/><!-- HP Increase (1x) -->
<skill id="4409" level="1"/><!-- MP Increase (1x) -->
<skill id="4410" level="11"/><!-- Average P. Atk. -->
<skill id="4411" level="11"/><!-- Average M. Atk. -->
<skill id="4412" level="11"/><!-- Average P. Def. -->
<skill id="4413" level="11"/><!-- Average M. Def. -->
<skill id="4414" level="2"/><!-- Standard Type -->
<skill id="4415" level="1"/><!-- Bare Hands -->
<skill id="4416" level="2"/><!-- Magic Creatures -->
<skill id="5004" level="1"/><!-- Dimensional Stun -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED">
<clanList>
<clan>FRINTESSA</clan>
</clanList>
</ai>
<collision>
<radius normal="5" />
<height normal="12" />
<radius normal="1"/>
<height normal="58"/>
</collision>
</npc>
<npc id="29066" level="1" type="GrandBoss" name="Antharas">
@ -2189,6 +2372,49 @@
</drop>
</dropLists>
</npc>
<npc id="29061" displayId="31842" level="70" type="Teleporter" name="Teleportation Cubic">
<race>ETC</race>
<sex>ETC</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="2444" hpRegen="7.5" mp="1345" mpRegen="2.7"/>
<attack physical="688.86373" magical="470.40463" random="10" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120"/>
<defence physical="295.91597" magical="216.53847"/>
<speed>
<walk ground="50"/>
<run ground="120"/>
</speed>
<abnormalResist physical="10" magical="10"/>
</stats>
<status attackable="false"/>
<skillList>
<skill id="4045" level="1"/>
<!-- Resist Full Magic Attack -->
<skill id="4408" level="1"/>
<!-- HP Increase (1x) -->
<skill id="4409" level="1"/>
<!-- MP Increase (1x) -->
<skill id="4410" level="11"/>
<!-- Average P. Atk. -->
<skill id="4411" level="11"/>
<!-- Average M. Atk. -->
<skill id="4412" level="11"/>
<!-- Average P. Def. -->
<skill id="4413" level="11"/>
<!-- Average M. Def. -->
<skill id="4414" level="2"/>
<!-- Standard Type -->
<skill id="4415" level="3"/>
<!-- One-handed Sword -->
<skill id="4416" level="19"/>
<!-- Others -->
</skillList>
<exCrtEffect>true</exCrtEffect>
<ai type="BALANCED" clanHelpRange="300" isAggressive="true" aggroRange="500"/>
<collision>
<radius normal="40"/>
<height normal="80"/>
</collision>
</npc>
<npc id="29067" level="1" type="GrandBoss" name="Antharas">
<parameters>
<param name="ultra_respawn_time" value="5" />

View File

@ -453,6 +453,57 @@
</effect>
</effects>
</skill>
<skill id="5015" toLevel="6" name="Frintezza Charge">
<!-- Demon $s1 charge. -->
<affectRange>
<value level="1">400</value>
<value level="2">500</value>
<value level="3">700</value>
<value level="4">400</value>
<value level="5">500</value>
<value level="6">700</value>
</affectRange>
<castRange>150</castRange>
<coolTime>
<value level="1">0</value>
<value level="2">0</value>
<value level="3">0</value>
<value level="4">1500</value>
<value level="5">1500</value>
<value level="6">1500</value>
</coolTime>
<effectPoint>-100</effectPoint>
<effectRange>650</effectRange>
<attributeType>DARK</attributeType>
<attributeValue>180</attributeValue>
<fanRange>
<value level="1">0;0;400;150</value>
<value level="2">0;0;500;170</value>
<value level="3">0;0;700;200</value>
<value level="4">0;0;400;150</value>
<value level="5">0;0;500;170</value>
<value level="6">0;0;700;200</value>
</fanRange>
<hitTime>1500</hitTime>
<magicLvl>85</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>-5</magicCriticalRate>
<targetType>ENEMY</targetType>
<affectScope>SQUARE</affectScope>
<affectObject>NOT_FRIEND</affectObject>
<effects>
<effect name="PhysicalAttack">
<power>
<value level="1">48761</value>
<value level="2">52970</value>
<value level="3">68074</value>
<value level="4">48761</value>
<value level="5">52970</value>
<value level="6">68074</value>
</power>
</effect>
</effects>
</skill>
<skill id="5016" toLevel="1" name="Yoke of Scarlet">
<!-- Yoked status. -->
<icon>icon.skill5016</icon>

View File

@ -24,4 +24,11 @@
</effect>
</effects>
</skill>
<skill id="14768" toLevel="1" name="Raid Boss (Lv. 85)">
<!-- After being killed by Frintezza, who lost his soul to the devil, it was reborn as a monster called Scarlet van Halisha. It has lost sense of self, and it only makes sacrifices for the demon Halisha. -->
<icon>icon.skillraid</icon>
<operateType>P</operateType>
<magicCriticalRate>-5</magicCriticalRate>
<magicLvl>1</magicLvl>
</skill>
</list>

View File

@ -287,21 +287,6 @@
</xs:complexType>
</xs:element>
<xs:element name="magicCriticalRate" type="xs:byte" />
<xs:element name="trait">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="targetType">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@ -412,9 +397,7 @@
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:unsignedByte">
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
@ -511,9 +494,9 @@
<xs:extension base="xs:string">
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromSubLevel" type="xs:unsignedShort" use="optional" />
<xs:attribute name="toSubLevel" type="xs:unsignedShort" use="optional" />
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
@ -618,7 +601,6 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" type="xs:string" />
<xs:element name="expMultiplier" type="xs:decimal" />
<xs:element name="halfLethal">
<xs:complexType mixed="true">
@ -969,7 +951,7 @@
</xs:complexType>
</xs:element>
<xs:element name="isAdvanced" type="xs:boolean" />
<xs:element name="DERANGEMENT">
<xs:element name="BLEED">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
@ -984,7 +966,7 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="BLEED">
<xs:element name="DERANGEMENT">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
@ -1367,6 +1349,9 @@
<xs:element name="PHYSICAL_ATTACK_SPEED" type="xs:unsignedByte" />
<xs:element name="MAGIC_ATTACK_SPEED" type="xs:unsignedByte" />
<xs:element name="transformationId" type="xs:unsignedByte" />
<xs:element name="distance" type="xs:unsignedByte" />
<xs:element name="speed" type="xs:unsignedShort" />
<xs:element name="knockDown" type="xs:boolean" />
<xs:element name="despawnDelay" type="xs:unsignedInt" />
<xs:element name="normal" type="xs:unsignedByte" />
<xs:element name="ride" type="xs:unsignedShort" />
@ -1446,6 +1431,7 @@
<xs:element name="PSYCHIC" type="xs:unsignedByte" />
<xs:element name="canKill" type="xs:boolean" />
<xs:element name="VALAKAS" type="xs:byte" />
<xs:element name="item" type="xs:string" />
<xs:element name="FIST" type="xs:unsignedByte" />
<xs:element name="ROOT_PHYSICALLY">
<xs:complexType>
@ -1464,11 +1450,8 @@
</xs:element>
<xs:element name="blockedActions" type="xs:byte" />
<xs:element name="lifeTime" type="xs:unsignedShort" />
<xs:element name="speed" type="xs:unsignedShort" />
<xs:element name="delay" type="xs:unsignedShort" />
<xs:element name="abnormalType" type="xs:string" />
<xs:element name="distance" type="xs:unsignedByte" />
<xs:element name="knockDown" type="xs:boolean" />
<xs:element name="hp" type="xs:unsignedByte" />
<xs:element name="mp" type="xs:unsignedByte" />
<xs:element name="cp" type="xs:unsignedByte" />
@ -1501,6 +1484,21 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="trait">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="abnormalVisualEffect">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@ -1564,7 +1562,21 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="fanRange" type="xs:string" />
<xs:element name="fanRange">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="itemConsumeCount">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
@ -1768,7 +1780,6 @@
<xs:element name="channelingStart" type="xs:decimal" />
<xs:element name="channelingTickInterval" type="xs:unsignedByte" />
<xs:element name="removedOnDamage" type="xs:boolean" />
<xs:element name="removedOnUnequipWeapon" type="xs:boolean" />
<xs:element name="removedOnAnyActionExceptMove" type="xs:boolean" />
<xs:element name="itemConsumeSteps" type="xs:unsignedByte" />
<xs:element name="soulMaxConsumeCount" type="xs:unsignedByte" />
@ -1852,26 +1863,7 @@
<xs:element maxOccurs="unbounded" name="effect">
<xs:complexType>
<xs:sequence minOccurs="0">
<xs:element minOccurs="0" name="amount">
<xs:complexType>
<xs:sequence>
<xs:element name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="required" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="required" />
<xs:attribute name="fromSubLevel" type="xs:unsignedShort" use="required" />
<xs:attribute name="toSubLevel" type="xs:unsignedShort" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="mode" type="xs:string" />
<xs:element minOccurs="0" name="power">
<xs:element name="power">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
@ -1890,10 +1882,6 @@
<xs:element minOccurs="0" name="ticks" type="xs:unsignedByte" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromSubLevel" type="xs:unsignedShort" use="optional" />
<xs:attribute name="toSubLevel" type="xs:unsignedShort" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>