таути фазы

  • Автор темы Автор темы uter81
  • Дата начала Дата начала

uter81

Знающий
Участник
Сообщения
310
Розыгрыши
0
Репутация
1
Реакции
11
Баллы
460
Хроники
  1. 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();
    }
}
 
Последнее редактирование модератором:
Возможно неправильно написано часть кода...
 
если ты его шотаеш то он и не будет переходить, надо ставить блок чтоб меньше 5% не снималось, или как легче просто убрать 1ю стадию и поставить сразу топор на спавне
 
в том то и дело что не шотаю его, ХР медленно убывает , но стадия 2 не включается
 
по уму на нужные фазы вобще надо вешать статус неубиваемости, есть же надеюсь в мобиусе такое свойство для нпс/моба?
это когда моб может получать урон, хп у него при этом как и надо падает, но ниже чем 1 хп упасть не может, т.е. проще говоря его не убить, сколько ты урона в него не вливай.
 

это должно быть в любой не кривой сборке, так как это механика НПЦ в городах. Если у мобиуса такого нет, то это будет очередной его вин))
 
Попробовал убрать скилы, без них вторая фаза заработала.
Подскажите, как вписать скилы корректно, а то он стал как манекен авто атакой бьет )

Код:
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.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 = 29234;
    private static final int TAUTI_COMMON_AXE = 29236;
    private static final int TAUTI_EXTREME_AXE = 29237;
    // 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;
    
    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;
            }
        }
        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);
    }
    
    @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();
    }
}
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…