l2j_mobius/trunk/dist/game/data/scripts/instances/Nursery/Nursery.java
2016-06-12 01:34:09 +00:00

470 lines
13 KiB
Java

/*
* 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 instances.Nursery;
import com.l2jmobius.gameserver.enums.CategoryType;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.instancemanager.ZoneManager;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.model.skills.BuffInfo;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.model.zone.L2ZoneType;
import com.l2jmobius.gameserver.model.zone.type.L2ScriptZone;
import com.l2jmobius.gameserver.network.NpcStringId;
import com.l2jmobius.gameserver.network.serverpackets.Earthquake;
import com.l2jmobius.gameserver.network.serverpackets.ExSendUIEvent;
import com.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import instances.AbstractInstance;
/**
* Nursery instance zone.
* @author St3eT
*/
public final class Nursery extends AbstractInstance
{
// NPCs
private static final int TIE = 33152;
private static final int MAGUEN = 19037;
private static final int[] MONSTERS =
{
23033, // Failed Creation
23034, // Failed Creation
23035, // Failed Creation
23036, // Failed Creation
23037, // Failed Creation
};
// Items
private static final int SCORE_ITEM = 17610; // Tissue Energy Residue
private static final int REWARD_ITEM = 17602; // Tissue Energy Crystal
// Skill
private static final SkillHolder ENERGY_SKILL_1 = new SkillHolder(14228, 1);
private static final SkillHolder ENERGY_SKILL_2 = new SkillHolder(14229, 1);
private static final SkillHolder ENERGY_SKILL_3 = new SkillHolder(14230, 1);
private static final SkillHolder MAGUEN_STEAL_SKILL = new SkillHolder(14235, 1);
// Zones
private static final L2ScriptZone ENTER_ZONE_1 = ZoneManager.getInstance().getZoneById(23601, L2ScriptZone.class);
private static final L2ScriptZone ENTER_ZONE_2 = ZoneManager.getInstance().getZoneById(23602, L2ScriptZone.class);
// Misc
private static final int TEMPLATE_ID = 171;
public Nursery()
{
addStartNpc(TIE);
addFirstTalkId(TIE);
addTalkId(TIE);
addAttackId(MAGUEN);
addKillId(MONSTERS);
addSpellFinishedId(MAGUEN);
addEnterZoneId(ENTER_ZONE_1.getId(), ENTER_ZONE_2.getId());
}
@Override
public void onTimerEvent(String event, StatsSet params, L2Npc npc, L2PcInstance player)
{
final Instance instance = npc.getInstanceWorld();
if (isNurseryInstance(instance))
{
final StatsSet npcVars = npc.getVariables();
final int gameStage = npcVars.getInt("GAME_STAGE", 0);
switch (event)
{
case "CLOCK_TIMER":
{
final int gameTime = npcVars.increaseInt("GAME_TIME", 1500, -1);
instance.getPlayers().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, 3, gameTime, npcVars.getInt("GAME_POINTS", 0), 0, 2042, 0, NpcStringId.ELAPSED_TIME.getId())));
if (gameStage == 1)
{
if (gameTime == 0)
{
player = instance.getFirstPlayer();
if ((player != null) && hasQuestItems(player, SCORE_ITEM))
{
final int itemCount = (int) getQuestItemsCount(player, SCORE_ITEM);
takeItems(player, SCORE_ITEM, itemCount);
npcVars.increaseInt("GAME_POINTS", 0, itemCount);
}
instance.despawnGroup("GAME_MONSTERS");
npcVars.set("GAME_STAGE", 2);
}
else
{
getTimers().addTimer("CLOCK_TIMER", 1000, npc, null);
}
}
break;
}
case "MAGUEN_WAIT_TIMER":
{
npc.getAI().stopFollow();
addSkillCastDesire(npc, player, MAGUEN_STEAL_SKILL, 23);
break;
}
case "MAGUEN_HIDE_TIMER":
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.OW_SINCE_I_M_DONE_I_M_GONE_OW);
npc.setTargetable(false);
npc.setDisplayEffect(5);
npc.doDie(null);
npcVars.set("MAGUEN_STATUS", 2);
break;
}
}
}
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
final Instance instance = npc.getInstanceWorld();
String htmltext = null;
if (isNurseryInstance(instance))
{
final StatsSet npcVars = npc.getVariables();
final int gameStage = npcVars.getInt("GAME_STAGE", 0);
switch (gameStage)
{
case 0:
htmltext = "GameManager-01.html";
break;
case 2:
htmltext = "GameManager-02.html";
break;
case 3:
htmltext = "GameManager-03.html";
break;
}
final BuffInfo energyInfo = player.getEffectList().getBuffInfoByAbnormalType(ENERGY_SKILL_1.getSkill().getAbnormalType());
final int energyLv = energyInfo == null ? 0 : energyInfo.getSkill().getAbnormalLvl();
if ((energyLv > 0) && (gameStage == 1) && (energyInfo != null))
{
int addPoints = 0;
if (energyLv == 10)
{
addPoints = 40;
}
else if (energyLv == 11)
{
addPoints = 60;
}
else if (energyLv == 12)
{
addPoints = 80;
}
npcVars.set("GAME_POINTS", npcVars.getInt("GAME_POINTS", 0) + addPoints);
showOnScreenMsg(instance, NpcStringId.SOLDIER_TIE_ABSORBED_REPRODUCTIVE_ENERGY_FROM_YOUR_BODY_AND_CONVERTED_S1_PIECES_OF_BIO_ENERGY, ExShowScreenMessage.TOP_CENTER, 3000, String.valueOf(addPoints));
player.getEffectList().stopSkillEffects(true, ENERGY_SKILL_1.getSkill());
player.getEffectList().stopSkillEffects(true, ENERGY_SKILL_2.getSkill());
player.getEffectList().stopSkillEffects(true, ENERGY_SKILL_3.getSkill());
}
}
return htmltext;
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final Instance instance = npc.getInstanceWorld();
if (isNurseryInstance(instance))
{
final StatsSet npcVars = npc.getVariables();
final int gameStage = npcVars.getInt("GAME_STAGE", 0);
switch (event)
{
case "startGame":
{
if (gameStage == 0)
{
instance.setReenterTime();
instance.spawnGroup("GAME_MONSTERS");
getTimers().addTimer("CLOCK_TIMER", 1000, npc, null);
npcVars.set("GAME_STAGE", 1);
}
break;
}
case "calculatePoints":
{
if (gameStage == 2)
{
final int gamePoints = npcVars.getInt("GAME_POINTS", 0);
int itemCount = 0;
if ((gamePoints != 0) && (gamePoints <= 800))
{
itemCount = 10;
}
else if ((gamePoints > 800) && (gamePoints <= 1600))
{
itemCount = 60;
}
else if ((gamePoints > 1600) && (gamePoints <= 2000))
{
itemCount = 160;
}
else if ((gamePoints > 2000) && (gamePoints <= 2400))
{
itemCount = 200;
}
else if ((gamePoints > 2400) && (gamePoints <= 2800))
{
itemCount = 240;
}
else if ((gamePoints > 2800) && (gamePoints <= 3200))
{
itemCount = 280;
}
else if ((gamePoints > 3200) && (gamePoints <= 3600))
{
itemCount = 320;
}
else if ((gamePoints > 3600) && (gamePoints <= 4000))
{
itemCount = 360;
}
else if (gamePoints > 4000)
{
itemCount = 400;
}
if (gamePoints != 0)
{
giveItems(player, REWARD_ITEM, itemCount);
addExpAndSp(player, 40000 * gamePoints, 0);
}
npcVars.set("GAME_STAGE", 3);
instance.finishInstance(0);
}
break;
}
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
final Instance instance = npc.getInstanceWorld();
if (isNurseryInstance(instance))
{
final StatsSet npcVars = npc.getVariables();
final int maguenStatus = npcVars.getInt("MAGUEN_STATUS", 0);
switch (maguenStatus)
{
case 0:
{
npc.setTargetable(false);
npc.doDie(null);
break;
}
case 1:
{
final int returnPoint = (npcVars.getInt("MAGUEN_STOLEN_COUNT", 0) / 2);
if (returnPoint > 0)
{
final L2Npc gameManager = instance.getNpc(TIE);
if (gameManager != null)
{
gameManager.getVariables().increaseInt("GAME_POINTS", returnPoint);
}
showOnScreenMsg(instance, NpcStringId.MAGUEN_GETS_SURPRISED_AND_GIVES_S1_PIECES_OF_BIO_ENERGY_RESIDUE, ExShowScreenMessage.MIDDLE_CENTER, 3000, String.valueOf(returnPoint));
npc.setTargetable(false);
npc.doDie(null);
}
break;
}
case 2:
{
npc.doDie(null);
break;
}
}
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
final Instance instance = npc.getInstanceWorld();
if (isNurseryInstance(instance))
{
if (getRandom(100) < 6)
{
switch (getRandom(3))
{
case 0:
ENERGY_SKILL_1.getSkill().applyEffects(npc, killer);
break;
case 1:
ENERGY_SKILL_2.getSkill().applyEffects(npc, killer);
break;
case 2:
ENERGY_SKILL_3.getSkill().applyEffects(npc, killer);
break;
}
instance.broadcastPacket(new Earthquake(npc, 50, 3));
showOnScreenMsg(instance, NpcStringId.RECEIVED_REGENERATION_ENERGY, ExShowScreenMessage.MIDDLE_CENTER, 2000);
}
if (getRandom(100) < 4)
{
final L2Npc maguen = addSpawn(MAGUEN, npc, false, 0, false, instance.getId());
maguen.setIsRunning(true);
maguen.getAI().startFollow(killer);
showOnScreenMsg(instance, NpcStringId.MAGUEN_APPEARANCE, ExShowScreenMessage.MIDDLE_CENTER, 4000);
getTimers().addTimer("MAGUEN_WAIT_TIMER", 4000, maguen, killer);
getTimers().addTimer("MAGUEN_HIDE_TIMER", 60000, maguen, null);
}
if ((getRandom(10) + 1) < 10)
{
int pointsCount = getRandom(6) + 3;
if (killer.isInCategory(CategoryType.SIGEL_GROUP) || killer.isInCategory(CategoryType.AEORE_GROUP))
{
pointsCount += 6;
}
else if (killer.isInCategory(CategoryType.TYRR_GROUP))
{
pointsCount -= 1;
}
else if (killer.isInCategory(CategoryType.OTHELL_GROUP))
{
pointsCount += 2;
}
else if (killer.isInCategory(CategoryType.YUL_GROUP))
{
pointsCount += 1;
}
else if (killer.isInCategory(CategoryType.FEOH_GROUP) || killer.isInCategory(CategoryType.ISS_GROUP))
{
pointsCount += 0;
}
else if (killer.isInCategory(CategoryType.WYNN_GROUP))
{
pointsCount += 3;
}
final L2Npc gameManager = instance.getNpc(TIE);
if (gameManager != null)
{
gameManager.getVariables().increaseInt("GAME_POINTS", pointsCount);
}
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
final Instance instance = npc.getInstanceWorld();
if (isNurseryInstance(instance))
{
final L2Npc gameManager = instance.getNpc(TIE);
if (gameManager != null)
{
final StatsSet managerVars = gameManager.getVariables();
final StatsSet npcVars = npc.getVariables();
final int gamePoints = managerVars.getInt("GAME_POINTS", 0);
if (gamePoints > 0)
{
int decreasePoints = 0;
if (gamePoints > 100)
{
decreasePoints = getRandom(80) + 21;
}
else
{
decreasePoints = getRandom(gamePoints) + 1;
}
npc.setTargetable(true);
managerVars.increaseInt("GAME_POINTS", decreasePoints * -1);
showOnScreenMsg(instance, NpcStringId.MAGUEN_STOLE_S1_PIECES_OF_BIO_ENERGY_RESIDUE, ExShowScreenMessage.MIDDLE_CENTER, 4000, String.valueOf(decreasePoints));
npcVars.set("MAGUEN_STOLEN_COUNT", decreasePoints);
npcVars.set("MAGUEN_STATUS", 1);
if (decreasePoints > 50)
{
if (getRandom(100) < 20)
{
npcVars.set("MAGUEN_STATUS", 2);
npc.setTargetable(false);
npc.doDie(null);
}
else
{
npc.setDisplayEffect(4);
getTimers().cancelTimer("MAGUEN_HIDE_TIMER", npc, null);
getTimers().addTimer("MAGUEN_HIDE_TIMER", getRandom(3000), npc, null);
}
}
else
{
npc.setDisplayEffect(4);
getTimers().cancelTimer("MAGUEN_HIDE_TIMER", npc, null);
getTimers().addTimer("MAGUEN_HIDE_TIMER", getRandom(3000), npc, null);
}
}
else
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.PFFT_THIS_ONE_IS_A_MISS_I_WASTED_TOO_MUCH_STRENGTH_WHOA);
npc.setTargetable(false);
npc.doDie(null);
}
}
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onEnterZone(L2Character character, L2ZoneType zone)
{
if (character.isPlayer())
{
enterInstance(character.getActingPlayer(), null, TEMPLATE_ID);
}
return super.onEnterZone(character, zone);
}
private boolean isNurseryInstance(Instance instance)
{
return ((instance != null) && (instance.getTemplateId() == TEMPLATE_ID));
}
public static void main(String[] args)
{
new Nursery();
}
}