Removed several unused scripts.

This commit is contained in:
MobiusDev
2017-08-05 04:10:21 +00:00
parent 039463f273
commit 75aef55daf
78 changed files with 0 additions and 2700 deletions

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -1,3 +0,0 @@
<html><body>
Very well. Here you go!
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>
If you cannot prove your worthiness, I cannot give it to you. Please leave!
</body></html>

View File

@@ -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>

View File

@@ -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>

View File

@@ -1,5 +0,0 @@
<html><body>Court Magician:<br>
<center>
Don't you already have the cloak?
</center>
</body></html>

View File

@@ -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>

View File

@@ -1,3 +0,0 @@
<html><body>
An unawakened character cannot buy the corresponding Talisman.
</body></html>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -1,3 +0,0 @@
<html><body>Reputation Manager Rapidus:<br>
Your clan will be proud of you.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Reputation Manager Rapidus:<br>
You have no sins for which you need to atone.
</body></html>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -1,3 +0,0 @@
<html><body>Reputation Manager Scipio:<br>
You are the pride of your clan!
</body></html>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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>

View File

@@ -1,3 +0,0 @@
<html><body>
Very well. Here you go!
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>
If you cannot prove your worthiness, I cannot give it to you. Please leave!
</body></html>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -1,3 +0,0 @@
<html><body>
Alegria is very busy now. Try again later.
</body></html>

View File

@@ -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>