테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/src/com/aionemu/gameserver/model/siege/FortressLocation.java
package com.aionemu.gameserver.model.siege;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.aionemu.gameserver.configs.main.SiegeConfig;
import com.aionemu.gameserver.controllers.observer.ShieldObserver;
import com.aionemu.gameserver.model.Race;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Kisk;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.templates.siegelocation.SiegeLegionReward;
import com.aionemu.gameserver.model.templates.siegelocation.SiegeLocationTemplate;
import com.aionemu.gameserver.model.templates.siegelocation.SiegeMercenaryZone;
import com.aionemu.gameserver.model.templates.zone.ZoneType;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.ShieldService;
import com.aionemu.gameserver.services.teleport.TeleportService;
import com.aionemu.gameserver.skillengine.SkillEngine;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.world.zone.ZoneInstance;

/**
 * @author Source
 */
public class FortressLocation extends SiegeLocation {

	private final Map<Integer, ShieldObserver> shieldObservers = new ConcurrentHashMap<>();

	public FortressLocation(SiegeLocationTemplate template) {
		super(template);
	}

	public List<SiegeLegionReward> getLegionRewards() {
		return getTemplate().getSiegeLegionRewards();
	}

	public List<SiegeMercenaryZone> getSiegeMercenaryZones() {
		return getTemplate().getSiegeMercenaryZones();
	}

	/**
	 * @return isEnemy
	 */
	public boolean isEnemy(Creature creature) {
		return creature.getRace().getRaceId() != getRace().getRaceId();
	}

	@Override
	public void onEnterZone(Creature creature, ZoneInstance zone) {
		super.onEnterZone(creature, zone);
		creature.setInsideZoneType(ZoneType.SIEGE);
		checkForBalanceBuff(creature, SiegeBuffAction.ADD);
		if (isUnderShield() && getRace() != SiegeRace.getByRace(creature.getRace())) {
			ShieldObserver observer = ShieldService.getInstance().createShieldObserver(this, creature);
			if (observer != null) {
				creature.getObserveController().addObserver(observer);
				shieldObservers.put(creature.getObjectId(), observer);
			}
		}
	}

	@Override
	public void onLeaveZone(Creature creature, ZoneInstance zone) {
		super.onLeaveZone(creature, zone);
		creature.unsetInsideZoneType(ZoneType.SIEGE);
		checkForBalanceBuff(creature, SiegeBuffAction.LEAVE_ZONE_REMOVE);
		ShieldObserver observer = shieldObservers.remove(creature.getObjectId());
		if (observer != null)
			creature.getObserveController().removeObserver(observer);
	}

	public void checkForBalanceBuff(Creature creature, SiegeBuffAction siegeBuffAction) {
		if (creature instanceof Player && isVulnerable() && getFactionBalance() != 0) {
			switch (siegeBuffAction) {
				case LEAVE_ZONE_REMOVE:
				case SIEGE_END_REMOVE:
					for (int i = 8867; i <= 8884; i++) {
						if (creature.getEffectController().hasAbnormalEffect(i)) {
							creature.getEffectController().removeEffect(i);
							if (creature.getRace() == Race.ELYOS) {
								PacketSendUtility.sendPacket((Player) creature, siegeBuffAction == SiegeBuffAction.LEAVE_ZONE_REMOVE ?
										SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_LIGHT_GET_OUT_AREA() : SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_LIGHT_MIST_OFF());
							} else {
								PacketSendUtility.sendPacket((Player) creature, siegeBuffAction == SiegeBuffAction.LEAVE_ZONE_REMOVE ?
										SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_DARK_GET_OUT_AREA() : SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_DARK_MIST_OFF());
							}
							break;
						}
					}
					break;
				case ADD:
					int balance = getFactionBalance();
					if (creature.getRace() == Race.ELYOS) {
						if (balance < 0) {
							SkillEngine.getInstance().applyEffectDirectly(8866 + Math.abs(balance), creature, creature);
							PacketSendUtility.sendPacket((Player) creature, SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_LIGHT_GAIN());
						} else {
							PacketSendUtility.sendPacket((Player) creature, SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_DARK_WARNING());
						}
					} else if (creature.getRace() == Race.ASMODIANS) {
						if (balance > 0) {
							SkillEngine.getInstance().applyEffectDirectly(8875 + balance, creature, creature);
							PacketSendUtility.sendPacket((Player) creature, SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_DARK_GAIN());
						} else {
							PacketSendUtility.sendPacket((Player) creature, SM_SYSTEM_MESSAGE.STR_MSG_WEAK_RACE_BUFF_LIGHT_WARNING());
						}
					}
					break;
				default:
					break;
			}
		}
	}

	@Override
	public void clearLocation() {
		forEachCreature(creature -> {
			if (isEnemy(creature)) {
				if (creature instanceof Kisk kisk)
					kisk.getController().die();
				else if (creature instanceof Player player && !(player.isStaff() && SiegeConfig.IGNORE_STAFF_ON_LOCATION_CLEAR))
					TeleportService.moveToBindLocation(player);
			}
		});
	}

	public enum SiegeBuffAction {
		ADD,
		LEAVE_ZONE_REMOVE,
		SIEGE_END_REMOVE
	}
}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 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