테스트

aion-server 4.8

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

import java.util.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aionemu.commons.services.CronService;
import com.aionemu.gameserver.configs.main.RankingConfig;
import com.aionemu.gameserver.dao.AbyssRankDAO;
import com.aionemu.gameserver.dao.AbyssRankDAO.RankingListPlayerGp;
import com.aionemu.gameserver.model.Race;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.utils.stats.AbyssRankEnum;
import com.aionemu.gameserver.world.World;

/**
 * @author ATracer, Neon
 */
public class AbyssRankUpdateService {

	private static final Logger log = LoggerFactory.getLogger(AbyssRankUpdateService.class);

	private AbyssRankUpdateService() {
	}

	public static void scheduleUpdate() {
		log.info("Scheduling ranking update task based on cron expression: " + RankingConfig.TOP_RANKING_UPDATE_RULE);
		CronService.getInstance().schedule(AbyssRankUpdateService::performUpdate, RankingConfig.TOP_RANKING_UPDATE_RULE, true);

		log.info("Scheduling daily GP loss task based on cron expression: " + RankingConfig.TOP_RANKING_DAILY_GP_LOSS_TIME);
		CronService.getInstance().schedule(AbyssRankUpdateService::updateDailyGpLoss, RankingConfig.TOP_RANKING_DAILY_GP_LOSS_TIME, true);
	}

	/**
	 * Perform update of all ranks
	 */
	public static void performUpdate() {
		ThreadPoolManager.getInstance().schedule(() -> {
			log.info("AbyssRankUpdateService: Executing rank update...");
			long startTime = System.currentTimeMillis();

			// update and store rank statistics for all online players (offline players update on login)
			World.getInstance().forEachPlayer(player -> {
				player.getAbyssRank().doUpdate();
				AbyssRankDAO.storeAbyssRank(player);
			});

			AbyssRankEnum minGpRank = Arrays.stream(AbyssRankEnum.values())
					.filter(rank -> rank.getRequiredGP() > 0)
					.min(Comparator.comparingInt(AbyssRankEnum::getId)).orElse(AbyssRankEnum.STAR1_OFFICER);
			int playerLimit = Arrays.stream(AbyssRankEnum.values())
					.filter(rank -> rank.getRequiredGP() > 0)
					.mapToInt(AbyssRankEnum::getQuota)
					.max().orElse(1000);

			// update and store player & legion DB rank_pos entries (for ▼/▲/= trend in the ranking table)
			AbyssRankDAO.updateRankingLists(RankingConfig.TOP_RANKING_MAX_OFFLINE_DAYS, playerLimit, RankingConfig.RANKING_LIST_LEGION_LIMIT);
			// update and store GP ranks
			updateQuotaRanksForRace(Race.ASMODIANS, minGpRank);
			updateQuotaRanksForRace(Race.ELYOS, minGpRank);

			// update ranking cache
			AbyssRankingCache.getInstance().reloadRankings();

			log.info("AbyssRankUpdateService: Finished in " + (System.currentTimeMillis() - startTime) / 1000 + "s");
		}, 1000);
	}

	/**
	 * Update player ranks based on quota for all players (online/offline)
	 *  @param race
	 *          the race that will be updated
	 * @param minRank
	 *          the minimum rank that will be updated (all lower GP ranks are disabled)
	 */
	private static void updateQuotaRanksForRace(Race race, AbyssRankEnum minRank) {
		List<RankingListPlayerGp> rankingListSorted = AbyssRankDAO.loadRankingListPlayersGp(race);
		if (rankingListSorted == null)
			return;

		// calculate and set new GP ranks
		int usedQuota = 0;
		for (int i = AbyssRankEnum.SUPREME_COMMANDER.getId(); i >= minRank.getId(); i--)
			usedQuota = selectAndUpdateQuotaRank(AbyssRankEnum.getRankById(i), rankingListSorted, usedQuota);

		// set all players with an old GP rank to AP ranks if they hold no rank position anymore
		Map<Integer, Integer> apByPlayerId = AbyssRankDAO.loadApOfPlayersNotInRankingList(race, minRank);
		if (apByPlayerId != null)
			updateToNoQuotaRank(apByPlayerId);
	}

	private static int selectAndUpdateQuotaRank(AbyssRankEnum rank, List<RankingListPlayerGp> rankingList, int usedQuota) {
		for (Iterator<RankingListPlayerGp> iterator = rankingList.iterator(); iterator.hasNext();) {
			RankingListPlayerGp rankingListEntry = iterator.next();
			if (usedQuota >= rank.getQuota() || rankingListEntry.gp() < rank.getRequiredGP())
				break;
			// remove player and update its rank
			iterator.remove();
			updateRankTo(rank, rankingListEntry.playerId(), rankingListEntry.position());
			usedQuota++;
		}
		return usedQuota;
	}

	private static void updateToNoQuotaRank(Map<Integer, Integer> apByPlayerId) {
		apByPlayerId.forEach((playerId, ap) -> {
			AbyssRankEnum rank = AbyssRankEnum.getRankForPoints(ap, 0); // no GP -> no officer ranks
			updateRankTo(rank, playerId, 0);
		});
	}

	private static void updateRankTo(AbyssRankEnum newRank, int playerId, int rankingPosition) {
		// check if rank has changed for online players
		Player player = World.getInstance().getPlayer(playerId);
		if (player != null) {
			boolean rankChanged = player.getAbyssRank().getRank() != newRank;
			if (rankChanged) {
				player.getAbyssRank().setRank(newRank);
				// save to db now, so cache reload loads the correct rank for online players
				AbyssRankDAO.updateAbyssRank(playerId, newRank);
			}
			AbyssPointsService.onRankChanged(player, false, rankChanged, rankingPosition);
		} else {
			AbyssRankDAO.updateAbyssRank(playerId, newRank);
		}
	}

	private static void updateDailyGpLoss() {
		for (AbyssRankEnum rank : AbyssRankEnum.values()) {
			if (rank.getGpLossPerDay() > 0)
				AbyssRankDAO.dailyUpdateGp(rank);
		}
		for (Player p : World.getInstance().getAllPlayers()) {
			if (p.getAbyssRank().getRank().getGpLossPerDay() > 0) {
				GloryPointsService.decreaseGpBy(p.getObjectId(), p.getAbyssRank().getRank().getGpLossPerDay());
			}
		}
	}
}

📎 첨부파일

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