Browse Source

BETA: Frintezza missing features:
* Implemented skill Dewdrop of Destruction(2276).
* Added missing Dewdrop of Destruction(2276) item drop for Hall Keeper Captain(18329).
* Added support for Frintezza's behavior when Soul Breaking Arrow(2234) skill is used on it, it gets stunned for 35 seconds (no debuff songs).
* Require test.
* Added support for Portraits's behavior when Dewdrop of Destruction item/skill is used on them, they suicide.

Zoey76 12 years ago
parent
commit
e7c8fabc5b

+ 59 - 14
L2J_DataPack_BETA/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java

@@ -79,7 +79,6 @@ import com.l2jserver.gameserver.util.Util;
  * Final Emperial Tomb instance zone. TODO:<br>
  * Test when Frintezza song use 5008 effect skill.<br>
  * Test deeply Scarlet van Halisha's AI.<br>
- * Use correct Song names.<br>
  * Use proper zone spawn system.
  * @author Gigiikun
  */
@@ -159,7 +158,8 @@ public class FinalEmperialTomb extends Quest
 	// NPCs
 	private static final int GUIDE = 32011;
 	private static final int CUBE = 29061;
-	
+	// Item
+	private static final int DEWDROP_OF_DESTRUCTION_ITEM_ID = 8556;
 	// mobs
 	private static final int SCARLET1 = 29046;
 	private static final int SCARLET2 = 29047;
@@ -175,6 +175,7 @@ public class FinalEmperialTomb extends Quest
 		29051
 	};
 	private static final int HALL_ALARM = 18328;
+	private static final int HALL_KEEPER_CAPTAIN = 18329;
 	private static final int HALL_KEEPER_SUICIDAL_SOLDIER = 18333;
 	private static final int DARK_CHOIR_PLAYER = 18339;
 	private static final int[] AI_DISABLED_MOBS =
@@ -195,7 +196,9 @@ public class FinalEmperialTomb extends Quest
 		new FrintezzaSong(new SkillHolder(5007, 4), new SkillHolder(5008, 4), NpcStringId.FUGUE_OF_JUBILATION, 90),
 		new FrintezzaSong(new SkillHolder(5007, 5), new SkillHolder(5008, 5), NpcStringId.HYPNOTIC_MAZURKA, 100),
 	};
-	
+	// Skills
+	private static final int DEWDROP_OF_DESTRUCTION_SKILL_ID = 2276;
+	private static final int SOUL_BREAKING_ARROW_SKILL_ID = 2234;
 	// Doors/Walls/Zones
 	protected static final int[] FIRST_ROOM_DOORS =
 	{
@@ -835,6 +838,22 @@ public class FinalEmperialTomb extends Quest
 		}
 	}
 	
+	private class SoulBreakingArrow implements Runnable
+	{
+		private final L2Npc _npc;
+		
+		protected SoulBreakingArrow(L2Npc npc)
+		{
+			_npc = npc;
+		}
+		
+		@Override
+		public void run()
+		{
+			_npc.setScriptValue(0);
+		}
+	}
+	
 	private class SongTask implements Runnable
 	{
 		private final FETWorld _world;
@@ -862,19 +881,26 @@ public class FinalEmperialTomb extends Quest
 					}
 					else if ((_world.frintezza != null) && !_world.frintezza.isDead())
 					{
-						int rnd = getRandom(100);
-						for (FrintezzaSong element : FRINTEZZASONGLIST)
+						if (_world.frintezza.getScriptValue() != 1)
 						{
-							if (rnd < element.chance)
+							int rnd = getRandom(100);
+							for (FrintezzaSong element : FRINTEZZASONGLIST)
 							{
-								_world.OnSong = element;
-								broadCastPacket(_world, new ExShowScreenMessage(2, -1, 2, 0, 0, 0, 0, true, 4000, false, null, element.songName, null));
-								broadCastPacket(_world, new MagicSkillUse(_world.frintezza, _world.frintezza, element.skill.getSkillId(), element.skill.getSkillLvl(), element.skill.getSkill().getHitTime(), 0));
-								_world.songEffectTask = ThreadPoolManager.getInstance().scheduleGeneral(new SongTask(_world, 1), element.skill.getSkill().getHitTime() - 10000);
-								_world.songTask = ThreadPoolManager.getInstance().scheduleGeneral(new SongTask(_world, 0), element.skill.getSkill().getHitTime());
-								break;
+								if (rnd < element.chance)
+								{
+									_world.OnSong = element;
+									broadCastPacket(_world, new ExShowScreenMessage(2, -1, 2, 0, 0, 0, 0, true, 4000, false, null, element.songName, null));
+									broadCastPacket(_world, new MagicSkillUse(_world.frintezza, _world.frintezza, element.skill.getSkillId(), element.skill.getSkillLvl(), element.skill.getSkill().getHitTime(), 0));
+									_world.songEffectTask = ThreadPoolManager.getInstance().scheduleGeneral(new SongTask(_world, 1), element.skill.getSkill().getHitTime() - 10000);
+									_world.songTask = ThreadPoolManager.getInstance().scheduleGeneral(new SongTask(_world, 0), element.skill.getSkill().getHitTime());
+									break;
+								}
 							}
 						}
+						else
+						{
+							ThreadPoolManager.getInstance().scheduleGeneral(new SoulBreakingArrow(_world.frintezza), 35000);
+						}
 					}
 					break;
 				case 1: // Frintezza song effect
@@ -1443,6 +1469,17 @@ public class FinalEmperialTomb extends Quest
 			{
 				controlStatus(world);
 			}
+			// When Dewdrop of Destruction is used on Portraits they suicide.
+			if (Util.contains(PORTRAITS, npc.getNpcId()) && (skill.getId() == DEWDROP_OF_DESTRUCTION_SKILL_ID))
+			{
+				npc.doDie(attacker);
+			}
+			else if ((npc.getNpcId() == FRINTEZZA) && (skill.getId() == SOUL_BREAKING_ARROW_SKILL_ID))
+			{
+				npc.setScriptValue(1);
+				npc.setTarget(null);
+				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+			}
 		}
 		return null;
 	}
@@ -1488,6 +1525,13 @@ public class FinalEmperialTomb extends Quest
 			{
 				controlStatus(world);
 			}
+			else if (npc.getNpcId() == HALL_KEEPER_CAPTAIN)
+			{
+				if (getRandom(100) < 5)
+				{
+					((L2MonsterInstance) npc).dropItem(player, DEWDROP_OF_DESTRUCTION_ITEM_ID, 1);
+				}
+			}
 			else if (world.getStatus() <= 2)
 			{
 				if (checkKillProgress(npc, world))
@@ -1535,10 +1579,11 @@ public class FinalEmperialTomb extends Quest
 		super(questId, name, descr);
 		
 		load();
-		addAttackId(SCARLET1);
+		addAttackId(SCARLET1, FRINTEZZA);
+		addAttackId(PORTRAITS);
 		addStartNpc(GUIDE, CUBE);
 		addTalkId(GUIDE, CUBE);
-		addKillId(HALL_ALARM, DARK_CHOIR_PLAYER, SCARLET2);
+		addKillId(HALL_ALARM, HALL_KEEPER_CAPTAIN, DARK_CHOIR_PLAYER, SCARLET2);
 		addKillId(PORTRAITS);
 		addKillId(DEMONS);
 		addKillId(_mustKillMobsId);

+ 9 - 3
L2J_DataPack_BETA/dist/game/data/stats/skills/02200-02299.xml

@@ -1436,11 +1436,17 @@
 		</for>
 	</skill>
 	<skill id="2276" levels="1" name="Dewdrop of Destruction">
+		<!-- Confirmed CT2.5 -->
+		<set name="aggroPoints" val="100" />
+		<set name="castRange" val="40" />
+		<set name="effectRange" val="400" />
+		<set name="hitTime" val="2000" />
 		<set name="isMagic" val="2" /> <!-- Static Skill -->
-		<set name="target" val="TARGET_NONE" />
-		<set name="skillType" val="NOTDONE" />
+		<set name="itemConsumeCount" val="1" />
+		<set name="itemConsumeId" val="8556" />
+		<set name="magicLvl" val="80" />
 		<set name="operateType" val="A1" />
-		<set name="hitTime" val="2000" />
+		<set name="target" val="TARGET_ONE" />
 		<cond msgId="113" addName="1">
 			<player insideZoneId="2276" />
 		</cond>