테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/data/handlers/ai/instance/custom/pvpveMap/ModifiedIronWallAggressiveAI.java
package ai.instance.custom.pvpveMap;

import java.util.ArrayList;
import java.util.List;

import com.aionemu.commons.utils.Rnd;
import com.aionemu.gameserver.ai.AIName;
import com.aionemu.gameserver.ai.HpPhases;
import com.aionemu.gameserver.ai.handler.ReturningEventHandler;
import com.aionemu.gameserver.custom.pvpmap.PvpMapService;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.stats.calc.Stat2;
import com.aionemu.gameserver.model.stats.container.StatEnum;
import com.aionemu.gameserver.network.aion.serverpackets.SM_FORCED_MOVE;
import com.aionemu.gameserver.skillengine.model.Effect;
import com.aionemu.gameserver.skillengine.model.SkillTemplate;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.PositionUtil;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.World;
import com.aionemu.gameserver.world.WorldPosition;
import com.aionemu.gameserver.world.geo.GeoService;

import ai.AggressiveNpcAI;

/**
 * @author Yeats
 */
@AIName("modified_iron_wall_aggressive")
public class ModifiedIronWallAggressiveAI extends AggressiveNpcAI implements HpPhases.PhaseHandler {

	private final HpPhases hpPhases;

	public ModifiedIronWallAggressiveAI(Npc owner) {
		super(owner);
		hpPhases = owner.getNpcId() == 231304 ? new HpPhases(98, 77, 56, 35, 10) : null;
	}

	@Override
	protected void handleAttack(Creature creature) {
		super.handleAttack(creature);
		if (hpPhases != null)
			hpPhases.tryEnterNextPhase(this);
	}

	@Override
	public void handleHpPhase(int phaseHpPercent) {
		getOwner().queueSkill(21165, 1, 3000);
	}

	@Override
	public float modifyOwnerDamage(float damage, Creature effected, Effect effect) {
		if (PvpMapService.getInstance().isRandomBoss(getOwner())) {
			return damage > 7900 ? (7700 + Rnd.nextInt(600)) : damage;
		}
		switch (getOwner().getNpcId()) {
			case 218547: // cleric
			case 219197:
			case 218551:
			case 219190:
			case 219169:
			case 218546: // mage
			case 218550:
			case 219196:
			case 219189:
			case 219168:
				if (effect != null) {
					return getRandomDmg(damage, 1.2f, 1.6f);
				} else {
					return getRandomDmg(damage, 2.4f, 3.2f);
				}
			case 219218: // keymaster chookuri (cleric, normal)
			case 219193: // keymaster dabra (mage, hero)
			case 219191: // keymaster niksi (fighter, elite)
			case 219192: // keymaster zumita (assa, elite)
				return damage;
			default:
				if (effect != null) {
					return getRandomDmg(damage, 2f, 2.8f);
				} else {
					return getRandomDmg(damage, 1.8f, 2.3f);
				}
		}
	}

	@Override
	public void modifyOwnerStat(Stat2 stat) {
		if (stat.getStat() == StatEnum.MAXHP) {
			if (PvpMapService.getInstance().isRandomBoss(getOwner())) {
				stat.setBase(882321);
			} else {
				switch (getOwner().getNpcId()) {
					case 219167:
					case 219169:
					case 219190:
						stat.setBaseRate(3.2f);
						break;
					case 219218:
						stat.setBaseRate(7f);
						break;
					case 219193:
					case 219191:
					case 219192:
						break;
					default:
						stat.setBaseRate(1.6f);
				}
			}
		} else {
			super.modifyOwnerStat(stat);
		}
	}

	@Override
	public void onEndUseSkill(SkillTemplate skillTemplate, int skillLevel) {
		if (getOwner().getNpcId() == 231304) {
			switch (skillTemplate.getSkillId()) {
				case 21165:
					ThreadPoolManager.getInstance().schedule(() -> {
						WorldPosition pos = getRandomTargetPosition();
						if (pos == null)
							return;
						World.getInstance().updatePosition(getOwner(), pos.getX(), pos.getY(), pos.getZ(), pos.getHeading());
						PacketSendUtility.broadcastPacketAndReceive(getOwner(), new SM_FORCED_MOVE(getOwner(), getOwner()));
						ThreadPoolManager.getInstance()
							.schedule(() -> getOwner().queueSkill(21171, 1, 6000), 500);
					}, 500);
					break;
			}
		}
	}

	@Override
	protected void handleBackHome() {
		super.handleBackHome();
		if (hpPhases != null)
			hpPhases.reset();
	}

	@Override
	protected void handleNotAtHome() {
		if (getOwner().getNpcId() == 231304) {
			World.getInstance().updatePosition(getOwner(), getOwner().getSpawn().getX(), getOwner().getSpawn().getY(), getOwner().getSpawn().getZ(),
				getOwner().getSpawn().getHeading());
			PacketSendUtility.broadcastPacketAndReceive(getOwner(), new SM_FORCED_MOVE(getOwner(), getOwner()));
			if (hpPhases != null)
				hpPhases.reset();
			ReturningEventHandler.onBackHome(this);
		} else {
			super.handleNotAtHome();
		}
	}

	private WorldPosition getRandomTargetPosition() {
		List<Player> knownPlayers = new ArrayList<>();
		WorldPosition pos = null;
		for (Player p : getOwner().getKnownList().getKnownPlayers().values()) {
			if (p.isDead() || p.getLifeStats().isAboutToDie())
				continue;
			if (getOwner().canSee(p) && PositionUtil.isInRange(getOwner(), p, 26) && GeoService.getInstance().canSee(getOwner(), p)) {
				knownPlayers.add(p);
			}

		}
		if (!knownPlayers.isEmpty()) {
			pos = Rnd.get(knownPlayers).getPosition();
		}
		return pos;
	}

	private float getRandomDmg(float damage, float minMultiplier, float maxMultiplier) {
		return damage * Rnd.nextFloat(minMultiplier, maxMultiplier);
	}
}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 102,949
2 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 63,733
3 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,771
4 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 36,923
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 35,011
6 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,470
7 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 29,077
8 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
9 no_profile 보거스쪽지보내기 자기소개 아이디로 검색 전체게시물 26,731
10 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 17,020
알림 0