테스트

aion-server 4.8

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

import com.aionemu.gameserver.configs.main.CraftConfig;
import com.aionemu.gameserver.dataholders.DataManager;
import com.aionemu.gameserver.model.craft.ExpertQuestsList;
import com.aionemu.gameserver.model.craft.MasterQuestsList;
import com.aionemu.gameserver.model.craft.Profession;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.skill.PlayerSkillEntry;
import com.aionemu.gameserver.model.templates.recipe.RecipeTemplate;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SKILL_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.questEngine.QuestEngine;
import com.aionemu.gameserver.services.trade.PricesService;
import com.aionemu.gameserver.utils.PacketSendUtility;

/**
 * @author synchro2
 */
public class RelinquishCraftStatus {

	private static final int expertMinValue = 400;
	private static final int expertMaxValue = 499;
	private static final int masterMinValue = 500;
	private static final int masterMaxValue = 549;
	private static final int expertPrice = 120895;
	private static final int masterPrice = 3497448;
	private static final int skillMessageId = 1401127;

	public static boolean relinquishExpertStatus(Player player, Profession profession) {
		return relinquishExpertStatus(player, profession, expertPrice);
	}

	public static boolean relinquishExpertStatus(Player player, Profession profession, int price) {
		return relinquishCraftStatus(player, profession, expertMinValue, expertMaxValue, price);
	}

	public static boolean relinquishMasterStatus(Player player, Profession profession) {
		return relinquishMasterStatus(player, profession, masterPrice);
	}

	public static boolean relinquishMasterStatus(Player player, Profession profession, int price) {
		return relinquishCraftStatus(player, profession, masterMinValue, masterMaxValue, price);
	}

	private static boolean relinquishCraftStatus(Player player, Profession profession, int minSkillLevel, int maxSkillLevel, int price) {
		if (profession == null || !profession.isCrafting())
			return false;
		PlayerSkillEntry skill = player.getSkillList().getSkillEntry(profession.getSkillId());
		if (skill == null || skill.getSkillLevel() < minSkillLevel || skill.getSkillLevel() > maxSkillLevel)
			return false;
		if (!decreaseKinah(player, price))
			return false;
		skill.setSkillLvl(minSkillLevel - 1);
		PacketSendUtility.sendPacket(player, new SM_SKILL_LIST(skill, skillMessageId));
		removeRecipesAbove(player, skill.getSkillId(), minSkillLevel);
		deleteCraftStatusQuests(skill.getSkillId(), player, maxSkillLevel < masterMinValue);
		return true;
	}

	private static boolean decreaseKinah(Player player, int basePrice) {
		if (basePrice > 0 && !player.getInventory().tryDecreaseKinah(PricesService.getPriceForService(basePrice, player.getRace()))) {
			PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_NOT_ENOUGH_MONEY());
			return false;
		}
		return true;
	}

	public static void removeRecipesAbove(Player player, int skillId, int level) {
		for (RecipeTemplate recipe : DataManager.RECIPE_DATA.getRecipeTemplates()) {
			if (recipe.getSkillId() != skillId || recipe.getSkillpoint() < level) {
				continue;
			}
			player.getRecipeList().deleteRecipe(player, recipe.getId());
		}
	}

	public static void deleteCraftStatusQuests(int skillId, Player player, boolean isExpert) {
		for (int questId : MasterQuestsList.getQuestIds(skillId, player.getRace())) {
			player.getQuestStateList().deleteQuest(questId);
		}
		if (isExpert) {
			for (int questId : ExpertQuestsList.getQuestIds(skillId, player.getRace())) {
				player.getQuestStateList().deleteQuest(questId);
			}
		}
		QuestEngine.getInstance().sendCompletedQuests(player);
		player.getController().updateNearbyQuests();
	}

	public static void removeExcessCraftStatus(Player player, boolean isExpert) {
		int minValue = isExpert ? expertMinValue : masterMinValue;
		int maxValue = isExpert ? expertMaxValue : masterMaxValue;
		int skillId;
		int skillLevel;
		int maxCraftStatus = isExpert ? CraftConfig.MAX_EXPERT_CRAFTING_SKILLS : CraftConfig.MAX_MASTER_CRAFTING_SKILLS;
		int countCraftStatus;
		for (PlayerSkillEntry skill : player.getSkillList().getAllSkills()) {
			countCraftStatus = isExpert
				? CraftSkillUpdateService.getInstance().getTotalMasterCraftingSkills(player)
					+ CraftSkillUpdateService.getInstance().getTotalExpertCraftingSkills(player)
				: CraftSkillUpdateService.getInstance().getTotalMasterCraftingSkills(player);
			if (countCraftStatus > maxCraftStatus) {
				skillId = skill.getSkillId();
				skillLevel = skill.getSkillLevel();
				if (skill.isCraftingSkill() && skillLevel > minValue && skillLevel <= maxValue) {
					skill.setSkillLvl(minValue - 1);
					PacketSendUtility.sendPacket(player, new SM_SKILL_LIST(skill, skillMessageId));
					removeRecipesAbove(player, skillId, minValue);
					deleteCraftStatusQuests(skillId, player, isExpert);
				}
				continue;
			}
			break;
		}
		if (!isExpert) {
			removeExcessCraftStatus(player, true);
		}
	}
}

📎 첨부파일

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