Merged with released L2J-Unity files.
This commit is contained in:
8
trunk/dist/game/data/scripts/ai/areas/FairySettlement/LargeCocoon/32920.html
vendored
Normal file
8
trunk/dist/game/data/scripts/ai/areas/FairySettlement/LargeCocoon/32920.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Large Cocoon:<br>
|
||||
You can see... many fairy citizens are being changed within these... cocoons,<br>
|
||||
but it's not too late... to stop them! Attack the cocoons, while they are still forming, and you will destroy them.<br>
|
||||
Otherwise, you can promote the mutation by injecting <font color="LEVEL">Glimmer</font> into them channel where nutrients are supplied.<br><br>
|
||||
(To use <font color="LEVEL">Glimmer</font>, target a cocoon and click Glimmer. To attack the cocoon, initiate an attack while pressing the Ctrl key. For a powerful attack, use your skills.)<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest LargeCocoon attack">Attack</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest LargeCocoon attackPowerful">Launch a powerful attack</Button>
|
||||
</body></html>
|
282
trunk/dist/game/data/scripts/ai/areas/FairySettlement/LargeCocoon/LargeCocoon.java
vendored
Normal file
282
trunk/dist/game/data/scripts/ai/areas/FairySettlement/LargeCocoon/LargeCocoon.java
vendored
Normal file
@@ -0,0 +1,282 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.areas.FairySettlement.LargeCocoon;
|
||||
|
||||
import com.l2jmobius.gameserver.instancemanager.QuestManager;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Playable;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureAttacked;
|
||||
import com.l2jmobius.gameserver.model.quest.Quest;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10305_UnstoppableFutileEfforts.Q10305_UnstoppableFutileEfforts;
|
||||
|
||||
/**
|
||||
* Large Cocoon AI.
|
||||
* @author St3eT
|
||||
*/
|
||||
public final class LargeCocoon extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int LARGE_COCOON = 32920;
|
||||
private static final int COCOON = 32919;
|
||||
private static final int LARGE_CONTAMINED_COCOON = 19394;
|
||||
private static final int COCOON_DESTROYER = 19294;
|
||||
private static final int FAIRY_WARRIOR = 22867;
|
||||
private static final int FAIRY_WARRIOR_HARD = 22870;
|
||||
private static final int FAIRY_ROGUE = 22875;
|
||||
private static final int FAIRY_ROGUE_HARD = 22878;
|
||||
private static final int FAIRY_KNIGHT = 22883;
|
||||
private static final int FAIRY_KNIGHT_HARD = 22886;
|
||||
private static final int FAIRY_SUMMONER = 22899;
|
||||
private static final int FAIRY_SUMMONER_HARD = 22902;
|
||||
private static final int FAIRY_WIZARD = 22891;
|
||||
private static final int FAIRY_WIZARD_HARD = 22894;
|
||||
private static final int FAIRY_WITCH = 22907;
|
||||
private static final int FAIRY_WITCH_HARD = 22910;
|
||||
|
||||
private LargeCocoon()
|
||||
{
|
||||
addStartNpc(COCOON, LARGE_COCOON);
|
||||
addTalkId(COCOON, LARGE_COCOON);
|
||||
addFirstTalkId(COCOON, LARGE_COCOON);
|
||||
addSpawnId(COCOON, LARGE_COCOON);
|
||||
setCreatureAttackedId(this::onCreatureAttacked, LARGE_COCOON);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case "attack":
|
||||
{
|
||||
onCreatureAttacked(new OnCreatureAttacked(player, npc));
|
||||
break;
|
||||
}
|
||||
case "attackPowerful":
|
||||
{
|
||||
// TODO: Quest 466 stuffs
|
||||
final Quest qs10305 = QuestManager.getInstance().getQuest(Q10305_UnstoppableFutileEfforts.class.getSimpleName());
|
||||
if (qs10305 != null)
|
||||
{
|
||||
qs10305.notifyEvent("NOTIFY_Q10305", npc, player);
|
||||
}
|
||||
|
||||
if (getRandom(3) < 1)
|
||||
{
|
||||
addSpawn(LARGE_CONTAMINED_COCOON, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 30000);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (getRandom(6))
|
||||
{
|
||||
case 0:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WARRIOR_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_ROGUE_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WIZARD_HARD, npc, false, 90000), player);
|
||||
break;
|
||||
case 1:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_KNIGHT_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_SUMMONER_HARD, npc, false, 90000), player);
|
||||
break;
|
||||
case 2:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WARRIOR_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WIZARD_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH_HARD, npc, false, 90000), player);
|
||||
break;
|
||||
case 3:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_ROGUE_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WARRIOR_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_ROGUE_HARD, npc, false, 90000), player);
|
||||
break;
|
||||
case 4:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WIZARD_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_SUMMONER_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH_HARD, npc, false, 90000), player);
|
||||
break;
|
||||
case 5:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_KNIGHT_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_KNIGHT_HARD, npc, false, 90000), player);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH_HARD, npc, false, 90000), player);
|
||||
break;
|
||||
}
|
||||
}
|
||||
npc.deleteMe();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(L2Npc npc)
|
||||
{
|
||||
if (getRandom(3) < 1)
|
||||
{
|
||||
addSpawn(COCOON_DESTROYER, npc.getX() + 120, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
}
|
||||
|
||||
switch (getRandom(6))
|
||||
{
|
||||
case 0:
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX() + 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_ROGUE, npc.getX() + 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 1:
|
||||
addSpawn(FAIRY_KNIGHT, npc.getX() + 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_ROGUE, npc.getX() + 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 2:
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX() + 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_KNIGHT, npc.getX() + 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 3:
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX() + 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX() + 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 4:
|
||||
addSpawn(FAIRY_WITCH, npc.getX() + 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX() + 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 5:
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX() + 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WITCH, npc.getX() + 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (getRandom(6))
|
||||
{
|
||||
case 0:
|
||||
addSpawn(FAIRY_ROGUE, npc.getX() - 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX() - 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 1:
|
||||
addSpawn(FAIRY_KNIGHT, npc.getX() - 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_ROGUE, npc.getX() - 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 2:
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX() - 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_KNIGHT, npc.getX() - 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 3:
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX() - 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WIZARD, npc.getX() - 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 4:
|
||||
addSpawn(FAIRY_WITCH, npc.getX() - 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX() - 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 5:
|
||||
addSpawn(FAIRY_WIZARD, npc.getX() - 270, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WITCH, npc.getX() - 230, npc.getY(), npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (getRandom(6))
|
||||
{
|
||||
case 0:
|
||||
addSpawn(FAIRY_ROGUE, npc.getX(), npc.getY() + 270, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX(), npc.getY() + 230, npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 1:
|
||||
addSpawn(FAIRY_KNIGHT, npc.getX(), npc.getY() + 270, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_ROGUE, npc.getX(), npc.getY() + 230, npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 2:
|
||||
addSpawn(FAIRY_WARRIOR, npc.getX(), npc.getY() + 270, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_KNIGHT, npc.getX(), npc.getY() + 230, npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 3:
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX(), npc.getY() + 270, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WIZARD, npc.getX(), npc.getY() + 230, npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 4:
|
||||
addSpawn(FAIRY_WITCH, npc.getX(), npc.getY() + 270, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_SUMMONER, npc.getX(), npc.getY() + 230, npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
case 5:
|
||||
addSpawn(FAIRY_WIZARD, npc.getX(), npc.getY() + 270, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(FAIRY_WITCH, npc.getX(), npc.getY() + 230, npc.getZ(), npc.getHeading(), false, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
public void onCreatureAttacked(OnCreatureAttacked event)
|
||||
{
|
||||
final L2Npc npc = (L2Npc) event.getTarget();
|
||||
final L2Playable playable = (L2Playable) event.getAttacker();
|
||||
|
||||
// TODO: Quest 466 stuffs
|
||||
final Quest qs10305 = QuestManager.getInstance().getQuest(Q10305_UnstoppableFutileEfforts.class.getSimpleName());
|
||||
if (qs10305 != null)
|
||||
{
|
||||
qs10305.notifyEvent("NOTIFY_Q10305", npc, playable.getActingPlayer());
|
||||
}
|
||||
|
||||
if (getRandom(3) < 1)
|
||||
{
|
||||
addSpawn(LARGE_CONTAMINED_COCOON, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 30000);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (getRandom(6))
|
||||
{
|
||||
case 0:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WARRIOR, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_ROGUE, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WIZARD, npc, false, 90000), playable);
|
||||
break;
|
||||
case 1:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_KNIGHT, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_SUMMONER, npc, false, 90000), playable);
|
||||
break;
|
||||
case 2:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WARRIOR, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WIZARD, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH, npc, false, 90000), playable);
|
||||
break;
|
||||
case 3:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_ROGUE, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WARRIOR, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_ROGUE, npc, false, 90000), playable);
|
||||
break;
|
||||
case 4:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WIZARD, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_SUMMONER, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH, npc, false, 90000), playable);
|
||||
break;
|
||||
case 5:
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_KNIGHT, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_KNIGHT, npc, false, 90000), playable);
|
||||
addAttackPlayerDesire(addSpawn(FAIRY_WITCH, npc, false, 90000), playable);
|
||||
break;
|
||||
}
|
||||
}
|
||||
npc.deleteMe();
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new LargeCocoon();
|
||||
}
|
||||
}
|
103
trunk/dist/game/data/scripts/ai/areas/FairySettlement/Wisp.java
vendored
Normal file
103
trunk/dist/game/data/scripts/ai/areas/FairySettlement/Wisp.java
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.areas.FairySettlement;
|
||||
|
||||
import com.l2jmobius.gameserver.model.L2Spawn;
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureSee;
|
||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Wisp AI.
|
||||
* @author St3eT
|
||||
*/
|
||||
public final class Wisp extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int WISP = 32915;
|
||||
private static final int LARGE_WISP = 32916;
|
||||
// Skills
|
||||
private static final SkillHolder WISP_HEAL = new SkillHolder(14064, 1);
|
||||
private static final SkillHolder LARGE_WISP_HEAL = new SkillHolder(14065, 1);
|
||||
// Misc
|
||||
private static final int RESPAWN_MIN = 60000;
|
||||
private static final int RESPAWN_MAX = 120000;
|
||||
|
||||
private Wisp()
|
||||
{
|
||||
addSpawnId(WISP, LARGE_WISP);
|
||||
setCreatureSeeId(this::onCreatureSee, WISP, LARGE_WISP);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimerEvent(String event, StatsSet params, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (event.equals("DELETE_NPC"))
|
||||
{
|
||||
params = new StatsSet();
|
||||
params.set("LOCATION_OBJECT", npc.getLocation());
|
||||
getTimers().addTimer("RESPAWN_WISP_" + npc.getObjectId(), params, getRandom(RESPAWN_MIN, RESPAWN_MAX), null, null);
|
||||
npc.deleteMe();
|
||||
}
|
||||
else
|
||||
{
|
||||
addSpawn(WISP, params.getObject("LOCATION_OBJECT", Location.class));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(L2Npc npc)
|
||||
{
|
||||
final L2Spawn spawn = npc.getSpawn();
|
||||
spawn.stopRespawn();
|
||||
|
||||
if ((npc.getId() == WISP) && (getRandom(100) < 10))
|
||||
{
|
||||
addSpawn(LARGE_WISP, npc);
|
||||
npc.deleteMe();
|
||||
}
|
||||
else
|
||||
{
|
||||
npc.initSeenCreatures();
|
||||
}
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
public void onCreatureSee(OnCreatureSee event)
|
||||
{
|
||||
final L2Character creature = event.getSeen();
|
||||
final L2Npc npc = (L2Npc) event.getSeer();
|
||||
|
||||
if (creature.isPlayer())
|
||||
{
|
||||
npc.setTarget(creature);
|
||||
npc.doCast(npc.getId() == WISP ? WISP_HEAL.getSkill() : LARGE_WISP_HEAL.getSkill());
|
||||
getTimers().addTimer("DELETE_NPC", 5000, npc, null);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Wisp();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user