Показать сообщение отдельно
Непрочитано 23.03.2012, 05:55   #1
Аватар для Gaikotsu
Герой

Автор темы (Топик Стартер) [share] Crazy Guards

Откопал у себя маленькое AI для гвардов на воротах населенных пунктов, которое писал давно чисто приколу ради и использовал некоторое время.

Гварды с этим аи с определенной вероятностью и периодом начинают отпускать разные фразы в адрес проходящих мимо игроков, а так же в адрес пк, которых увидели и хотят атаковать.

PHP код:
package ai;

import l2p.extensions.scripts.Functions;
import l2p.gameserver.ai.CtrlIntention;
import l2p.gameserver.ai.Guard;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Playable;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.instances.L2NpcInstance;
import l2p.gameserver.geodata.GeoEngine;
import l2p.util.Rnd;

public class 
CrazyGuard extends Guard implements Runnable
{
    private 
boolean _crazyState;
    private 
long _lastAggroSay;
    private 
long _lastNormalSay;
    private static final 
int _crazyChance 50// Шанс того, что гвард после его респавна будет чуток "двинутым" (произносить разные фразы)
    
private static final int _sayNormalChance 5// Шанс произнесения фразы адресуемой проходящим мимо игрокам
    
private static final long _sayNormalPeriod 120000// Минимальный период (в мс), с которым гвард произносит фразы, адресуемые проходящим мимо игрокам
    
private static final long _sayAggroPeriod 10000// Минимальный период (в мс), с которым гвард произносит фразы, при начале атаки пк

    // Фразы, которые может произнести гвард, когда начинает атаковать пк
    
private static final String[] _sayAggroText = {
        
"{name}, никуда не уходи, сейчас я тебя чуть-чуть убью!",
        
"{name}, я тебя зарэжу, мамой клянусь!",
        
"Ля-ля-ля, я сошел с ума. Сейчас всех буду убивать!",
        
"Сколько я зарезал, сколько перерезал, сколько я народу загубил! Будешь ты, {name}, еще одним в этом списке!",
        
"Я ужас, летящий на крыльях ночи! Я жвачка, прилипшая к вашей подошве! Я... Короче, {name}, сейчас я тебя буду убивать!",
        
"Я страх, трепещущий в ночи! Я хитроумный замок от подвала правосудия! Я любимец удачи! Я Чёрный Гвард!",
        
"Ух ты, моя будущая жертва. Это я к тебе обращаюсь, {name}! Не делай вид что ты не при делах!",
        
"Ура! За родину, за всех моих собратьев! Готовься к смерти, {name}!",
        
"{name}, кошелек или жизнь?",
        
"{name}, просто умри, не осложняй мне жизнь!",
        
"{name}, как ты предпочитаешь умереть? Быстро и легко или же медленно и мучительно?",
        
"{name}, пвп или засцал?",
        
"{name}, я убью тебя нежно.",
        
"{name}, я тебя порву как Тузик грелку!",
        
"Готовься к смерти, {name}!",
        
"{name}, ты дерешся как девчонка!",
        
"{name}, помолись перед смертью! Хотя... уже не успеешь!" };
    
// Фразы, которые может произнести гвард, адресуя их проходящим мимо игрокам мужского пола
    
private static final String[] _sayNormalTextM = {
        
"{name}, есть чо?",
        
"{name}, превед!",
        
"{name}, привет!",
        
"{name}, привет пративный.",
        
"{name}, дай оружие на минутку, хочу скрин сделать.",
        
"{name}, удачной охоты.",
        
"{name}, в чем сила, брат?",
        
"{name}, больше фрагов тебе.",
        
"{name}, ты мне в кошмарах снился.",
        
"{name}, я тебя знаю - тебя давно разыскивают за убийства невинных монстров.",
        
"{name}, пвп или засцал?",
        
"{name}, у тебя кошелек выпал.",
        
"{name}, не пойду я с тобой на свидание, даже не проси.",
        
"Всем чмоке в этом чате." };
    
// Фразы, которые может произнести гвард, адресуя их проходящим мимо игрокам женского пола
    
private static final String[] _sayNormalTextF = {
        
"{name}, привет красавица.",
        
"{name}, ух ты, какие у тебя... э... глаза.",
        
"{name}, не хочешь погулять с настоящим мачо?",
        
"{name}, привет!",
        
"{name}, дай потрогать... э... ну вобщем дай чего нибудь потрогать.",
        
"{name}, не женское это дело - врагов убивать.",
        
"{name}, у тебя верх порвался, не свети... глазками.",
        
"{name}, ах какие булочки...",
        
"{name}, ах какие ножки...",
        
"{name}, да ты красотка однако.",
        
"{name}, вах, какая женщина, мне бы такую.",
        
"{name}, а что вы делаете сегодня вечером?",
        
"{name}, вы согласны что с точки зрения банальной эрудиции, не всякий локально селектированный индивидуум способен игнорировать тенденции потенциальных эмоций и паритетно аллоцировать амбивалентные кванты логистики, экстрагируемой с учетом антропоморфности эвристического генезиса?",
        
"{name}, предлагаю руку и сердце. И кошелек после свадьбы." };

    public 
CrazyGuard(L2Character actor)
    {
        
super(actor);
        
MAX_Z_AGGRO_RANGE 500;
        
_crazyState false;
        
_lastAggroSay 0;
        
_lastNormalSay 0;
    }

    @
Override
    
protected void onEvtSpawn()
    {
        
_lastAggroSay 0;
        
_lastNormalSay 0;
        
_crazyState Rnd.chance(_crazyChance) ? true false;
        
super.onEvtSpawn();
    }

    @
Override
    
public void checkAggression(L2Character target)
    {
        if (
_crazyState)
        {
            
L2NpcInstance actor getActor();

            if (
actor == null || actor.isDead())
                return;

            if (
target.getPlayer().isGM())
                return;

            if (
Rnd.chance(_sayNormalChance))
            {
                if (
target.isPlayer() && target.getKarma() <= && (_lastNormalSay _sayNormalPeriod System.currentTimeMillis()) && actor.isInRange(target250L))
                {
                    
Functions.npcSay(actortarget.getPlayer().getSex() == _sayNormalTextM[Rnd.get(_sayNormalTextM.length)].replace("{name}"target.getName()) : _sayNormalTextF[Rnd.get(_sayNormalTextF.length)].replace("{name}"target.getName()));
                    
_lastNormalSay System.currentTimeMillis();
                }
            }

            if (
target.getKarma() <= 0)
                return;

            if (
getIntention() != CtrlIntention.AI_INTENTION_ACTIVE)
                return;

            if (
_globalAggro 0L)
                return;

            if (
target.getHateList().get(actor) == null && !actor.isInRange(target600L))
                return;

            if (
Math.abs(target.getZ() - actor.getZ()) > MAX_Z_AGGRO_RANGE)
                return;

            if (
target.isPlayable() && !canSeeInSilentMove((L2Playabletarget))
                return;

            if (!
GeoEngine.canSeeTarget(actortargetfalse))
                return;

            if (
target.isPlayer() && ((L2Playertarget).isInvisible())
                return;

            if ((
target.isSummon() || target.isPet()) && target.getPlayer() != null)
                
target.getPlayer().addDamageHate(actor01);

            
target.addDamageHate(actor02);
            
startRunningTask(2000);

            if (
_lastAggroSay _sayAggroPeriod System.currentTimeMillis())
            {
                
Functions.npcSay(actor_sayAggroText[Rnd.get(_sayAggroText.length)].replace("{name}"target.getPlayer().getName()));
                
_lastAggroSay System.currentTimeMillis();
            }

            
setIntention(CtrlIntention.AI_INTENTION_ATTACKtarget);
        }
        else
        {
            
super.checkAggression(target);
        }
    }


Gaikotsu вне форума Ответить с цитированием
Сказали спасибо: