Removed several unused scripts.
This commit is contained in:
@@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others;
|
|
||||||
|
|
||||||
import com.l2jmobius.commons.util.CommonUtil;
|
|
||||||
import com.l2jmobius.gameserver.model.StatsSet;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Area Skill Npc AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class AreaSkillNpc extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int[] BASIC = // area_skill_npc
|
|
||||||
{
|
|
||||||
13018, // Maximum Defense
|
|
||||||
13019, // Anti-Music
|
|
||||||
13020, // Maximum Resist Status
|
|
||||||
13021, // Maximum Recovery
|
|
||||||
13022, // Recover Force
|
|
||||||
13023, // Maximize long-range weapon use
|
|
||||||
13024, // Smokescreen
|
|
||||||
13028, // Day of Doom
|
|
||||||
13030, // Anti-Summoning Field
|
|
||||||
13323, // Whisper of Fear
|
|
||||||
13324, // Whisper of Fear
|
|
||||||
13325, // Whisper of Fear
|
|
||||||
13458, // Whisper of Fear
|
|
||||||
13459, // Whisper of Fear
|
|
||||||
13460, // Whisper of Fear
|
|
||||||
13310, // Solo Dance
|
|
||||||
13377, // Solo Dance
|
|
||||||
13378, // Solo Dance
|
|
||||||
13379, // Solo Dance
|
|
||||||
13380, // Solo Dance
|
|
||||||
13381, // Solo Dance
|
|
||||||
13452, // Solo Dance
|
|
||||||
13453, // Solo Dance
|
|
||||||
13454, // Solo Dance
|
|
||||||
};
|
|
||||||
private static final int[] TOTEMS = // ai_totem_of_body
|
|
||||||
{
|
|
||||||
143, // Totem of Body
|
|
||||||
144, // Totem of Spirit
|
|
||||||
145, // Totem of Bravery
|
|
||||||
146, // Totem of Fortitude
|
|
||||||
};
|
|
||||||
private static final int[] DECOY = // ai_decoy
|
|
||||||
{
|
|
||||||
13071, // Virtual Image
|
|
||||||
13072, // Virtual Image
|
|
||||||
13073, // Virtual Image
|
|
||||||
13074, // Virtual Image
|
|
||||||
13075, // Virtual Image
|
|
||||||
13076, // Virtual Image
|
|
||||||
13257, // Virtual Image
|
|
||||||
13258, // Virtual Image
|
|
||||||
13259, // Virtual Image
|
|
||||||
13260, // Virtual Image
|
|
||||||
13261, // Virtual Image
|
|
||||||
13262, // Virtual Image
|
|
||||||
13263, // Virtual Image
|
|
||||||
13264, // Virtual Image
|
|
||||||
13265, // Virtual Image
|
|
||||||
13266, // Virtual Image
|
|
||||||
13267, // Virtual Image
|
|
||||||
13328, // Decoy
|
|
||||||
};
|
|
||||||
|
|
||||||
private AreaSkillNpc()
|
|
||||||
{
|
|
||||||
addSpawnId(BASIC);
|
|
||||||
addSpawnId(TOTEMS);
|
|
||||||
addSpawnId(DECOY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpawn(L2Npc npc)
|
|
||||||
{
|
|
||||||
final L2Character summoner = npc.getSummoner();
|
|
||||||
if ((summoner != null) && summoner.isPlayer())
|
|
||||||
{
|
|
||||||
final L2PcInstance player = summoner.getActingPlayer();
|
|
||||||
|
|
||||||
if (CommonUtil.contains(BASIC, npc.getId()) || CommonUtil.contains(TOTEMS, npc.getId()))
|
|
||||||
{
|
|
||||||
final int despawnTime = npc.getTemplate().getParameters().getInt("despawn_time", 7);
|
|
||||||
getTimers().addTimer("SKILL_CAST_BASIC", 100, npc, player);
|
|
||||||
getTimers().addTimer("DELETE_ME", (despawnTime * 1000), npc, player);
|
|
||||||
}
|
|
||||||
else if (CommonUtil.contains(DECOY, npc.getId()))
|
|
||||||
{
|
|
||||||
final int castTime = npc.getTemplate().getParameters().getInt("i_use_term_time", 5000);
|
|
||||||
final int despawnTime = npc.getTemplate().getParameters().getInt("i_despawn_time", 30000);
|
|
||||||
onTimerEvent("SKILL_CAST_BASIC", null, npc, player); // Trigger cast instantly
|
|
||||||
getTimers().addTimer("SKILL_CAST_BASIC", castTime, npc, player);
|
|
||||||
getTimers().addTimer("DELETE_ME", despawnTime, npc, player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.onSpawn(npc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTimerEvent(String event, StatsSet params, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
if (event.equals("SKILL_CAST_BASIC"))
|
|
||||||
{
|
|
||||||
final SkillHolder skill = npc.getParameters().getSkillHolder(CommonUtil.contains(DECOY, npc.getId()) ? "decoy_skill" : "union_skill");
|
|
||||||
final int skillDelay = npc.getParameters().getInt("skill_delay", 2);
|
|
||||||
|
|
||||||
if (skill != null)
|
|
||||||
{
|
|
||||||
npc.doCast(skill.getSkill());
|
|
||||||
getTimers().addTimer("SKILL_CAST_BASIC", skillDelay * 1000, npc, player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (event.equals("DELETE_ME"))
|
|
||||||
{
|
|
||||||
getTimers().cancelTimer("SKILL_CAST_BASIC", npc, player);
|
|
||||||
npc.deleteMe();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new AreaSkillNpc();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others;
|
|
||||||
|
|
||||||
import com.l2jmobius.Config;
|
|
||||||
import com.l2jmobius.gameserver.model.L2Object;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ballista AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class Ballista extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int[] BALLISTA =
|
|
||||||
{
|
|
||||||
35685, // Shanty Fortress
|
|
||||||
35723, // Southern Fortress
|
|
||||||
35754, // Hive Fortress
|
|
||||||
35792, // Valley Fortress
|
|
||||||
35823, // Ivory Fortress
|
|
||||||
35854, // Narsell Fortress
|
|
||||||
35892, // Bayou Fortress
|
|
||||||
35923, // White Sands Fortress
|
|
||||||
35961, // Borderland Fortress
|
|
||||||
35999, // Swamp Fortress
|
|
||||||
36030, // Archaic Fortress
|
|
||||||
36068, // Floran Fortress
|
|
||||||
36106, // Cloud Mountain)
|
|
||||||
36137, // Tanor Fortress
|
|
||||||
36168, // Dragonspine Fortress
|
|
||||||
36206, // Antharas's Fortress
|
|
||||||
36244, // Western Fortress
|
|
||||||
36282, // Hunter's Fortress
|
|
||||||
36313, // Aaru Fortress
|
|
||||||
36351, // Demon Fortress
|
|
||||||
36389, // Monastic Fortress
|
|
||||||
};
|
|
||||||
// Skill
|
|
||||||
private static final SkillHolder BOMB = new SkillHolder(2342, 1); // Ballista Bomb
|
|
||||||
// Misc
|
|
||||||
private static final int MIN_CLAN_LV = 5;
|
|
||||||
|
|
||||||
private Ballista()
|
|
||||||
{
|
|
||||||
addSkillSeeId(BALLISTA);
|
|
||||||
addSpawnId(BALLISTA);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon)
|
|
||||||
{
|
|
||||||
if ((skill != null) && (caster.getTarget() == npc) && (getRandom(100) < 40) && (skill == BOMB.getSkill()))
|
|
||||||
{
|
|
||||||
if (npc.getFort().getSiege().isInProgress())
|
|
||||||
{
|
|
||||||
if ((caster.getClan() != null) && (caster.getClan().getLevel() >= MIN_CLAN_LV))
|
|
||||||
{
|
|
||||||
caster.getClan().addReputationScore(Config.BALLISTA_POINTS, true);
|
|
||||||
caster.sendPacket(SystemMessageId.THE_BALLISTA_HAS_BEEN_SUCCESSFULLY_DESTROYED_THE_CLAN_REPUTATION_WILL_BE_INCREASED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
npc.doDie(caster);
|
|
||||||
}
|
|
||||||
return super.onSkillSee(npc, caster, skill, targets, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpawn(L2Npc npc)
|
|
||||||
{
|
|
||||||
npc.disableCoreAI(true);
|
|
||||||
npc.setUndying(true);
|
|
||||||
return super.onSpawn(npc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new Ballista();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,410 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others.CastleCourtMagician;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.data.xml.impl.MultisellData;
|
|
||||||
import com.l2jmobius.gameserver.enums.CastleSide;
|
|
||||||
import com.l2jmobius.gameserver.enums.CategoryType;
|
|
||||||
import com.l2jmobius.gameserver.model.ClanPrivilege;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
|
||||||
import com.l2jmobius.gameserver.network.clientpackets.RequestAcquireSkill;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
import handlers.effecthandlers.CallPc;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Castle Court Magician AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class CastleCourtMagician extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int[] COURT_MAGICIAN =
|
|
||||||
{
|
|
||||||
35648, // Gludio
|
|
||||||
35649, // Dion
|
|
||||||
35650, // Giran
|
|
||||||
35651, // Oren
|
|
||||||
35652, // Aden
|
|
||||||
35653, // Innadril
|
|
||||||
35654, // Goddard
|
|
||||||
35655, // Rune
|
|
||||||
35656, // Schuttgart
|
|
||||||
};
|
|
||||||
// Skills
|
|
||||||
private static final int CLAN_GATE = 3632; // Clan Gate
|
|
||||||
private static final SkillHolder DISPLAY_CLAN_GATE = new SkillHolder(5109, 1); // Production - Clan Gate
|
|
||||||
// Items
|
|
||||||
private static final int CLOAK_OF_LIGHT = 34925;
|
|
||||||
private static final int CLOAK_OF_DARK = 34926;
|
|
||||||
private static final int EPAULETTE = 9912; // Knight's Epaulette
|
|
||||||
private static final int RED_MEDITATION = 9931; // Red Talisman of Meditation
|
|
||||||
private static final int BLUE_DIV_PROTECTION = 9932; // Blue Talisman - Divine Protection
|
|
||||||
private static final int BLUE_EXPLOSION = 10416; // Blue Talisman - Explosion
|
|
||||||
private static final int BLUE_M_EXPLOSION = 10417; // Blue Talisman - Magic Explosion
|
|
||||||
private static final int RED_MIN_CLARITY = 9917; // Red Talisman of Minimum Clarity
|
|
||||||
private static final int RED_MAX_CLARITY = 9918; // Red Talisman of Maximum Clarity
|
|
||||||
private static final int RED_MENTAL_REG = 9928; // Red Talisman of Mental Regeneration
|
|
||||||
private static final int BLUE_PROTECTION = 9929; // Blue Talisman of Protection
|
|
||||||
private static final int BLUE_INVIS = 9920; // Blue Talisman of Invisibility
|
|
||||||
private static final int BLUE_DEFENSE = 9916; // Blue Talisman of Defense
|
|
||||||
private static final int BLACK_ESCAPE = 9923; // Black Talisman - Escape
|
|
||||||
private static final int BLUE_HEALING = 9924; // Blue Talisman of Healing
|
|
||||||
private static final int RED_RECOVERY = 9925; // Red Talisman of Recovery
|
|
||||||
private static final int BLUE_DEFENSE2 = 9926; // Blue Talisman of Defense
|
|
||||||
private static final int BLUE_M_DEFENSE = 9927; // Blue Talisman of Magic Defense
|
|
||||||
private static final int RED_LIFE_FORCE = 10518; // Red Talisman - Life Force
|
|
||||||
private static final int BLUE_GREAT_HEAL = 10424; // Blue Talisman - Greater Healing
|
|
||||||
private static final int WHITE_FIRE = 10421; // White Talisman - Fire
|
|
||||||
private static final int[] COMMON_TALISMANS =
|
|
||||||
{
|
|
||||||
9914, // Blue Talisman of Power
|
|
||||||
9915, // Blue Talisman of Wild Magic
|
|
||||||
9920, // Blue Talisman of Invisibility
|
|
||||||
9921, // Blue Talisman - Shield Protection
|
|
||||||
9922, // Black Talisman - Mending
|
|
||||||
9933, // Yellow Talisman of Power
|
|
||||||
9934, // Yellow Talisman of Violent Haste
|
|
||||||
9935, // Yellow Talisman of Arcane Defense
|
|
||||||
9936, // Yellow Talisman of Arcane Power
|
|
||||||
9937, // Yellow Talisman of Arcane Haste
|
|
||||||
9938, // Yellow Talisman of Accuracy
|
|
||||||
9939, // Yellow Talisman of Defense
|
|
||||||
9940, // Yellow Talisman of Alacrity
|
|
||||||
9941, // Yellow Talisman of Speed
|
|
||||||
9942, // Yellow Talisman of Critical Reduction
|
|
||||||
9943, // Yellow Talisman of Critical Damage
|
|
||||||
9944, // Yellow Talisman of Critical Dodging
|
|
||||||
9945, // Yellow Talisman of Evasion
|
|
||||||
9946, // Yellow Talisman of Healing
|
|
||||||
9947, // Yellow Talisman of CP Regeneration
|
|
||||||
9948, // Yellow Talisman of Physical Regeneration
|
|
||||||
9949, // Yellow Talisman of Mental Regeneration
|
|
||||||
9950, // Grey Talisman of Weight Training
|
|
||||||
9952, // Orange Talisman - Hot Springs CP Potion
|
|
||||||
9953, // Orange Talisman - Elixir of Life
|
|
||||||
9954, // Orange Talisman - Elixir of Mental Strength
|
|
||||||
9955, // Black Talisman - Vocalization
|
|
||||||
9956, // Black Talisman - Arcane Freedom
|
|
||||||
9957, // Black Talisman - Physical Freedom
|
|
||||||
9958, // Black Talisman - Rescue
|
|
||||||
9959, // Black Talisman - Free Speech
|
|
||||||
9960, // White Talisman of Bravery
|
|
||||||
9961, // White Talisman of Motion
|
|
||||||
9962, // White Talisman of Grounding
|
|
||||||
9963, // White Talisman of Attention
|
|
||||||
9964, // White Talisman of Bandages
|
|
||||||
9965, // White Talisman of Protection
|
|
||||||
10418, // White Talisman - Storm
|
|
||||||
10420, // White Talisman - Water
|
|
||||||
10519, // White Talisman - Earth
|
|
||||||
10422, // White Talisman - Light
|
|
||||||
10423, // Blue Talisman - Self-Destruction
|
|
||||||
10419, // White Talisman - Darkness
|
|
||||||
};
|
|
||||||
// Misc
|
|
||||||
private static final CategoryType[] AWAKENED_CT =
|
|
||||||
{
|
|
||||||
CategoryType.SIGEL_GROUP,
|
|
||||||
CategoryType.TYRR_GROUP,
|
|
||||||
CategoryType.OTHELL_GROUP,
|
|
||||||
CategoryType.YUL_GROUP,
|
|
||||||
CategoryType.FEOH_GROUP,
|
|
||||||
CategoryType.ISS_GROUP,
|
|
||||||
CategoryType.WYNN_GROUP,
|
|
||||||
CategoryType.AEORE_GROUP,
|
|
||||||
};
|
|
||||||
|
|
||||||
private CastleCourtMagician()
|
|
||||||
{
|
|
||||||
addStartNpc(COURT_MAGICIAN);
|
|
||||||
addTalkId(COURT_MAGICIAN);
|
|
||||||
addFirstTalkId(COURT_MAGICIAN);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
if ((player.getClan() == null) && (player.getClanId() != npc.getCastle().getOwnerId()))
|
|
||||||
{
|
|
||||||
return "courtmagician-01.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
String htmltext = null;
|
|
||||||
int itemId = 0;
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "courtmagician.html":
|
|
||||||
case "courtmagician-03.html":
|
|
||||||
case "courtmagician-07.html":
|
|
||||||
case "courtmagician-11.html":
|
|
||||||
{
|
|
||||||
htmltext = event;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveTalisman":
|
|
||||||
{
|
|
||||||
if (getQuestItemsCount(player, EPAULETTE) < 10)
|
|
||||||
{
|
|
||||||
htmltext = "courtmagician-06.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int categoryChance = getRandom(100);
|
|
||||||
if (categoryChance <= 5)
|
|
||||||
{
|
|
||||||
final int chance = getRandom(100);
|
|
||||||
if (chance <= 25)
|
|
||||||
{
|
|
||||||
itemId = RED_MEDITATION;
|
|
||||||
}
|
|
||||||
else if (chance <= 50)
|
|
||||||
{
|
|
||||||
itemId = BLUE_DIV_PROTECTION;
|
|
||||||
}
|
|
||||||
else if (chance <= 75)
|
|
||||||
{
|
|
||||||
itemId = BLUE_EXPLOSION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = BLUE_M_EXPLOSION;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (categoryChance <= 15)
|
|
||||||
{
|
|
||||||
final int chance = getRandom(100);
|
|
||||||
if (chance <= 20)
|
|
||||||
{
|
|
||||||
itemId = RED_MIN_CLARITY;
|
|
||||||
}
|
|
||||||
else if (chance <= 40)
|
|
||||||
{
|
|
||||||
itemId = RED_MAX_CLARITY;
|
|
||||||
}
|
|
||||||
else if (chance <= 60)
|
|
||||||
{
|
|
||||||
itemId = RED_MENTAL_REG;
|
|
||||||
}
|
|
||||||
else if (chance <= 80)
|
|
||||||
{
|
|
||||||
itemId = BLUE_PROTECTION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = BLUE_INVIS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (categoryChance <= 30)
|
|
||||||
{
|
|
||||||
final int chance = getRandom(100);
|
|
||||||
if (chance <= 12)
|
|
||||||
{
|
|
||||||
itemId = BLUE_DEFENSE;
|
|
||||||
}
|
|
||||||
else if (chance <= 25)
|
|
||||||
{
|
|
||||||
itemId = BLACK_ESCAPE;
|
|
||||||
}
|
|
||||||
else if (chance <= 37)
|
|
||||||
{
|
|
||||||
itemId = BLUE_HEALING;
|
|
||||||
}
|
|
||||||
else if (chance <= 50)
|
|
||||||
{
|
|
||||||
itemId = RED_RECOVERY;
|
|
||||||
}
|
|
||||||
else if (chance <= 62)
|
|
||||||
{
|
|
||||||
itemId = BLUE_DEFENSE2;
|
|
||||||
}
|
|
||||||
else if (chance <= 75)
|
|
||||||
{
|
|
||||||
itemId = BLUE_M_DEFENSE;
|
|
||||||
}
|
|
||||||
else if (chance <= 87)
|
|
||||||
{
|
|
||||||
itemId = RED_LIFE_FORCE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = BLUE_GREAT_HEAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final int chance = getRandom(46);
|
|
||||||
if (chance <= 42)
|
|
||||||
{
|
|
||||||
itemId = COMMON_TALISMANS[chance];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = WHITE_FIRE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
takeItems(player, EPAULETTE, 10);
|
|
||||||
giveItems(player, itemId, 1);
|
|
||||||
htmltext = "courtmagician-04.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveTalismanR":
|
|
||||||
{
|
|
||||||
htmltext = player.isInCategory(CategoryType.AWAKEN_GROUP) ? "courtmagician-09.html" : "courtmagician-10.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveTalismanR_classSpecific":
|
|
||||||
{
|
|
||||||
final int playerLevel = player.getLevel();
|
|
||||||
if ((playerLevel >= 85) && (playerLevel < 90))
|
|
||||||
{
|
|
||||||
showClassSpecificMultisell(player, npc, 797);
|
|
||||||
}
|
|
||||||
else if ((playerLevel >= 90) && (playerLevel < 95))
|
|
||||||
{
|
|
||||||
showClassSpecificMultisell(player, npc, 805);
|
|
||||||
}
|
|
||||||
else if ((playerLevel >= 95) && (playerLevel <= 98))
|
|
||||||
{
|
|
||||||
showClassSpecificMultisell(player, npc, 813);
|
|
||||||
}
|
|
||||||
else if (playerLevel >= 99) // TODO: Glory Days AI use "else if (talker->level == 99)" but on IO is max level 106 - need be confirmed for 100+ chars
|
|
||||||
{
|
|
||||||
showClassSpecificMultisell(player, npc, 821);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveTalismanR_active":
|
|
||||||
{
|
|
||||||
final int playerLevel = player.getLevel();
|
|
||||||
if ((playerLevel >= 85) && (playerLevel < 90))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(789, player, npc, false);
|
|
||||||
}
|
|
||||||
else if ((playerLevel >= 90) && (playerLevel < 95))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(794, player, npc, false);
|
|
||||||
}
|
|
||||||
else if ((playerLevel >= 95) && (playerLevel < 99))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(795, player, npc, false);
|
|
||||||
}
|
|
||||||
else if (playerLevel >= 99) // TODO: Glory Days AI use "else if (talker->level == 99)" but on IO is max level 106 - need be confirmed for 100+ chars
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(796, player, npc, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveTalismanR_passive":
|
|
||||||
{
|
|
||||||
final int playerLevel = player.getLevel();
|
|
||||||
if ((playerLevel >= 85) && (playerLevel < 90))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(789, player, npc, false);
|
|
||||||
}
|
|
||||||
else if ((playerLevel >= 90) && (playerLevel < 95))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(790, player, npc, false);
|
|
||||||
}
|
|
||||||
else if ((playerLevel >= 95) && (playerLevel < 99))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(791, player, npc, false);
|
|
||||||
}
|
|
||||||
else if (playerLevel >= 99) // TODO: Glory Days AI use "else if (talker->level == 99)" but on IO is max level 106 - need be confirmed for 100+ chars
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(792, player, npc, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "squadSkill":
|
|
||||||
{
|
|
||||||
if (player.isClanLeader() || player.hasClanPrivilege(ClanPrivilege.CL_TROOPS_FAME))
|
|
||||||
{
|
|
||||||
RequestAcquireSkill.showSubUnitSkillList(player);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "courtmagician-05.html";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "clanTeleport":
|
|
||||||
{
|
|
||||||
if (player.getClanId() == npc.getCastle().getOwnerId())
|
|
||||||
{
|
|
||||||
final L2PcInstance clanLeader = player.getClan().getLeader().getPlayerInstance();
|
|
||||||
|
|
||||||
if ((clanLeader != null) && clanLeader.isAffectedBySkill(CLAN_GATE))
|
|
||||||
{
|
|
||||||
if (CallPc.checkSummonTargetStatus(player, clanLeader)) // TODO: Custom one, retail dont check it but for sure lets check same conditions like when summon player by skill.
|
|
||||||
{
|
|
||||||
npc.setTarget(player);
|
|
||||||
npc.doCast(DISPLAY_CLAN_GATE.getSkill());
|
|
||||||
player.teleToLocation(clanLeader.getLocation(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "courtmagician-02.html";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveCloak":
|
|
||||||
{
|
|
||||||
final int cloakId = npc.getCastle().getSide() == CastleSide.DARK ? CLOAK_OF_DARK : CLOAK_OF_LIGHT;
|
|
||||||
|
|
||||||
if (hasQuestItems(player, cloakId))
|
|
||||||
{
|
|
||||||
htmltext = "courtmagician-08.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
giveItems(player, cloakId, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
return ((player.getClan() != null) && (player.getClanId() == npc.getCastle().getOwnerId())) ? "courtmagician.html" : "courtmagician-01.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showClassSpecificMultisell(L2PcInstance player, L2Npc npc, int index)
|
|
||||||
{
|
|
||||||
for (CategoryType ct : AWAKENED_CT)
|
|
||||||
{
|
|
||||||
if (player.isInCategory(ct))
|
|
||||||
{
|
|
||||||
MultisellData.getInstance().separateAndSend(index, player, npc, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new CastleCourtMagician();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Court Magician:<br>
|
|
||||||
Can't you see that I am busy? If you continue to bother me, I will turn you into a frog!<br><br>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Court Magician:<br>
|
|
||||||
I cannot find the lord's signal right now, so it is impossible to cast the spell.<br><br>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
A Talisman is an interesting mana item. When used on your wrist, it'll give you awesome results. However, you'll need to prove to me that you're worthy of such power. As a proof, give me <font color="LEVEL">10 Knight's Epaulettes</font> and I will reward you with a Fortress Talisman. Then, I can exchange them for you.<br>
|
|
||||||
<center>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician giveTalisman">Exchange Knight's Epaulettes for a Fortress Talisman</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician giveTalismanR">Exchange for a Grade-R Fortress Talisman</Button> </center>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Very well. Here you go!
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
If you cannot prove your worthiness, I cannot give it to you. Please leave!
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
You do not have enough Knight's Epaulettes.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest CastleCourtMagician courtmagician.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Court Wizard:<br>
|
|
||||||
Only those who are a Marquis or higher can receive the cloak. You cannot receive more than one cloak either, I might add.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician giveCloak">"I would like one."</Button>
|
|
||||||
</body></html>
|
|
@@ -1,5 +0,0 @@
|
|||||||
<html><body>Court Magician:<br>
|
|
||||||
<center>
|
|
||||||
Don't you already have the cloak?
|
|
||||||
</center>
|
|
||||||
</body></html>
|
|
@@ -1,7 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Please select which of the following types of talisman you want.<br>
|
|
||||||
<center>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician courtmagician-11.html">Normal Talisman</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician giveTalismanR_classSpecific">Class-Specific Talisman</Button>
|
|
||||||
</center>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
An unawakened character cannot buy the corresponding Talisman.
|
|
||||||
</body></html>
|
|
@@ -1,7 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Please select the type of talisman that you want.<br>
|
|
||||||
<center>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician giveTalismanR_active">Active</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician giveTalismanR_passive">Passive</Button>
|
|
||||||
</center>
|
|
||||||
</body></html>
|
|
@@ -1,15 +0,0 @@
|
|||||||
<html><body>Court Magician:<br>
|
|
||||||
Cast your eyes upon the results of this magical research conducted by the Mystics Guild.<br>
|
|
||||||
You can make use of a magical field capable of teleporting a clan member through a crown, as well as magic that provides special abilities to your low-ranking soldiers. We even have a Talisman, a magical crystal filled with power.<br>
|
|
||||||
We have also purchased certain items directly from the Elves' mystical merchant. How may I serve you?<br><br>
|
|
||||||
<center>
|
|
||||||
<Button ALIGN=LEFT ICON="TELEPORT" action="bypass -h Quest CastleCourtMagician clanTeleport">Move through the magic field</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 90002001">Purchase Elven items</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 90002002">Purchase Bracelet</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 90002003">Purchase Shirt</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_exc_multisell 90002004">Trade Shirt for Enchanted Shirt</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician courtmagician-03.html">Obtain Talisman</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician squadSkill">Learn special skills for low-ranked soldiers</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleCourtMagician courtmagician-07.html">Receive a cloak</Button>
|
|
||||||
</center>
|
|
||||||
</body></html>
|
|
@@ -1,5 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
I seek the leader of a Clan!<br>
|
|
||||||
That person alone can validate their Clan's reputation and be justly rewarded for doing so...<br>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,9 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
There are many ways to increase your clan's reputation, from capturing a castle or fortress in battle, to helping out wandering newbies. Protecting a territory is also laudable, and in that spirit I wish to make you an offer if you can bring me these items:<br><br>
|
|
||||||
<font color = "LEVEL">1 Blood Alliance</font> to prove that you have successfully defended a castle, <font color = "LEVEL">10 Blood Oaths gained by preserving civic order in a territory</font>, and finally <font color = "LEVEL">100 Knight's Epaulettes to prove that you are invincible in battle</font>.<br><br>
|
|
||||||
Bring me these things, and I will personally see to it that your reputation increases.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader exchange-ba">Provide 1 Blood Alliance</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader exchange-bo">Provide 10 Blood Oaths</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader exchange-ke">Provide 100 Knight's Epaulettes</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32024.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
You have not brought a sufficient number of the items I requested to justify an increase in reputation.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32024.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
Your reputation has been increased.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32024.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
The maximum clan level for raising reputation is 5.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32024.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
Leading one, or one who has been charged with the legacy. Are you the one?<br>
|
|
||||||
Only then can you claim the prize of your clan's repute. But if you are a clan member, you may buy a Clan Cloak. Well?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 878">"Yeah, uh, can I buy a Clan Cloak?"</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,8 +0,0 @@
|
|||||||
<html><body>Clan Trader Mulia:<br>
|
|
||||||
Oh, renowned leader of the clan! What business do you have with me?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 1235">Buy a Clan Item</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 1236">Upgrade a clan item</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader repinfo">Ask about Clan Reputation Points</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_TerritoryStatus">Ask about the local lord and tax rate</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
I seek a partner to a blood oath, the most sacred pledge of allegiance!<br>
|
|
||||||
I will not release any item to anyone else!<br>
|
|
||||||
Our reputation depends on it!<br>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,9 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
There are many ways to increase your clan's reputation, from capturing a castle or fortress in battle, to helping out wandering newbies. Protecting a territory is also laudable, and in that spirit I wish to make you an offer if you can bring me these items:<br><br>
|
|
||||||
<font color = "LEVEL">1 Blood Alliance</font> to prove that you have successfully defended a castle, <font color = "LEVEL">10 Blood Oaths gained by preserving civic order in a territory</font>, and finally <font color = "LEVEL">100 Knight's Epaulettes to prove that you are invincible in battle</font>.<br><br>
|
|
||||||
Bring me these things, and I will personally see to it that your reputation increases.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader exchange-ba">Provide 1 Blood Alliance</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader exchange-bo">Provide 10 Blood Oaths</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader exchange-ke">Provide 100 Knight's Epaulettes</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32025.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
You have not brought a sufficient number of the items I requested to justify an increase in reputation.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32025.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
Your reputation has been increased.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32025.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
The maximum clan level for raising reputation is 5.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ClanTrader 32025.html">Back</Button>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
An oath sworn in blood. The promise to rise and fall as one. Are you a keeper of this oath?<br>
|
|
||||||
If you are not, and have no permission from the keeper of the oath, touch nothing here! But if you are a clan member, you may buy a Clan Cloak. Well?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 878">"Yeah, uh, can I buy a Clan Cloak?"</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,8 +0,0 @@
|
|||||||
<html><body>Clan Trader Ilia:<br>
|
|
||||||
We swore the blood oath together, did we not? If you are that oath-holder, come speak with me.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 1235">Buy a Clan Item</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 1236">Upgrade a clan item</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ClanTrader repinfo">Ask about Clan Reputation Points</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_TerritoryStatus">Ask about the local lord and tax rate</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,127 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others.ClanTrader;
|
|
||||||
|
|
||||||
import com.l2jmobius.Config;
|
|
||||||
import com.l2jmobius.gameserver.model.ClanPrivilege;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clan Trader AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class ClanTrader extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int[] CLAN_TRADER =
|
|
||||||
{
|
|
||||||
32024, // Mulia
|
|
||||||
32025, // Ilia
|
|
||||||
};
|
|
||||||
// Items
|
|
||||||
private static final int BLOOD_ALLIANCE = 9911; // Blood Alliance
|
|
||||||
private static final int BLOOD_ALLIANCE_COUNT = 1; // Blood Alliance Count
|
|
||||||
private static final int BLOOD_OATH = 9910; // Blood Oath
|
|
||||||
private static final int BLOOD_OATH_COUNT = 10; // Blood Oath Count
|
|
||||||
private static final int KNIGHTS_EPAULETTE = 9912; // Knight's Epaulette
|
|
||||||
private static final int KNIGHTS_EPAULETTE_COUNT = 100; // Knight's Epaulette Count
|
|
||||||
|
|
||||||
private ClanTrader()
|
|
||||||
{
|
|
||||||
addStartNpc(CLAN_TRADER);
|
|
||||||
addTalkId(CLAN_TRADER);
|
|
||||||
addFirstTalkId(CLAN_TRADER);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String giveReputation(L2Npc npc, L2PcInstance player, int count, int itemId, int itemCount)
|
|
||||||
{
|
|
||||||
if (getQuestItemsCount(player, itemId) >= itemCount)
|
|
||||||
{
|
|
||||||
takeItems(player, itemId, itemCount);
|
|
||||||
player.getClan().addReputationScore(count, true);
|
|
||||||
|
|
||||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_CLAN_HAS_ADDED_S1_POINT_S_TO_ITS_CLAN_REPUTATION);
|
|
||||||
sm.addInt(count);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
return npc.getId() + "-04.html";
|
|
||||||
}
|
|
||||||
return npc.getId() + "-03.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
String htmltext = null;
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "32024.html":
|
|
||||||
case "32024-02.html":
|
|
||||||
case "32025.html":
|
|
||||||
case "32025-02.html":
|
|
||||||
{
|
|
||||||
htmltext = event;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "repinfo":
|
|
||||||
{
|
|
||||||
htmltext = (player.getClan().getLevel() > 4) ? npc.getId() + "-02.html" : npc.getId() + "-05.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "exchange-ba":
|
|
||||||
{
|
|
||||||
htmltext = giveReputation(npc, player, Config.BLOODALLIANCE_POINTS, BLOOD_ALLIANCE, BLOOD_ALLIANCE_COUNT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "exchange-bo":
|
|
||||||
{
|
|
||||||
htmltext = giveReputation(npc, player, Config.BLOODOATH_POINTS, BLOOD_OATH, BLOOD_OATH_COUNT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "exchange-ke":
|
|
||||||
{
|
|
||||||
htmltext = giveReputation(npc, player, Config.KNIGHTSEPAULETTE_POINTS, KNIGHTS_EPAULETTE, KNIGHTS_EPAULETTE_COUNT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
String htmltext = null;
|
|
||||||
if (player.getClanId() > 0)
|
|
||||||
{
|
|
||||||
htmltext = npc.getId() + ((player.isClanLeader() || player.hasClanPrivilege(ClanPrivilege.CL_TROOPS_FAME)) ? ".html" : "-06.html");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = npc.getId() + "-01.html";
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new ClanTrader();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,104 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.enums.ChatType;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
|
||||||
import com.l2jmobius.gameserver.network.NpcStringId;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AI for Kamaloka (33) - Crimson Hatu Otis
|
|
||||||
* @author Gladicek
|
|
||||||
*/
|
|
||||||
public final class CrimsonHatuOtis extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// Npc
|
|
||||||
private static final int CRIMSON_HATU_OTIS = 18558;
|
|
||||||
// Skills
|
|
||||||
private static SkillHolder BOSS_SPINING_SLASH = new SkillHolder(4737, 1);
|
|
||||||
private static SkillHolder BOSS_HASTE = new SkillHolder(4175, 1);
|
|
||||||
|
|
||||||
private CrimsonHatuOtis()
|
|
||||||
{
|
|
||||||
addAttackId(CRIMSON_HATU_OTIS);
|
|
||||||
addKillId(CRIMSON_HATU_OTIS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "SKILL":
|
|
||||||
{
|
|
||||||
if (npc.isDead())
|
|
||||||
{
|
|
||||||
cancelQuestTimer("SKILL", npc, null);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
npc.setTarget(player);
|
|
||||||
npc.doCast(BOSS_SPINING_SLASH.getSkill());
|
|
||||||
startQuestTimer("SKILL", 60000, npc, null);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "BUFF":
|
|
||||||
{
|
|
||||||
if (npc.isScriptValue(2))
|
|
||||||
{
|
|
||||||
npc.setTarget(npc);
|
|
||||||
npc.doCast(BOSS_HASTE.getSkill());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.onAdvEvent(event, npc, player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
|
||||||
{
|
|
||||||
if (npc.isScriptValue(0))
|
|
||||||
{
|
|
||||||
npc.setScriptValue(1);
|
|
||||||
startQuestTimer("SKILL", 5000, npc, null);
|
|
||||||
}
|
|
||||||
else if (npc.isScriptValue(1) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.3)))
|
|
||||||
{
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.I_VE_HAD_IT_UP_TO_HERE_WITH_YOU_I_LL_TAKE_CARE_OF_YOU);
|
|
||||||
npc.setScriptValue(2);
|
|
||||||
startQuestTimer("BUFF", 1000, npc, null);
|
|
||||||
}
|
|
||||||
return super.onAttack(npc, attacker, damage, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
|
|
||||||
{
|
|
||||||
cancelQuestTimer("SKILL", npc, null);
|
|
||||||
cancelQuestTimer("BUFF", npc, null);
|
|
||||||
return super.onKill(npc, player, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new CrimsonHatuOtis();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
You have not yet met the qualifications. (Requires completion of second class transfer and Clan Fame level above 40.)<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager 36479-07.html">Ask how to obtain Clan Fame points.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,7 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
Tell me what you want, and if you are worthy I will help you.<br>
|
|
||||||
If you have already <font color="LEVEL">bestowed them with a special ability</font>, <font color="LEVEL">top-grade weapons and armor</font> can be enhanced <font color="LEVEL">beyond A-Grade</font> especially for PvP combat. Once a multi-user item is specialized, you will still be able to enchant the item. However, you cannot augment, crystallize, convert or add an attribute to it.</font> Think carefully before making a decision...<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_exc_multisell 364790001">Enhance weapons and armor for PvP.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_exc_multisell 364790002">Cancel enhancement.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 364790003">Obtain consumable item.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
If you are not part of a clan, or if your clan status is too low, your victory cannot be recognized.
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
Your clan will be proud of you.
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
You have no sins for which you need to atone.
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
No matter what excuses you make, there is no justifying murder. From now on, make every effort to obey the law. Do not fail!
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
Fame comes naturally when one takes an active part in battles with others. If you have clan members with the same goal, consider participating in Castle Sieges, Fortress Battles and Clan Hall Battles. If you have party members who work extremely well together, try your luck in the Underground Coliseum Game or the Festival of Darkness. If you are alone, demonstrate your prowess by participating in the Olympiad.<br>
|
|
||||||
You can use Clan Reputation Points earned in any of the above games to help increase your clan's fame or improve your own PVP capabilities.
|
|
||||||
</body></html>
|
|
@@ -1,7 +0,0 @@
|
|||||||
<html><body>Reputation Manager Rapidus:<br>
|
|
||||||
O victorious one, have you set your next goal? I have prepared something for you. You will be awarded according to your distinguished service. What is it that you seek?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager 36479-02.html">Examine PVP exclusive items.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager decreasePk">Decrease PK count by 1 (5,000 Fame Points).</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager clanRep">Increase Clan Fame (1,000 Fame Points).</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h Quest FameManager clanRep">Quest.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
Diplomacy is sometimes wiser than fighting. Nevertheless, Warriors need power if they are to protect those who depend on them. (Requires completion of second class transfer and Clan Fame level above 40.)<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager 36480-07.html">Ask how to obtain Clan Fame points.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,8 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
If you need something, please let me know.<br>
|
|
||||||
Weapons and armor can be enhanced <font color="LEVEL">beyond Grade A</font> for <font color="LEVEL">top-grade items</font> and specialized for PvP. Weapons must have <font color="LEVEL">bestowed special abilities</font>... Once it is enhanced, an item <font color="LEVEL">can only be used by its owner</font>.<br>
|
|
||||||
And once a multi-user item is specialized, <font color="LEVEL">you can use enhanced Spellbooks, but you cannot augment, soul crystalize or convert it</font>. Be careful so that you don't have to cancel the effect.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_exc_multisell 364790001">Enhance weapons and armor for PvP.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_exc_multisell 364790002">Cancel enhancement.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 364790003">Obtain consumable item.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
Whether or not you are a member of a clan, your victory cannot be acknowledged unless you possess Clan Reputation Points. Work harder for the benefit of your clan and fame will follow.
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
You are the pride of your clan!
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
You do not need to ask for forgiveness by lowering your Clan Fame if you did not commit an offense.
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
You have committed a serious crime! No matter the circumstances, murder is inexcusable. I will forgive you this once, but do not do this again or the consequences will be dire...
|
|
||||||
</body></html>
|
|
@@ -1,5 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
Fame comes naturally when one takes an active part in battles with others. If you have clan members with the same goal, consider jointly participating in Castle Sieges, Fortress Battles and Clan Hall Battles. If you have party members who work extremely well together, try your luck in the Underground Coliseum Game or at the Festival of Darkness. If you are alone, demonstrate your prowess by participating in the Olympiad.<br>
|
|
||||||
You can use Clan Reputation Points earned in any of the above games to help increase your clan's fame or improve your own PvP capabilities.
|
|
||||||
</body></html>
|
|
||||||
|
|
@@ -1,7 +0,0 @@
|
|||||||
<html><body>Reputation Manager Scipio:<br>
|
|
||||||
Warrior, are you confident that your actions are undertaken for the sake of peace rather than to serve your own greed? If so, your reward shall be as great as your accomplishment. What do you seek?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager 36479-02.html">Examine PVP exclusive items.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager decreasePk">Decrease PK count by 1 (5,000 Fame Points).</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest FameManager clanRep">Increase Clan Fame (1,000 Fame Points).</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,127 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others.FameManager;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fame Manager AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class FameManager extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// Npc
|
|
||||||
private static final int[] FAME_MANAGER =
|
|
||||||
{
|
|
||||||
36479, // Rapidus
|
|
||||||
36480, // Scipio
|
|
||||||
};
|
|
||||||
// Misc
|
|
||||||
private static final int MIN_LVL = 40;
|
|
||||||
private static final int DECREASE_COST = 5000;
|
|
||||||
private static final int REPUTATION_COST = 1000;
|
|
||||||
private static final int MIN_CLAN_LVL = 5;
|
|
||||||
private static final int CLASS_LVL = 2;
|
|
||||||
|
|
||||||
private FameManager()
|
|
||||||
{
|
|
||||||
addStartNpc(FAME_MANAGER);
|
|
||||||
addTalkId(FAME_MANAGER);
|
|
||||||
addFirstTalkId(FAME_MANAGER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
String htmltext = null;
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "36479.html":
|
|
||||||
case "36479-02.html":
|
|
||||||
case "36479-07.html":
|
|
||||||
case "36480.html":
|
|
||||||
case "36480-02.html":
|
|
||||||
case "36480-07.html":
|
|
||||||
{
|
|
||||||
htmltext = event;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "decreasePk":
|
|
||||||
{
|
|
||||||
if (player.getPkKills() > 0)
|
|
||||||
{
|
|
||||||
if ((player.getFame() >= DECREASE_COST) && (player.getLevel() >= MIN_LVL) && (player.getClassId().level() >= CLASS_LVL))
|
|
||||||
{
|
|
||||||
player.setFame(player.getFame() - DECREASE_COST);
|
|
||||||
player.setPkKills(player.getPkKills() - 1);
|
|
||||||
player.sendPacket(new UserInfo(player));
|
|
||||||
htmltext = npc.getId() + "-06.html";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = npc.getId() + "-01.html";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = npc.getId() + "-05.html";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "clanRep":
|
|
||||||
{
|
|
||||||
if ((player.getClan() != null) && (player.getClan().getLevel() >= MIN_CLAN_LVL))
|
|
||||||
{
|
|
||||||
if ((player.getFame() >= REPUTATION_COST) && (player.getLevel() >= MIN_LVL) && (player.getClassId().level() >= CLASS_LVL))
|
|
||||||
{
|
|
||||||
player.setFame(player.getFame() - REPUTATION_COST);
|
|
||||||
player.getClan().addReputationScore(50, true);
|
|
||||||
player.sendPacket(new UserInfo(player));
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ACQUIRED_50_CLAN_REPUTATION);
|
|
||||||
htmltext = npc.getId() + "-04.html";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = npc.getId() + "-01.html";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = npc.getId() + "-03.html";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
return ((player.getFame() > 0) && (player.getLevel() >= MIN_LVL) && (player.getClassId().level() >= CLASS_LVL)) ? npc.getId() + ".html" : npc.getId() + "-01.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new FameManager();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Treasure seeker Sumiel:<br>
|
|
||||||
Is it hard? Yeah, true. Looking at the torch, we can do it about two more times. You using the lighting skill on the lighted torch?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Minigame restart">Restart Mini Game</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Treasure seeker Sumiel:<br>
|
|
||||||
Last time. Concentrate on the treasure to appear. We can't try if the torch is all burnt.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Minigame restart">Restart Mini Game</Button>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Treasure Seeker Sumiel:<br>
|
|
||||||
Now's not the time. There's another adventurer trying. Wait your turn! Haha!
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Treasure Seeker Sumiel:<br>
|
|
||||||
No, there's none. You have to light it the moment the furnace is turned on.
|
|
||||||
</body></html>
|
|
@@ -1,5 +0,0 @@
|
|||||||
<html><body>Treasure seeker Sumiel:<br>
|
|
||||||
Is that so? If you say so... so what else can I do for you?<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Minigame teleport1">Teleport outside the door.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Minigame teleport2">Teleport to Greymore</Button>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Treasure seeker Sumiel:<br>
|
|
||||||
Ha, ha, you're funny. Since you started already, light up the rest.
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>Treasure seeker Sumiel:<br>
|
|
||||||
Ekoo... wait. I'm not ready yet. I need to clean up, this equipment has fingerprints all over it! Give me <font color="LEVEL">3 minutes</font>, I'll be ready then.<br>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>Treasure seeker Sumiel:<br>
|
|
||||||
Success! You've found this room, wandered around this Monastery of Silence for a long time, got lost, got hungry, found your way here now, haven't you? Trust me when I say I don't know where the treasure is. I'd be long gone if I did. But I've had time to look, and I think there is a connection in the turning order of this furnace... I think we can solve the puzzle if we have an item to light. Do you want to give it a try? Tricky part is this, we have to light it within a certain time...<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Minigame restart">Say you will try.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Minigame 32758-06.html">Say you don't have time for this jibber jabber, so you want to get out.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
|
||||||
</body></html>
|
|
@@ -1,530 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others.Minigame;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.datatables.SpawnTable;
|
|
||||||
import com.l2jmobius.gameserver.enums.ChatType;
|
|
||||||
import com.l2jmobius.gameserver.model.L2Object;
|
|
||||||
import com.l2jmobius.gameserver.model.L2Spawn;
|
|
||||||
import com.l2jmobius.gameserver.model.Location;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.model.events.EventType;
|
|
||||||
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureSkillFinishCast;
|
|
||||||
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
|
|
||||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
|
||||||
import com.l2jmobius.gameserver.network.NpcStringId;
|
|
||||||
import com.l2jmobius.gameserver.util.Util;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Monastery Minigame AI.
|
|
||||||
* @author nonom
|
|
||||||
*/
|
|
||||||
public final class Minigame extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
private static final int SUMIEL = 32758;
|
|
||||||
private static final int BURNER = 18913;
|
|
||||||
private static final int TREASURE_BOX = 18911;
|
|
||||||
|
|
||||||
private static final int UNLIT_TORCHLIGHT = 15540;
|
|
||||||
private static final int TORCHLIGHT = 15485;
|
|
||||||
|
|
||||||
private static final int SKILL_TORCH_LIGHT = 9059;
|
|
||||||
private static final SkillHolder TRIGGER_MIRAGE = new SkillHolder(5144, 1);
|
|
||||||
|
|
||||||
private static final Location TELEPORT1 = new Location(113187, -85388, -3424, 0);
|
|
||||||
private static final Location TELEPORT2 = new Location(118833, -80589, -2688, 0);
|
|
||||||
|
|
||||||
private static final int TIMER_INTERVAL = 3;
|
|
||||||
private static final int MAX_ATTEMPTS = 3;
|
|
||||||
|
|
||||||
private final List<MinigameRoom> _rooms = new ArrayList<>(2);
|
|
||||||
|
|
||||||
private Minigame()
|
|
||||||
{
|
|
||||||
addStartNpc(SUMIEL);
|
|
||||||
addFirstTalkId(SUMIEL);
|
|
||||||
addTalkId(SUMIEL);
|
|
||||||
addSpawnId(SUMIEL, TREASURE_BOX);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
final MinigameRoom room = getRoomByManager(npc);
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "restart":
|
|
||||||
{
|
|
||||||
final boolean miniGameStarted = room.getStarted();
|
|
||||||
if (!miniGameStarted && !hasQuestItems(player, UNLIT_TORCHLIGHT))
|
|
||||||
{
|
|
||||||
return "32758-05.html";
|
|
||||||
}
|
|
||||||
else if ((npc.getTarget() != null) && (npc.getTarget() != player))
|
|
||||||
{
|
|
||||||
return "32758-04.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
takeItems(player, UNLIT_TORCHLIGHT, 1);
|
|
||||||
giveItems(player, TORCHLIGHT, 1);
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.I_LL_START_THE_FURNACE_MECHANISM_WATCH_FOR_THE_PATTERN);
|
|
||||||
|
|
||||||
room.getManager().setTarget(player);
|
|
||||||
room.setParticipant(player);
|
|
||||||
room.setStarted(true);
|
|
||||||
for (int i = 0; i < 9; i++)
|
|
||||||
{
|
|
||||||
room.getOrder()[i] = getRandom(8);
|
|
||||||
}
|
|
||||||
cancelQuestTimer("hurry_up", npc, null);
|
|
||||||
cancelQuestTimer("hurry_up2", npc, null);
|
|
||||||
cancelQuestTimer("expire", npc, null);
|
|
||||||
|
|
||||||
startQuestTimer("hurry_up", 120000, npc, null);
|
|
||||||
startQuestTimer("expire", 190000, npc, null);
|
|
||||||
startQuestTimer("start", 1000, npc, null);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
case "off":
|
|
||||||
{
|
|
||||||
if (npc.getId() == BURNER)
|
|
||||||
{
|
|
||||||
npc.setDisplayEffect(2);
|
|
||||||
npc.setIsRunning(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (L2Npc burner : room.getBurners())
|
|
||||||
{
|
|
||||||
burner.setDisplayEffect(2);
|
|
||||||
burner.setIsRunning(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "teleport1":
|
|
||||||
{
|
|
||||||
player.teleToLocation(TELEPORT1, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "teleport2":
|
|
||||||
{
|
|
||||||
player.teleToLocation(TELEPORT2, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "start":
|
|
||||||
{
|
|
||||||
room.burnThemAll();
|
|
||||||
startQuestTimer("off", 2000, npc, null); // It should be null to stop burnthemAll 2s after
|
|
||||||
startQuestTimer("timer", 4000, npc, null);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "timer":
|
|
||||||
{
|
|
||||||
if (room.getCurrentPot() < 9)
|
|
||||||
{
|
|
||||||
final L2Npc b = room.getBurners()[room.getOrder()[room.getCurrentPot()]];
|
|
||||||
b.setDisplayEffect(1);
|
|
||||||
b.setIsRunning(false);
|
|
||||||
startQuestTimer("off", 2000, b, null); // Stopping burning each pot 2s after
|
|
||||||
startQuestTimer("timer", TIMER_INTERVAL * 1000, npc, null);
|
|
||||||
room.setCurrentPot(room.getCurrentPot() + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
room.getManager().broadcastSay(ChatType.NPC_GENERAL, NpcStringId.NOW_LIGHT_THE_FURNACES_IN_THE_CORRECT_ORDER);
|
|
||||||
room.burnThemAll();
|
|
||||||
startQuestTimer("off", 2000, npc, null);
|
|
||||||
final ConsumerEventListener listener = new ConsumerEventListener(room.getParticipant(), EventType.ON_CREATURE_SKILL_FINISH_CAST, (OnCreatureSkillFinishCast listenerEvent) -> onSkillUse(listenerEvent), room);
|
|
||||||
room.getParticipant().addListener(listener);
|
|
||||||
room.setCurrentPot(0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "hurry_up":
|
|
||||||
{
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ONLY_1_MINUTE_LEFT);
|
|
||||||
startQuestTimer("hurry_up2", 60000, npc, null);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "hurry_up2":
|
|
||||||
{
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.JUST_10_SECONDS_LEFT);
|
|
||||||
startQuestTimer("expire", 10000, npc, null);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "expire":
|
|
||||||
{
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.TOO_LATE_THE_TORCH_HAS_RUN_OUT_MAYBE_NEXT_TIME);
|
|
||||||
}
|
|
||||||
case "end":
|
|
||||||
{
|
|
||||||
cancelQuestTimer("expire", npc, null);
|
|
||||||
cancelQuestTimer("hurry_up", npc, null);
|
|
||||||
cancelQuestTimer("hurry_up2", npc, null);
|
|
||||||
room.getManager().setTarget(null);
|
|
||||||
room.setParticipant(null);
|
|
||||||
room.setStarted(false);
|
|
||||||
room.setAttemptNumber(1);
|
|
||||||
room.setCurrentPot(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "afterthat":
|
|
||||||
{
|
|
||||||
npc.deleteMe();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onFirstTalk(L2Npc npc, L2PcInstance talker)
|
|
||||||
{
|
|
||||||
String htmltext = null;
|
|
||||||
final MinigameRoom room = getRoomByManager(npc);
|
|
||||||
final boolean miniGameStarted = room.getStarted();
|
|
||||||
|
|
||||||
if (npc.getTarget() == null)
|
|
||||||
{
|
|
||||||
htmltext = (miniGameStarted ? "32758-08.html" : "32758.html");
|
|
||||||
}
|
|
||||||
else if (npc.getTarget() == talker)
|
|
||||||
{
|
|
||||||
if (miniGameStarted)
|
|
||||||
{
|
|
||||||
htmltext = "32758-07.html";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final int attemptNumber = room.getAttemptNumber();
|
|
||||||
|
|
||||||
if (attemptNumber == 2)
|
|
||||||
{
|
|
||||||
htmltext = "32758-02.html";
|
|
||||||
}
|
|
||||||
else if (attemptNumber == 3)
|
|
||||||
{
|
|
||||||
htmltext = "32758-03.html";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "32758-04.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpawn(L2Npc npc)
|
|
||||||
{
|
|
||||||
switch (npc.getId())
|
|
||||||
{
|
|
||||||
case SUMIEL:
|
|
||||||
{
|
|
||||||
_rooms.add(initRoom(npc));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TREASURE_BOX:
|
|
||||||
{
|
|
||||||
npc.disableCoreAI(true);
|
|
||||||
startQuestTimer("afterthat", 180000, npc, null);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.onSpawn(npc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onSkillUse(OnCreatureSkillFinishCast event)
|
|
||||||
{
|
|
||||||
final MinigameRoom room = getRoomByParticipant((L2PcInstance) event.getCaster());
|
|
||||||
final boolean miniGameStarted = room.getStarted();
|
|
||||||
if (miniGameStarted && (event.getSkill().getId() == SKILL_TORCH_LIGHT))
|
|
||||||
{
|
|
||||||
final L2Object obj = event.getTarget();
|
|
||||||
if ((obj != null) && obj.isNpc())
|
|
||||||
{
|
|
||||||
final L2Npc npc = (L2Npc) obj;
|
|
||||||
if (npc.getId() == BURNER)
|
|
||||||
{
|
|
||||||
npc.doCast(TRIGGER_MIRAGE.getSkill());
|
|
||||||
final int pos = room.getBurnerPos(npc);
|
|
||||||
if (pos == room.getOrder()[room.getCurrentPot()])
|
|
||||||
{
|
|
||||||
if (room.getCurrentPot() < 8)
|
|
||||||
{
|
|
||||||
npc.setDisplayEffect(1);
|
|
||||||
npc.setIsRunning(false);
|
|
||||||
startQuestTimer("off", 2000, npc, null);
|
|
||||||
room.setCurrentPot(room.getCurrentPot() + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
addSpawn(TREASURE_BOX, room.getParticipant().getLocation(), true, 0);
|
|
||||||
room.getManager().broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THAT_S_IT_YOU_VE_DONE_IT);
|
|
||||||
room.setCurrentPot(0);
|
|
||||||
room.burnThemAll();
|
|
||||||
startQuestTimer("off", 2000, room.getManager(), null);
|
|
||||||
startQuestTimer("end", 4000, room.getManager(), null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (room.getAttemptNumber() == MAX_ATTEMPTS)
|
|
||||||
{
|
|
||||||
room.getManager().broadcastSay(ChatType.NPC_GENERAL, NpcStringId.I_VE_FAILED_ANY_FURTHER_ATTEMPTS_WOULD_BE_WASTEFUL);
|
|
||||||
room.burnThemAll();
|
|
||||||
startQuestTimer("off", 2000, room.getManager(), null);
|
|
||||||
room.getParticipant().removeListenerIf(EventType.ON_CREATURE_SKILL_USE, listener -> listener.getOwner() == room);
|
|
||||||
startQuestTimer("end", 4000, room.getManager(), null);
|
|
||||||
}
|
|
||||||
else if (room.getAttemptNumber() < MAX_ATTEMPTS)
|
|
||||||
{
|
|
||||||
room.getManager().broadcastSay(ChatType.NPC_GENERAL, NpcStringId.TOO_BAD_I_WILL_NOT_GIVE_UP_ON_THIS_THOUGH);
|
|
||||||
room.burnThemAll();
|
|
||||||
startQuestTimer("off", 2000, room.getManager(), null);
|
|
||||||
room.setAttemptNumber(room.getAttemptNumber() + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create and initialize a MinigameRoom<br>
|
|
||||||
* It's loading the nearby pots around the game instructor NPC.<br>
|
|
||||||
* TODO: Load the pot_number value from npc ai_params.
|
|
||||||
* @param manager the NPC instructor
|
|
||||||
* @return MinigameRoom
|
|
||||||
*/
|
|
||||||
private MinigameRoom initRoom(L2Npc manager)
|
|
||||||
{
|
|
||||||
final L2Npc[] burners = new L2Npc[9];
|
|
||||||
L2Npc lastSpawn;
|
|
||||||
int potNumber = 0;
|
|
||||||
|
|
||||||
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(BURNER))
|
|
||||||
{
|
|
||||||
lastSpawn = spawn.getLastSpawn();
|
|
||||||
if ((potNumber <= 8) && Util.checkIfInRange(1000, manager, lastSpawn, false))
|
|
||||||
{
|
|
||||||
lastSpawn.setAutoAttackable(true);
|
|
||||||
burners[potNumber++] = lastSpawn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new MinigameRoom(burners, manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a MinigameRoom by game instructor
|
|
||||||
* @param manager the NPC instructor
|
|
||||||
* @return MinigameRoom
|
|
||||||
*/
|
|
||||||
private MinigameRoom getRoomByManager(L2Npc manager)
|
|
||||||
{
|
|
||||||
for (MinigameRoom room : _rooms)
|
|
||||||
{
|
|
||||||
if (room.getManager() == manager)
|
|
||||||
{
|
|
||||||
return room;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a MinigameRoom by participant
|
|
||||||
* @param participant the L2PcInstance participating
|
|
||||||
* @return MinigameRoom
|
|
||||||
*/
|
|
||||||
private MinigameRoom getRoomByParticipant(L2PcInstance participant)
|
|
||||||
{
|
|
||||||
for (MinigameRoom room : _rooms)
|
|
||||||
{
|
|
||||||
if (room.getParticipant() == participant)
|
|
||||||
{
|
|
||||||
return room;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An object that holds the participant, manager, burning order<br>
|
|
||||||
* and game status for each secret room into Monastery of Silence.
|
|
||||||
*/
|
|
||||||
private class MinigameRoom
|
|
||||||
{
|
|
||||||
private final L2Npc[] _burners;
|
|
||||||
private final L2Npc _manager;
|
|
||||||
private L2PcInstance _participant;
|
|
||||||
private boolean _started;
|
|
||||||
private int _attemptNumber;
|
|
||||||
private int _currentPot;
|
|
||||||
private final int _order[];
|
|
||||||
|
|
||||||
public MinigameRoom(L2Npc[] burners, L2Npc manager)
|
|
||||||
{
|
|
||||||
_burners = burners;
|
|
||||||
_manager = manager;
|
|
||||||
_participant = null;
|
|
||||||
_started = false;
|
|
||||||
_attemptNumber = 1;
|
|
||||||
_currentPot = 0;
|
|
||||||
_order = new int[9];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the burner position into the array
|
|
||||||
* @param npc the L2Npc burner
|
|
||||||
* @return the array index
|
|
||||||
*/
|
|
||||||
public int getBurnerPos(L2Npc npc)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 9; i++)
|
|
||||||
{
|
|
||||||
if (npc.equals(_burners[i]))
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Burn all the pots into the room
|
|
||||||
*/
|
|
||||||
public void burnThemAll()
|
|
||||||
{
|
|
||||||
for (L2Npc burner : _burners)
|
|
||||||
{
|
|
||||||
burner.setDisplayEffect(1);
|
|
||||||
burner.setIsRunning(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a list of burners
|
|
||||||
* @return An array of L2Npcs
|
|
||||||
*/
|
|
||||||
public L2Npc[] getBurners()
|
|
||||||
{
|
|
||||||
return _burners;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the current game manager
|
|
||||||
* @return The L2Npc game instructor
|
|
||||||
*/
|
|
||||||
public L2Npc getManager()
|
|
||||||
{
|
|
||||||
return _manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the current game participant
|
|
||||||
* @return The L2PcInstance who is participating
|
|
||||||
*/
|
|
||||||
public L2PcInstance getParticipant()
|
|
||||||
{
|
|
||||||
return _participant;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current participant
|
|
||||||
* @param participant The L2PcInstance participating
|
|
||||||
*/
|
|
||||||
public void setParticipant(L2PcInstance participant)
|
|
||||||
{
|
|
||||||
_participant = participant;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the MinigameRoom status
|
|
||||||
* @return {@code true} if the game is started, {@code false} otherwise
|
|
||||||
*/
|
|
||||||
public boolean getStarted()
|
|
||||||
{
|
|
||||||
return _started;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the MinigameRoom status
|
|
||||||
* @param started The game status {@code true} if the game is started, {@code false} otherwise
|
|
||||||
*/
|
|
||||||
public void setStarted(boolean started)
|
|
||||||
{
|
|
||||||
_started = started;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the current burner position
|
|
||||||
* @return The array index
|
|
||||||
*/
|
|
||||||
public int getCurrentPot()
|
|
||||||
{
|
|
||||||
return _currentPot;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current burner position
|
|
||||||
* @param pot The position
|
|
||||||
*/
|
|
||||||
public void setCurrentPot(int pot)
|
|
||||||
{
|
|
||||||
_currentPot = pot;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the current attempt Number
|
|
||||||
* @return The attempt number
|
|
||||||
*/
|
|
||||||
public int getAttemptNumber()
|
|
||||||
{
|
|
||||||
return _attemptNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the attempt number
|
|
||||||
* @param attempt attempt number
|
|
||||||
*/
|
|
||||||
public void setAttemptNumber(int attempt)
|
|
||||||
{
|
|
||||||
_attemptNumber = attempt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the burning order
|
|
||||||
* @return an array of Ids
|
|
||||||
*/
|
|
||||||
public int[] getOrder()
|
|
||||||
{
|
|
||||||
return _order;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new Minigame();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,155 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.enums.ChatType;
|
|
||||||
import com.l2jmobius.gameserver.model.L2Object;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
|
||||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jmobius.gameserver.network.NpcStringId;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prison Guards AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class PrisonGuards extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int GUARD_HEAD = 18367; // Prison Guard
|
|
||||||
private static final int GUARD = 18368; // Prison Guard
|
|
||||||
// Item
|
|
||||||
private static final int STAMP = 10013; // Race Stamp
|
|
||||||
// Skills
|
|
||||||
private static final int TIMER = 5239; // Event Timer
|
|
||||||
private static final SkillHolder STONE = new SkillHolder(4578, 1); // Petrification
|
|
||||||
private static final SkillHolder SILENCE = new SkillHolder(4098, 9); // Silence
|
|
||||||
|
|
||||||
private PrisonGuards()
|
|
||||||
{
|
|
||||||
addAttackId(GUARD_HEAD, GUARD);
|
|
||||||
addSpawnId(GUARD_HEAD, GUARD);
|
|
||||||
addNpcHateId(GUARD);
|
|
||||||
addSkillSeeId(GUARD);
|
|
||||||
addSpellFinishedId(GUARD_HEAD, GUARD);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
if (event.equals("CLEAR_STATUS"))
|
|
||||||
{
|
|
||||||
npc.setScriptValue(0);
|
|
||||||
}
|
|
||||||
else if (event.equals("CHECK_HOME"))
|
|
||||||
{
|
|
||||||
if ((npc.calculateDistance(npc.getSpawn().getLocation(), false, false) > 10) && !npc.isInCombat() && !npc.isDead())
|
|
||||||
{
|
|
||||||
npc.teleToLocation(npc.getSpawn().getLocation());
|
|
||||||
}
|
|
||||||
startQuestTimer("CHECK_HOME", 30000, npc, null);
|
|
||||||
}
|
|
||||||
return super.onAdvEvent(event, npc, player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon)
|
|
||||||
{
|
|
||||||
if (npc.getId() == GUARD_HEAD)
|
|
||||||
{
|
|
||||||
if (player.isAffectedBySkill(TIMER))
|
|
||||||
{
|
|
||||||
if ((getRandom(100) < 10) && (npc.calculateDistance(player, true, false) < 100))
|
|
||||||
{
|
|
||||||
if ((getQuestItemsCount(player, STAMP) <= 3) && npc.isScriptValue(0))
|
|
||||||
{
|
|
||||||
giveItems(player, STAMP, 1);
|
|
||||||
npc.setScriptValue(1);
|
|
||||||
startQuestTimer("CLEAR_STATUS", 600000, npc, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
npc.setTarget(player);
|
|
||||||
npc.doCast(STONE.getSkill());
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.IT_S_NOT_EASY_TO_OBTAIN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!player.isAffectedBySkill(TIMER) && (npc.calculateDistance(npc.getSpawn().getLocation(), false, false) < 2000))
|
|
||||||
{
|
|
||||||
npc.setTarget(player);
|
|
||||||
npc.doCast(STONE.getSkill());
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.YOU_RE_OUT_OF_YOUR_MIND_COMING_HERE);
|
|
||||||
}
|
|
||||||
return super.onAttack(npc, player, damage, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon)
|
|
||||||
{
|
|
||||||
if (!caster.isAffectedBySkill(TIMER))
|
|
||||||
{
|
|
||||||
npc.setTarget(caster);
|
|
||||||
npc.doCast(SILENCE.getSkill());
|
|
||||||
}
|
|
||||||
return super.onSkillSee(npc, caster, skill, targets, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
|
|
||||||
{
|
|
||||||
if ((skill == SILENCE.getSkill()) || (skill == STONE.getSkill()))
|
|
||||||
{
|
|
||||||
((L2Attackable) npc).clearAggroList();
|
|
||||||
npc.setTarget(npc);
|
|
||||||
}
|
|
||||||
return super.onSpellFinished(npc, player, skill);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onNpcHate(L2Attackable mob, L2PcInstance player, boolean isSummon)
|
|
||||||
{
|
|
||||||
return player.isAffectedBySkill(TIMER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpawn(L2Npc npc)
|
|
||||||
{
|
|
||||||
if (npc.getId() == GUARD_HEAD)
|
|
||||||
{
|
|
||||||
npc.setIsImmobilized(true);
|
|
||||||
npc.setIsInvul(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
npc.setRandomWalking(true);
|
|
||||||
cancelQuestTimer("CHECK_HOME", npc, null);
|
|
||||||
startQuestTimer("CHECK_HOME", 30000, npc, null);
|
|
||||||
}
|
|
||||||
return super.onSpawn(npc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new PrisonGuards();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scarecrow AI.
|
|
||||||
* @author ivantotov
|
|
||||||
*/
|
|
||||||
public final class Scarecrow extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int TRAINING_DUMMY = 19546;
|
|
||||||
private static final int SCARECROW = 27457;
|
|
||||||
private static final int PHYSICAL_PUNCH_MACHINE = 33752;
|
|
||||||
private static final int MAGICAL_PUNCH_MACHINE = 33753;
|
|
||||||
|
|
||||||
private Scarecrow()
|
|
||||||
{
|
|
||||||
addSpawnId(TRAINING_DUMMY, SCARECROW, PHYSICAL_PUNCH_MACHINE, MAGICAL_PUNCH_MACHINE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpawn(L2Npc npc)
|
|
||||||
{
|
|
||||||
npc.disableCoreAI(true);
|
|
||||||
npc.setIsImmobilized(true);
|
|
||||||
return super.onSpawn(npc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new Scarecrow();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,282 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others.SupportUnitCaptain;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.model.ClanPrivilege;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.network.clientpackets.RequestAcquireSkill;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Support Unit Captain AI.
|
|
||||||
* @author St3eT
|
|
||||||
*/
|
|
||||||
public final class SupportUnitCaptain extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// NPCs
|
|
||||||
private static final int[] UNIT_CAPTAIN =
|
|
||||||
{
|
|
||||||
35662, // Shanty Fortress
|
|
||||||
35694, // Southern Fortress
|
|
||||||
35731, // Hive Fortress
|
|
||||||
35763, // Valley Fortress
|
|
||||||
35800, // Ivory Fortress
|
|
||||||
35831, // Narsell Fortress
|
|
||||||
35863, // Bayou Fortress
|
|
||||||
35900, // White Sands Fortress
|
|
||||||
35932, // Borderland Fortress
|
|
||||||
35970, // Swamp Fortress
|
|
||||||
36007, // Archaic Fortress
|
|
||||||
36039, // Floran Fortress
|
|
||||||
36077, // Cloud Mountain
|
|
||||||
36114, // Tanor Fortress
|
|
||||||
36145, // Dragonspine Fortress
|
|
||||||
36177, // Antharas's Fortress
|
|
||||||
36215, // Western Fortress
|
|
||||||
36253, // Hunter's Fortress
|
|
||||||
36290, // Aaru Fortress
|
|
||||||
36322, // Demon Fortress
|
|
||||||
36360, // Monastic Fortress
|
|
||||||
};
|
|
||||||
// Items
|
|
||||||
private static final int EPAULETTE = 9912; // Knight's Epaulette
|
|
||||||
private static final int RED_MEDITATION = 9931; // Red Talisman of Meditation
|
|
||||||
private static final int BLUE_DIV_PROTECTION = 9932; // Blue Talisman - Divine Protection
|
|
||||||
private static final int BLUE_EXPLOSION = 10416; // Blue Talisman - Explosion
|
|
||||||
private static final int BLUE_M_EXPLOSION = 10417; // Blue Talisman - Magic Explosion
|
|
||||||
private static final int RED_MIN_CLARITY = 9917; // Red Talisman of Minimum Clarity
|
|
||||||
private static final int RED_MAX_CLARITY = 9918; // Red Talisman of Maximum Clarity
|
|
||||||
private static final int RED_MENTAL_REG = 9928; // Red Talisman of Mental Regeneration
|
|
||||||
private static final int BLUE_PROTECTION = 9929; // Blue Talisman of Protection
|
|
||||||
private static final int BLUE_INVIS = 9920; // Blue Talisman of Invisibility
|
|
||||||
private static final int BLUE_DEFENSE = 9916; // Blue Talisman of Defense
|
|
||||||
private static final int BLACK_ESCAPE = 9923; // Black Talisman - Escape
|
|
||||||
private static final int BLUE_HEALING = 9924; // Blue Talisman of Healing
|
|
||||||
private static final int RED_RECOVERY = 9925; // Red Talisman of Recovery
|
|
||||||
private static final int BLUE_DEFENSE2 = 9926; // Blue Talisman of Defense
|
|
||||||
private static final int BLUE_M_DEFENSE = 9927; // Blue Talisman of Magic Defense
|
|
||||||
private static final int RED_LIFE_FORCE = 10518; // Red Talisman - Life Force
|
|
||||||
private static final int BLUE_GREAT_HEALING = 10424; // Blue Talisman - Greater Healing
|
|
||||||
private static final int WHITE_FIRE = 10421; // White Talisman - Fire
|
|
||||||
private static final int[] COMMON_TALISMANS =
|
|
||||||
{
|
|
||||||
9914, // Blue Talisman of Power
|
|
||||||
9915, // Blue Talisman of Wild Magic
|
|
||||||
9920, // Blue Talisman of Invisibility
|
|
||||||
9921, // Blue Talisman - Shield Protection
|
|
||||||
9922, // Black Talisman - Mending
|
|
||||||
9933, // Yellow Talisman of Power
|
|
||||||
9934, // Yellow Talisman of Violent Haste
|
|
||||||
9935, // Yellow Talisman of Arcane Defense
|
|
||||||
9936, // Yellow Talisman of Arcane Power
|
|
||||||
9937, // Yellow Talisman of Arcane Haste
|
|
||||||
9938, // Yellow Talisman of Accuracy
|
|
||||||
9939, // Yellow Talisman of Defense
|
|
||||||
9940, // Yellow Talisman of Alacrity
|
|
||||||
9941, // Yellow Talisman of Speed
|
|
||||||
9942, // Yellow Talisman of Critical Reduction
|
|
||||||
9943, // Yellow Talisman of Critical Damage
|
|
||||||
9944, // Yellow Talisman of Critical Dodging
|
|
||||||
9945, // Yellow Talisman of Evasion
|
|
||||||
9946, // Yellow Talisman of Healing
|
|
||||||
9947, // Yellow Talisman of CP Regeneration
|
|
||||||
9948, // Yellow Talisman of Physical Regeneration
|
|
||||||
9949, // Yellow Talisman of Mental Regeneration
|
|
||||||
9950, // Grey Talisman of Weight Training
|
|
||||||
9952, // Orange Talisman - Hot Springs CP Potion
|
|
||||||
9953, // Orange Talisman - Elixir of Life
|
|
||||||
9954, // Orange Talisman - Elixir of Mental Strength
|
|
||||||
9955, // Black Talisman - Vocalization
|
|
||||||
9956, // Black Talisman - Arcane Freedom
|
|
||||||
9957, // Black Talisman - Physical Freedom
|
|
||||||
9958, // Black Talisman - Rescue
|
|
||||||
9959, // Black Talisman - Free Speech
|
|
||||||
9960, // White Talisman of Bravery
|
|
||||||
9961, // White Talisman of Motion
|
|
||||||
9962, // White Talisman of Grounding
|
|
||||||
9963, // White Talisman of Attention
|
|
||||||
9964, // White Talisman of Bandages
|
|
||||||
9965, // White Talisman of Protection
|
|
||||||
10418, // White Talisman - Storm
|
|
||||||
10420, // White Talisman - Water
|
|
||||||
10519, // White Talisman - Earth
|
|
||||||
10422, // White Talisman - Light
|
|
||||||
10423, // Blue Talisman - Self-Destruction
|
|
||||||
};
|
|
||||||
|
|
||||||
private SupportUnitCaptain()
|
|
||||||
{
|
|
||||||
addStartNpc(UNIT_CAPTAIN);
|
|
||||||
addTalkId(UNIT_CAPTAIN);
|
|
||||||
addFirstTalkId(UNIT_CAPTAIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
final int fortOwner = npc.getFort().getOwnerClan() == null ? 0 : npc.getFort().getOwnerClan().getId();
|
|
||||||
if ((player.getClan() == null) || (player.getClanId() != fortOwner))
|
|
||||||
{
|
|
||||||
return "unitcaptain-04.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
String htmltext = null;
|
|
||||||
int itemId = 0;
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "unitcaptain.html":
|
|
||||||
case "unitcaptain-01.html":
|
|
||||||
{
|
|
||||||
htmltext = event;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "giveTalisman":
|
|
||||||
{
|
|
||||||
if (getQuestItemsCount(player, EPAULETTE) < 10)
|
|
||||||
{
|
|
||||||
htmltext = "unitcaptain-05.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int categoryChance = getRandom(100);
|
|
||||||
if (categoryChance <= 5)
|
|
||||||
{
|
|
||||||
final int chance = getRandom(100);
|
|
||||||
if (chance <= 25)
|
|
||||||
{
|
|
||||||
itemId = RED_MEDITATION;
|
|
||||||
}
|
|
||||||
else if (chance <= 50)
|
|
||||||
{
|
|
||||||
itemId = BLUE_DIV_PROTECTION;
|
|
||||||
}
|
|
||||||
else if (chance <= 75)
|
|
||||||
{
|
|
||||||
itemId = BLUE_EXPLOSION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = BLUE_M_EXPLOSION;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (categoryChance <= 15)
|
|
||||||
{
|
|
||||||
final int chance = getRandom(100);
|
|
||||||
if (chance <= 20)
|
|
||||||
{
|
|
||||||
itemId = RED_MIN_CLARITY;
|
|
||||||
}
|
|
||||||
else if (chance <= 40)
|
|
||||||
{
|
|
||||||
itemId = RED_MAX_CLARITY;
|
|
||||||
}
|
|
||||||
else if (chance <= 60)
|
|
||||||
{
|
|
||||||
itemId = RED_MENTAL_REG;
|
|
||||||
}
|
|
||||||
else if (chance <= 80)
|
|
||||||
{
|
|
||||||
itemId = BLUE_PROTECTION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = BLUE_INVIS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (categoryChance <= 30)
|
|
||||||
{
|
|
||||||
final int chance = getRandom(100);
|
|
||||||
if (chance <= 12)
|
|
||||||
{
|
|
||||||
itemId = BLUE_DEFENSE;
|
|
||||||
}
|
|
||||||
else if (chance <= 25)
|
|
||||||
{
|
|
||||||
itemId = BLACK_ESCAPE;
|
|
||||||
}
|
|
||||||
else if (chance <= 37)
|
|
||||||
{
|
|
||||||
itemId = BLUE_HEALING;
|
|
||||||
}
|
|
||||||
else if (chance <= 50)
|
|
||||||
{
|
|
||||||
itemId = RED_RECOVERY;
|
|
||||||
}
|
|
||||||
else if (chance <= 62)
|
|
||||||
{
|
|
||||||
itemId = BLUE_DEFENSE2;
|
|
||||||
}
|
|
||||||
else if (chance <= 75)
|
|
||||||
{
|
|
||||||
itemId = BLUE_M_DEFENSE;
|
|
||||||
}
|
|
||||||
else if (chance <= 87)
|
|
||||||
{
|
|
||||||
itemId = RED_LIFE_FORCE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = BLUE_GREAT_HEALING;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final int chance = getRandom(46);
|
|
||||||
if (chance <= 41)
|
|
||||||
{
|
|
||||||
itemId = COMMON_TALISMANS[chance];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemId = WHITE_FIRE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
takeItems(player, EPAULETTE, 10);
|
|
||||||
giveItems(player, itemId, 1);
|
|
||||||
htmltext = "unitcaptain-02.html";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "squadSkill":
|
|
||||||
{
|
|
||||||
if (player.isClanLeader() || player.hasClanPrivilege(ClanPrivilege.CL_TROOPS_FAME))
|
|
||||||
{
|
|
||||||
RequestAcquireSkill.showSubUnitSkillList(player);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "unitcaptain-03.html";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
final int fortOwner = npc.getFort().getOwnerClan() == null ? 0 : npc.getFort().getOwnerClan().getId();
|
|
||||||
return ((player.getClan() != null) && (player.getClanId() == fortOwner)) ? "unitcaptain.html" : "unitcaptain-04.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new SupportUnitCaptain();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
The Talisman is both magical and mysterious. Once applied to your bracelet, you will be able to see its surprising effect for yourself. Before I can give it to you, however, you must prove to me that you are capable of responsibly wielding such power. Give me <font color = "LEVEL">10 Knight's Epaulettes</font> and I will provide you the Talisman.<br><br><br>
|
|
||||||
<center>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest SupportUnitCaptain giveTalisman">Give Knight's Epaulettes.</Button>
|
|
||||||
</center>
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Very well. Here you go!
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
If you cannot prove your worthiness, I cannot give it to you. Please leave!
|
|
||||||
</body></html>
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Can't you see that I am busy? Continue to bother me and you'll finish your days as a toad in the castle pond!<br><br>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
You do not have enough Knight's Epaulettes.<br><br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest SupportUnitCaptain unitcaptain.html">Back.</Button><br>
|
|
||||||
</body></html>
|
|
@@ -1,11 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Magic is intertwined with the very fabric of our world, affecting not only large-scale events like wars but also the mundane tasks of daily life.<br><br><br>
|
|
||||||
<center>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 90001001">Purchase necessary items.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 90001002">Purchase bracelet.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 90001003">Purchase shirt.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_exc_multisell 90001004">Trade with enchanted shirt.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest SupportUnitCaptain unitcaptain-01.html">Obtain Talisman.</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest SupportUnitCaptain squadSkill">Learn special skills for low-ranking soldiers.</Button>
|
|
||||||
</center>
|
|
||||||
</body></html>
|
|
@@ -1,139 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package ai.others;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.ai.CtrlEvent;
|
|
||||||
import com.l2jmobius.gameserver.enums.ChatType;
|
|
||||||
import com.l2jmobius.gameserver.model.L2Object;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.network.NpcStringId;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Warrior Fishing Block AI.
|
|
||||||
* @author Zoey76
|
|
||||||
*/
|
|
||||||
public final class WarriorFishingBlock extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// Monsters
|
|
||||||
private static final int[] MONSTERS =
|
|
||||||
{
|
|
||||||
18319, // Caught Frog
|
|
||||||
18320, // Caught Undine
|
|
||||||
18321, // Caught Rakul
|
|
||||||
18322, // Caught Sea Giant
|
|
||||||
18323, // Caught Sea Horse Soldier
|
|
||||||
18324, // Caught Homunculus
|
|
||||||
18325, // Caught Flava
|
|
||||||
18326, // Caught Gigantic Eye
|
|
||||||
};
|
|
||||||
// NPC Strings
|
|
||||||
private static final NpcStringId[] NPC_STRINGS_ON_SPAWN =
|
|
||||||
{
|
|
||||||
NpcStringId.CROAK_CROAK_FOOD_LIKE_S1_IN_THIS_PLACE,
|
|
||||||
NpcStringId.S1_HOW_LUCKY_I_AM,
|
|
||||||
NpcStringId.PRAY_THAT_YOU_CAUGHT_A_WRONG_FISH_S1
|
|
||||||
};
|
|
||||||
private static final NpcStringId[] NPC_STRINGS_ON_ATTACK =
|
|
||||||
{
|
|
||||||
NpcStringId.DO_YOU_KNOW_WHAT_A_FROG_TASTES_LIKE,
|
|
||||||
NpcStringId.I_WILL_SHOW_YOU_THE_POWER_OF_A_FROG,
|
|
||||||
NpcStringId.I_WILL_SWALLOW_AT_A_MOUTHFUL
|
|
||||||
};
|
|
||||||
private static final NpcStringId[] NPC_STRINGS_ON_KILL =
|
|
||||||
{
|
|
||||||
NpcStringId.UGH_NO_CHANCE_HOW_COULD_THIS_ELDER_PASS_AWAY_LIKE_THIS,
|
|
||||||
NpcStringId.CROAK_CROAK_A_FROG_IS_DYING,
|
|
||||||
NpcStringId.A_FROG_TASTES_BAD_YUCK
|
|
||||||
};
|
|
||||||
// Misc
|
|
||||||
private static final int CHANCE_TO_SHOUT_ON_ATTACK = 33;
|
|
||||||
private static final int DESPAWN_TIME = 50; // 50 seconds to despawn
|
|
||||||
|
|
||||||
public WarriorFishingBlock()
|
|
||||||
{
|
|
||||||
addAttackId(MONSTERS);
|
|
||||||
addKillId(MONSTERS);
|
|
||||||
addSpawnId(MONSTERS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case "SPAWN":
|
|
||||||
{
|
|
||||||
final L2Object obj = npc.getTarget();
|
|
||||||
if ((obj == null) || !obj.isPlayer())
|
|
||||||
{
|
|
||||||
npc.decayMe();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final L2PcInstance target = obj.getActingPlayer();
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NPC_STRINGS_ON_SPAWN[getRandom(NPC_STRINGS_ON_SPAWN.length)], target.getName());
|
|
||||||
((L2Attackable) npc).addDamageHate(target, 0, 2000);
|
|
||||||
npc.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, target);
|
|
||||||
npc.addAttackerToAttackByList(target);
|
|
||||||
|
|
||||||
startQuestTimer("DESPAWN", DESPAWN_TIME * 1000, npc, target);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "DESPAWN":
|
|
||||||
{
|
|
||||||
npc.decayMe();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.onAdvEvent(event, npc, player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
|
||||||
{
|
|
||||||
if (getRandom(100) < CHANCE_TO_SHOUT_ON_ATTACK)
|
|
||||||
{
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NPC_STRINGS_ON_ATTACK[getRandom(NPC_STRINGS_ON_ATTACK.length)]);
|
|
||||||
}
|
|
||||||
return super.onAttack(npc, attacker, damage, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
|
|
||||||
{
|
|
||||||
npc.broadcastSay(ChatType.NPC_GENERAL, NPC_STRINGS_ON_KILL[getRandom(NPC_STRINGS_ON_KILL.length)]);
|
|
||||||
cancelQuestTimer("DESPAWN", npc, killer);
|
|
||||||
return super.onKill(npc, killer, isSummon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onSpawn(L2Npc npc)
|
|
||||||
{
|
|
||||||
startQuestTimer("SPAWN", 2000, npc, null);
|
|
||||||
return super.onSpawn(npc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new WarriorFishingBlock();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package custom.ShadowWeapons;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shadow Weapons AI.<br>
|
|
||||||
* @author Nyaran, jurchiks
|
|
||||||
*/
|
|
||||||
public final class ShadowWeapons extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
// @formatter:off
|
|
||||||
private static final int[] NPCS =
|
|
||||||
{
|
|
||||||
30037, 30066, 30070, 30109, 30115, 30120, 30174, 30175, 30176, 30187,
|
|
||||||
30191, 30195, 30288, 30289, 30290, 30297, 30373, 30462, 30474, 30498,
|
|
||||||
30499, 30500, 30503, 30504, 30505, 30511, 30512, 30513, 30595, 30676,
|
|
||||||
30677, 30681, 30685, 30687, 30689, 30694, 30699, 30704, 30845, 30847,
|
|
||||||
30849, 30854, 30857, 30862, 30865, 30894, 30897, 30900, 30905, 30910,
|
|
||||||
30913, 31269, 31272, 31276, 31285, 31288, 31314, 31317, 31321, 31324,
|
|
||||||
31326, 31328, 31331, 31334, 31336, 31958, 31961, 31965, 31968, 31974,
|
|
||||||
31977, 31996, 32092, 32093, 32094, 32095, 32096, 32097, 32098, 32193,
|
|
||||||
32196, 32199, 32202, 32205, 32206, 32213, 32214, 32221, 32222, 32229,
|
|
||||||
32230, 32233, 32234
|
|
||||||
};
|
|
||||||
// @formatter:on
|
|
||||||
private ShadowWeapons()
|
|
||||||
{
|
|
||||||
addStartNpc(NPCS);
|
|
||||||
addTalkId(NPCS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onTalk(L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
String htmltext;
|
|
||||||
final boolean has_d = hasQuestItems(player, 8869); // Shadow Item Exchange Coupon (D-Grade)
|
|
||||||
final boolean has_c = hasQuestItems(player, 8870); // Shadow Item Exchange Coupon (C-Grade)
|
|
||||||
|
|
||||||
if (has_d || has_c)
|
|
||||||
{
|
|
||||||
if (!has_d)
|
|
||||||
{
|
|
||||||
htmltext = "exchange_c.html";
|
|
||||||
}
|
|
||||||
else if (!has_c)
|
|
||||||
{
|
|
||||||
htmltext = "exchange_d.html";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "exchange_both.html";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "exchange_no.html";
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String args[])
|
|
||||||
{
|
|
||||||
new ShadowWeapons();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
A Shadow weapon is a special weapon that is made in cooperation between the Ivory Tower and the Black Anvil Guild. It is created by magically projecting the power of a weapon onto another catalytic object. While that means that it can only be used while the magic charge remains, it has made it possible to mass produce projectile weapons.<br>
|
|
||||||
Its performance is no different than if you used the original weapon, except that it cannot possess the special ability to absorb souls or refine through a Stone of Life. Also, although it acts as a weapon, it is actualy in the magic category -- once opened, it cannot be passed on to someone else. Consider it an aid on your new path until you lay your hands on some real weapons.<br>
|
|
||||||
If you have a Shadow Weapon exchange coupon, you can receive a Shadow Weapon right for you.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 306893003">Give the shadow Weapon exchange coupon.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
A Shadow weapon is a special weapon that is made in cooperation between the Ivory Tower and the Black Anvil Guild. It is created by magically projecting the power of a weapon onto another catalytic object. While that means that it can only be used while the magic charge remains, it has made it possible to mass produce projectile weapons.<br>
|
|
||||||
Its performance is no different than if you used the original weapon, except that it cannot possess the special ability to absorb souls or refine through a Stone of Life. Also, although it acts as a weapon, it is actualy in the magic category -- once opened, it cannot be passed on to someone else. Consider it an aid on your new path until you lay your hands on some real weapons.<br>
|
|
||||||
If you have a Shadow Weapon exchange coupon, you can receive a Shadow Weapon right for you.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 306893002">Give the shadow Weapon exchange coupon.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
A Shadow weapon is a special weapon that is made in cooperation between the Ivory Tower and the Black Anvil Guild. It is created by magically projecting the power of a weapon onto another catalytic object. While that means that it can only be used while the magic charge remains, it has made it possible to mass produce projectile weapons.<br>
|
|
||||||
Its performance is no different than if you used the original weapon, except that it cannot possess the special ability to absorb souls or refine through a Stone of Life. Also, although it acts as a weapon, it is actualy in the magic category -- once opened, it cannot be passed on to someone else. Consider it an aid on your new path until you lay your hands on some real weapons.<br>
|
|
||||||
If you have a Shadow Weapon exchange coupon, you can receive a Shadow Weapon right for you.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 306893001">Give the shadow Weapon exchange coupon.</Button>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
You don't have a Shadow weapon exchange coupon.<br>
|
|
||||||
A shadow Weapon exchange coupon is a <font color="LEVEL">gift received from a Grand Master, Magister or High Priest when you complete a class transfer.</font>
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Alegria:<br>
|
|
||||||
Oh really?!<br>
|
|
||||||
Well, I'm already taken. But I'm flattered that you would think so highly of me.
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Alegria:<br>
|
|
||||||
Oh, no! You don't have the hat with you.<br>
|
|
||||||
You should've checked to see if the Explorer Hat (event) was in your inventory! Can't exchange if you don't have it!
|
|
||||||
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|||||||
<html><body>Alegria:<br>
|
|
||||||
Once you exchange your Explorer Hat, you will not be able to receive it again. Are you ok with that?<br>
|
|
||||||
Your Birthday Hat is so pretty, which is why I'm worried that this might be a mistake on your part.<br>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CharacterBirthday change">"My mind's made"</Button>
|
|
||||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 0">"Hmm. Maybe you're right." (Back)</Button>
|
|
||||||
</body></html>
|
|
@@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package events.CharacterBirthday;
|
|
||||||
|
|
||||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jmobius.gameserver.util.Util;
|
|
||||||
|
|
||||||
import ai.AbstractNpcAI;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Character Birthday event AI.<br>
|
|
||||||
* Updated to H5 by Nyaran.
|
|
||||||
* @author Gnacik
|
|
||||||
*/
|
|
||||||
public final class CharacterBirthday extends AbstractNpcAI
|
|
||||||
{
|
|
||||||
private static final int ALEGRIA = 32600;
|
|
||||||
private static int SPAWNS = 0;
|
|
||||||
|
|
||||||
private static final int[] GK =
|
|
||||||
{
|
|
||||||
30006,
|
|
||||||
30059,
|
|
||||||
30080,
|
|
||||||
30134,
|
|
||||||
30146,
|
|
||||||
30177,
|
|
||||||
30233,
|
|
||||||
30256,
|
|
||||||
30320,
|
|
||||||
30540,
|
|
||||||
30576,
|
|
||||||
30836,
|
|
||||||
30848,
|
|
||||||
30878,
|
|
||||||
30899,
|
|
||||||
31275,
|
|
||||||
31320,
|
|
||||||
31964,
|
|
||||||
32163
|
|
||||||
};
|
|
||||||
|
|
||||||
private CharacterBirthday()
|
|
||||||
{
|
|
||||||
addStartNpc(ALEGRIA);
|
|
||||||
addStartNpc(GK);
|
|
||||||
addTalkId(ALEGRIA);
|
|
||||||
addTalkId(GK);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
String htmltext = event;
|
|
||||||
if (event.equalsIgnoreCase("despawn_npc"))
|
|
||||||
{
|
|
||||||
npc.doDie(player);
|
|
||||||
SPAWNS--;
|
|
||||||
|
|
||||||
htmltext = null;
|
|
||||||
}
|
|
||||||
else if (event.equalsIgnoreCase("change"))
|
|
||||||
{
|
|
||||||
// Change Hat
|
|
||||||
if (hasQuestItems(player, 10250))
|
|
||||||
{
|
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
|
||||||
htmltext = null; // FIXME: Probably has html
|
|
||||||
// Despawn npc
|
|
||||||
npc.doDie(player);
|
|
||||||
SPAWNS--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
htmltext = "32600-nohat.htm";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return htmltext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String onTalk(L2Npc npc, L2PcInstance player)
|
|
||||||
{
|
|
||||||
if (SPAWNS >= 3)
|
|
||||||
{
|
|
||||||
return "busy.htm";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Util.checkIfInRange(10, npc, player, true))
|
|
||||||
{
|
|
||||||
final L2Npc spawned = addSpawn(32600, player.getX() + 10, player.getY() + 10, player.getZ() + 10, 0, false, 0, true);
|
|
||||||
startQuestTimer("despawn_npc", 180000, spawned, player);
|
|
||||||
SPAWNS++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return "tooclose.htm";
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
new CharacterBirthday();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,3 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
Alegria is very busy now. Try again later.
|
|
||||||
</body></html>
|
|
@@ -1,4 +0,0 @@
|
|||||||
<html><body>Gatekeeper:<br>
|
|
||||||
Alegria, the Creation Day Helper, cannot be summoned as you are too close.<br1>
|
|
||||||
Please move back a little bit and try again.
|
|
||||||
</body></html>
|
|
Reference in New Issue
Block a user