[Classic] Unused items removal, Newbie buffers and more misc changes.
This commit is contained in:
@@ -40,20 +40,6 @@ public final class MinionSpawnManager extends AbstractNpcAI
|
||||
|
||||
static
|
||||
{
|
||||
NPC.add(18344); // Ancient Egg
|
||||
NPC.add(18352); // Kamael Guard
|
||||
NPC.add(18353); // Guardian of Records
|
||||
NPC.add(18354); // Guardian of Observation
|
||||
NPC.add(18355); // Spicula's Guard
|
||||
NPC.add(18356); // Harkilgamed's Gatekeeper
|
||||
NPC.add(18357); // Rodenpicula's Gatekeeper
|
||||
NPC.add(18359); // Arviterre's Guardian
|
||||
NPC.add(18360); // Katenar's Gatekeeper
|
||||
NPC.add(18361); // Guardian of Prediction
|
||||
NPC.add(18484); // Naia Failan
|
||||
NPC.add(18491); // Lock
|
||||
NPC.add(18547); // Ancient Experiment
|
||||
NPC.add(18551); // Cruma Phantom
|
||||
NPC.add(35375); // Bloody Lord Nurka
|
||||
NPC.add(20376); // Varikan Brigand Leader
|
||||
NPC.add(20398); // Vrykolakas
|
||||
@@ -87,55 +73,8 @@ public final class MinionSpawnManager extends AbstractNpcAI
|
||||
NPC.add(21078); // Magus Valac
|
||||
NPC.add(21081); // Power Angel Amon
|
||||
NPC.add(21090); // Bloody Guardian
|
||||
NPC.add(21312); // Eye of Ruler
|
||||
NPC.add(21343); // Ketra Commander
|
||||
NPC.add(21345); // Ketra's Head Shaman
|
||||
NPC.add(21347); // Ketra Prophet
|
||||
NPC.add(21369); // Varka's Commander
|
||||
NPC.add(21371); // Varka's Head Magus
|
||||
NPC.add(21373); // Varka's Prophet
|
||||
NPC.add(21432); // Chakram Beetle
|
||||
NPC.add(21434); // Seer of Blood
|
||||
NPC.add(21512); // Splinter Stakato Drone
|
||||
NPC.add(21517); // Needle Stakato Drone
|
||||
NPC.add(21541); // Pilgrim of Splendor
|
||||
NPC.add(21544); // Judge of Splendor
|
||||
NPC.add(21596); // Requiem Lord
|
||||
NPC.add(21599); // Requiem Priest
|
||||
NPC.add(21652); // Scarlet Stakato Noble
|
||||
NPC.add(21653); // Assassin Beetle
|
||||
NPC.add(21654); // Necromancer of Destruction
|
||||
NPC.add(21655); // Arimanes of Destruction
|
||||
NPC.add(21656); // Ashuras of Destruction
|
||||
NPC.add(21657); // Magma Drake
|
||||
NPC.add(22028); // Vagabond of the Ruins
|
||||
NPC.add(22080); // Massive Lost Bandersnatch
|
||||
NPC.add(22084); // Panthera
|
||||
NPC.add(22092); // Frost Iron Golem
|
||||
NPC.add(22096); // Ursus
|
||||
NPC.add(22100); // Freya's Gardener
|
||||
NPC.add(22102); // Freya's Servant
|
||||
NPC.add(22104); // Freya's Dog
|
||||
NPC.add(22155); // Triol's High Priest
|
||||
NPC.add(22159); // Triol's High Priest
|
||||
NPC.add(22163); // Triol's High Priest
|
||||
NPC.add(22167); // Triol's High Priest
|
||||
NPC.add(22171); // Triol's High Priest
|
||||
NPC.add(22188); // Andreas' Captain of the Royal Guard
|
||||
NPC.add(22196); // Velociraptor
|
||||
NPC.add(22198); // Velociraptor
|
||||
NPC.add(22202); // Ornithomimus
|
||||
NPC.add(22205); // Deinonychus
|
||||
NPC.add(22210); // Pachycephalosaurus
|
||||
NPC.add(22213); // Wild Strider
|
||||
NPC.add(22223); // Velociraptor
|
||||
NPC.add(22224); // Ornithomimus
|
||||
NPC.add(22225); // Deinonychus
|
||||
NPC.add(22275); // Gatekeeper Lohan
|
||||
NPC.add(22277); // Gatekeeper Provo
|
||||
NPC.add(22305); // Kechi's Captain
|
||||
NPC.add(22306); // Kechi's Captain
|
||||
NPC.add(22307); // Kechi's Captain
|
||||
NPC.add(22320); // Junior Watchman
|
||||
NPC.add(22321); // Junior Summoner
|
||||
NPC.add(22346); // Quarry Foreman
|
||||
@@ -143,18 +82,10 @@ public final class MinionSpawnManager extends AbstractNpcAI
|
||||
NPC.add(22370); // Passageway Captain
|
||||
NPC.add(22377); // Master Zelos
|
||||
NPC.add(22390); // Foundry Foreman
|
||||
NPC.add(22416); // Kechi's Captain
|
||||
NPC.add(22423); // Original Sin Warden
|
||||
NPC.add(22431); // Original Sin Warden
|
||||
NPC.add(22448); // Leodas
|
||||
NPC.add(22449); // Amaskari
|
||||
NPC.add(22621); // Male Spiked Stakato
|
||||
NPC.add(22625); // Cannibalistic Stakato Leader
|
||||
NPC.add(22630); // Spiked Stakato Nurse
|
||||
NPC.add(22666); // Barif
|
||||
NPC.add(22670); // Cursed Lord
|
||||
NPC.add(22742); // Ornithomimus
|
||||
NPC.add(22743); // Deinonychus
|
||||
NPC.add(25001); // Greyclaw Kutus
|
||||
NPC.add(25004); // Turek Mercenary Captain
|
||||
NPC.add(25007); // Retreat Spider Cletu
|
||||
@@ -304,62 +235,7 @@ public final class MinionSpawnManager extends AbstractNpcAI
|
||||
NPC.add(25493); // Eva's Spirit Niniel
|
||||
NPC.add(25496); // Fafurion's Envoy Pingolpin
|
||||
NPC.add(25498); // Fafurion's Henchman Istary
|
||||
NPC.add(25501); // Boss Akata
|
||||
NPC.add(25504); // Nellis' Vengeful Spirit
|
||||
NPC.add(25506); // Rayito the Looter
|
||||
NPC.add(25509); // Dark Shaman Varangka
|
||||
NPC.add(25514); // Queen Shyeed
|
||||
NPC.add(25524); // Flamestone Giant
|
||||
NPC.add(25528); // Tiberias
|
||||
NPC.add(25536); // Hannibal
|
||||
NPC.add(25546); // Rhianna the Traitor
|
||||
NPC.add(25549); // Tesla the Deceiver
|
||||
NPC.add(25554); // Brutus the Obstinate
|
||||
NPC.add(25557); // Ranger Karankawa
|
||||
NPC.add(25560); // Sargon the Mad
|
||||
NPC.add(25563); // Beautiful Atrielle
|
||||
NPC.add(25566); // Nagen the Tomboy
|
||||
NPC.add(25569); // Jax the Destroyer
|
||||
NPC.add(25572); // Hager the Outlaw
|
||||
NPC.add(25575); // All-Seeing Rango
|
||||
NPC.add(25579); // Helsing
|
||||
NPC.add(25582); // Gillien
|
||||
NPC.add(25585); // Medici
|
||||
NPC.add(25589); // Brand the Exile
|
||||
NPC.add(25593); // Gerg the Hunter
|
||||
NPC.add(25600); // Temenir
|
||||
NPC.add(25601); // Draksius
|
||||
NPC.add(25602); // Kiretcenah
|
||||
NPC.add(25671); // Queen Shyeed
|
||||
NPC.add(25674); // Gwindorr
|
||||
NPC.add(25677); // Water Spirit Lian
|
||||
NPC.add(25681); // Gorgolos
|
||||
NPC.add(25684); // Last Titan Utenus
|
||||
NPC.add(25687); // Hekaton Prime
|
||||
NPC.add(25703); // Gigantic Golem
|
||||
NPC.add(25710); // Lost Captain
|
||||
NPC.add(25735); // Greyclaw Kutus
|
||||
NPC.add(25738); // Lead Tracker Sharuk
|
||||
NPC.add(25741); // Sukar Wererat Chief
|
||||
NPC.add(25744); // Ikuntai
|
||||
NPC.add(25747); // Zombie Lord Crowl
|
||||
NPC.add(25750); // Zombie Lord Ferkel
|
||||
NPC.add(25754); // Fire Lord Shadar
|
||||
NPC.add(25757); // Soul Collector Acheron
|
||||
NPC.add(25760); // Lord Ishka
|
||||
NPC.add(25763); // Demon Kuri
|
||||
NPC.add(25767); // Carnage Lord Gato
|
||||
NPC.add(25770); // Ketra Commander Atis
|
||||
NPC.add(25773); // Beacon of Blue Sky
|
||||
NPC.add(25776); // Earth Protector Panathen
|
||||
NPC.add(25779); // Betrayer of Urutu Freki
|
||||
NPC.add(25782); // Nellis' Vengeful Spirit
|
||||
NPC.add(25784); // Rayito the Looter
|
||||
NPC.add(25787); // Ketra's Hero Hekaton
|
||||
NPC.add(25790); // Varka's Hero Shadith
|
||||
NPC.add(25794); // Kernon
|
||||
NPC.add(25797); // Meanas Anor
|
||||
NPC.add(25800); // Mammon Collector Talos
|
||||
NPC.add(27036); // Calpico
|
||||
NPC.add(27041); // Varangka's Messenger
|
||||
NPC.add(27062); // Tanukia
|
||||
@@ -375,25 +251,6 @@ public final class MinionSpawnManager extends AbstractNpcAI
|
||||
NPC.add(27186); // Fairy Tree of Star
|
||||
NPC.add(27187); // Fairy Tree of Twilight
|
||||
NPC.add(27188); // Fairy Tree of Abyss
|
||||
NPC.add(27259); // Archangel Iconoclasis
|
||||
NPC.add(27260); // Archangel Iconoclasis
|
||||
NPC.add(27266); // Fallen Angel Haures
|
||||
NPC.add(27267); // Fallen Angel Haures
|
||||
NPC.add(27290); // White Wing Commander
|
||||
NPC.add(29030); // Fenril Hound Kerinne
|
||||
NPC.add(29033); // Fenril Hound Freki
|
||||
NPC.add(29037); // Fenril Hound Kinaz
|
||||
NPC.add(29040); // Wings of Flame, Ixion
|
||||
NPC.add(29056); // Ice Fairy Sirra
|
||||
NPC.add(29062); // Andreas Van Halter
|
||||
NPC.add(29096); // Anais
|
||||
NPC.add(29129); // Lost Captain
|
||||
NPC.add(29132); // Lost Captain
|
||||
NPC.add(29135); // Lost Captain
|
||||
NPC.add(29138); // Lost Captain
|
||||
NPC.add(29141); // Lost Captain
|
||||
NPC.add(29144); // Lost Captain
|
||||
NPC.add(29147); // Lost Captain
|
||||
}
|
||||
|
||||
private static final NpcStringId[] ON_ATTACK_MSG =
|
||||
|
@@ -1,142 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.group_template;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.ai.CtrlEvent;
|
||||
import com.l2jserver.gameserver.enums.ChatType;
|
||||
import com.l2jserver.gameserver.model.L2Object;
|
||||
import com.l2jserver.gameserver.model.actor.L2Attackable;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.network.NpcStringId;
|
||||
|
||||
/**
|
||||
* 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()
|
||||
{
|
||||
super(WarriorFishingBlock.class.getSimpleName(), "ai/group_template");
|
||||
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();
|
||||
broadcastNpcSay(npc, 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)
|
||||
{
|
||||
broadcastNpcSay(npc, 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)
|
||||
{
|
||||
broadcastNpcSay(npc, 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,9 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br><br>
|
||||
Ah, you have excellent taste! This bracelet is truly unique. In fact, it is said that it contains an <font color="LEVEL">Agathion</font>. Quite a find, eh? Wondering if it is for sale? Of course it is -- that's why I'm here!<br>
|
||||
Both this <font color="LEVEL">Little Angel Agathion Bracelet</font> and this <font color="LEVEL">Little Devil Agathion Bracelet</font> were discovered by another group of adventurers while exploring some ancient ruins. I am positive that they contain Agathions! Of course, no one knows for sure the power an Agathion possesses or how long it lasts. I have been reluctant to experiment on them because it's clear that some of the bracelets possess only limited magic power.<br>
|
||||
Others have more, however. What you get depends on your luck, I'm afraid.<br>
|
||||
To get either the angel or devil bracelet, you must bring me <font color="LEVEL">10 Fish Bones</font>, <font color="LEVEL">10 Fish Scales</font>, <font color="LEVEL">10 units of Fish Oil</font>, <font color="LEVEL">10 Fish Fins</font>, <font color="LEVEL">10 Fish Gems</font>, <font color="LEVEL">5 units of Whale Blubber</font>, and <font color="LEVEL">3,000,000 Adena</font>. I wish I could part with them in exchange for crystals as I normally would, but the adventurers who delivered the bracelets here insisted on these other items for payment.<br>
|
||||
Even so, I still believe this is a reasonable price. After all, an Agathion isn't something you run across every day, eh? So, would you like to buy one?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Alexandria littleAngel">Purchase the Little Angel Agathion Bracelet</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Alexandria littleDevil">Purchase the Little Devil Agathion Bracelet</Button>
|
||||
</body></html>
|
@@ -1,4 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Yes, I've checked the necessary items. Thank you for your hard work.<br>
|
||||
I'm telling you ahead that I don't know for sure what kind of power each bracelet has. I only can tell you that the angel-engraved bracelet has an angel-type Agathion, and the devil-engraved one has a devil-type Agathion. You can find out the capability and magic power of each Agathion on your own.
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Yes, I checked the necessary items. It must have been difficult to obtain them all!<br>
|
||||
I must warn you that I do not know for sure what kind of power posessed by each bracelet. I only can tell you that the Angel's Bracelet contains an angel-type Agathion, while the Devil's Bracelet contains a devil-type Agathion. You must discover the capability and magic power of each on your own.<br>
|
||||
Here, please take this as an extra token of my appreciation for your business...<br>
|
||||
(I have a strange feeling about that bracelet -- I hope this adventurer will simply take this and leave here immediately.)
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Oh, you don't have the items required to buy either the Angel's Bracelet or the Devil's Bracelet. In order to obtain one, you must first bring me <font color="LEVEL">25 Big Red Nimble Fish</font>, <font color="LEVEL">50 Great Codrans</font>, and <font color="LEVEL">4 Memento Moris, 5 Earth Eggs, 5 Nonliving Nuclei, 3 Dragon Hearts</font>, and <font color="LEVEL">7,500,000 Adena</font>.
|
||||
</body></html>
|
@@ -1,9 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Welcome! Thank you so much for visiting our boutique. We sell precious and valuable things that you would never find anywhere else. We've also added some luxury accessories this time. Look around see if you can find anything you like.<br>
|
||||
Ah! Now, you can use <font color="LEVEL">Adena</font> to pay for your goods.<br>
|
||||
If you would like to purchase a weapon, please ask my husband.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 300984001">Purchase Armor</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 300984002">Purchase supplies</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Alexandria 30098-02.html">Purchase an Agathion Bracelet</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -1,147 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.Alexandria;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.holders.ItemHolder;
|
||||
import com.l2jserver.gameserver.model.holders.QuestItemHolder;
|
||||
|
||||
/**
|
||||
* Alexandria (Armor Merchant) AI.
|
||||
* @author xban1x
|
||||
*/
|
||||
public final class Alexandria extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int ALEXANDRIA = 30098;
|
||||
// Items
|
||||
private static final ItemHolder[] REQUIRED_ITEMS = new ItemHolder[]
|
||||
{
|
||||
new ItemHolder(57, 3550000),
|
||||
new ItemHolder(5094, 400),
|
||||
new ItemHolder(6471, 200),
|
||||
new ItemHolder(9814, 40),
|
||||
new ItemHolder(9815, 30),
|
||||
new ItemHolder(9816, 50),
|
||||
new ItemHolder(9817, 50),
|
||||
};
|
||||
// Agathions
|
||||
private static final QuestItemHolder[] LITTLE_DEVILS = new QuestItemHolder[]
|
||||
{
|
||||
new AdditionalQuestItemHolder(10321, 600, 1, 10408),
|
||||
new QuestItemHolder(10322, 10),
|
||||
new QuestItemHolder(10323, 10),
|
||||
new QuestItemHolder(10324, 5),
|
||||
new QuestItemHolder(10325, 5),
|
||||
new QuestItemHolder(10326, 370),
|
||||
};
|
||||
private static final QuestItemHolder[] LITTLE_ANGELS = new QuestItemHolder[]
|
||||
{
|
||||
new AdditionalQuestItemHolder(10315, 600, 1, 10408),
|
||||
new QuestItemHolder(10316, 10),
|
||||
new QuestItemHolder(10317, 10),
|
||||
new QuestItemHolder(10318, 5),
|
||||
new QuestItemHolder(10319, 5),
|
||||
new QuestItemHolder(10320, 370),
|
||||
};
|
||||
private static final Map<String, List<QuestItemHolder>> AGATHIONS = new HashMap<>();
|
||||
static
|
||||
{
|
||||
AGATHIONS.put("littleAngel", Arrays.asList(LITTLE_ANGELS));
|
||||
AGATHIONS.put("littleDevil", Arrays.asList(LITTLE_DEVILS));
|
||||
}
|
||||
|
||||
private Alexandria()
|
||||
{
|
||||
super(Alexandria.class.getSimpleName(), "ai/npc");
|
||||
addStartNpc(ALEXANDRIA);
|
||||
addTalkId(ALEXANDRIA);
|
||||
addFirstTalkId(ALEXANDRIA);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
if (event.equals("30098-02.html"))
|
||||
{
|
||||
htmltext = event;
|
||||
}
|
||||
else if (AGATHIONS.containsKey(event))
|
||||
{
|
||||
final int chance = getRandom(1000);
|
||||
int chance2 = 0;
|
||||
int chance3 = 0;
|
||||
for (QuestItemHolder agathion : AGATHIONS.get(event))
|
||||
{
|
||||
chance3 += agathion.getChance();
|
||||
if ((chance >= chance2) && (chance2 < chance3))
|
||||
{
|
||||
if (takeAllItems(player, REQUIRED_ITEMS))
|
||||
{
|
||||
giveItems(player, agathion);
|
||||
htmltext = "30098-03.html";
|
||||
|
||||
if (agathion instanceof AdditionalQuestItemHolder)
|
||||
{
|
||||
giveItems(player, ((AdditionalQuestItemHolder) agathion).getAdditionalId(), 1);
|
||||
htmltext = "30098-03a.html";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = "30098-04.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
chance2 += agathion.getChance();
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
public static class AdditionalQuestItemHolder extends QuestItemHolder
|
||||
{
|
||||
private final int _additionalId;
|
||||
|
||||
public AdditionalQuestItemHolder(int id, int chance, long count, int additionalId)
|
||||
{
|
||||
super(id, chance, count);
|
||||
_additionalId = additionalId;
|
||||
}
|
||||
|
||||
public int getAdditionalId()
|
||||
{
|
||||
return _additionalId;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Alexandria();
|
||||
}
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
Hello!<br>
|
||||
We Dwarves of the Blacksmith Guild have refined our skills in order to create a greater variety of crops for our Lord.<br>
|
||||
What can I do for you?<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35098-02.html">Manufacture a crop</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>
|
||||
Sure, no problem! Bring the ingredients needed and I'll create an item for you.<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980001">Choose an item</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,8 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
My goodness! What brings you here?<br>
|
||||
We Dwarves of the Blacksmith Guild have refined our skills in order to create a greater variety of crops for our Lord.<br>
|
||||
What can I do for you?<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35140-02.html">Manufacture a crop</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>
|
||||
Sure, no problem! If you bring me the ingredients I need, I'll get right on it!<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980002">Choose an item</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
Greetings! Is there anything I can do for you today?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35182-02.html">Manufacture a crop</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,7 +0,0 @@
|
||||
<html><body>
|
||||
Certainly! If you bring me the ingredients I need I'll make it for you.<br>
|
||||
What would you like?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980003">View the list</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,8 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
Greetings!<br>
|
||||
We Dwarves of the Blacksmith Guild have refined our skills in order to create a greater variety of crops for our Lord.<br>
|
||||
What can I do for you?<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35224-02.html">Manufacture a crop</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>
|
||||
Certainly, I'd be glad to make an item for you! Bring me the ingredients I need and I'll make it immediately.<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980004">View the list</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,8 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
My goodness! What brings you here?<br>
|
||||
We Dwarves of the Blacksmith Guild have refined our skills in order to create a greater variety of crops for our Lord.<br>
|
||||
What can I do for you?<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35272-02.html">Manufacture a crop</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,7 +0,0 @@
|
||||
<html><body>
|
||||
Sure, just bring the ingredients I need and I'll make it for you right away.<br>
|
||||
What would you like?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980005">Choose Item</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,8 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
My goodness! What brings you here?<br>
|
||||
We Dwarves of the Blacksmith Guild have refined our skills in order to create a greater variety of crops for our Lord.<br>
|
||||
What can I do for you?<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35314-02.html">Manufacture a crop</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>
|
||||
Certainly, I'd be glad to make an item for you! Bring me the ingredients I need and I'll make it immediately.<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980006">View the list</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,9 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
What brings you here?<br>
|
||||
Our Blacksmiths Guild has learned a new technique, so we can use more diverse crops.<br>
|
||||
Our Dwarven dexterity is truly unequaled!<br>
|
||||
If you want something made, just give us the order!<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35361-02.html">Crop Processing</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>
|
||||
If you provide the materials, it won't take anytime! What do you want made?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980007">See the list</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,9 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
What brings you to this shabby place?<br>
|
||||
I've learned a new skill from our Blacksmith Guild. Now I can make what you want with various crops, my Lord!<br>
|
||||
Our Dwarves are truly gifted with their hands. Ha! Oops! Pardon me, my Lord!<br>
|
||||
If you want me to make something, just say the word!<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35507-02.html">Crop Manufacturing</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,7 +0,0 @@
|
||||
<html><body>
|
||||
Of course! Give me the materials I need and I'll make anything you want at once!<br>
|
||||
What do you want?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980008">Examine the List</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,9 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
What brings you to this shabby place?<br>
|
||||
By the way, I've learned a new skill from our Blacksmith Guild! Now I use a wider variety of crops to make the items you need, my Lord.<br>
|
||||
Our Dwarves are truly gifted with their hands.. Ha! Oops! Pardon me, my Lord.<br>
|
||||
If you want me to make something for you, just ask.<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleBlacksmith 35553-02.html">Crop Manufacturing</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,7 +0,0 @@
|
||||
<html><body>
|
||||
Of course! Bring me the materials I need and I'll make anything you want at once!<br>
|
||||
What do you want?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 350980009">Examine the list</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.CastleBlacksmith;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.ClanPrivilege;
|
||||
import com.l2jserver.gameserver.model.PcCondOverride;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
|
||||
/**
|
||||
* Castle Blacksmith AI.
|
||||
* @author malyelfik
|
||||
*/
|
||||
public final class CastleBlacksmith extends AbstractNpcAI
|
||||
{
|
||||
// Blacksmith IDs
|
||||
private static final int[] NPCS =
|
||||
{
|
||||
35098, // Blacksmith (Gludio)
|
||||
35140, // Blacksmith (Dion)
|
||||
35182, // Blacksmith (Giran)
|
||||
35224, // Blacksmith (Oren)
|
||||
35272, // Blacksmith (Aden)
|
||||
35314, // Blacksmith (Innadril)
|
||||
35361, // Blacksmith (Goddard)
|
||||
35507, // Blacksmith (Rune)
|
||||
35553, // Blacksmith (Schuttgart)
|
||||
};
|
||||
|
||||
private CastleBlacksmith()
|
||||
{
|
||||
super(CastleBlacksmith.class.getSimpleName(), "ai/npc");
|
||||
addStartNpc(NPCS);
|
||||
addTalkId(NPCS);
|
||||
addFirstTalkId(NPCS);
|
||||
}
|
||||
|
||||
private boolean hasRights(L2PcInstance player, L2Npc npc)
|
||||
{
|
||||
return player.canOverrideCond(PcCondOverride.CASTLE_CONDITIONS) || npc.isMyLord(player) || ((player.getClanId() == npc.getCastle().getOwnerId()) && player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
return (event.equalsIgnoreCase(npc.getId() + "-02.html") && hasRights(player, npc)) ? event : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
return (hasRights(player, npc)) ? npc.getId() + "-01.html" : "no.html";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new CastleBlacksmith();
|
||||
}
|
||||
}
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Blacksmith:<br>
|
||||
Leave me alone! I'm very busy!
|
||||
</body></html>
|
@@ -1,134 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.CastleMercenaryManager;
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.ClanPrivilege;
|
||||
import com.l2jserver.gameserver.model.PcCondOverride;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.entity.Castle;
|
||||
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
|
||||
|
||||
/**
|
||||
* Castle Mercenary Manager AI.
|
||||
* @author malyelfik
|
||||
*/
|
||||
public final class CastleMercenaryManager extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int[] NPCS =
|
||||
{
|
||||
35102, // Greenspan
|
||||
35144, // Sanford
|
||||
35186, // Arvid
|
||||
35228, // Morrison
|
||||
35276, // Eldon
|
||||
35318, // Solinus
|
||||
35365, // Rowell
|
||||
35511, // Gompus
|
||||
35557, // Kendrew
|
||||
};
|
||||
|
||||
private CastleMercenaryManager()
|
||||
{
|
||||
super(CastleMercenaryManager.class.getSimpleName(), "ai/npc");
|
||||
addStartNpc(NPCS);
|
||||
addTalkId(NPCS);
|
||||
addFirstTalkId(NPCS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
final StringTokenizer st = new StringTokenizer(event, " ");
|
||||
switch (st.nextToken())
|
||||
{
|
||||
case "limit":
|
||||
{
|
||||
final Castle castle = npc.getCastle();
|
||||
final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
|
||||
if (castle.getName().equals("aden"))
|
||||
{
|
||||
html.setHtml(getHtm(player.getHtmlPrefix(), "mercmanager-aden-limit.html"));
|
||||
}
|
||||
else if (castle.getName().equals("rune"))
|
||||
{
|
||||
html.setHtml(getHtm(player.getHtmlPrefix(), "mercmanager-rune-limit.html"));
|
||||
}
|
||||
else
|
||||
{
|
||||
html.setHtml(getHtm(player.getHtmlPrefix(), "mercmanager-limit.html"));
|
||||
}
|
||||
html.replace("%feud_name%", String.valueOf(1001000 + castle.getResidenceId()));
|
||||
player.sendPacket(html);
|
||||
break;
|
||||
}
|
||||
case "buy":
|
||||
{
|
||||
final int listId = Integer.parseInt(npc.getId() + st.nextToken());
|
||||
((L2MerchantInstance) npc).showBuyWindow(player, listId, false); // NOTE: Not affected by Castle Taxes, baseTax is 20% (done in merchant buylists)
|
||||
break;
|
||||
}
|
||||
case "main":
|
||||
{
|
||||
htmltext = onFirstTalk(npc, player);
|
||||
break;
|
||||
}
|
||||
case "mercmanager-01.html":
|
||||
{
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
final String htmltext;
|
||||
if (player.canOverrideCond(PcCondOverride.CASTLE_CONDITIONS) || ((player.getClanId() == npc.getCastle().getOwnerId()) && player.hasClanPrivilege(ClanPrivilege.CS_MERCENARIES)))
|
||||
{
|
||||
if (npc.getCastle().getSiege().isInProgress())
|
||||
{
|
||||
htmltext = "mercmanager-siege.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = "mercmanager.html";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = "mercmanager-no.html";
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new CastleMercenaryManager();
|
||||
}
|
||||
}
|
@@ -1,12 +0,0 @@
|
||||
<html><body>
|
||||
When you sign a contract with me, I'll give you a certificate stating that my mercenaries are in your employ. Place it wherever you wish to assign them.<br>
|
||||
Place the certificate on the ground at the beginning of the battle and they will be summoned. They will position themselves wherever you are and in the direction you look. Most importantly, they'll defend you, my lord, to the death!<br>
|
||||
If you wish to re-position them, simply pick up the certificate and place it where you wish them to be.<br>
|
||||
You can buy as many certificates as you want, but there is a limit to the number of mercenaries that can be hired.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager limit">View the Mercenary Posting based on the Seal of Strife</Button>
|
||||
You cannot position the mercenaries too closely together, and they must be assigned inside the castle. Of course, if you place the certificate in other castles, the mercenaries will not be able to come to your aid.<br>
|
||||
The contract between us will be terminated at the end of the siege. You may use any unused certificates in another battle.<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest CastleMercenaryManager main">Return</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,83 +0,0 @@
|
||||
<html><body>
|
||||
<font color="LEVEL">[<fstring>%feud_name%</fstring> Castle Force Assignment Regulations]</font><br>
|
||||
<center>
|
||||
<table border=1 cellspacing=0>
|
||||
<tr>
|
||||
<td align=center width=70>Seal Owner</td><td align=center>Force Assignments</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="999999">All</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Teleporter (stationary)</font><br1>
|
||||
Inner Castle (east/west/hall) - Sacred Ark (1)<br1>
|
||||
Outer Castle - Inner Castle (east/hall) - Sacred Ark (1)<br1>
|
||||
Outer Castle - Inner Castle (west/hall) - Sacred Ark (1)<br1>
|
||||
Outer Castle - Inner Castle (east/west) - Sacred Ark (1)<br1>
|
||||
Outer Castle - Inner Castle (east/west/hall) (1)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top>None</td>
|
||||
<td>
|
||||
<font color="LEVEL">Elite Mercenary Guild Members</font><br1>
|
||||
Swordsmen (4 stationary/4 mobile)<br1>
|
||||
Pikemen (4 stationary/4 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
<font color="LEVEL">Mercenary Guild Members</font><br1>
|
||||
Swordsmen (10 stationary/10 mobile)<br1>
|
||||
Pikemen (6 stationary/6 mobile)<br1>
|
||||
Archers (20 stationary/20 mobile)<br1>
|
||||
Clerics (4 stationary/4 mobile)<br1>
|
||||
Human Wizards (4 stationary/4 mobile)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="00FFFF">Dawn</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Nephilim Mercenaries</font><br1>
|
||||
Warriors (2 mobile)<br1>
|
||||
Human Wizards (2 mobile)<br>
|
||||
<font color="LEVEL">Mercenaries of Dawn</font><br1>
|
||||
Swordsmen (10 stationary/10 mobile)<br1>
|
||||
Pikemen (4 stationary/4 mobile)<br1>
|
||||
Archers (20 stationary/20 mobile)<br1>
|
||||
Clerics (4 stationary/4 mobile)<br1>
|
||||
Human Wizards (4 stationary/4 mobile)<br>
|
||||
<font color="LEVEL">Elite Mercenary Guild Members</font><br1>
|
||||
Swordsmen (4 stationary/4 mobile)<br1>
|
||||
Pikemen (4 stationary/4 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
<font color="LEVEL">Mercenary Guild Members</font><br1>
|
||||
Swordsmen (10 stationary/10 mobile)<br1>
|
||||
Pikemen (6 stationary/6 mobile)<br1>
|
||||
Archers (20 stationary/20 mobile)<br1>
|
||||
Clerics (4 stationary/4 mobile)<br1>
|
||||
Human Wizards (4 stationary/4 mobile)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="FF9933">Dusk</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Elite Trainees</font><br1>
|
||||
Swordsmen (4 stationary/4 mobile)<br1>
|
||||
Pikemen (4 stationary/4 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
<font color="LEVEL">Trainees</font><br1>
|
||||
Swordsmen (10 stationary/10 mobile)<br1>
|
||||
Pikemen (6 stationary/6 mobile)<br1>
|
||||
Archers (20 stationary/20 mobile)<br1>
|
||||
Clerics (4 stationary/4 mobile)<br1>
|
||||
Human Wizards (4 stationary/4 mobile)<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<button action="bypass -h Quest CastleMercenaryManager main" value="Back" width=80 height=27 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
|
||||
</center>
|
||||
</body></html>
|
@@ -1,12 +0,0 @@
|
||||
<html><body>
|
||||
Greetings, my lord! Do you wish to hire the mercenaries of our guild?<br>
|
||||
Along with our highly skilled mercenaries, the <font color="LEVEL">Lords of Dawn</font> will join forces with us. The <font color="LEVEL">Mercenaries of Legend</font> will also join in. The balance of power is tilted in our favor!<br>
|
||||
The seal of strife is on our side! Victory is assured!<br>
|
||||
If you don't know the method of Contract, just ask me.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager mercmanager-01.html">"Tell me about the method of Contract</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 1">Hire mercenary guild members</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 2">Hire elite mercenary guild members</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 4">Hire Lords of Dawn</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 5">Hire special mercenaries</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 3">Hire a teleporter</Button>
|
||||
</body></html>
|
@@ -1,10 +0,0 @@
|
||||
<html><body>
|
||||
Greetings, my lord! Do you wish to hire mercenaries?<br>
|
||||
Currently, due to the influence of the seal of strife, I regret to say that it has become difficult to mobilize our guild members.<br>
|
||||
You can still hire <font color="LEVEL">Deadmen of War</font>. Although you possess a posting ticket from a previous Contract, if it does not meet the conditions of the seal, you won't be able to place it.<br>
|
||||
Although the situation appears dire, trust in your soldiers and be brave until the end.<br>
|
||||
If you wish to know the method of Contract, just ask me.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager mercmanager-01.html">"Tell me about the method of Contract</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 6">Hire Deadmen of War</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 3">Hire a teleporter</Button>
|
||||
</body></html>
|
@@ -1,80 +0,0 @@
|
||||
<html><body>
|
||||
<font color="LEVEL">[<fstring>%feud_name%</fstring> Castle Force Allocation Restrictions]</font><br>
|
||||
<center>
|
||||
<table border=1 cellspacing=0>
|
||||
<tr>
|
||||
<td align=center width=70>Seal Owner</td><td align=center>Force Assignments</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="999999">All cases</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Teleporter (stationary)</font><br1>
|
||||
Outer Castle-Inner Castle (1)<br1>
|
||||
Inner Castle-Sacred Ark (1)<br1>
|
||||
Outer Castle-Sacred Ark (1)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top>None</td>
|
||||
<td>
|
||||
<font color="LEVEL">Elite Mercenary Guild Members</font><br1>
|
||||
Swordsmen (2 stationary/2 mobile)<br1>
|
||||
Pikemen (2 stationary/2 mobile)<br1>
|
||||
Archers (5 stationary/5 mobile)<br1>
|
||||
Clerics (1 stationary/1 mobile)<br1>
|
||||
Human Wizards (1 stationary/1 mobile)<br>
|
||||
<font color="LEVEL"> Mercenary Guild Members</font><br1>
|
||||
Swordsmen (5 stationary/5 mobile)<br1>
|
||||
Pikemen (3 stationary/3 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="00FFFF">Dawn</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Nephilim Mercenaries</font><br1>
|
||||
Warriors (1 mobile)<br1>
|
||||
Human Wizards (1 mobile)<br>
|
||||
<font color="LEVEL"> Mercenaries of Dawn</font><br1>
|
||||
Swordsmen (5 stationary/5 mobile)<br1>
|
||||
Pikemen (2 stationary/2 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
<font color="LEVEL">Elite Mercenary Guild Members</font><br1>
|
||||
Swordsmen (2 stationary/2 mobile)<br1>
|
||||
Pikemen (2 stationary/2 mobile)<br1>
|
||||
Archers (5 stationary/5 mobile)<br1>
|
||||
Clerics (1 stationary/1 mobile)<br1>
|
||||
Human Wizards (1 stationary/1 mobile)<br>
|
||||
<font color="LEVEL"> Mercenary Guild Members</font><br1>
|
||||
Swordsmen (5 stationary/5 mobile)<br1>
|
||||
Pikemen (3 stationary/3 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="FF9933">Dusk</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Elite Trainees</font><br1>
|
||||
Swordsmen (2 stationary/2 mobile)<br1>
|
||||
Pikemen (2 stationary/2 mobile)<br1>
|
||||
Archers (5 stationary/5 mobile)<br1>
|
||||
Clerics (1 stationary/1 mobile)<br1>
|
||||
Human Wizards (1 stationary/1 mobile)<br>
|
||||
<font color="LEVEL">Trainees</font><br1>
|
||||
Swordsmen (5 stationary/5 mobile)<br1>
|
||||
Pikemen (3 stationary/3 mobile)<br1>
|
||||
Archers (10 stationary/10 mobile)<br1>
|
||||
Clerics (2 stationary/2 mobile)<br1>
|
||||
Human Wizards (2 stationary/2 mobile)<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table><br>
|
||||
<button action="bypass -h Quest CastleMercenaryManager main" value="Back" width=80 height=27 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
|
||||
</center>
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>
|
||||
Do you wish to join our mercenary guild?
|
||||
</body></html>
|
@@ -1,80 +0,0 @@
|
||||
<html><body>
|
||||
<font color="LEVEL">[<fstring>%feud_name%</fstring> Castle Mercenary Deployment Limitations]</font><br>
|
||||
<center>
|
||||
<table border=1 cellspacing=0>
|
||||
<tr>
|
||||
<td align=center width=80>Seal Owner</td>
|
||||
<td align=center>Maximum Deployment Number</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="999999">All Cases</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Teleporter</font> (Fix)<br1>
|
||||
Inner Wall (East)-Outer Wall (West)-Holy Item Repository (1 person)<br1>
|
||||
Outer Wall-Inner Wall (East)-Outside-Holy Item Repository (1 person)<br1>
|
||||
Outer Wall-Outer Wall (West)-Outside-Holy Items Repository (1 person)<br1>
|
||||
Outer Wall-Inner Wall (West)-Holy Item Repository (1 person)<br1>
|
||||
Outer Wall-Inner Wall (East)-Outer Wall (West)-Outside (1 person)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top>None</td>
|
||||
<td>
|
||||
<font color="LEVEL">Elite Mercenary Guild Members</font> (Fix/Move)<br1>
|
||||
Inspection (4 persons/4 persons)<br1>
|
||||
Pikemen (10 persons/10 persons)<br1>
|
||||
Archers (10 persons/10 persons)<br1>
|
||||
Clerics (2 persons/2 persons)<br1>
|
||||
Wizards (2 persons/2 persons)<br>
|
||||
<font color="LEVEL">Mercenary Guild Members</font> (Fix/Move)<br1>
|
||||
Inspection (10 persons/10 persons)<br1>
|
||||
Pikemen (6 persons/6 persons)<br1>
|
||||
Archers (20 persons/20 persons)<br1>
|
||||
Clerics (4 persons/4 persons)<br1>
|
||||
Wizards (4 persons/4 persons)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="00FFFF">Dawn</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Nephilim Mercenaries</font> (Move)<br1>
|
||||
Warriors (2 persons)<br1>Wizards (2 persons)<br>
|
||||
<font color="LEVEL">Mercenaries of Dawn</font> (Fix/Move)<br1>
|
||||
Inspection (10 persons/10 persons)<br1>
|
||||
Pikemen (4 persons/4 persons)<br1>
|
||||
Archers (20 persons/20 persons)<br1>
|
||||
Clerics (4 persons/4 persons)<br1>Wizards (4 persons/4 persons)<br>
|
||||
<font color="LEVEL">Elite Mercenary Guild Members</font> (Fix/Move)<br1>
|
||||
Inspection (4 persons/4 persons)<br1>
|
||||
Pikemaen (4 persons/4 persons)<br1>
|
||||
Archers (10 persons/10 persons)<br1>
|
||||
Clerics (2 persons/2 persons)<br1>Wizards (2 persons/2 persons)<br>
|
||||
<font color="LEVEL">Mercenary Guild Members</font> (fix/Move)<br1>
|
||||
Inspection (10 persons/10 persons)<br1>
|
||||
Pikemen (6 persons/6 persons)<br1>
|
||||
Archers (20 persons/20 persons)<br1>
|
||||
Clerics (4 persons/4 persons)<br1>
|
||||
Wizards (4 persons/4 persons)<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center valign=top><font color="FF9933">Dusk</font></td>
|
||||
<td>
|
||||
<font color="LEVEL">Greater Recruits</font> (Fix/Move)<br1>
|
||||
Inspection (4 persons/4 persons)<br1>
|
||||
Pikemen (4 persons/4 persons)<br1>
|
||||
Archers (10 persons/10 persons)<br1>
|
||||
Clerics (2 persons/2 persons)<br1>
|
||||
Wizards (2 persons/2 presons)<br>
|
||||
<font color="LEVEL">Recruits</font> (Fix/Move)<br1>
|
||||
Inspection (10 persons/10 persons)<br1>
|
||||
Pikemen (6 persons/6 persons)<br1>
|
||||
Archers (20 persons/20 persons)<br1>
|
||||
Clerics (4 persons/4 persons)<br1>
|
||||
Wizards (4 persons/4 persons)<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table><br>
|
||||
<button action="bypass -h Quest CastleMercenaryManager main" value="Return" width=80 height=27 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
|
||||
</center>
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>
|
||||
It is too late, the war has begun.
|
||||
</body></html>
|
@@ -1,7 +0,0 @@
|
||||
<html><body>
|
||||
I'm sorry, my lord.<br>
|
||||
You can only hire mercenaries during the seal validation period.<br><br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager main">Back</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,11 +0,0 @@
|
||||
<html><body>
|
||||
Greetings, my Lord. Would you care to hire the mercenaries of our guild?<br>
|
||||
Although you have already signed a Contract with special mercenaries who were after the Seal of Strife previously, you will not be able to place them unless they belong to our guild.<br>
|
||||
If you don't know how to draw up a Contract, just ask me.<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager mercmanager-01.html">Ask about how to draw up a Contract</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 1">Hire mercenaries</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 2">Hire elite mercenary guild members</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest CastleMercenaryManager buy 3">Hire a teleporter</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,162 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.ManorManager;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.Config;
|
||||
import com.l2jserver.gameserver.instancemanager.CastleManorManager;
|
||||
import com.l2jserver.gameserver.model.PcCondOverride;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.events.EventType;
|
||||
import com.l2jserver.gameserver.model.events.ListenerRegisterType;
|
||||
import com.l2jserver.gameserver.model.events.annotations.Id;
|
||||
import com.l2jserver.gameserver.model.events.annotations.RegisterEvent;
|
||||
import com.l2jserver.gameserver.model.events.annotations.RegisterType;
|
||||
import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcManorBypass;
|
||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
||||
import com.l2jserver.gameserver.network.serverpackets.BuyListSeed;
|
||||
import com.l2jserver.gameserver.network.serverpackets.ExShowCropInfo;
|
||||
import com.l2jserver.gameserver.network.serverpackets.ExShowManorDefaultInfo;
|
||||
import com.l2jserver.gameserver.network.serverpackets.ExShowProcureCropDetail;
|
||||
import com.l2jserver.gameserver.network.serverpackets.ExShowSeedInfo;
|
||||
import com.l2jserver.gameserver.network.serverpackets.ExShowSellCropList;
|
||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
||||
|
||||
/**
|
||||
* Manor manager AI.
|
||||
* @author malyelfik
|
||||
*/
|
||||
public final class ManorManager extends AbstractNpcAI
|
||||
{
|
||||
private static final int[] NPC =
|
||||
{
|
||||
35644,
|
||||
35645,
|
||||
35319,
|
||||
35366,
|
||||
36456,
|
||||
35512,
|
||||
35558,
|
||||
35229,
|
||||
35230,
|
||||
35231,
|
||||
35277,
|
||||
35103,
|
||||
35145,
|
||||
35187
|
||||
};
|
||||
|
||||
public ManorManager()
|
||||
{
|
||||
super(ManorManager.class.getSimpleName(), "ai/npc");
|
||||
addStartNpc(NPC);
|
||||
addFirstTalkId(NPC);
|
||||
addTalkId(NPC);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
switch (event)
|
||||
{
|
||||
case "manager-help-01.htm":
|
||||
case "manager-help-02.htm":
|
||||
case "manager-help-03.htm":
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (Config.ALLOW_MANOR)
|
||||
{
|
||||
final int castleId = npc.getTemplate().getParameters().getInt("manor_id", -1);
|
||||
if (!player.canOverrideCond(PcCondOverride.CASTLE_CONDITIONS) && player.isClanLeader() && (castleId == player.getClan().getCastleId()))
|
||||
{
|
||||
return "manager-lord.htm";
|
||||
}
|
||||
return "manager.htm";
|
||||
}
|
||||
return getHtm(player.getHtmlPrefix(), "html/npcdefault.htm");
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@RegisterEvent(EventType.ON_NPC_MANOR_BYPASS)
|
||||
@RegisterType(ListenerRegisterType.NPC)
|
||||
@Id({35644, 35645, 35319, 35366, 36456, 35512, 35558, 35229, 35230, 35231, 35277, 35103, 35145, 35187})
|
||||
// @formatter:on
|
||||
public final void onNpcManorBypass(OnNpcManorBypass evt)
|
||||
{
|
||||
final L2PcInstance player = evt.getActiveChar();
|
||||
if (CastleManorManager.getInstance().isUnderMaintenance())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THE_MANOR_SYSTEM_IS_CURRENTLY_UNDER_MAINTENANCE);
|
||||
return;
|
||||
}
|
||||
|
||||
final L2Npc npc = evt.getTarget();
|
||||
final int templateId = npc.getTemplate().getParameters().getInt("manor_id", -1);
|
||||
final int castleId = (evt.getManorId() == -1) ? templateId : evt.getManorId();
|
||||
switch (evt.getRequest())
|
||||
{
|
||||
case 1: // Seed purchase
|
||||
{
|
||||
if (templateId != castleId)
|
||||
{
|
||||
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.HERE_YOU_CAN_BUY_ONLY_SEEDS_OF_S1_MANOR).addCastleId(templateId));
|
||||
return;
|
||||
}
|
||||
player.sendPacket(new BuyListSeed(player.getAdena(), castleId));
|
||||
break;
|
||||
}
|
||||
case 2: // Crop sales
|
||||
player.sendPacket(new ExShowSellCropList(player.getInventory(), castleId));
|
||||
break;
|
||||
case 3: // Seed info
|
||||
player.sendPacket(new ExShowSeedInfo(castleId, evt.isNextPeriod(), false));
|
||||
break;
|
||||
case 4: // Crop info
|
||||
player.sendPacket(new ExShowCropInfo(castleId, evt.isNextPeriod(), false));
|
||||
break;
|
||||
case 5: // Basic info
|
||||
player.sendPacket(new ExShowManorDefaultInfo(false));
|
||||
break;
|
||||
case 6: // Buy harvester
|
||||
((L2MerchantInstance) npc).showBuyWindow(player, 300000 + npc.getId());
|
||||
break;
|
||||
case 9: // Edit sales (Crop sales)
|
||||
player.sendPacket(new ExShowProcureCropDetail(evt.getManorId()));
|
||||
break;
|
||||
default:
|
||||
_log.warning(getClass().getSimpleName() + ": Player " + player.getName() + " (" + player.getObjectId() + ") send unknown request id " + evt.getRequest() + "!");
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new ManorManager();
|
||||
}
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
<html><body>
|
||||
A manor refers to any property owned by the lord. Anything produced within its confines remains the exclusive property of the lord.<br>
|
||||
If you wish to be an agricultural producer, first you must buy a<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ManorManager manager-help-02.htm">seed</Button>
|
||||
and place it onto a monster. This can be easily accomplished while targeting.<br>
|
||||
When the monster, dies you will harvest a crop from its body. To harvest a crop, just target the corpse and use the harvester - if you don't have one, I'll happily sell you one! These crops are important to the manor, so after you've harvested them, bring the<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ManorManager manager-help-03.htm">crops</Button>
|
||||
to me!<br>
|
||||
I will then appraise them and give you an appropriate reward! I'll tell you about the rewards later...<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,11 +0,0 @@
|
||||
<html><body>
|
||||
There are both regular and alternative types of seeds. If you plant a regular seed, a monster will hide an item and give you a crop of equivalent value instead.<br>
|
||||
When you plant alternative seed, you will receive a crop approximately half of the time, and an item the other half of the time.<br>
|
||||
The lord established this system to give people more choice in what to plan in a manor.<br>
|
||||
There are four kinds of seed--coda, cobol, codran and coba, available at different levels. Coda seeds are most appropriate for level 10 - 30 farmers, relatively low levels. Cobol seeds are for farmers between level 31 and 48. Codran seeds are best for level 49 - 64 farmers. Coba seeds are reserved for high level farmers of level 65 or above.<br>
|
||||
Obviously, different seeds grow different crops, and work better with certain monsters. A weak monster will produce a disappointing crop, but, on the other hand, if it is too strong, it may damage the crop.<br>
|
||||
One secret of a successful crop is to pick a monster with approximately the same power as the sower. Trying to sow a seed on a non-compliant monster can have disastrous consequences.<br>
|
||||
You may purchase any seed at any time, but the lord reserves the right not to purchase any crop at his discretion. You should always check to make sure that your crop is currently in demand.<br>
|
||||
Oh, and keep this part a secret, but I hear that other castles also buy crops, as long as that same crop can be purchased there. That's my backup plan in case the Lord changes his mind.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ManorManager manager-help-01.htm">Back</Button>
|
||||
</body></html>
|
@@ -1,8 +0,0 @@
|
||||
<html><body>
|
||||
When a seed germinates inside a monster it becomes a crop. The best crops are harvested from monsters of a level similar to the sower.<br>
|
||||
Bring your harvested crops to me and you will be rewarded. The lord usually compensates farmers with items, some much more valuable than the crops.<br>
|
||||
Of course, you should be willing to gamble a little, right?<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest ManorManager manager-help-01.htm">Back</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,5 +0,0 @@
|
||||
<html><body>
|
||||
My Lord! To what do I owe the honor of a personal visit?<br>
|
||||
I serve at your pleasure, my Lord!<br>
|
||||
I would never even think of stealing from you! Please believe me!<br>
|
||||
</body></html>
|
@@ -1,16 +0,0 @@
|
||||
<html><body>
|
||||
I'm a merchant dispatched by the Lord in order to sell Seeds from the Manor and purchase Special Products.<br>
|
||||
The seeds I'm selling can be sowed only in the Manor. But the Special Products can be sold in any castle. When selling to another castle, I will sell to another Manor on your behalf for a small fee.<br>
|
||||
The buying and selling of seeds for Special Products begin each day at 8 pm. Prepare in advance by referring to the Manor information begins to be displayed from 4:30 am, and come back at 8 pm. If you don't hurry, items can be sold out. Huh Huh<br>
|
||||
If you also have Special Products, sell them to me. The Lord will be glad.<br>
|
||||
If you perhaps don't know what the Manor or Special Product is, ask me anytime -- I will explain them to you in detail.<br>
|
||||
<center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass manor_menu_select?ask=1&state=-1&time=0">Purchase Seeds</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass manor_menu_select?ask=2&state=-1&time=0">Settle Special Products</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass manor_menu_select?ask=3&state=-1&time=0">View the Manor information</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass manor_menu_select?ask=5&state=-1&time=0">View the basic Seed information</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass manor_menu_select?ask=6&state=-1&time=0">Purchase a Harvester</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_TerritoryStatus">Ask about the territory's current status</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ManorManager manager-help-01.htm">Listen</Button>
|
||||
</center>
|
||||
</body></html>
|
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.MonumentOfHeroes;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* Monument of Heroes AI.
|
||||
* @author Adry_85
|
||||
*/
|
||||
public final class MonumentOfHeroes extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int[] MONUMENTS =
|
||||
{
|
||||
31690,
|
||||
31769,
|
||||
31770,
|
||||
31771,
|
||||
31772
|
||||
};
|
||||
// Items
|
||||
private static final int WINGS_OF_DESTINY_CIRCLET = 6842;
|
||||
private static final int[] WEAPONS =
|
||||
{
|
||||
6611, // Infinity Blade
|
||||
6612, // Infinity Cleaver
|
||||
6613, // Infinity Axe
|
||||
6614, // Infinity Rod
|
||||
6615, // Infinity Crusher
|
||||
6616, // Infinity Scepter
|
||||
6617, // Infinity Stinger
|
||||
6618, // Infinity Fang
|
||||
6619, // Infinity Bow
|
||||
6620, // Infinity Wing
|
||||
6621, // Infinity Spear
|
||||
9388, // Infinity Rapier
|
||||
9389, // Infinity Sword
|
||||
9390, // Infinity Shooter
|
||||
};
|
||||
|
||||
private MonumentOfHeroes()
|
||||
{
|
||||
super(MonumentOfHeroes.class.getSimpleName(), "ai/npc");
|
||||
addStartNpc(MONUMENTS);
|
||||
addTalkId(MONUMENTS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case "HeroWeapon":
|
||||
{
|
||||
if (player.isHero())
|
||||
{
|
||||
return hasAtLeastOneQuestItem(player, WEAPONS) ? "already_have_weapon.htm" : "weapon_list.htm";
|
||||
}
|
||||
return "no_hero_weapon.htm";
|
||||
}
|
||||
case "HeroCirclet":
|
||||
{
|
||||
if (player.isHero())
|
||||
{
|
||||
if (!hasQuestItems(player, WINGS_OF_DESTINY_CIRCLET))
|
||||
{
|
||||
giveItems(player, WINGS_OF_DESTINY_CIRCLET, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
return "already_have_circlet.htm";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return "no_hero_circlet.htm";
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
int weaponId = Integer.parseInt(event);
|
||||
if (Util.contains(WEAPONS, weaponId))
|
||||
{
|
||||
giveItems(player, weaponId, 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new MonumentOfHeroes();
|
||||
}
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
<html><body scroll="no">
|
||||
<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="L2UI_CH3.refinewnd_back_Pattern">
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center>You already received the Wings of Destiny Circlet.</td></tr>
|
||||
<tr><td height=10></td></tr>
|
||||
<tr><td align=center>You cannot receive again.</td></tr>
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center><button action="bypass -h npc_%objectId%_Chat 0" value="Back" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Back_Down" fore="L2UI_CT1.OlympiadWnd_DF_Back"></td></tr>
|
||||
<tr><td height=200></td></tr>
|
||||
</table>
|
||||
</body></html>
|
@@ -1,11 +0,0 @@
|
||||
<html><body scroll="no">
|
||||
<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="L2UI_CH3.refinewnd_back_Pattern">
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center>You already received a weapon.</td></tr>
|
||||
<tr><td height=10></td></tr>
|
||||
<tr><td align=center>You cannot receive another weapon.</td></tr>
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center><button action="bypass -h npc_%objectId%_Chat 0" value="Back" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Back_Down" fore="L2UI_CT1.OlympiadWnd_DF_Back"></td></tr>
|
||||
<tr><td height=200></td></tr>
|
||||
</table>
|
||||
</body></html>
|
@@ -1,11 +0,0 @@
|
||||
<html><body scroll="no">
|
||||
<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="L2UI_CH3.refinewnd_back_Pattern">
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center>You cannot receive the circlet if you are not a hero.</td></tr>
|
||||
<tr><td height=10></td></tr>
|
||||
<tr><td align=center>Please come back next time as a hero.</td></tr>
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center><button action="bypass -h npc_%objectId%_Chat 0" value="Back" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Back_Down" fore="L2UI_CT1.OlympiadWnd_DF_Back"></td></tr>
|
||||
<tr><td height=200></td></tr>
|
||||
</table>
|
||||
</body></html>
|
@@ -1,11 +0,0 @@
|
||||
<html><body scroll="no">
|
||||
<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="L2UI_CH3.refinewnd_back_Pattern">
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center>If you are not a hero, you cannot receive a weapon.</td></tr>
|
||||
<tr><td height=10></td></tr>
|
||||
<tr><td align=center>Please come back next time as a hero.</td></tr>
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center><button action="bypass -h npc_%objectId%_Chat 0" value="Back" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Back_Down" fore="L2UI_CT1.OlympiadWnd_DF_Back"></td></tr>
|
||||
<tr><td height=200></td></tr>
|
||||
</table>
|
||||
</body></html>
|
@@ -1,26 +0,0 @@
|
||||
<html><body>
|
||||
<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="L2UI_CH3.refinewnd_back_Pattern">
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center>Select a weapon that suits you.</td></tr>
|
||||
<tr><td height=30></td></tr>
|
||||
<tr><td align=center>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6611" msg="1484;">Infinity Blade (One-Handed Sword)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6612" msg="1484;">Infinity Cleaver (Two-Handed Sword)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6613" msg="1484;">Infinity Axe (One-Handed Blunt Weapon)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6614" msg="1484;">Infinity Rod (One-Handed Blunt Weapon)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6615" msg="1484;">Infinity Crusher (Two-Handed Blunt Weapon)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6616" msg="1484;">Infinity Scepter (Two-Handed Staff)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6617" msg="1484;">Infinity Stinger (Dagger)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6618" msg="1484;">Infinity Fang (Fist Weapon)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6619" msg="1484;">Infinity Bow (Bow)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6620" msg="1484;">Infinity Wing (Dualsword)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 6621" msg="1484;">Infinity Spear (Pole Arm)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 9388" msg="2234;">Infinity Rapier (Kamael-Exclusive Short Sword)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 9389" msg="2234;">Infinity Sword (Kamael-Exclusive Ancient Sword)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest MonumentOfHeroes 9390" msg="2234;">Infinity Shooter (Kamael-Exclusive Crossbow)</Button>
|
||||
</td></tr>
|
||||
<tr><td height=34></td></tr>
|
||||
<tr><td align=center><button action="bypass -h npc_%objectId%_Chat 0" value="Back" width=200 height=31 back="L2UI_CT1.OlympiadWnd_DF_Back_Down" fore="L2UI_CT1.OlympiadWnd_DF_Back"></td></tr>
|
||||
<tr><td height=30></td></tr>
|
||||
</table>
|
||||
</body></html>
|
@@ -1,215 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J Server
|
||||
*
|
||||
* This file is part of L2J Server.
|
||||
*
|
||||
* L2J Server is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J Server 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.npc.NpcBuffers;
|
||||
|
||||
import com.l2jserver.gameserver.ThreadPoolManager;
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2TamedBeastInstance;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
import com.l2jserver.gameserver.model.zone.ZoneId;
|
||||
import com.l2jserver.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class NpcBufferAI implements Runnable
|
||||
{
|
||||
private final L2Npc _npc;
|
||||
private final NpcBufferSkillData _skillData;
|
||||
|
||||
protected NpcBufferAI(L2Npc npc, NpcBufferSkillData skill)
|
||||
{
|
||||
_npc = npc;
|
||||
_skillData = skill;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if ((_npc == null) || !_npc.isVisible() || _npc.isDecayed() || _npc.isDead() || (_skillData == null) || (_skillData.getSkill() == null))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((_npc.getSummoner() == null) || !_npc.getSummoner().isPlayer())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill skill = _skillData.getSkill();
|
||||
final L2PcInstance player = _npc.getSummoner().getActingPlayer();
|
||||
|
||||
switch (_skillData.getAffectScope())
|
||||
{
|
||||
case PARTY:
|
||||
{
|
||||
if (player.isInParty())
|
||||
{
|
||||
for (L2PcInstance member : player.getParty().getMembers())
|
||||
{
|
||||
if (Util.checkIfInRange(skill.getAffectRange(), _npc, member, true) && !member.isDead())
|
||||
{
|
||||
skill.applyEffects(player, member);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Util.checkIfInRange(skill.getAffectRange(), _npc, player, true) && !player.isDead())
|
||||
{
|
||||
skill.applyEffects(player, player);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case RANGE:
|
||||
{
|
||||
for (L2Character target : _npc.getKnownList().getKnownCharactersInRadius(skill.getAffectRange()))
|
||||
{
|
||||
switch (_skillData.getAffectObject())
|
||||
{
|
||||
case FRIEND:
|
||||
{
|
||||
if (isFriendly(player, target) && !target.isDead())
|
||||
{
|
||||
skill.applyEffects(target, target);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NOT_FRIEND:
|
||||
{
|
||||
if (isEnemy(player, target) && !target.isDead())
|
||||
{
|
||||
// Update PvP status
|
||||
if (target.isPlayable())
|
||||
{
|
||||
player.updatePvPStatus(target);
|
||||
}
|
||||
skill.applyEffects(target, target);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
ThreadPoolManager.getInstance().scheduleGeneral(this, _skillData.getDelay());
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies if the character is an friend and can be affected by positive effect.
|
||||
* @param player the player
|
||||
* @param target the target
|
||||
* @return {@code true} if target can be affected by positive effect, {@code false} otherwise
|
||||
*/
|
||||
private boolean isFriendly(L2PcInstance player, L2Character target)
|
||||
{
|
||||
if (target.isPlayable())
|
||||
{
|
||||
final L2PcInstance targetPlayer = target.getActingPlayer();
|
||||
|
||||
if (player == targetPlayer)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player.isInPartyWith(targetPlayer))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player.isInCommandChannelWith(targetPlayer))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player.isInClanWith(targetPlayer))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player.isInAllyWith(targetPlayer))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player.isOnSameSiegeSideWith(targetPlayer))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies if the character is an enemy and can be affected by negative effect.
|
||||
* @param player the player
|
||||
* @param target the target
|
||||
* @return {@code true} if target can be affected by negative effect, {@code false} otherwise
|
||||
*/
|
||||
private boolean isEnemy(L2PcInstance player, L2Character target)
|
||||
{
|
||||
if (isFriendly(player, target))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (target instanceof L2TamedBeastInstance)
|
||||
{
|
||||
return isEnemy(player, ((L2TamedBeastInstance) target).getOwner());
|
||||
}
|
||||
|
||||
if (target.isMonster())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (target.isPlayable())
|
||||
{
|
||||
final L2PcInstance targetPlayer = target.getActingPlayer();
|
||||
|
||||
if (!isFriendly(player, targetPlayer))
|
||||
{
|
||||
if (targetPlayer.getPvpFlag() != 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (targetPlayer.getKarma() != 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player.isAtWarWith(targetPlayer))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (targetPlayer.isInsideZone(ZoneId.PVP))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J Server
|
||||
*
|
||||
* This file is part of L2J Server.
|
||||
*
|
||||
* L2J Server is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J Server 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.npc.NpcBuffers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class NpcBufferData
|
||||
{
|
||||
private final int _id;
|
||||
private final List<NpcBufferSkillData> _skills = new ArrayList<>();
|
||||
|
||||
public NpcBufferData(int id)
|
||||
{
|
||||
_id = id;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return _id;
|
||||
}
|
||||
|
||||
public void addSkill(NpcBufferSkillData skill)
|
||||
{
|
||||
_skills.add(skill);
|
||||
}
|
||||
|
||||
public List<NpcBufferSkillData> getSkills()
|
||||
{
|
||||
return _skills;
|
||||
}
|
||||
}
|
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J Server
|
||||
*
|
||||
* This file is part of L2J Server.
|
||||
*
|
||||
* L2J Server is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J Server 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.npc.NpcBuffers;
|
||||
|
||||
import com.l2jserver.gameserver.model.StatsSet;
|
||||
import com.l2jserver.gameserver.model.holders.SkillHolder;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
import com.l2jserver.gameserver.model.skills.targets.AffectObject;
|
||||
import com.l2jserver.gameserver.model.skills.targets.AffectScope;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class NpcBufferSkillData
|
||||
{
|
||||
private final SkillHolder _skill;
|
||||
private final int _initialDelay;
|
||||
private final int _delay;
|
||||
private final AffectScope _affectScope;
|
||||
private final AffectObject _affectObject;
|
||||
|
||||
public NpcBufferSkillData(StatsSet set)
|
||||
{
|
||||
_skill = new SkillHolder(set.getInt("id"), set.getInt("level"));
|
||||
_initialDelay = set.getInt("skillInitDelay", 0) * 1000;
|
||||
_delay = set.getInt("delay") * 1000;
|
||||
_affectScope = set.getEnum("affectScope", AffectScope.class);
|
||||
_affectObject = set.getEnum("affectObject", AffectObject.class);
|
||||
}
|
||||
|
||||
public Skill getSkill()
|
||||
{
|
||||
return _skill.getSkill();
|
||||
}
|
||||
|
||||
public int getInitialDelay()
|
||||
{
|
||||
return _initialDelay;
|
||||
}
|
||||
|
||||
public int getDelay()
|
||||
{
|
||||
return _delay;
|
||||
}
|
||||
|
||||
public AffectScope getAffectScope()
|
||||
{
|
||||
return _affectScope;
|
||||
}
|
||||
|
||||
public AffectObject getAffectObject()
|
||||
{
|
||||
return _affectObject;
|
||||
}
|
||||
}
|
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J Server
|
||||
*
|
||||
* This file is part of L2J Server.
|
||||
*
|
||||
* L2J Server is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J Server 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.npc.NpcBuffers;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.ThreadPoolManager;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public final class NpcBuffers extends AbstractNpcAI
|
||||
{
|
||||
private final NpcBuffersData _npcBuffers = new NpcBuffersData();
|
||||
|
||||
private NpcBuffers()
|
||||
{
|
||||
super(NpcBuffers.class.getSimpleName(), "npc");
|
||||
|
||||
for (int npcId : _npcBuffers.getNpcBufferIds())
|
||||
{
|
||||
// TODO: Cleanup once npc rework is finished and default html is configurable.
|
||||
addFirstTalkId(npcId);
|
||||
addSpawnId(npcId);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Cleanup once npc rework is finished and default html is configurable.
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(L2Npc npc)
|
||||
{
|
||||
final NpcBufferData data = _npcBuffers.getNpcBuffer(npc.getId());
|
||||
for (NpcBufferSkillData skill : data.getSkills())
|
||||
{
|
||||
ThreadPoolManager.getInstance().scheduleAi(new NpcBufferAI(npc, skill), skill.getInitialDelay());
|
||||
}
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new NpcBuffers();
|
||||
}
|
||||
}
|
@@ -1,109 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.NpcBuffers;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import com.l2jserver.gameserver.model.StatsSet;
|
||||
import com.l2jserver.util.data.xml.IXmlReader;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class NpcBuffersData implements IXmlReader
|
||||
{
|
||||
private final Map<Integer, NpcBufferData> _npcBuffers = new HashMap<>();
|
||||
|
||||
protected NpcBuffersData()
|
||||
{
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load()
|
||||
{
|
||||
parseDatapackFile("scripts/ai/npc/NpcBuffers/NpcBuffersData.xml");
|
||||
LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _npcBuffers.size() + " buffers data.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parseDocument(Document doc)
|
||||
{
|
||||
StatsSet set;
|
||||
Node attr;
|
||||
NamedNodeMap attrs;
|
||||
for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
|
||||
{
|
||||
if ("list".equalsIgnoreCase(n.getNodeName()))
|
||||
{
|
||||
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
|
||||
{
|
||||
if ("npc".equalsIgnoreCase(d.getNodeName()))
|
||||
{
|
||||
attrs = d.getAttributes();
|
||||
final int npcId = parseInteger(attrs, "id");
|
||||
final NpcBufferData npc = new NpcBufferData(npcId);
|
||||
for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
|
||||
{
|
||||
switch (c.getNodeName())
|
||||
{
|
||||
case "skill":
|
||||
{
|
||||
attrs = c.getAttributes();
|
||||
set = new StatsSet();
|
||||
for (int i = 0; i < attrs.getLength(); i++)
|
||||
{
|
||||
attr = attrs.item(i);
|
||||
set.set(attr.getNodeName(), attr.getNodeValue());
|
||||
}
|
||||
npc.addSkill(new NpcBufferSkillData(set));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
_npcBuffers.put(npcId, npc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public NpcBufferData getNpcBuffer(int npcId)
|
||||
{
|
||||
return _npcBuffers.get(npcId);
|
||||
}
|
||||
|
||||
public Collection<NpcBufferData> getNpcBuffers()
|
||||
{
|
||||
return _npcBuffers.values();
|
||||
}
|
||||
|
||||
public Set<Integer> getNpcBufferIds()
|
||||
{
|
||||
return _npcBuffers.keySet();
|
||||
}
|
||||
}
|
@@ -1,101 +0,0 @@
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="NpcBuffersData.xsd">
|
||||
<npc id="106"> <!-- Birthday Cake -->
|
||||
<skill id="22250" level="1" initialDelay="1" delay="60" affectScope="PARTY" affectObject="FRIEND" /> <!-- Birthday Cake Vitality Buff -->
|
||||
</npc>
|
||||
<npc id="139"> <!-- Birthday Cake -->
|
||||
<skill id="22035" level="1" initialDelay="1" delay="60" affectScope="PARTY" affectObject="FRIEND" /> <!-- Birthday Cake Vitality Buff -->
|
||||
</npc>
|
||||
<npc id="143"> <!-- Totem of Body -->
|
||||
<skill id="23308" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Totem's Energy - Body -->
|
||||
</npc>
|
||||
<npc id="144"> <!-- Totem of Spirit -->
|
||||
<skill id="23309" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Totem's Energy - Spirit -->
|
||||
</npc>
|
||||
<npc id="145"> <!-- Totem of Bravery -->
|
||||
<skill id="23310" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Totem's Energy - Courage -->
|
||||
</npc>
|
||||
<npc id="146"> <!-- Totem of Fortitude -->
|
||||
<skill id="23311" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Totem's Energy - Fortitude -->
|
||||
</npc>
|
||||
<npc id="13007"> <!-- Special Christmas Tree -->
|
||||
<skill id="2139" level="1" initialDelay="1" delay="10" affectScope="RANGE" affectObject="FRIEND" /> <!-- Special Tree Recovery Bonus -->
|
||||
</npc>
|
||||
<npc id="13018">
|
||||
<skill id="5123" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Maximum Defense -->
|
||||
</npc>
|
||||
<npc id="13019">
|
||||
<skill id="5124" level="1" initialDelay="1" delay="2" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Anti-Music -->
|
||||
</npc>
|
||||
<npc id="13020">
|
||||
<skill id="5125" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Maximum Resist Status -->
|
||||
</npc>
|
||||
<npc id="13021">
|
||||
<skill id="5126" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Maximum Recovery -->
|
||||
</npc>
|
||||
<npc id="13022">
|
||||
<skill id="5127" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Recover Force -->
|
||||
</npc>
|
||||
<npc id="13023">
|
||||
<skill id="5128" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Maximize long-range weapon use -->
|
||||
</npc>
|
||||
<npc id="13024">
|
||||
<skill id="5129" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Smokescreen -->
|
||||
</npc>
|
||||
<npc id="13028">
|
||||
<skill id="5145" level="1" initialDelay="1" delay="2" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Day of Doom -->
|
||||
</npc>
|
||||
<npc id="13030">
|
||||
<skill id="5134" level="1" initialDelay="1" delay="2" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Anti-Summoning Field -->
|
||||
</npc>
|
||||
<npc id="13071"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="1" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13072"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="2" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13073"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="3" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13074"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="4" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13075"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="5" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13076"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="6" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13257"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="7" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13258"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="8" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13259"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="9" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13260"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="10" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13261"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="11" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13262"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="12" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13263"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="13" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13264"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="14" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13265"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="15" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13266"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="16" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
<npc id="13267"> <!-- Virtual Image -->
|
||||
<skill id="5272" level="17" delay="5" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Decoy Provocation -->
|
||||
</npc>
|
||||
</list>
|
@@ -1,25 +0,0 @@
|
||||
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
<xs:element name="list">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="npc" maxOccurs="unbounded" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="skill">
|
||||
<xs:complexType>
|
||||
<xs:attribute type="xs:positiveInteger" name="id" use="required" />
|
||||
<xs:attribute type="xs:short" name="level" use="required" />
|
||||
<xs:attribute type="xs:positiveInteger" name="initialDelay" use="optional" />
|
||||
<xs:attribute type="xs:positiveInteger" name="delay" use="required" />
|
||||
<xs:attribute type="xs:string" name="affectScope" use="optional" />
|
||||
<xs:attribute type="xs:string" name="affectObject" use="optional" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:positiveInteger" name="id" use="required" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.Summons.MerchantGolem;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
|
||||
/**
|
||||
* Golem Trader AI.
|
||||
* @author Zoey76
|
||||
*/
|
||||
public final class GolemTrader extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int GOLEM_TRADER = 13128;
|
||||
|
||||
private GolemTrader()
|
||||
{
|
||||
super(GolemTrader.class.getSimpleName(), "ai/npc/Summons");
|
||||
addSpawnId(GOLEM_TRADER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(L2Npc npc)
|
||||
{
|
||||
npc.scheduleDespawn(180000);
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new GolemTrader();
|
||||
}
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
<html><body>&$556;<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30600">Dark Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30601">Dwarven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30599">Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30602">Orc Village - 1 Newbie Travel Token</Button>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>&$556;<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30600">Dark Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30601">Dwarven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30598">Talking Island - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30602">Orc Village - 1 Newbie Travel Token</Button>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>&$556;<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30601">Dwarven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30598">Talking Island - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30599">Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30602">Orc Village - 1 Newbie Travel Token</Button>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>&$556;<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30600">Dark Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30598">Talking Island - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30599">Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30602">Orc Village - 1 Newbie Travel Token</Button>
|
||||
</body></html>
|
@@ -1,6 +0,0 @@
|
||||
<html><body>&$556;<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30600">Dark Elven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30601">Dwarven Village - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30598">Talking Island - 1 Newbie Travel Token</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest NewbieTravelToken 30599">Elven Village - 1 Newbie Travel Token</Button>
|
||||
</body></html>
|
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.Teleports.NewbieTravelToken;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.Location;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
||||
import com.l2jserver.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* Newbie Travel Token AI.
|
||||
* @author Plim
|
||||
*/
|
||||
public final class NewbieTravelToken extends AbstractNpcAI
|
||||
{
|
||||
// Item
|
||||
private static final int NEWBIE_TRAVEL_TOKEN = 8542;
|
||||
// NPC Id - Teleport Location
|
||||
private static final Map<Integer, Location> DATA = new HashMap<>();
|
||||
|
||||
private NewbieTravelToken()
|
||||
{
|
||||
super(NewbieTravelToken.class.getSimpleName(), "ai/npc/Teleports");
|
||||
// Initialize Map
|
||||
DATA.put(30600, new Location(12160, 16554, -4583)); // DE
|
||||
DATA.put(30601, new Location(115594, -177993, -912)); // DW
|
||||
DATA.put(30599, new Location(45470, 48328, -3059)); // EV
|
||||
DATA.put(30602, new Location(-45067, -113563, -199)); // OV
|
||||
DATA.put(30598, new Location(-84053, 243343, -3729)); // TI
|
||||
|
||||
for (int npcId : DATA.keySet())
|
||||
{
|
||||
addStartNpc(npcId);
|
||||
addTalkId(npcId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (Util.isDigit(event))
|
||||
{
|
||||
final int npcId = Integer.parseInt(event);
|
||||
if (DATA.keySet().contains(npcId))
|
||||
{
|
||||
if (hasQuestItems(player, NEWBIE_TRAVEL_TOKEN))
|
||||
{
|
||||
takeItems(player, NEWBIE_TRAVEL_TOKEN, 1);
|
||||
player.teleToLocation(DATA.get(npcId), false);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
}
|
||||
return event;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
return player.getLevel() >= 20 ? "cant-travel.htm" : npc.getId() + ".htm";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new NewbieTravelToken();
|
||||
}
|
||||
}
|
@@ -1,4 +0,0 @@
|
||||
<html><body>Newbie Guide:<br>
|
||||
Characters of level 20 or above may not use the Newbie Travel Token to teleport.<br>
|
||||
Newbie Travel Token were designed to help newcomers to this world get started.
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Researcher Keplon:<br>
|
||||
Don't do this to me! I would love to give them out to you, but I am not so well off to give them out for nothing.
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Researcher Euclie:<br>
|
||||
No way, no. I can't give it out for free. I didn't get this for free either.
|
||||
</body></html>
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Researcher Pithgon:<br>
|
||||
If you have no Adena, I have no interest trading with you. Sorry.
|
||||
</body></html>
|
@@ -1,145 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J DataPack
|
||||
*
|
||||
* This file is part of L2J DataPack.
|
||||
*
|
||||
* L2J DataPack is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J DataPack is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.npc.Teleports.ToIVortex;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import ai.npc.AbstractNpcAI;
|
||||
|
||||
import com.l2jserver.gameserver.model.Location;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
|
||||
|
||||
/**
|
||||
* Tower of Insolence Vortex teleport AI.<br>
|
||||
* Updated to High Five by pmq.<br>
|
||||
* Reworked by xban1x.
|
||||
* @author Plim
|
||||
*/
|
||||
public final class ToIVortex extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int KEPLON = 30949;
|
||||
private static final int EUCLIE = 30950;
|
||||
private static final int PITHGON = 30951;
|
||||
private static final int DIMENSION_VORTEX_1 = 30952;
|
||||
private static final int DIMENSION_VORTEX_2 = 30953;
|
||||
private static final int DIMENSION_VORTEX_3 = 30954;
|
||||
// Items
|
||||
private static final int GREEN_DIMENSION_STONE = 4401;
|
||||
private static final int BLUE_DIMENSION_STONE = 4402;
|
||||
private static final int RED_DIMENSION_STONE = 4403;
|
||||
private static final Map<String, Integer> TOI_FLOOR_ITEMS = new HashMap<>();
|
||||
// Locations
|
||||
private static final Map<String, Location> TOI_FLOORS = new HashMap<>();
|
||||
// Misc
|
||||
private static final Map<String, Integer> DIMENSION_TRADE = new HashMap<>();
|
||||
static
|
||||
{
|
||||
TOI_FLOORS.put("1", new Location(114356, 13423, -5096));
|
||||
TOI_FLOORS.put("2", new Location(114666, 13380, -3608));
|
||||
TOI_FLOORS.put("3", new Location(111982, 16028, -2120));
|
||||
TOI_FLOORS.put("4", new Location(114636, 13413, -640));
|
||||
TOI_FLOORS.put("5", new Location(114152, 19902, 928));
|
||||
TOI_FLOORS.put("6", new Location(117131, 16044, 1944));
|
||||
TOI_FLOORS.put("7", new Location(113026, 17687, 2952));
|
||||
TOI_FLOORS.put("8", new Location(115571, 13723, 3960));
|
||||
TOI_FLOORS.put("9", new Location(114649, 14144, 4976));
|
||||
TOI_FLOORS.put("10", new Location(118507, 16605, 5984));
|
||||
|
||||
TOI_FLOOR_ITEMS.put("1", GREEN_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("2", GREEN_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("3", GREEN_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("4", BLUE_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("5", BLUE_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("6", BLUE_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("7", RED_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("8", RED_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("9", RED_DIMENSION_STONE);
|
||||
TOI_FLOOR_ITEMS.put("10", RED_DIMENSION_STONE);
|
||||
|
||||
DIMENSION_TRADE.put("GREEN", GREEN_DIMENSION_STONE);
|
||||
DIMENSION_TRADE.put("BLUE", BLUE_DIMENSION_STONE);
|
||||
DIMENSION_TRADE.put("RED", RED_DIMENSION_STONE);
|
||||
}
|
||||
|
||||
private ToIVortex()
|
||||
{
|
||||
super(ToIVortex.class.getSimpleName(), "ai/npc/Teleports");
|
||||
addStartNpc(KEPLON, EUCLIE, PITHGON, DIMENSION_VORTEX_1, DIMENSION_VORTEX_2, DIMENSION_VORTEX_3);
|
||||
addTalkId(KEPLON, EUCLIE, PITHGON, DIMENSION_VORTEX_1, DIMENSION_VORTEX_2, DIMENSION_VORTEX_3);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
int npcId = npc.getId();
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case "1":
|
||||
case "2":
|
||||
case "3":
|
||||
case "4":
|
||||
case "5":
|
||||
case "6":
|
||||
case "7":
|
||||
case "8":
|
||||
case "9":
|
||||
case "10":
|
||||
{
|
||||
final Location loc = TOI_FLOORS.get(event);
|
||||
final int itemId = TOI_FLOOR_ITEMS.get(event);
|
||||
if (hasQuestItems(player, itemId))
|
||||
{
|
||||
takeItems(player, itemId, 1);
|
||||
player.teleToLocation(loc, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
return "no-stones.htm";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "GREEN":
|
||||
case "BLUE":
|
||||
case "RED":
|
||||
{
|
||||
if (player.getAdena() >= 10000)
|
||||
{
|
||||
takeItems(player, Inventory.ADENA_ID, 10000);
|
||||
giveItems(player, DIMENSION_TRADE.get(event), 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
return npcId + "no-adena.htm";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new ToIVortex();
|
||||
}
|
||||
}
|
@@ -1,3 +0,0 @@
|
||||
<html><body>Dimensional Vortex:<br>
|
||||
You do not have the Dimensional Stone required for teleportation.
|
||||
</body></html>
|
@@ -2,7 +2,6 @@
|
||||
Welcome to the Temple of Einhasad. I follow here in the footsteps of my father, who was a bishop in the service of <font color="LEVEL">Einhasad, the goddess of light</font>. What brings you here today, my friend? Do you wish to devote yourself to her service as well?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Ask about Einhasad.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
May the splendor of Einhasad, the goddess of light, shine upon you. Welcome to the Temple of Einhasad. Serving the goddess is fulfillment itself. Trust in her and do her will and you will not regret it.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
Welcome, fellow practitioner of the Dark Arts. Do you wish to gain the power to terrify the Spirits of Darkness into obeying your will? Do you want to learn the secrets only known to Gran Kain? Abandon your preconceptions and I will lead you down a road of new learning.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
Darkness is the source of fear for the other races' Wizards, but that is shortsighted. They see only half the picture! I will teach you the ultimate power behind the darkness and the secret of the magic that lies hidden in the shadow.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -4,6 +4,5 @@ They have no trouble killing each other with sword and spear, so scruples about
|
||||
There must be more to this, perhaps some sort of conspiracy to learn its secrets and keep them from the other races. I wouldn't be surprised if the Ivory Tower even has a secret facility for studying the Dark Arts...<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
You don't have to introduce yourself--I already know all about you. I am Magister Errikin. Perhaps you've already noticed that this town is a dangerous place. You could easily be called on to defend not only your life, but more importantly, your honor.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -3,6 +3,5 @@ Should I let this one live or not? Ah, I was just talking to myself.<br>
|
||||
Why are you here? Grand Magister Fairen has a terrible headache, so bother him at your peril. Like him, I hate to be bothered because of trivialities...<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
Welcome, stranger. May Shilen's darkness cloak and protect you. Don't worry about those two frowning women over there. One hasn't slept much recently, and the other is just as sour as an old lemon. Ha ha ha!<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
What do you know about Devil's Isle? I heard a rumor that the ghost of Great Pirate Zaken still haunts it... Our temple is definitely not happy with that... This is all due to those greedy adventurers seeking treasure there -- they must have awakened Zaken's spirit. Well, they paid the price for their avarice; not a one of them returned. If you choose to set foot on that accursed island, take great care. Only the light of Einhasad can vanquish so powerful an undead...<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -2,6 +2,5 @@
|
||||
We Elves serve Elvas and Andariel -- Eva and Einhasad, in the Human tongue. Our faith is closely connected to Mother Tree. It is the symbol and archetype of all the trees created by the goddesses, as well as the means by which they communicate their will to us. The Mother Tree here Innadril was grown from a small branch brought from the Elven Forest's Mother Tree itself, and the 2 trees are connected as one living being...<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -3,6 +3,5 @@ True, there's a lot of clamoring these days about the return of Shilen. Those cl
|
||||
I am not skilled in using weapons, but I have some other useful skills...<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_SkillList">Learn skills.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest HealerTrainer SkillTransfer">Ask about Skill Transfer.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Link common/skill_enchant_help.htm">Ask about Skill Enchanting.</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -46,15 +46,6 @@ public final class FirstClassTransferTalk extends AbstractNpcAI
|
||||
MASTERS.put(30565, Race.ORC); // Kakai, Orc Village Flame Lord
|
||||
MASTERS.put(30520, Race.DWARF); // Reed, Dwarven Village Warehouse Chief
|
||||
MASTERS.put(30525, Race.DWARF); // Bronk, Dwarven Village Head Blacksmith
|
||||
// Kamael Village NPCs
|
||||
MASTERS.put(32171, Race.DWARF); // Hoffa, Warehouse Chief
|
||||
MASTERS.put(32158, Race.DWARF); // Fisler, Dwarf Guild Warehouse Chief
|
||||
MASTERS.put(32157, Race.DWARF); // Moka, Dwarf Guild Head Blacksmith
|
||||
MASTERS.put(32160, Race.DARK_ELF); // Devon, Dark Elf Guild Grand Magister
|
||||
MASTERS.put(32147, Race.ELF); // Rivian, Elf Guild Grand Master
|
||||
MASTERS.put(32150, Race.ORC); // Took, Orc Guild High Prefect
|
||||
MASTERS.put(32153, Race.HUMAN); // Prana, Human Guild High Priest
|
||||
MASTERS.put(32154, Race.HUMAN); // Aldenia, Human Guild Grand Master
|
||||
}
|
||||
|
||||
private FirstClassTransferTalk()
|
||||
|
Reference in New Issue
Block a user