From 49b1e2174529d506afea623bb04a3c8b7f314a52 Mon Sep 17 00:00:00 2001 From: St3eT <St3eT@users.noreply.github.com> Date: Tue, 21 Jan 2014 20:54:02 +0000 Subject: [PATCH] BETA: Updated '''Monastery of Silence''' AI. * Reviewed by: malyelfil, Zoey76, Adry_85, xban1x, !UnAfraid --- L2J_DataPack_BETA/dist/game/data/scripts.cfg | 2 +- .../scripts/ai/group_template/Monastery.java | 239 -------------- .../ai/group_template/MonasteryOfSilence.java | 297 ++++++++++++++++++ L2J_DataPack_BETA/dist/sql/game/npcaidata.sql | 14 +- 4 files changed, 305 insertions(+), 247 deletions(-) delete mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Monastery.java create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java diff --git a/L2J_DataPack_BETA/dist/game/data/scripts.cfg b/L2J_DataPack_BETA/dist/game/data/scripts.cfg index e5d003f16c..b686b9da77 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts.cfg +++ b/L2J_DataPack_BETA/dist/game/data/scripts.cfg @@ -98,7 +98,7 @@ ai/group_template/GiantsCave.java ai/group_template/IsleOfPrayer.java ai/group_template/LairOfAntharas.java ai/group_template/MithrilMines.java -ai/group_template/Monastery.java +ai/group_template/MonasteryOfSilence.java ai/group_template/NonLethalableNpcs.java ai/group_template/PavelArchaic.java ai/group_template/PlainsOfDion.java diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Monastery.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Monastery.java deleted file mode 100644 index 2454c6567c..0000000000 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Monastery.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (C) 2004-2013 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 ai.group_template; - -import ai.npc.AbstractNpcAI; - -import com.l2jserver.gameserver.GeoData; -import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.model.L2Object; -import com.l2jserver.gameserver.model.L2Spawn; -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.L2MonsterInstance; -import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import com.l2jserver.gameserver.model.effects.L2EffectType; -import com.l2jserver.gameserver.model.holders.SkillHolder; -import com.l2jserver.gameserver.model.skills.L2Skill; -import com.l2jserver.gameserver.network.NpcStringId; -import com.l2jserver.gameserver.network.clientpackets.Say2; -import com.l2jserver.gameserver.network.serverpackets.NpcSay; - -/** - * Monastery AI. - * @author Kerberos, nonom - */ -public class Monastery extends AbstractNpcAI -{ - private static final int CAPTAIN = 18910; - private static final int KNIGHT = 18909; - private static final int SCARECROW = 18912; - - private static final int[] SOLINA_CLAN = - { - 22789, // Guide Solina - 22790, // Seeker Solina - 22791, // Savior Solina - 22793, // Ascetic Solina - }; - - private static final int[] DIVINITY_CLAN = - { - 22794, // Divinity Judge - 22795, // Divinity Manager - }; - - private static final NpcStringId[] SOLINA_KNIGHTS_MSG = - { - NpcStringId.PUNISH_ALL_THOSE_WHO_TREAD_FOOTSTEPS_IN_THIS_PLACE, - NpcStringId.WE_ARE_THE_SWORD_OF_TRUTH_THE_SWORD_OF_SOLINA, - NpcStringId.WE_RAISE_OUR_BLADES_FOR_THE_GLORY_OF_SOLINA - }; - - private static final NpcStringId[] DIVINITY_MSG = - { - NpcStringId.S1_WHY_WOULD_YOU_CHOOSE_THE_PATH_OF_DARKNESS, - NpcStringId.S1_HOW_DARE_YOU_DEFY_THE_WILL_OF_EINHASAD - }; - - private static final SkillHolder DECREASE_SPEED = new SkillHolder(4589, 8); - - private Monastery() - { - super(Monastery.class.getSimpleName(), "ai/group_template"); - addSeeCreatureId(SOLINA_CLAN); - addSeeCreatureId(CAPTAIN, KNIGHT); - addSkillSeeId(DIVINITY_CLAN); - addAttackId(KNIGHT, CAPTAIN); - addSpawnId(KNIGHT); - - for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(KNIGHT)) - { - startQuestTimer("training", 5000, spawn.getLastSpawn(), null, true); - } - - for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(SCARECROW)) - { - spawn.getLastSpawn().setIsInvul(true); - spawn.getLastSpawn().disableCoreAI(true); - } - } - - @Override - public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) - { - if (event.equals("training") && !npc.isInCombat() && (getRandom(100) < 25)) - { - for (L2Character character : npc.getKnownList().getKnownCharactersInRadius(300)) - { - if (character.isNpc() && (character.getId() == SCARECROW)) - { - for (L2Skill skill : npc.getAllSkills()) - { - if (skill.isActive()) - { - npc.disableSkill(skill, 0); - } - } - npc.setRunning(); - ((L2Attackable) npc).addDamageHate(character, 0, 100); - npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, character, null); - break; - } - } - } - else if (event.equals("checking")) - { - if (!npc.getKnownList().getKnownCharacters().contains(player)) - { - cancelQuestTimer("checking", npc, player); - return super.onAdvEvent(event, npc, player); - } - - if (player.getAppearance().getInvisible() || player.isSilentMoving()) - { - npc.setTarget(null); - npc.getAI().stopFollow(); - ((L2Attackable) npc).getAggroList().remove(player); - npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, player, null); - - for (L2Character character : player.getKnownList().getKnownCharactersInRadius(500)) - { - if ((character instanceof L2MonsterInstance) && (character.getTarget() == player)) - { - character.setTarget(null); - character.getAI().stopFollow(); - ((L2Attackable) character).getAggroList().remove(player); - character.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, player, null); - } - } - return super.onAdvEvent(event, npc, player); - } - - final double distance = npc.calculateDistance(player, false, false); - if (((distance < 500) && !player.isDead() && GeoData.getInstance().canSeeTarget(npc, player))) - { - switch (npc.getId()) - { - case CAPTAIN: - case KNIGHT: - { - npc.setRunning(); - npc.setTarget(player); - ((L2Attackable) npc).addDamageHate(player, 0, 999); - npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player, null); - break; - } - default: - { - if (player.getActiveWeaponInstance() != null) - { - npc.setRunning(); - npc.setTarget(player); - if (getRandom(10) < 2) - { - broadcastNpcSay(npc, Say2.NPC_ALL, NpcStringId.YOU_CANNOT_CARRY_A_WEAPON_WITHOUT_AUTHORIZATION); - } - npc.doCast(DECREASE_SPEED.getSkill()); - ((L2Attackable) npc).addDamageHate(player, 0, 999); - npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player, null); - } - } - } - } - - } - return super.onAdvEvent(event, npc, player); - } - - @Override - public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon) - { - if (getRandom(10) < 1) - { - broadcastNpcSay(npc, Say2.NPC_ALL, SOLINA_KNIGHTS_MSG[getRandom(2)]); - } - return super.onAttack(npc, player, damage, isSummon); - } - - @Override - public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon) - { - if (creature.isPlayer()) - { - startQuestTimer("checking", 2000, npc, (L2PcInstance) creature, true); - } - return super.onSeeCreature(npc, creature, isSummon); - } - - @Override - public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isSummon) - { - if (skill.hasEffectType(L2EffectType.AGGRESSION) && (targets.length != 0)) - { - for (L2Object obj : targets) - { - if (obj.equals(npc)) - { - NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), DIVINITY_MSG[getRandom(1)]); - packet.addStringParameter(caster.getName()); - npc.broadcastPacket(packet); - ((L2Attackable) npc).addDamageHate(caster, 0, 999); - npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); - break; - } - } - } - return super.onSkillSee(npc, caster, skill, targets, isSummon); - } - - @Override - public String onSpawn(L2Npc npc) - { - broadcastNpcSay(npc, Say2.NPC_ALL, NpcStringId.FOR_THE_GLORY_OF_SOLINA); - return super.onSpawn(npc); - } - - public static void main(String[] args) - { - new Monastery(); - } -} diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java new file mode 100644 index 0000000000..a336acd28c --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java @@ -0,0 +1,297 @@ +/* + * Copyright (C) 2004-2013 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 ai.group_template; + +import ai.npc.AbstractNpcAI; + +import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.datatables.SpawnTable; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Spawn; +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.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.effects.L2EffectType; +import com.l2jserver.gameserver.model.holders.SkillHolder; +import com.l2jserver.gameserver.model.skills.L2Skill; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.clientpackets.Say2; + +/** + * Monastery of Silence AI. + * @author Kerberos, nonom + */ +public final class MonasteryOfSilence extends AbstractNpcAI +{ + // NPCs + private static final int CAPTAIN = 18910; // Solina Knight Captain + private static final int KNIGHT = 18909; // Solina Knights + private static final int SCARECROW = 18912; // Scarecrow + private static final int GUIDE = 22789; // Guide Solina + private static final int SEEKER = 22790; // Seeker Solina + private static final int SAVIOR = 22791; // Savior Solina + private static final int ASCETIC = 22793; // Ascetic Solina + private static final int[] DIVINITY_CLAN = + { + 22794, // Divinity Judge + 22795, // Divinity Manager + }; + // Skills + private static final SkillHolder ORDEAL_STRIKE = new SkillHolder(6303, 1); // Trial of the Coup + private static final SkillHolder LEADER_STRIKE = new SkillHolder(6304, 1); // Shock + private static final SkillHolder SAVER_STRIKE = new SkillHolder(6305, 1); // Sacred Gnosis + private static final SkillHolder SAVER_BLEED = new SkillHolder(6306, 1); // Solina Strike + private static final SkillHolder LEARNING_MAGIC = new SkillHolder(6308, 1); // Opus of the Wave + private static final SkillHolder STUDENT_CANCEL = new SkillHolder(6310, 1); // Loss of Quest + private static final SkillHolder WARRIOR_THRUSTING = new SkillHolder(6311, 1); // Solina Thrust + private static final SkillHolder KNIGHT_BLESS = new SkillHolder(6313, 1); // Solina Bless + // Misc + private static final NpcStringId[] DIVINITY_MSG = + { + NpcStringId.S1_WHY_WOULD_YOU_CHOOSE_THE_PATH_OF_DARKNESS, + NpcStringId.S1_HOW_DARE_YOU_DEFY_THE_WILL_OF_EINHASAD + }; + private static final NpcStringId[] SOLINA_KNIGHTS_MSG = + { + NpcStringId.PUNISH_ALL_THOSE_WHO_TREAD_FOOTSTEPS_IN_THIS_PLACE, + NpcStringId.WE_ARE_THE_SWORD_OF_TRUTH_THE_SWORD_OF_SOLINA, + NpcStringId.WE_RAISE_OUR_BLADES_FOR_THE_GLORY_OF_SOLINA + }; + + private MonasteryOfSilence() + { + super(MonasteryOfSilence.class.getSimpleName(), "ai/group_template"); + addSkillSeeId(DIVINITY_CLAN); + addAttackId(KNIGHT, CAPTAIN, GUIDE, SEEKER, ASCETIC); + addNpcHateId(GUIDE, SEEKER, SAVIOR, ASCETIC); + addAggroRangeEnterId(GUIDE, SEEKER, SAVIOR, ASCETIC); + + for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(SCARECROW)) + { + spawn.getLastSpawn().setIsInvul(true); + spawn.getLastSpawn().disableCoreAI(true); + startQuestTimer("TRAINING", 30000, spawn.getLastSpawn(), null, true); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + switch (event) + { + case "TRAINING": + { + for (L2Character character : npc.getKnownList().getKnownCharactersInRadius(400)) + { + if ((getRandom(100) < 30) && character.isNpc() && !character.isDead() && !character.isInCombat()) + { + if ((character.getId() == CAPTAIN) && (getRandom(100) < 10) && npc.isScriptValue(0)) + { + final L2Npc captain = (L2Npc) character; + broadcastNpcSay(captain, Say2.NPC_ALL, SOLINA_KNIGHTS_MSG[getRandom(SOLINA_KNIGHTS_MSG.length)]); + captain.setScriptValue(1); + startQuestTimer("TIMER", 10000, captain, null); + } + else if (character.getId() == KNIGHT) + { + character.setRunning(); + ((L2Attackable) character).addDamageHate(npc, 0, 100); + character.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, npc, null); + } + } + } + break; + } + case "DO_CAST": + { + if ((npc != null) && (player != null) && (getRandom(100) < 3)) + { + if (npc.checkDoCastConditions(STUDENT_CANCEL.getSkill())) + { + npc.setTarget(player); + npc.doCast(STUDENT_CANCEL.getSkill()); + } + npc.setScriptValue(0); + } + break; + } + case "TIMER": + { + if (npc != null) + { + npc.setScriptValue(0); + } + break; + } + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon) + { + final L2Attackable mob = (L2Attackable) npc; + + switch (npc.getId()) + { + case KNIGHT: + { + if ((getRandom(100) < 10) && (mob.getMostHated() == player) && mob.checkDoCastConditions(WARRIOR_THRUSTING.getSkill())) + { + npc.setTarget(player); + npc.doCast(WARRIOR_THRUSTING.getSkill()); + } + break; + } + case CAPTAIN: + { + if ((getRandom(100) < 20) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.5)) && npc.isScriptValue(0)) + { + if (npc.checkDoCastConditions(KNIGHT_BLESS.getSkill())) + { + npc.setTarget(npc); + npc.doCast(KNIGHT_BLESS.getSkill()); + } + npc.setScriptValue(1); + broadcastNpcSay(npc, Say2.ALL, NpcStringId.FOR_THE_GLORY_OF_SOLINA); + final L2Attackable knight = (L2Attackable) addSpawn(KNIGHT, npc); + attackPlayer(knight, player); + } + break; + } + case GUIDE: + { + if ((getRandom(100) < 3) && (mob.getMostHated() == player) && npc.checkDoCastConditions(ORDEAL_STRIKE.getSkill())) + { + npc.setTarget(player); + npc.doCast(ORDEAL_STRIKE.getSkill()); + } + break; + } + case SEEKER: + { + if ((getRandom(100) < 33) && (mob.getMostHated() == player) && npc.checkDoCastConditions(SAVER_STRIKE.getSkill())) + { + npc.setTarget(npc); + npc.doCast(SAVER_STRIKE.getSkill()); + } + break; + } + case ASCETIC: + { + if ((mob.getMostHated() == player) && npc.isScriptValue(0)) + { + npc.setScriptValue(1); + startQuestTimer("DO_CAST", 20000, npc, player); + } + break; + } + } + return super.onAttack(npc, player, damage, isSummon); + } + + @Override + public boolean onNpcHate(L2Attackable mob, L2Playable playable) + { + return playable.getActiveWeaponInstance() != null; + } + + @Override + public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon) + { + if (player.getActiveWeaponInstance() != null) + { + SkillHolder skill = null; + switch (npc.getId()) + { + case GUIDE: + { + if (getRandom(100) < 3) + { + skill = LEADER_STRIKE; + } + break; + } + case SEEKER: + { + skill = SAVER_BLEED; + break; + } + case SAVIOR: + { + skill = LEARNING_MAGIC; + break; + } + case ASCETIC: + { + if (getRandom(100) < 3) + { + skill = STUDENT_CANCEL; + } + + if (npc.isScriptValue(0)) + { + npc.setScriptValue(1); + startQuestTimer("DO_CAST", 20000, npc, player); + } + break; + } + } + + if ((skill != null) && npc.checkDoCastConditions(skill.getSkill())) + { + npc.setTarget(player); + npc.doCast(skill.getSkill()); + } + + if (!npc.isInCombat()) + { + broadcastNpcSay(npc, Say2.NPC_ALL, NpcStringId.YOU_CANNOT_CARRY_A_WEAPON_WITHOUT_AUTHORIZATION); + } + + attackPlayer((L2Attackable) npc, player); + } + return super.onAggroRangeEnter(npc, player, isSummon); + } + + @Override + public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isSummon) + { + if (skill.hasEffectType(L2EffectType.AGGRESSION) && (targets.length != 0)) + { + for (L2Object obj : targets) + { + if (obj.equals(npc)) + { + broadcastNpcSay(npc, Say2.NPC_ALL, DIVINITY_MSG[getRandom(DIVINITY_MSG.length)], caster.getName()); + attackPlayer((L2Attackable) npc, caster); + break; + } + } + } + return super.onSkillSee(npc, caster, skill, targets, isSummon); + } + + public static void main(String[] args) + { + new MonasteryOfSilence(); + } +} diff --git a/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql b/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql index caf1bc40f4..55c2584d15 100644 --- a/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql +++ b/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql @@ -2409,8 +2409,8 @@ INSERT INTO `npcaidata` VALUES (18906, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, "null", 300, "null", 0, 0, "fighter"), -- Farm Bandit (18907, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, "null", 300, "null", 0, 0, "fighter"), -- Beast Devourer (18908, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "fighter"), -- Sel Mahum Chef -(18909, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "n_solina_clan", 300, "monastery_scarecrow", 400, 0, "fighter"), -- Solina Knights -(18910, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "n_solina_clan", 300, "null", 0, 0, "fighter"), -- Solina Knight Captain +(18909, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, "n_solina_clan", 300, "monastery_scarecrow", 400, 0, "fighter"), -- Solina Knights +(18910, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, "n_solina_clan", 300, "null", 0, 0, "fighter"), -- Solina Knight Captain (18911, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "fighter"), -- Abbey Treasure Chest (18912, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, "null", 300, "dummy_clan", 400, 0, "corpse"), -- Scarecrow (18913, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "fighter"), -- Furnace @@ -4874,11 +4874,11 @@ INSERT INTO `npcaidata` VALUES (22786, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "xel_private_clan", 400, "null", 0, 0, "fighter"), -- Sel Mahum Squad Leader (22787, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "xel_private_clan", 400, "null", 0, 0, "fighter"), -- Sel Mahum Squad Leader (22788, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "xel_private_clan", 400, "null", 0, 0, "fighter"), -- Sel Mahum Squad Leader -(22789, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Guide Solina -(22790, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Seeker Solina -(22791, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Savior Solina -(22792, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Disciple Solina -(22793, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Ascetic Solina +(22789, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Guide Solina +(22790, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Seeker Solina +(22791, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Savior Solina +(22792, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Disciple Solina +(22793, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, "solina_n_clan", 300, "null", 0, 0, "balanced"), -- Ascetic Solina (22794, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 600, 0, "divine_n_clan", 300, "null", 0, 0, "balanced"), -- Divinity Judge (22795, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 600, 0, "divine_n_clan", 300, "null", 0, 0, "balanced"), -- Divinity Manager (22796, 7, 15, 0, 300, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 600, 0, "divine_n_clan", 300, "null", 0, 0, "balanced"), -- Divinity Supervisor -- GitLab