Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
переделанный AI гордона, ошибка((
#1
Доброго дня ув. форумчане. Занимаюсь явой совсем недавно, но хотелось бы разобраться в чем я совершил ошибку. Есть следующий скрипт - АИ гордона (стандартный в ИЛе), я его немножко переписал под свои нужды, хочу сделать моба, который будет бегать по моим координатам и убивать игроков (если они будут у него на пути). Вот собственно что у меня получилось:

Код:
package com.l2jfrozen.gameserver.ai.special;

import java.util.Collection;

import com.l2jfrozen.gameserver.ai.CtrlIntention;
import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
import com.l2jfrozen.gameserver.model.L2Attackable;
import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2MonsterInstance;
import com.l2jfrozen.gameserver.model.actor.position.L2CharPosition;
import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
import com.l2jfrozen.gameserver.model.quest.Quest;
import com.l2jfrozen.gameserver.model.quest.QuestState;
import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
import com.l2jfrozen.util.random.Rnd;

public class di_knight extends Quest implements Runnable
{
    private static final int KNIGHT = 70568; //KnighT
    private static int _npcMoveX = 0;
    private static int _npcMoveY = 0;
    private static int _isWalkTo = 0;
    private static int _npcBlock = 0;
    private static int X = 0;
    private static int Y = 0;
    private static int Z = 0;
    private static final int[][] WALKS =
    {
            {
                    19816, -15679, -3091
            },
            {
                    22452, -14854, -3061
            },
            {
                    19889, -15918, -3084
            },
            {
                    19914, -16255, -3086
            },
            {
                    18967, -15830, -3093
            }
    };

    private static boolean _isAttacked = false;
    private static boolean _isSpawned = false;

    public di_knight(int id, String name, String descr)
    {
        super(id, name, descr);

        addEventId(KNIGHT, Quest.QuestEventType.ON_KILL);
        addEventId(KNIGHT, Quest.QuestEventType.ON_ATTACK);
        addEventId(KNIGHT, Quest.QuestEventType.ON_SPAWN);

        // wait 2 minutes after Start AI
        startQuestTimer("check_ai", 12000, null, null,true);

        _isSpawned = false;
        _isAttacked = false;
        _isWalkTo = 1;
        _npcMoveX = 0;
        _npcMoveY = 0;
        _npcBlock = 0;
    }

    @Override
    public String onAdvEvent(String event, L2NpcInstance npc, L2PcInstance player)
    {
        X = WALKS[_isWalkTo - 1][0];
        Y = WALKS[_isWalkTo - 1][1];
        Z = WALKS[_isWalkTo - 1][2];
        if(event == "time_isAttacked")
        {
            _isAttacked = false;
            if(npc.getNpcId() == KNIGHT)
            {
                npc.setRunning();
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(X, Y, Z, 0));
            }
        }
        else if(event == "check_ai")
        {
            cancelQuestTimer("check_ai", null, null);
            if(_isSpawned == false)
            {
                L2NpcInstance KNIGHT_ai = findTemplate(KNIGHT);
                if(KNIGHT_ai != null)
                {
                    _isSpawned = true;
                    startQuestTimer("Start", 12000, KNIGHT_ai, null,true);
                    return super.onAdvEvent(event, npc, player);
                }
            }
        }
        else if(event == "Start")
        {
            //startQuestTimer("Start", 1000, npc, null);
            if(npc != null && _isSpawned == true)
            {
                // check if player in radius
                if(npc.getNpcId() == KNIGHT)
                {
                    Collection<L2PcInstance> chars = npc.getKnownList().getKnownPlayers().values();
                    if(chars != null && chars.size() > 0)
                    {
                        for(L2PcInstance pc : chars)
                        {
                            if(pc.isInsideRadius(npc, 5000, false, false))
                            {
                                npc.setRunning();
                                ((L2Attackable) npc).addDamageHate(pc, 0, 9999);
                                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, pc);
                                _isAttacked = true;
                                cancelQuestTimer("time_isAttacked", null, null);
                                startQuestTimer("time_isAttacked", 12000, npc, null);
                                return super.onAdvEvent(event, npc, player);
                            }
                        }
                    }
                }
                // end check
                if(_isAttacked == true)
                    return super.onAdvEvent(event, npc, player);

                if(npc.getNpcId() == KNIGHT && npc.getX() - 50 <= X && npc.getX() + 50 >= X && npc.getY() - 50 <= Y && npc.getY() + 50 >= Y)
                {
                    _isWalkTo++;
                    if(_isWalkTo > 6) //change WALKS number
                    {
                        _isWalkTo = 1;
                    }
                    X = WALKS[_isWalkTo - 1][0];
                    Y = WALKS[_isWalkTo - 1][1];
                    Z = WALKS[_isWalkTo - 1][2];
                    npc.setRunning();
            }
        }
        return super.onAdvEvent(event, npc, player);
    }

    @Override
    public String onSpawn(L2NpcInstance npc)
    {
        if(npc.getNpcId() == KNIGHT && _npcBlock == 0)
        {
            _isSpawned = true;
            _isWalkTo = 1;
            startQuestTimer("Start", 12000, npc, null);
        }
        return super.onSpawn(npc);
    }

    @Override
    public String onAttack(L2NpcInstance npc, L2PcInstance player, int damage, boolean isPet)
    {
        if(npc.getNpcId() == KNIGHT)
        {
            _isAttacked = true;
            cancelQuestTimer("time_isAttacked", null, null);
            startQuestTimer("time_isAttacked", 12000, npc, null);
            if(player != null)
            {
                npc.setRunning();
                ((L2Attackable) npc).addDamageHate(player, 0, 100);
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
            }
        }
        return super.onAttack(npc, player, damage, isPet);
    }

    @Override
    public String onKill(L2NpcInstance npc, L2PcInstance killer, boolean isPet)
    {
        if(npc.getNpcId() == KNIGHT)
        {
            cancelQuestTimer("Start", null, null);
            cancelQuestTimer("time_isAttacked", null, null);
            _isSpawned = false;
        }
        return super.onKill(npc, killer, isPet);
    }

    public L2NpcInstance findTemplate(int npcId)
    {
        L2NpcInstance npc = null;
        for(L2Spawn spawn : SpawnTable.getInstance().getSpawnTable().values())
        {
            if(spawn != null && spawn.getNpcid() == npcId)
            {
                npc = spawn.getLastSpawn();
                break;
            }
        }
        return npc;
    }

    @Override
    public void run()
    {}
}

Когда начал смотреть как это выглядит в игре, вроде бы все было нормально.. но как оказалось - где-то я ошибся с таймерами, потому что когда он бьет игрока - начинает дергаться и убегать, а не убивает до конца и только потом бежит дальше.. Хотелось бы сделать так, что бы перерыв между "бегами" в следующую точку был равен = одной секунде, т.е. передвижение было постоянное, а вот только тогда, если он кого-нибудь увидит - сразу килл, не увидит - так и пусть бежит себе дальше.

Буду ждать ответов, спасибо заранее!Sad
[Изображение: ck.gif]
Ответ
#2
up-чик, народ помогите поооозялюсьта!
[Изображение: ck.gif]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Что за ошибка? serg5777 22 9,009 07-11-2023, 09:49 PM
Последний пост: ntking
  Ошибка Cannot read field "race" valdemart123 0 1,049 12-04-2021, 04:44 AM
Последний пост: valdemart123
  При запуске game server на сайте (sw13) ошибка mysql 0 AndreDeiu 1 1,301 09-27-2020, 11:32 PM
Последний пост: Lord_Gothic
  Ошибка геймсервера zane 9 2,527 04-27-2018, 12:28 PM
Последний пост: DmnC
  Ошибка загрузки гейм сервера zane 5 2,003 04-17-2018, 08:03 PM
Последний пост: zane
  Ошибка телепорта Rork 1 1,264 03-02-2018, 03:05 PM
Последний пост: Gaikotsu
  Ошибка с ГМ шопом silok 1 1,310 01-11-2018, 07:36 AM
Последний пост: Narsell
  Ошибка PWSOFT Ananim 0 1,367 07-07-2017, 11:42 AM
Последний пост: Ananim
  Ошибка _aveList; knaif 1 1,395 06-22-2017, 03:07 PM
Последний пост: Trimius
  Ошибка KastaMeN 1 1,807 06-16-2017, 11:32 PM
Последний пост: Mangol

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)