Merged with released L2J-Unity files.

This commit is contained in:
mobiusdev
2016-06-12 01:34:09 +00:00
parent e003e87887
commit 635557f5da
18352 changed files with 3245113 additions and 2892959 deletions

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

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

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