테스트

aion-server 4.8

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

import java.util.Map;

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

import com.aionemu.gameserver.dataholders.DataManager;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.items.ManaStone;
import com.aionemu.gameserver.model.templates.item.actions.TuningAction;
import com.aionemu.gameserver.model.templates.item.bonuses.StatBonusType;
import com.aionemu.gameserver.model.templates.item.purification.ItemPurificationTemplate;
import com.aionemu.gameserver.model.templates.item.purification.PurificationResult;
import com.aionemu.gameserver.model.templates.item.purification.RequiredMaterial;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.abyss.AbyssPointsService;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.audit.AuditLogger;

/**
 * @author Ranastic, Estrayl
 */
public class ItemPurificationService {

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

	public static boolean isPurificationAllowed(Player player, Item baseItem, int resultItemId) {
		ItemPurificationTemplate itemPurificationTemplate = DataManager.ITEM_PURIFICATION_DATA.getItemPurificationTemplate(baseItem.getItemId());
		if (itemPurificationTemplate == null) {
			log.warn("Item purification template is not available for [resultItemId=" + resultItemId + "]");
			return false;
		}

		Map<Integer, PurificationResult> resultItemMap = DataManager.ITEM_PURIFICATION_DATA.getResultItemMap(baseItem.getItemId());
		PurificationResult purificationResult = resultItemMap.get(resultItemId);
		if (purificationResult == null) {
			AuditLogger.log(player,
				"tried to purify an item to an invalid result [baseItemId=" + baseItem.getItemId() + ", resultItemId=" + resultItemId + "]");
			return false;
		}

		if (!baseItem.isIdentified()) {
			PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_REGISTER_ITEM_MSG_UPGRADE_CANNOT_NO_IDENTIFY());
			return false;
		}

		if (baseItem.getEnchantLevel() < purificationResult.getMinEnchantCount()) {
			PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_REGISTER_ITEM_MSG_UPGRADE_CANNOT(baseItem.getL10n()));
			return false;
		}

		if (player.getAbyssRank().getAp() < purificationResult.getNecessaryAbyssPoints()) {
			PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_REGISTER_ITEM_MSG_UPGRADE_CANNOT_NEED_AP());
			return false;
		}

		if (player.getInventory().getKinah() < purificationResult.getNecessaryKinah()) {
			PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_REGISTER_ITEM_MSG_UPGRADE_CANNOT_NEED_QINA());
			return false;
		}

		for (RequiredMaterial reqMat : purificationResult.getRequiredMaterials())
			if (player.getInventory().getItemCountByItemId(reqMat.getItemId()) < reqMat.getItemCount())
				return false;

		String resultItemL10n = DataManager.ITEM_DATA.getItemTemplate(resultItemId).getL10n();
		PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_ITEM_UPGRADE_MSG_UPGRADE_SUCCESS(baseItem.getL10n(), resultItemL10n));
		return true;
	}

	public static boolean decreaseMaterials(Player player, Item baseItem, int resultItemId) {
		Map<Integer, PurificationResult> resultItemMap = DataManager.ITEM_PURIFICATION_DATA.getResultItemMap(baseItem.getItemId());

		PurificationResult purificationResult = resultItemMap.get(resultItemId);

		for (RequiredMaterial reqMaterial : purificationResult.getRequiredMaterials()) {
			if (!player.getInventory().decreaseByItemId(reqMaterial.getItemId(), reqMaterial.getItemCount())) {
				AuditLogger.log(player, "tried to use item purification with insufficient materials [baseItemId=" + baseItem.getItemId() + ", resultItemId="
					+ resultItemId + ", reqMaterialId=" + reqMaterial.getItemId() + ", reqMaterialCount=" + reqMaterial.getItemCount() + "]");
				return false;
			}
		}

		if (purificationResult.getNecessaryAbyssPoints() > 0)
			AbyssPointsService.addAp(player, -purificationResult.getNecessaryAbyssPoints());

		if (purificationResult.getNecessaryKinah() > 0)
			player.getInventory().decreaseKinah(-purificationResult.getNecessaryKinah());

		player.getInventory().decreaseByObjectId(baseItem.getObjectId(), 1);

		return true;
	}

	public static void upgradeItem(Player player, Item sourceItem, int targetItemId) {
		Item newItem = ItemFactory.newItem(targetItemId, 1);
		newItem.setOptionalSockets(sourceItem.getOptionalSockets());
		newItem.setItemCreator(sourceItem.getItemCreator());
		newItem.setTuneCount(Math.max(0, Math.min(sourceItem.getTuneCount(), newItem.getItemTemplate().getMaxTuneCount())));
		newItem.setEnchantLevel(sourceItem.getEnchantLevel() - 5);
		newItem.setEnchantBonus(sourceItem.getEnchantBonus());
		newItem.setAmplified(sourceItem.isAmplified() && newItem.getEnchantLevel() >= newItem.getMaxEnchantLevel());
		if (newItem.isAmplified() && newItem.getEnchantLevel() >= 20) {
			newItem.setBuffSkill(sourceItem.getBuffSkill());
		}
		if (sourceItem.hasFusionedItem()) {
			newItem.setFusionedItem(sourceItem.getFusionedItemTemplate(), sourceItem.getFusionedItemBonusStatsId(),
				sourceItem.getFusionedItemOptionalSockets());
		}
		if (sourceItem.hasManaStones()) {
			for (ManaStone manaStone : sourceItem.getItemStones())
				ItemSocketService.addManaStone(newItem, manaStone.getItemId(), false);
		}
		if (sourceItem.hasFusionStones()) {
			for (ManaStone manaStone : sourceItem.getFusionStones())
				ItemSocketService.addManaStone(newItem, manaStone.getItemId(), true);
		}
		if (sourceItem.getGodStone() != null)
			newItem.addGodStone(sourceItem.getGodStone().getItemId(), sourceItem.getGodStone().getActivatedCount());
		if (sourceItem.getTempering() > 0)
			newItem.setTempering(sourceItem.getTempering());
		if (sourceItem.isSoulBound())
			newItem.setSoulBound(true);
		if (sourceItem.getBonusStatsId() > 0) {
			int statBonusId = sourceItem.getBonusStatsId();
			if (!DataManager.ITEM_RANDOM_BONUSES.areBonusSetsEqual(StatBonusType.INVENTORY, sourceItem.getItemTemplate().getStatBonusSetId(),
				newItem.getItemTemplate().getStatBonusSetId())) {
				statBonusId = TuningAction.getRandomStatBonusIdFor(newItem);
			}
			newItem.setBonusStats(statBonusId, true);
		}
		newItem.setItemColor(sourceItem.getItemColor());
		player.getInventory().add(newItem);
	}

}

📎 첨부파일

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