- Хроники
- Master Class
- Исходники
- Присутствуют
- Сборка
- l2jMobius
Добрый день!
Подскажите где ош в скрипте, таути не переходит на вторую фазу с появлением топора.
Подскажите где ош в скрипте, таути не переходит на вторую фазу с появлением топора.
Java:
package ai.bosses.Tauti;
import java.util.List;
import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import org.l2jmobius.gameserver.model.actor.instance.Monster;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import instances.AbstractInstance;
public class TautiWarzone extends AbstractInstance
{
// NPCs
private static final int FINARIA = 33675;
private static final int ZAHAK = 19266;
private static final int TELEPORTER = 33678;
private static final int TAUTI_COMMON = 29233;
private static final int TAUTI_EXTREME = 26453;
private static final int TAUTI_COMMON_AXE = 29236;
private static final int TAUTI_EXTREME_AXE = 29238;
// Skills
private static final SkillHolder POWER_STRIKE = new SkillHolder(15044, 1);
private static final SkillHolder POWER_MULTI_SHOT = new SkillHolder(15046, 1);
private static final SkillHolder HOLY_VENGEANCE = new SkillHolder(15047, 1);
private static final SkillHolder HOLY_DIMENSION = new SkillHolder(15048, 1);
private static final SkillHolder HOLY_SHIELD = new SkillHolder(15050, 1);
// Item
private static final int KEY_OF_DARKNESS = 34899;
// Teleport
private static final Location TAUTI_TELEPORT = new Location(-148972, 209879, -10199);
// Misc
private static final int TEMPLATE_ID = 218;
private static final int EXTREME_TEMPLATE_ID = 219;
private static final int DOOR_1 = 15240001;
private static final int DOOR_2 = 15240002;
// Others
private boolean _hp75 = false;
private boolean _hp50 = false;
private boolean _hp25 = false;
public TautiWarzone()
{
super(TEMPLATE_ID, EXTREME_TEMPLATE_ID);
addTalkId(FINARIA, TELEPORTER);
addFirstTalkId(FINARIA, TELEPORTER);
addAttackId(TAUTI_COMMON, TAUTI_EXTREME);
addKillId(ZAHAK, TAUTI_COMMON_AXE, TAUTI_EXTREME_AXE);
}
@Override
public String onEvent(String event, Npc npc, Player player)
{
switch (event)
{
case "enterEasyInstance":
{
enterInstance(player, npc, TEMPLATE_ID);
if (player.getInstanceWorld() != null)
{
startQuestTimer("WORLD_STATUS_CHECK", 5000, player.getInstanceWorld().getNpc(FINARIA), null);
}
break;
}
case "enterExtremeInstance":
{
enterInstance(player, npc, EXTREME_TEMPLATE_ID);
if (player.getInstanceWorld() != null)
{
startQuestTimer("WORLD_STATUS_CHECK", 5000, player.getInstanceWorld().getNpc(FINARIA), null);
}
break;
}
case "useKey":
{
final Instance world = npc.getInstanceWorld();
if (hasAtLeastOneQuestItem(player, KEY_OF_DARKNESS))
{
takeItems(player, KEY_OF_DARKNESS, -1);
world.setStatus(3);
npc.broadcastPacket(new OnEventTrigger(15235001, true));
return "33678-3.htm";
}
return "33678-1.htm";
}
case "teleport":
{
final Instance world = npc.getInstanceWorld();
world.setStatus(4);
world.openCloseDoor(DOOR_2, true);
for (Player member : world.getPlayers())
{
member.teleToLocation(TAUTI_TELEPORT, world);
if ((world.getAliveNpcCount(TAUTI_EXTREME) == 0) && (world.getAliveNpcCount(TAUTI_EXTREME_AXE) == 0))
{
startQuestTimer("PLAY_OPENING_B_MOVIE", 5000, null, member, false);
}
}
startQuestTimer("SPAWN_TAUTI", 60000, npc, null, false);
break;
}
case "PLAY_OPENING_B_MOVIE":
{
playMovie(player, Movie.SC_TAUTI_OPENING_B);
break;
}
case "SPAWN_TAUTI":
{
final Instance world = npc.getInstanceWorld();
if ((world.getAliveNpcCount(TAUTI_EXTREME) == 0) && (world.getAliveNpcCount(TAUTI_EXTREME_AXE) == 0))
{
world.spawnGroup("boss");
}
world.openCloseDoor(DOOR_1, true);
break;
}
case "SPAWN_AXE":
{
final Instance world = player.getInstanceWorld();
final Npc axe = addSpawn(world.getTemplateId() == EXTREME_TEMPLATE_ID ? TAUTI_EXTREME_AXE : TAUTI_COMMON_AXE, world.getParameters().getObject("AXE_LOCATION", Location.class), false, 0, false, world.getId());
axe.setRandomWalking(false);
axe.setImmobilized(true);
world.getParameters().remove("AXE_LOCATION");
break;
}
case "WORLD_STATUS_CHECK":
{
final Instance world = npc.getInstanceWorld();
if (world == null)
{
return null;
}
if (world.isStatus(0))
{
world.setStatus(1);
world.spawnGroup("room1");
playMovie(world.getPlayers(), Movie.SC_TAUTI_OPENING);
for (Player member : world.getPlayers())
{
takeItems(member, KEY_OF_DARKNESS, -1);
}
startQuestTimer("WORLD_STATUS_CHECK", 5000, npc, null);
}
else if (world.isStatus(1))
{
if (world.getAliveNpcs(Monster.class).isEmpty())
{
world.setStatus(2);
final List<Npc> monsters = world.spawnGroup("room2");
for (Npc monster : monsters)
{
monster.setRandomWalking(false);
}
}
startQuestTimer("WORLD_STATUS_CHECK", 5000, npc, null);
}
return null;
}
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onEvent(event, npc, player);
}
@Override
public String onFirstTalk(Npc npc, Player player)
{
String htmltext = "";
switch (npc.getId())
{
case FINARIA:
{
htmltext = "33675.htm";
break;
}
case TELEPORTER:
{
final int worldStatus = npc.getInstanceWorld().getStatus();
if (worldStatus > 2)
{
htmltext = "33678-3.htm";
}
else if ((worldStatus == 2) && hasAtLeastOneQuestItem(player, KEY_OF_DARKNESS))
{
htmltext = "33678-2.htm";
}
else
{
htmltext = "33678-1.htm";
}
break;
}
}
return htmltext;
}
@Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{
final Instance world = npc.getInstanceWorld();
if (world.isStatus(5) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.15)))
{
world.setStatus(6);
world.setParameter("AXE_LOCATION", npc.getLocation());
npc.deleteMe();
startQuestTimer("SPAWN_AXE", 15000, null, attacker, false);
playMovie(world.getPlayers(), Movie.SC_TAUTI_PHASE);
}
if (world.isStatus(4))
{
world.setStatus(5);
world.openCloseDoor(DOOR_1, false);
world.openCloseDoor(DOOR_2, false);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
if (npc.getId() == ZAHAK)
{
npc.dropItem(killer, KEY_OF_DARKNESS, 1);
}
else
{
final Instance world = npc.getInstanceWorld();
playMovie(world.getPlayers(), Movie.SC_TAUTI_ENDING);
npc.deleteMe();
world.finishInstance();
}
return super.onKill(npc, killer, isSummon);
}
//SKILLS
@Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == TAUTI_EXTREME)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, Player player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.75)) && !_hp75)
{
_hp75 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.50)) && !_hp50)
{
_hp50 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.25)) && !_hp25)
{
_hp25 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = HOLY_DIMENSION;
}
else if (chance < 30)
{
skillToCast = HOLY_VENGEANCE;
}
else if (chance < 50)
{
skillToCast = POWER_MULTI_SHOT;
}
else
{
skillToCast = POWER_STRIKE;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
@Override
public void onInstanceCreated(Instance instance, Player player)
{
if (player != null)
{
showHtmlFile(player, instance.getTemplateId() == EXTREME_TEMPLATE_ID ? "PartyEnterExtreme.html" : "PartyEnterCommon.html");
}
}
public static void main(String[] args)
{
new TautiWarzone();
}
}
Последнее редактирование модератором: