테스트

aion-server 4.8

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

import java.util.Collections;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import com.aionemu.gameserver.model.Race;
import com.aionemu.gameserver.services.SiegeService;

/**
 * Holds and calculates the faction influences based on the fortresses template influence values (which should sum up to 100).<br/>
 * The faction who owns a fortress gets the associated influence value. Based on these values, the global influence rate is then calculated.
 *
 * @author Sarynth, Neon
 */
public class Influence {

	private static final Influence instance = new Influence();
	private Map<Integer, Map<SiegeRace, Integer>> influencesByWorld;
	private Map<SiegeRace, Integer> globalInfluences;
	private float elyosInfluenceRate;
	private float asmoInfluenceRate;
	private float balaurInfluenceRate;

	private Influence() {
		recalculateInfluence();
	}

	public static Influence getInstance() {
		return instance;
	}

	public void recalculateInfluence() {
		influencesByWorld = calculateFortressWorldInfluences();
		globalInfluences = calculateGlobalInfluences(influencesByWorld);
		elyosInfluenceRate = getInfluence(SiegeRace.ELYOS) / 100f;
		asmoInfluenceRate = getInfluence(SiegeRace.ASMODIANS) / 100f;
		balaurInfluenceRate = getInfluence(SiegeRace.BALAUR) / 100f;
	}

	private Map<Integer, Map<SiegeRace, Integer>> calculateFortressWorldInfluences() {
		Map<Integer, Map<SiegeRace, Integer>> fortressWorldInfluences = new LinkedHashMap<>();
		for (SiegeLocation sLoc : SiegeService.getInstance().getSiegeLocations().values()) {
			int influence = sLoc.getInfluenceValue();
			if (influence > 0) {
				fortressWorldInfluences.compute(sLoc.getWorldId(), (worldId, influences) -> {
					if (influences == null)
						influences = new EnumMap<>(SiegeRace.class);
					influences.compute(sLoc.getRace(), (k, value) -> value == null ? influence : value + influence);
					return influences;
				});
			}
		}
		return fortressWorldInfluences;
	}

	private Map<SiegeRace, Integer> calculateGlobalInfluences(Map<Integer, Map<SiegeRace, Integer>> influencesByWorld) {
		if (influencesByWorld.isEmpty())
			return Collections.emptyMap();
		return influencesByWorld.values().stream().flatMap(e -> e.entrySet().stream())
			.collect(Collectors.groupingBy(Map.Entry::getKey, () -> new EnumMap<>(SiegeRace.class), Collectors.summingInt(Map.Entry::getValue)));
	}

	public float getElyosInfluenceRate() {
		return elyosInfluenceRate;
	}

	public float getAsmodianInfluenceRate() {
		return asmoInfluenceRate;
	}

	public float getBalaurInfluenceRate() {
		return balaurInfluenceRate;
	}

	public int getInfluence(SiegeRace race) {
		return globalInfluences.getOrDefault(race, 0);
	}

	public int getInfluence(int worldId, SiegeRace race) {
		return influencesByWorld.getOrDefault(worldId, Collections.emptyMap()).getOrDefault(race, 0);
	}

	public Set<Integer> getInfluenceRelevantWorldIds() {
		return influencesByWorld.keySet();
	}

	/**
	 * @return float containing dmg modifier for disadvantaged race
	 */
	public float getPvpRaceBonus(Race attRace) {
		switch (attRace) {
			case ASMODIANS:
				return calculatePvpRaceBonus(getAsmodianInfluenceRate(), getElyosInfluenceRate());
			case ELYOS:
				return calculatePvpRaceBonus(getElyosInfluenceRate(), getAsmodianInfluenceRate());
			default:
				return 1f;
		}
	}

	private float calculatePvpRaceBonus(float ownInfluence, float enemyInfluence) {
		if (enemyInfluence >= 0.81f && ownInfluence <= 0.10f)
			return 1.2f;
		else if (enemyInfluence >= 0.81f || (enemyInfluence >= 0.71f && ownInfluence <= 0.10f))
			return 1.15f;
		else if (enemyInfluence >= 0.71f)
			return 1.1f;
		return 1f;
	}
}

📎 첨부파일

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