/** * Обработка активации ловушки. * * @param object объект, который изменил свое положение. */ public boolean activate(TObject object) { if (!object.isCharacter()) return false; Character owner = getOwner(); Character target = object.getCharacter(); if (owner == null || owner == target || !owner.checkTarget(target)) { return false; } float dist = target.getGeomDistance(x, y); if (dist > radius) { return false; } if (lifeTask != null) { lifeTask.cancel(false); lifeTask = null; } ExecutorManager executor = ExecutorManager.getInstance(); executor.scheduleGeneral(this, 100); return true; }
@Override public void addAggro(Character aggressor, long aggro, boolean damage) { // если это не урон от игрока if (!damage && aggressor.isPlayer()) { // получаем игрока Player player = aggressor.getPlayer(); // в зависимости от класса игрока switch (player.getPlayerClass()) { case WARRIOR: case LANCER: aggro = 1; break; case MYSTIC: case PRIEST: aggro *= 3; break; default: break; } } // обрабатываем добавление аггро super.addAggro(aggressor, aggro, damage); }
@Override public boolean checkTarget(Character target) { // если это контрол if (target.getClass() == RegionWarControl.class) { // получаем контрол RegionWarControl control = (RegionWarControl) target; // является враг, если он был захвачен return control.getGuildOwner() != null; } // если это НПС, значит свой if (target.isNpc() && !target.isSummon()) return false; Player player = null; if (target.isSummon()) { Character owner = target.getOwner(); if (owner != null && owner.isPlayer()) player = owner.getPlayer(); } else if (target.isPlayer()) player = target.getPlayer(); // если это игрок или питомец игрока, значит враг return player != null; }
@Override public void doRegen() { Character actor = getActor(); actor.setCurrentHp(actor.getCurrentHp() + actor.getRegenHp()); actor.updateHp(); }
@Override public boolean checkCondition() { Character actor = getActor(); if (actor.isBattleStanced()) return false; return actor.getCurrentHp() < actor.getMaxHp(); }
@Override public boolean checkCondition(Character attacker, float targetX, float targetY, float targetZ) { if (attacker.getSummon() == null) { attacker.sendMessage("У вас нет вызванных питомцев."); return false; } return super.checkCondition(attacker, targetX, targetY, targetZ); }
public static PlayerBankPanel getInstance(Character owner) { PlayerBankPanel packet = (PlayerBankPanel) instance.newInstance(); packet.name = owner.getName(); packet.objectId = owner.getObjectId(); packet.subId = owner.getSubId(); return packet; }
@Override public void useSkill(Character character, float targetX, float targetY, float targetZ) { if (target != null) { if (target.isPlayer()) NpcFastShot.startShot(character, this, target); else FastShot.startShot(character, this, target.getX(), target.getY(), target.getZ()); } target = null; }
public static TargetHp getInstance(Character target, int type) { TargetHp packet = (TargetHp) instance.newInstance(); packet.objectId = target.getObjectId(); packet.subId = target.getSubId(); packet.hp = target.getCurrentHp() / (float) target.getMaxHp(); packet.type = type; return packet; }
@Override public void useSkill(Character character, float targetX, float targetY, float targetZ) { if (target != null) FastShot.startShot( character, this, target.getX(), target.getY(), target.getZ() + (target.getGeomHeight() * 0.5F)); target = null; }
@Override public void onDie(Character killer, Character killed) { if (!isCheckDieState() || !killed.isPlayer()) { return; } Player player = killed.getPlayer(); if (!player.isEvent() || !players.containsKey(killed.getObjectId())) { return; } onDie(player, killer); }
@Override public boolean checkCondition(Character attacker, float targetX, float targetY, float targetZ) { target = attacker.getTarget(); if (target == null) return false; return super.checkCondition(attacker, targetX, targetY, targetZ); }
@Override public boolean checkTarget(Character target) { // полукчаем игрока из цели Player player = target.getPlayer(); // если это игрок на ивенте ,то можно бить return player != null && player.isEvent(); }
@Override public void causingDamage(Skill skill, AttackInfo info, Character attacker) { // полукчаем игрока из атакующего Player player = attacker.getPlayer(); if (!player.isEvent()) return; super.causingDamage(skill, info, attacker); }
@Override public void startSkill(Character attacker, float targetX, float targetY, float targetZ) { super.startSkill(attacker, targetX, targetY, targetZ); impactX = attacker.getX(); impactY = attacker.getY(); impactZ = attacker.getZ(); if (target.isPlayer()) attacker.broadcastPacket(StartFastShot.getInstance(attacker, target, this, castId)); else attacker.broadcastPacket( StartFastShot.getInstance( attacker, this, castId, target.getX(), target.getY(), target.getZ())); }
@Override public void causingDamage(Skill skill, AttackInfo info, Character attacker) { // пробуем получить игрока Player player = attacker.getPlayer(); // если это игрок и он не на ивенте, выходим if (player != null && !player.isEvent()) return; super.causingDamage(skill, info, attacker); }
@Override public void useSkill(Character character, float targetX, float targetY, float targetZ) { super.useSkill(character, targetX, targetY, targetZ); Summon summon = character.getSummon(); if (summon == null) return; summon.getAI().abortAttack(); }
@Override public boolean test(Character attacker, Character attacked, Skill skill, float val) { if (!attacker.isPlayer()) return true; Equipment equipment = attacker.getEquipment(); if (equipment == null) return false; Slot[] slots = equipment.getSlots(); for (Enum<?> type : types) { for (Slot slot : slots) { if (slot.isEmpty()) continue; if (type == slot.getItem().getType()) return true; } } return false; }
@Override protected void writeImpl() { writeOpcode(); writeInt(actor.getObjectId()); writeInt(actor.getSubId()); writeFloat(actor.getX()); writeFloat(actor.getY()); writeFloat(actor.getZ()); writeShort(actor.getHeading()); writeInt(actor.getModelId()); writeInt(actor.getOwerturnId()); writeInt(0); writeInt(0); }
@Override public void startSkill(Character attacker, float targetX, float targetY, float targetZ) { super.startSkill(attacker, targetX, targetY, targetZ); impactX = attacker.getX(); impactY = attacker.getY(); impactZ = attacker.getZ(); attacker.broadcastPacket( StartFastShot.getInstance( attacker, this, castId, target.getX(), target.getY(), target.getZ() + (target.getGeomHeight() * 0.5F))); }
/** * Создание новой ловукши. * * @param owner создатель и владелец. * @param skill скил, который создает. * @param lifeTime время жизни. * @param radius ражиус активации. * @return новая ловука. */ public static Trap newInstance( Character owner, Skill skill, int range, int lifeTime, int radius) { Trap trap = pool.take(); if (trap == null) { IdFactory idFactory = IdFactory.getInstance(); trap = new Trap(idFactory.getNextTrapId()); } trap.setContinentId(owner.getContinentId()); trap.spawnMe(owner, skill, range, lifeTime, radius); return trap; }
/** * Спавн в мир ловушку. * * @param owner владелец. * @param skill скил ловушки. * @param lifeTime время жизни. * @param radius радиус активации. */ public void spawnMe(Character owner, Skill skill, int range, int lifeTime, int radius) { this.owner = owner; this.skill = skill; this.radius = radius; spawnMe( Coords.calcX(owner.getX(), range, owner.getHeading()), Coords.calcY(owner.getY(), range, owner.getHeading()), owner.getZ(), 0); LocalObjects local = LocalObjects.get(); Array<Character> chars = World.getAround(Character.class, local.getNextCharList(), this, radius); ExecutorManager executor = ExecutorManager.getInstance(); if (chars.isEmpty()) this.lifeTask = executor.scheduleGeneral(this, lifeTime * 1000); else { Character[] array = chars.array(); for (int i = 0, length = chars.size(); i < length; i++) { Character target = array[i]; if (owner.checkTarget(target)) { executor.scheduleGeneral(this, 100); return; } } this.lifeTask = executor.scheduleGeneral(this, lifeTime * 1000); } }
@Override public void causingDamage(Skill skill, AttackInfo info, Character attacker) { // определяем атакующего игрока Player player = null; if (attacker.isSummon()) { Character owner = attacker.getOwner(); if (owner != null && owner.isPlayer()) player = owner.getPlayer(); } else if (attacker.isPlayer()) player = attacker.getPlayer(); // если игрока нет, урон не засчитываем if (player == null) return; // получаем гильдию игрока Guild guild = player.getGuild(); // если гильдии нет либо она не из этой битвы, не засчитываем урон if (guild == null || !getRegion().isRegister(guild)) return; // обрабатываем урон super.causingDamage(skill, info, attacker); }
@Override public <A extends Npc> void think( NpcAI<A> ai, A actor, LocalObjects local, ConfigAI config, long currentTime) { // если нпс мертв if (actor.isDead()) { // очищаем задания ai.clearTaskList(); // очищаем агр лист actor.clearAggroList(); // переводим в режим ожидания ai.setNewState(NpcAIState.WAIT); // выходим return; } // если нпс щас что-то делает, выходим if (actor.isTurner() || actor.isCastingNow() || actor.isStuned() || actor.isOwerturned()) return; // если актор вышел за пределы максимального радиуса атаки if (!actor.isInRangeZ(actor.getSpawnLoc(), getReactionMaxRange())) { // очищаем задания ai.clearTaskList(); // очищаем агр лист actor.clearAggroList(); // переводим в режим возврпщения домой ai.setNewState(NpcAIState.RETURN_TO_HOME); // отправляем иконку думания PacketManager.showNotifyIcon(actor, NotifyType.NOTICE_THINK); // обновляем время отправки иконки ai.setLastNotifyIcon(currentTime); // выходим return; } // получаем топовый агр Character mostHated = actor.getMostHated(); if (mostHated == null && actor.isAggressive()) { // получаем текущий регион НПС WorldRegion region = actor.getCurrentRegion(); // если там есть игроки if (region != null) { // получаем список персонажей Array<Character> charList = local.getNextCharList(); // собираем сведения о целях вокруг World.getAround(Character.class, charList, actor, actor.getAggroRange()); // получаем массив целей Character[] array = charList.array(); // перебираем потенциальные цели for (int i = 0, length = charList.size(); i < length; i++) { // получаем потенциальную цель Character target = array[i]; // если на цель возможна агрессия и цель в зоне агра if (ai.checkAggression(target)) // добавляем в агр лист actor.addAggro(target, 1, false); } } } mostHated = actor.getMostHated(); // если главная цель отсутствует, выходим if (mostHated == null) { // очищаем задания ai.clearTaskList(); // очищаем агр лист actor.clearAggroList(); // переводим в режим возврпщения домой ai.setNewState(NpcAIState.RETURN_TO_HOME); // отправляем иконку думания PacketManager.showNotifyIcon(actor, NotifyType.NOTICE_THINK); // обновляем время отправки иконки ai.setLastNotifyIcon(currentTime); // выходим return; } // получаем текущую цель АИ Character target = ai.getTarget(); // если цель выходит за радиус боевых действий if (mostHated.isDead() || !mostHated.isInRange(actor.getSpawnLoc(), getBattleMaxRange())) { // удаляем его с агр листа actor.removeAggro(mostHated); // очищаем задания ai.clearTaskList(); // выходим return; } // если топ агр не является текущей целью АИ if (mostHated != target) // обновляем текущую цель АИ ai.setTarget(mostHated); // если есть ожидающие задания if (ai.isWaitingTask()) // выполняем и если это небыло последнее задание if (ai.doTask(actor, currentTime, local)) // выходим return; // если нпс щас что-то делает, выходим if (actor.isTurner() || actor.isCastingNow() || actor.isStuned() || actor.isOwerturned()) return; if (currentTime - ai.getLastNotifyIcon() > 15000) { // отправляем иконку думания PacketManager.showNotifyIcon(actor, NotifyType.YELLOW_QUESTION); // обновляем время отправки иконки ai.setLastNotifyIcon(currentTime); } // создаем новое ai.getCurrentFactory().addNewTask(ai, actor, local, config, currentTime); // если есть ожидающие задания if (ai.isWaitingTask()) // выполняем ai.doTask(actor, currentTime, local); }