From fcbb66cfcf01333adf95178baa2d724c6a89a95d Mon Sep 17 00:00:00 2001
From: Maneco2 <maneco_1@hotmail.com>
Date: Fri, 31 Jul 2020 00:29:22 -0300
Subject: [PATCH] Add new Gigantic Golem AI

Add relative AI skills
Removed old DrChaos AI
---
 .../com/l2jserver/datapack/ai/AILoader.java   |   4 +-
 .../datapack/ai/individual/DrChaos.java       | 109 ------
 .../datapack/ai/individual/GiganticGolem.java | 324 ++++++++++++++++++
 .../resources/data/stats/npcs/25700-25799.xml |  11 -
 .../data/stats/skills/06200-06299.xml         |  15 +-
 .../data/stats/skills/06600-06699.xml         |  36 +-
 src/main/resources/sql/spawnlist.sql          |   4 +-
 7 files changed, 373 insertions(+), 130 deletions(-)
 delete mode 100644 src/main/java/com/l2jserver/datapack/ai/individual/DrChaos.java
 create mode 100644 src/main/java/com/l2jserver/datapack/ai/individual/GiganticGolem.java

diff --git a/src/main/java/com/l2jserver/datapack/ai/AILoader.java b/src/main/java/com/l2jserver/datapack/ai/AILoader.java
index 9e54d7b608..fc10cbf0f8 100644
--- a/src/main/java/com/l2jserver/datapack/ai/AILoader.java
+++ b/src/main/java/com/l2jserver/datapack/ai/AILoader.java
@@ -73,13 +73,13 @@ import com.l2jserver.datapack.ai.individual.Core;
 import com.l2jserver.datapack.ai.individual.CrimsonHatuOtis;
 import com.l2jserver.datapack.ai.individual.DarkWaterDragon;
 import com.l2jserver.datapack.ai.individual.DivineBeast;
-import com.l2jserver.datapack.ai.individual.DrChaos;
 import com.l2jserver.datapack.ai.individual.DrakosWarrior;
 import com.l2jserver.datapack.ai.individual.DustRider;
 import com.l2jserver.datapack.ai.individual.EmeraldHorn;
 import com.l2jserver.datapack.ai.individual.Epidos;
 import com.l2jserver.datapack.ai.individual.EvasGiftBox;
 import com.l2jserver.datapack.ai.individual.FrightenedRagnaOrc;
+import com.l2jserver.datapack.ai.individual.GiganticGolem;
 import com.l2jserver.datapack.ai.individual.Gordon;
 import com.l2jserver.datapack.ai.individual.GraveRobbers;
 import com.l2jserver.datapack.ai.individual.Knoriks;
@@ -356,12 +356,12 @@ public class AILoader {
 		DarkWaterDragon.class,
 		DivineBeast.class,
 		DrakosWarrior.class,
-		DrChaos.class,
 		DustRider.class,
 		EmeraldHorn.class,
 		Epidos.class,
 		EvasGiftBox.class,
 		FrightenedRagnaOrc.class,
+		GiganticGolem.class,
 		Gordon.class,
 		GraveRobbers.class,
 		Knoriks.class,
diff --git a/src/main/java/com/l2jserver/datapack/ai/individual/DrChaos.java b/src/main/java/com/l2jserver/datapack/ai/individual/DrChaos.java
deleted file mode 100644
index 1a9cd4881f..0000000000
--- a/src/main/java/com/l2jserver/datapack/ai/individual/DrChaos.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright © 2004-2020 L2J DataPack
- * 
- * This file is part of L2J DataPack.
- * 
- * L2J DataPack 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.
- * 
- * L2J DataPack 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 com.l2jserver.datapack.ai.individual;
-
-import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
-import com.l2jserver.gameserver.model.Location;
-import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
-import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
-
-/**
- * DrChaos' AI.
- * @author Kerberos
- */
-public final class DrChaos extends Quest {
-	private static final int DR_CHAOS = 32033;
-	private static final int STRANGE_MACHINE = 32032;
-	private static final int CHAOS_GOLEM = 25703;
-	private static boolean _IsGolemSpawned;
-	
-	private static final Location PLAYER_TELEPORT = new Location(94832, -112624, -3304);
-	private static final Location NPC_LOCATION = new Location(-113091, -243942, -15536);
-	
-	public DrChaos() {
-		// TODO extends AbstractNpcAI
-		super(-1, "Doctor Chaos", "ai/individual");
-		addFirstTalkId(DR_CHAOS);
-		_IsGolemSpawned = false;
-	}
-	
-	@Override
-	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) {
-		switch (event) {
-			case "1": {
-				L2Npc machine = null;
-				for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(STRANGE_MACHINE)) {
-					if (spawn != null) {
-						machine = spawn.getLastSpawn();
-					}
-				}
-				if (machine != null) {
-					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, machine);
-					machine.broadcastPacket(new SpecialCamera(machine, 1, -200, 15, 10000, 1000, 20000, 0, 0, 0, 0, 0));
-				} else {
-					startQuestTimer("2", 2000, npc, player);
-				}
-				startQuestTimer("3", 10000, npc, player);
-				break;
-			}
-			case "2": {
-				npc.broadcastSocialAction(3);
-				break;
-			}
-			case "3": {
-				npc.broadcastPacket(new SpecialCamera(npc, 1, -150, 10, 3000, 1000, 20000, 0, 0, 0, 0, 0));
-				startQuestTimer("4", 2500, npc, player);
-				break;
-			}
-			case "4": {
-				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(96055, -110759, -3312, 0));
-				startQuestTimer("5", 2000, npc, player);
-				break;
-			}
-			case "5": {
-				player.teleToLocation(PLAYER_TELEPORT);
-				npc.teleToLocation(NPC_LOCATION);
-				if (!_IsGolemSpawned) {
-					L2Npc golem = addSpawn(CHAOS_GOLEM, 94640, -112496, -3336, 0, false, 0);
-					_IsGolemSpawned = true;
-					startQuestTimer("6", 1000, golem, player);
-				}
-				break;
-			}
-			case "6": {
-				npc.broadcastPacket(new SpecialCamera(npc, 30, -200, 20, 6000, 700, 8000, 0, 0, 0, 0, 0));
-				break;
-			}
-		}
-		return super.onAdvEvent(event, npc, player);
-	}
-	
-	@Override
-	public String onFirstTalk(L2Npc npc, L2PcInstance player) {
-		if (npc.getId() == DR_CHAOS) {
-			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(96323, -110914, -3328, 0));
-			this.startQuestTimer("1", 3000, npc, player);
-		}
-		return "";
-	}
-}
diff --git a/src/main/java/com/l2jserver/datapack/ai/individual/GiganticGolem.java b/src/main/java/com/l2jserver/datapack/ai/individual/GiganticGolem.java
new file mode 100644
index 0000000000..446f9de65f
--- /dev/null
+++ b/src/main/java/com/l2jserver/datapack/ai/individual/GiganticGolem.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2004-2020 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack 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.
+ * 
+ * L2J DataPack 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 com.l2jserver.datapack.ai.individual;
+
+import java.util.List;
+
+import com.l2jserver.datapack.ai.npc.AbstractNpcAI;
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.datatables.SpawnTable;
+import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager;
+import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
+
+/**
+ * Gigantic Golem AI.
+ * @author Kerberos, Maneco2
+ * @version 2.6.2.0
+ */
+public class GiganticGolem extends AbstractNpcAI
+{
+	// NPCs
+	private static final int DR_CHAOS = 32033;
+	private static final int GIGANTIC_GOLEM = 25703;
+	private static final int STRANGE_MACHINE = 32032;
+	private static final int GIGANTIC_BOOM_GOLEM = 25705;
+	// Skills
+	private static final SkillHolder SMOKE = new SkillHolder(6265);
+	private static final SkillHolder EMP_SHOCK = new SkillHolder(6263);
+	private static final SkillHolder GOLEM_BOOM = new SkillHolder(6264);
+	private static final SkillHolder NPC_EARTH_SHOT = new SkillHolder(6608);
+	// Variables
+	private static long _lastAttack = 0;
+	private static final int RESPAWN = 24;
+	private static final int MAX_CHASE_DIST = 3000;
+	private static final double MIN_HP_PERCENTAGE = 0.30;
+	private static final String SPAWN_FLAG = "SPAWN_FLAG";
+	private static final String ATTACK_FLAG = "ATTACK_FLAG";
+	// Locations
+	private static final Location PLAYER_TELEPORT = new Location(94832, -112624, -3304);
+	private static final Location DR_CHAOS_LOC = new Location(96320, -110912, -3328, 8191);
+	
+	public GiganticGolem()
+	{
+		super(GiganticGolem.class.getSimpleName(), "ai/individual");
+		addFirstTalkId(DR_CHAOS);
+		addKillId(GIGANTIC_GOLEM);
+		addTeleportId(GIGANTIC_GOLEM);
+		addMoveFinishedId(GIGANTIC_BOOM_GOLEM);
+		addSpawnId(GIGANTIC_GOLEM, GIGANTIC_BOOM_GOLEM);
+		addAttackId(GIGANTIC_GOLEM, GIGANTIC_BOOM_GOLEM);
+		
+		final long remain = GlobalVariablesManager.getInstance().getLong("GolemRespawn", 0) - System.currentTimeMillis();
+		if (remain > 0)
+		{
+			startQuestTimer("CLEAR_STATUS", remain, null, null);
+		}
+		else
+		{
+			startQuestTimer("CLEAR_STATUS", 1000, null, null);
+		}
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		switch (event)
+		{
+			case "ATTACK_MACHINE":
+			{
+				for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(STRANGE_MACHINE))
+				{
+					final L2Npc obj = spawn.getLastSpawn();
+					if (obj != null)
+					{
+						if (npc.getId() == DR_CHAOS)
+						{
+							npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, obj);
+							npc.broadcastPacket(new SpecialCamera(npc, 1, -200, 15, 10000, 1000, 20000, 0, 0, 0, 0, 0));
+						}
+					}
+				}
+				startQuestTimer("ACTION_CAMERA", 10000, npc, player);
+				break;
+			}
+			case "ACTION_CAMERA":
+			{
+				startQuestTimer("MOVE_SHOW", 2500, npc, player);
+				npc.broadcastPacket(new SpecialCamera(npc, 1, -150, 10, 3000, 1000, 20000, 0, 0, 0, 0, 0));
+				break;
+			}
+			case "MOVE_SHOW":
+			{
+				startQuestTimer("TELEPORT", 2000, npc, player);
+				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(96055, -110759, -3312, 0));
+				broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.FOOLS_WHY_HAVENT_YOU_FLED_YET_PREPARE_TO_LEARN_A_LESSON);
+				break;
+			}
+			case "TELEPORT":
+			{
+				if (player.isInParty())
+				{
+					final L2Party party = player.getParty();
+					final boolean isInCC = party.isInCommandChannel();
+					final List<L2PcInstance> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
+					for (L2PcInstance groupMembers : members)
+					{
+						if (groupMembers.isInsideRadius(npc, 2000, true, false))
+						{
+							groupMembers.teleToLocation(PLAYER_TELEPORT, true);
+						}
+					}
+				}
+				else
+				{
+					player.teleToLocation(PLAYER_TELEPORT);
+				}
+				
+				if ((npc != null) && (npc.getId() == DR_CHAOS))
+				{
+					npc.deleteMe();
+				}
+				startQuestTimer("WAIT_CAMERA", 1000, npc, player);
+				break;
+			}
+			case "WAIT_CAMERA":
+			{
+				startQuestTimer("SPAWN_RAID", 1000, npc, player);
+				npc.broadcastPacket(new SpecialCamera(npc, 30, -200, 20, 6000, 700, 8000, 0, 0, 0, 0, 0));
+				break;
+			}
+			case "SPAWN_RAID":
+			{
+				addSpawn(GIGANTIC_GOLEM, 94640, -112496, -3360, 0, false, 0);
+				break;
+			}
+			case "FLAG":
+			{
+				npc.getVariables().set(SPAWN_FLAG, false);
+				break;
+			}
+			case "CORE_AI":
+			{
+				if (npc != null)
+				{
+					((L2Attackable) npc).clearAggroList();
+					npc.disableCoreAI(false);
+				}
+				break;
+			}
+			case "CLEAR_STATUS":
+			{
+				addSpawn(DR_CHAOS, DR_CHAOS_LOC, false, 0);
+				GlobalVariablesManager.getInstance().set("GolemRespawn", 0);
+				break;
+			}
+			case "SKILL_ATTACK":
+			{
+				addSkillCastDesire(npc, npc, SMOKE, 1000000L);
+				if (!npc.getVariables().getBoolean(ATTACK_FLAG, false))
+				{
+					npc.disableCoreAI(true);
+					npc.getVariables().set(ATTACK_FLAG, true);
+				}
+				break;
+			}
+			case "MOVE_TIME": 
+			{
+				if (npc != null)
+				{
+					for (L2Character obj : npc.getKnownList().getKnownCharactersInRadius(3000))
+					{
+						if ((obj != null) && (obj.isRaid()))
+						{
+							addMoveToDesire(npc, new Location(obj.getX() + getRandom(-200, 200), obj.getY() + getRandom(-200, 200), obj.getZ() + 20, 0), 0);
+						}
+					}
+				}
+				break;
+			}
+			case "CHECK_ATTACK":{
+				if ((_lastAttack + 1800000) < System.currentTimeMillis())
+				{
+					if (npc != null)
+					{
+						npc.deleteMe();
+						cancelQuestTimer("CHECK_ATTACK", npc, null);
+						startQuestTimer("CLEAR_STATUS", 1000, null, null);
+					}
+				}
+				else
+				{
+					startQuestTimer("CHECK_ATTACK", 60000, npc, null);
+				}
+				break;
+			}
+		}
+		return super.onAdvEvent(event, npc, player);
+	}
+	
+	@Override
+	public String onFirstTalk(L2Npc npc, L2PcInstance player)
+	{
+		if (npc.getId() == DR_CHAOS)
+		{
+			startQuestTimer("ATTACK_MACHINE", 3000, npc, player);
+			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(96320, -110912, -3328, 0));
+			broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.HOW_DARE_YOU_TRESPASS_INTO_MY_TERRITORY_HAVE_YOU_NO_FEAR);
+		}
+		return "";
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
+	{
+		if (npc.getId() == GIGANTIC_BOOM_GOLEM)
+		{
+			npc.doCast(GOLEM_BOOM);
+		}
+		else
+		{
+			_lastAttack = System.currentTimeMillis();
+			
+			if (!npc.isCastingNow())
+			{
+				if (getRandom(100) < 5)
+				{
+					npc.doCast(NPC_EARTH_SHOT);
+				}
+				else if ((getRandom(100) < 1) && (npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)))
+				{
+					npc.doCast(EMP_SHOCK);
+				}
+			}
+			
+			if (!npc.getVariables().getBoolean(SPAWN_FLAG, false))
+			{
+				npc.getVariables().set(SPAWN_FLAG, true);
+				int posX = npc.getX() + getRandom(-200, 200);
+				int posY = npc.getY() + getRandom(-200, 200);
+				addSpawn(GIGANTIC_BOOM_GOLEM, posX + getRandom(-200, 200), posY + getRandom(-200, 200), npc.getZ() + 20, 0, false, 0);
+				addSpawn(GIGANTIC_BOOM_GOLEM, posX + getRandom(-200, 200), posY + getRandom(-200, 200), npc.getZ() + 20, 0, false, 0);
+				addSpawn(GIGANTIC_BOOM_GOLEM, posX + getRandom(-200, 200), posY + getRandom(-200, 200), npc.getZ() + 20, 0, false, 0);
+				addSpawn(GIGANTIC_BOOM_GOLEM, posX + getRandom(-200, 200), posY + getRandom(-200, 200), npc.getZ() + 20, 0, false, 0);
+				addSpawn(GIGANTIC_BOOM_GOLEM, posX + getRandom(-200, 200), posY + getRandom(-200, 200), npc.getZ() + 20, 0, false, 0);
+				addSpawn(GIGANTIC_BOOM_GOLEM, posX + getRandom(-200, 200), posY + getRandom(-200, 200), npc.getZ() + 20, 0, false, 0);
+				startQuestTimer("FLAG", 360000, npc, null);
+			}
+			
+			if (npc.calculateDistance(npc.getSpawn().getLocation(), false, false) > MAX_CHASE_DIST)
+			{
+				npc.disableCoreAI(true);
+				npc.teleToLocation(npc.getSpawn().getLocation());
+			}
+		}
+		return super.onAttack(npc, attacker, damage, isSummon);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
+	{
+		final long respawnTime = RESPAWN * 3600000;
+		GlobalVariablesManager.getInstance().set("GolemRespawn", System.currentTimeMillis() + respawnTime);
+		startQuestTimer("CLEAR_STATUS", respawnTime, null, null);
+		cancelQuestTimer("CHECK_ATTACK", npc, null);
+		return super.onKill(npc, killer, isSummon);
+	}
+	
+	@Override
+	protected void onTeleport(L2Npc npc)
+	{
+		startQuestTimer("CORE_AI", 100, npc, null);
+	}
+	
+	@Override
+	public void onMoveFinished(L2Npc npc)
+	{
+		startQuestTimer("SKILL_ATTACK", 1000, npc, null);
+		startQuestTimer("MOVE_TIME", 3000, npc, null);
+	}
+	
+	@Override
+	public String onSpawn(L2Npc npc)
+	{
+		if (npc.getId() == GIGANTIC_BOOM_GOLEM)
+		{
+			npc.setIsRunning(true);
+			npc.scheduleDespawn(360000);
+			startQuestTimer("MOVE_TIME", 3000, npc, null);
+			((L2Attackable) npc).setCanReturnToSpawnPoint(false);
+		}
+		else
+		{
+			_lastAttack = System.currentTimeMillis();
+			startQuestTimer("CHECK_ATTACK", 300000, npc, null);
+			broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.BWAH_HA_HA_YOUR_DOOM_IS_AT_HAND_BEHOLD_THE_ULTRA_SECRET_SUPER_WEAPON);
+		}
+		return super.onSpawn(npc);
+	}
+}
diff --git a/src/main/resources/data/stats/npcs/25700-25799.xml b/src/main/resources/data/stats/npcs/25700-25799.xml
index 0253e8be38..0d95746c4c 100644
--- a/src/main/resources/data/stats/npcs/25700-25799.xml
+++ b/src/main/resources/data/stats/npcs/25700-25799.xml
@@ -206,9 +206,6 @@
 			</minions>
 			<param name="Party_Type" value="2" />
 			<param name="Party_Loyalty" value="2" />
-			<param name="Skill01_Probablity" value="0" />
-			<skill name="Skill01_ID" id="6263" level="1" /> <!-- EMP Shock -->
-			<skill name="Skill02_ID" id="6608" level="10" /> <!-- NPC earth shot -->
 		</parameters>
 		<race>CONSTRUCT</race>
 		<sex>MALE</sex>
@@ -241,8 +238,6 @@
 			<skill id="4416" level="2" /> <!--Magic Creatures -->
 			<skill id="4494" level="1" /> <!--Raid Boss -->
 			<skill id="5465" level="1" /> <!--Earth Attacks -->
-			<skill id="6263" level="1" /> <!--EMP Shock -->
-			<skill id="6608" level="10" /> <!--NPC earth shot -->
 			<skill id="6663" level="1" /> <!--Level 76 Raid Boss -->
 		</skillList>
 		<exCrtEffect>true</exCrtEffect>
@@ -316,10 +311,6 @@
 	</npc>
 	<npc id="25705" level="74" type="L2Monster" name="Gigantic Boom Golem" title="Chaos">
 		<!-- Confirmed CT2.5 -->
-		<parameters>
-			<skill name="Skill01_ID" id="6265" level="1" /> <!-- Smoke -->
-			<skill name="Skill02_ID" id="6264" level="1" /> <!-- Golem Boom -->
-		</parameters>
 		<race>CONSTRUCT</race>
 		<sex>MALE</sex>
 		<stats str="40" int="21" dex="30" wit="20" con="43" men="20">
@@ -346,8 +337,6 @@
 			<skill id="4414" level="2" /> <!--Standard Type -->
 			<skill id="4415" level="3" /> <!--One-handed Sword -->
 			<skill id="4416" level="2" /> <!--Magic Creatures -->
-			<skill id="6264" level="1" /> <!--Golem Boom -->
-			<skill id="6265" level="1" /> <!--Smoke -->
 		</skillList>
 		<exCrtEffect>true</exCrtEffect>
 		<ai aggroRange="300" clanHelpRange="300" isAggressive="false" />
diff --git a/src/main/resources/data/stats/skills/06200-06299.xml b/src/main/resources/data/stats/skills/06200-06299.xml
index f747c8bfb8..47f4bfc93c 100644
--- a/src/main/resources/data/stats/skills/06200-06299.xml
+++ b/src/main/resources/data/stats/skills/06200-06299.xml
@@ -788,16 +788,25 @@
 		<set name="activateRate" val="80" />
 		<set name="basicProperty" val="CON" />
 		<set name="coolTime" val="500" />
+		<set name="affectRange" val="100" />
 		<set name="effectPoint" val="-100" />
+		<set name="hitTime" val="2000" />
 		<set name="icon" val="icon.skill0100" />
 		<set name="isDebuff" val="true" />
 		<set name="lvlBonusRate" val="1" />
 		<set name="magicLvl" val="77" />
+		<set name="mpConsume2" val="78" />
 		<set name="operateType" val="A2" />
 		<set name="reuseDelay" val="30000" />
 		<set name="rideState" val="NONE" />
-		<set name="targetType" val="NONE" />
+		<set name="targetType" val="AURA" />
 		<set name="trait" val="SHOCK" />
+		<effects>
+			<effect name="PhysicalAttack">
+				<param power="2959" />
+			</effect>
+			<effect name="Stun" />
+		</effects>
 	</skill>
 	<skill id="6264" levels="1" name="Golem Boom">
 		<set name="coolTime" val="500" />
@@ -809,13 +818,15 @@
 		<set name="targetType" val="NONE" />
 	</skill>
 	<skill id="6265" levels="1" name="Smoke">
+		<set name="hitTime" val="1000" />
 		<set name="coolTime" val="500" />
 		<set name="effectPoint" val="-689" />
 		<set name="magicLvl" val="75" />
 		<set name="operateType" val="A1" />
 		<set name="reuseDelay" val="3000" />
 		<set name="rideState" val="NONE" />
-		<set name="targetType" val="NONE" />
+		<set name="targetType" val="AURA" />
+		<set name="affectRange" val="50" />
 	</skill>
 	<skill id="6266" levels="1" name="Shock">
 		<set name="abnormalLvl" val="1" />
diff --git a/src/main/resources/data/stats/skills/06600-06699.xml b/src/main/resources/data/stats/skills/06600-06699.xml
index bc7b2eaab0..6eabc51470 100644
--- a/src/main/resources/data/stats/skills/06600-06699.xml
+++ b/src/main/resources/data/stats/skills/06600-06699.xml
@@ -20,12 +20,25 @@
 	</skill>
 	<skill id="6602" levels="28" name="NPC earth attack">
 		<table name="#effectPoints"> -138 -204 -285 -379 -477 -566 -597 -624 -646 -655 -662 -669 -676 -679 -681 -684 -687 -689 -692 -694 -696 -698 -700 -702 -704 -706 -707 -709 </table>
+		<table name="#magicLvl"> 10 20 30 40 50 60 64 68 72 74 76 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 </table>
+		<table name="#mpConsume2"> 13 20 28 38 50 61 65 69 73 75 77 78 80 80 81 82 82 83 83 84 84 84 84 85 85 85 85 85 </table>
+		<table name="#power"> 46 105 219 417 722 1136 1327 1525 1727 1827 1925 2020 2112 2156 2200 2241 2282 2320 2358 2393 2426 2458 2487 2515 2540 2565 2591 2617 </table>
 		<set name="coolTime" val="500" />
 		<set name="effectPoint" val="#effectPoints" />
-		<set name="magicLvl" val="10" />
+		<set name="affectRange" val="200" />
+		<set name="hitTime" val="1500" />
+		<set name="attributeType" val="EARTH" />
+		<set name="attributePower" val="180" />
+		<set name="magicLvl" val="#magicLvl" />
+		<set name="mpConsume2" val="#mpConsume2" />
 		<set name="operateType" val="A1" />
 		<set name="rideState" val="NONE" />
-		<set name="targetType" val="NONE" />
+		<set name="targetType" val="AREA" />
+		<effects>
+			<effect name="PhysicalAttack">
+				<param power="#power" />
+			</effect>
+		</effects>
 	</skill>
 	<skill id="6603" levels="28" name="NPC earth shot">
 		<table name="#effectPoints"> -138 -204 -285 -379 -477 -566 -597 -624 -646 -655 -662 -669 -676 -679 -681 -684 -687 -689 -692 -694 -696 -698 -700 -702 -704 -706 -707 -709 </table>
@@ -74,12 +87,27 @@
 	</skill>
 	<skill id="6608" levels="28" name="NPC earth shot">
 		<table name="#effectPoints"> -138 -204 -285 -379 -477 -566 -597 -624 -646 -655 -662 -669 -676 -679 -681 -684 -687 -689 -692 -694 -696 -698 -700 -702 -704 -706 -707 -709 </table>
+		<table name="#magicLvl"> 10 20 30 40 50 60 64 68 72 74 76 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 </table>
+		<table name="#mpConsume2"> 13 20 28 38 50 61 65 69 73 75 77 78 80 80 81 82 82 83 83 84 84 84 84 85 85 85 85 85 </table>
+		<table name="#power"> 46 105 219 417 722 1136 1327 1525 1727 1827 1925 2020 2112 2156 2200 2241 2282 2320 2358 2393 2426 2458 2487 2515 2540 2565 2591 2617 </table>
+		<set name="castRange" val="700" />
 		<set name="coolTime" val="500" />
 		<set name="effectPoint" val="#effectPoints" />
-		<set name="magicLvl" val="10" />
+		<set name="effectRange" val="1200" />
+		<set name="affectRange" val="200" />
+		<set name="hitTime" val="3000" />
+		<set name="attributeType" val="EARTH" />
+		<set name="attributePower" val="180" />
+		<set name="magicLvl" val="#magicLvl" />
+		<set name="mpConsume2" val="#mpConsume2" />
 		<set name="operateType" val="A1" />
 		<set name="rideState" val="NONE" />
-		<set name="targetType" val="NONE" />
+		<set name="targetType" val="AREA" />
+		<effects>
+			<effect name="PhysicalAttack">
+				<param power="#power" />
+			</effect>
+		</effects>
 	</skill>
 	<skill id="6609" levels="28" name="NPC earth magic">
 		<table name="#effectPoints"> -138 -204 -285 -379 -477 -566 -597 -624 -646 -655 -662 -669 -676 -679 -681 -684 -687 -689 -692 -694 -696 -698 -700 -702 -704 -706 -707 -709 </table>
diff --git a/src/main/resources/sql/spawnlist.sql b/src/main/resources/sql/spawnlist.sql
index cb9db56b66..7613ac1265 100644
--- a/src/main/resources/sql/spawnlist.sql
+++ b/src/main/resources/sql/spawnlist.sql
@@ -22775,8 +22775,8 @@ INSERT INTO `spawnlist` VALUES
 ("pavel_ruins", 1, 22812, 84201, -107208, -3320, 0, 0, 0, 60, 0, 0, 0),
 -- Torrant
 ("den_of_evil_npc", 1, 32016, 71232, -113952, -1736, 0, 0, 47768, 60, 0, 0, 0),
--- Dr. Chaos
-("PavelRuins", 1, 32033, 96320, -110912, -3328, 0, 0, 8191, 60, 0, 0, 0),
+-- Strange Machine
+("PavelRuins", 1, 32032, 96341, -110891, -3337, 0, 0, 40960, 60, 0, 0, 0),
 -- Yumi
 ("pavel_ruins_npc", 1, 32041, 91374, -116884, -3920, 0, 0, 54750, 60, 0, 0, 0),
 -- Weathermaster
-- 
GitLab