테스트

aion-server 4.8

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

import java.util.HashMap;
import java.util.Map;

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

import com.aionemu.gameserver.configs.main.CraftConfig;
import com.aionemu.gameserver.model.craft.Profession;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.player.RequestResponseHandler;
import com.aionemu.gameserver.model.skill.PlayerSkillList;
import com.aionemu.gameserver.network.aion.serverpackets.SM_QUESTION_WINDOW;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.item.ItemPacketService.ItemUpdateType;
import com.aionemu.gameserver.utils.PacketSendUtility;

/**
 * @author MrPoke, sphinx, Imaginary, Pad
 */
public class CraftSkillUpdateService {

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

	private static final Map<Integer, Profession> professionByNpc = new HashMap<>();

	public static CraftSkillUpdateService getInstance() {
		return SingletonHolder.instance;
	}

	private CraftSkillUpdateService() {
		// Asmodian
		professionByNpc.put(204096, Profession.ESSENCETAPPING);
		professionByNpc.put(830150, Profession.ESSENCETAPPING);
		professionByNpc.put(204257, Profession.AETHERTAPPING);
		professionByNpc.put(830148, Profession.AETHERTAPPING);

		professionByNpc.put(204100, Profession.COOKING);
		professionByNpc.put(830142, Profession.COOKING);
		professionByNpc.put(204104, Profession.WEAPONSMITHING);
		professionByNpc.put(830146, Profession.WEAPONSMITHING);
		professionByNpc.put(204106, Profession.ARMORSMITHING);
		professionByNpc.put(830144, Profession.ARMORSMITHING);
		professionByNpc.put(204110, Profession.TAILORING);
		professionByNpc.put(830136, Profession.TAILORING);
		professionByNpc.put(204102, Profession.ALCHEMY);
		professionByNpc.put(830138, Profession.ALCHEMY);
		professionByNpc.put(204108, Profession.HANDICRAFTING);
		professionByNpc.put(830140, Profession.HANDICRAFTING);
		professionByNpc.put(798452, Profession.CONSTRUCTION);
		professionByNpc.put(798456, Profession.CONSTRUCTION);

		// Elyos
		professionByNpc.put(203780, Profession.ESSENCETAPPING);
		professionByNpc.put(830066, Profession.ESSENCETAPPING);
		professionByNpc.put(203782, Profession.AETHERTAPPING);
		professionByNpc.put(830064, Profession.AETHERTAPPING);

		professionByNpc.put(203784, Profession.COOKING);
		professionByNpc.put(830058, Profession.COOKING);
		professionByNpc.put(203788, Profession.WEAPONSMITHING);
		professionByNpc.put(830062, Profession.WEAPONSMITHING);
		professionByNpc.put(203790, Profession.ARMORSMITHING);
		professionByNpc.put(830060, Profession.ARMORSMITHING);
		professionByNpc.put(203793, Profession.TAILORING);
		professionByNpc.put(830052, Profession.TAILORING);
		professionByNpc.put(203786, Profession.ALCHEMY);
		professionByNpc.put(830054, Profession.ALCHEMY);
		professionByNpc.put(203792, Profession.HANDICRAFTING);
		professionByNpc.put(830056, Profession.HANDICRAFTING);
		professionByNpc.put(798450, Profession.CONSTRUCTION);
		professionByNpc.put(798454, Profession.CONSTRUCTION);

		log.info("CraftSkillUpdateService: Initialized.");
	}

	public Profession getProfessionByNpc(Npc npc) {
		return professionByNpc.get(npc.getNpcId());
	}

	public void learnSkill(Player player, Npc npc) {
		if (player.getLevel() < 10)
			return;
		Profession profession = professionByNpc.get(npc.getNpcId());
		if (profession == null)
			return;
		int skillId = profession.getSkillId();
		if (skillId == 0)
			return;

		PlayerSkillList skillList = player.getSkillList();
		int skillLevel = skillList.isSkillPresent(skillId) ? skillList.getSkillLevel(skillId) : 0;
		Integer price = profession.getUpgradeCost(skillLevel);
		if (price == null) {
			if (skillLevel > profession.getMaxUpgradableLevel())
				PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_DONT_RANK_UP_GATHERING());
			else if (skillLevel == 399) // expert is granted by quest
				PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_CRAFT_CANT_EXTEND_MONEY());
			else if (skillLevel == 499) // master is granted by quest
				PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_CRAFT_CANT_EXTEND_GRAND_MASTER());
			else
				PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_DONT_RANK_UP());
			return;
		}

		RequestResponseHandler<Npc> responseHandler = new RequestResponseHandler<Npc>(npc) {

			@Override
			public void acceptRequest(Npc requester, Player responder) {
				if (responder.getInventory().tryDecreaseKinah(price, ItemUpdateType.DEC_KINAH_LEARN)) {
					PlayerSkillList skillList = responder.getSkillList();
					skillList.addSkill(responder, skillId, skillLevel + 1);
				} else {
					PacketSendUtility.sendPacket(responder, SM_SYSTEM_MESSAGE.STR_NOT_ENOUGH_MONEY());
				}
			}

		};

		if (player.getResponseRequester().putRequest(SM_QUESTION_WINDOW.STR_CRAFT_ADDSKILL_CONFIRM, responseHandler)) {
			String professionName = skillLevel == 0 ? profession.getClientName() : profession.getClientName(skillLevel + 1);
			PacketSendUtility.sendPacket(player,
				new SM_QUESTION_WINDOW(SM_QUESTION_WINDOW.STR_CRAFT_ADDSKILL_CONFIRM, 0, 0, professionName, String.valueOf(price)));
		}
	}

	public int getTotalExpertCraftingSkills(Player player) {
		int mastered = 0;

		for (Profession profession : Profession.values()) {
			if (profession.isCrafting() && player.getSkillList().isSkillPresent(profession.getSkillId())) {
				int skillLvl = player.getSkillList().getSkillLevel(profession.getSkillId());
				if (skillLvl > 399 && skillLvl <= 499)
					mastered++;
			}
		}
		return mastered;
	}

	/**
	 * @return total number of mastered crafting skills
	 */
	public int getTotalMasterCraftingSkills(Player player) {
		int mastered = 0;

		for (Profession profession : Profession.values()) {
			if (profession.isCrafting() && player.getSkillList().isSkillPresent(profession.getSkillId())) {
				int skillLvl = player.getSkillList().getSkillLevel(profession.getSkillId());
				if (skillLvl > 499)
					mastered++;
			}
		}

		return mastered;
	}

	public boolean canLearnMoreExpertCraftingSkill(Player player) {
		if (getTotalExpertCraftingSkills(player) + getTotalMasterCraftingSkills(player) < CraftConfig.MAX_EXPERT_CRAFTING_SKILLS) {
			return true;
		} else {
			PacketSendUtility.sendMessage(player, "You can only be an expert in " + CraftConfig.MAX_EXPERT_CRAFTING_SKILLS + " professions.");
			return false;
		}
	}

	public boolean canLearnMoreMasterCraftingSkill(Player player) {
		if (getTotalMasterCraftingSkills(player) < CraftConfig.MAX_MASTER_CRAFTING_SKILLS) {
			return true;
		} else {
			PacketSendUtility.sendMessage(player, "You can only be a master in " + CraftConfig.MAX_MASTER_CRAFTING_SKILLS + " professions.");
			return false;
		}
	}

	private static class SingletonHolder {

		private static final CraftSkillUpdateService instance = new CraftSkillUpdateService();
	}
}

📎 첨부파일

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