03-23-2012, 05:55 AM
Откопал у себя маленькое AI для гвардов на воротах населенных пунктов, которое писал давно чисто приколу ради и использовал некоторое время.
Гварды с этим аи с определенной вероятностью и периодом начинают отпускать разные фразы в адрес проходящих мимо игроков, а так же в адрес пк, которых увидели и хотят атаковать.
Гварды с этим аи с определенной вероятностью и периодом начинают отпускать разные фразы в адрес проходящих мимо игроков, а так же в адрес пк, которых увидели и хотят атаковать.
PHP код:
<?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() <= 0 && (_lastNormalSay + _sayNormalPeriod < System.currentTimeMillis()) && actor.isInRange(target, 250L))
{
Functions.npcSay(actor, target.getPlayer().getSex() == 0 ? _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(target, 600L))
return;
if (Math.abs(target.getZ() - actor.getZ()) > MAX_Z_AGGRO_RANGE)
return;
if (target.isPlayable() && !canSeeInSilentMove((L2Playable) target))
return;
if (!GeoEngine.canSeeTarget(actor, target, false))
return;
if (target.isPlayer() && ((L2Player) target).isInvisible())
return;
if ((target.isSummon() || target.isPet()) && target.getPlayer() != null)
target.getPlayer().addDamageHate(actor, 0, 1);
target.addDamageHate(actor, 0, 2);
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_ATTACK, target);
}
else
{
super.checkAggression(target);
}
}
}