Показать сообщение отдельно
Непрочитано 24.02.2011, 22:41   #19
Аватар для Amorph1s
Пользователь

По умолчанию Re: [core]Модификации Java серверов

Кто сможет вот в это
Код:
package l2p.gameserver.clientpackets;

import java.util.logging.Logger;

import l2p.Config;
import l2p.extensions.multilang.CustomMessage;
import l2p.gameserver.cache.Msg;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.items.L2ItemInstance;
import l2p.gameserver.model.items.PcInventory;
import l2p.gameserver.serverpackets.EnchantResult;
import l2p.gameserver.serverpackets.InventoryUpdate;
import l2p.gameserver.serverpackets.SystemMessage;
import l2p.gameserver.tables.ItemTable;
import l2p.gameserver.tables.SkillTable;
import l2p.gameserver.templates.L2Item;
import l2p.util.Log;
import l2p.util.Rnd;

public class RequestEnchantItem extends L2GameClientPacket
{
	protected static Logger _log = Logger.getLogger(RequestEnchantItem.class.getName());

	// Format: cd
	private int _objectId, _catalystObjId;

	@Override
	public void readImpl()
	{
		_objectId = readD();
		_catalystObjId = readD();
	}

	@Override
	public void runImpl()
	{
		L2Player activeChar = getClient().getActiveChar();
		if(activeChar == null)
			return;

		if(activeChar.isOutOfControl() || activeChar.isActionsDisabled())
		{
			activeChar.sendActionFailed();
			return;
		}

		PcInventory inventory = activeChar.getInventory();
		L2ItemInstance itemToEnchant = inventory.getItemByObjectId(_objectId);
		L2ItemInstance catalyst = _catalystObjId > 0 ? inventory.getItemByObjectId(_catalystObjId) : null;
		L2ItemInstance scroll = activeChar.getEnchantScroll();
		activeChar.setEnchantScroll(null);

		if(itemToEnchant == null || scroll == null)
		{
			activeChar.sendActionFailed();
			return;
		}

		// Затычка, ибо клиент криво обрабатывает RequestExTryToPutEnchantSupportItem
		if(!RequestExTryToPutEnchantSupportItem.checkCatalyst(itemToEnchant, catalyst))
			catalyst = null;

		// С помощью Master Yogi's Scroll: Enchant Weapon можно точить только Staff of Master Yogi
		if(scroll.getItemId() == 13540 && itemToEnchant.getItemId() != 13539 || itemToEnchant.getItemId() == 13539 && scroll.getItemId() != 13540)
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
			activeChar.sendActionFailed();
			return;
		}

		Log.add(activeChar.getName() + "|Trying to enchant|" + itemToEnchant.getItemId() + "|+" + itemToEnchant.getEnchantLevel() + "|" + itemToEnchant.getObjectId(), "enchants");

		// Затычка, разрешающая точить Staff of Master Yogi
		if(!itemToEnchant.canBeEnchanted() && !isYogiStaffEnchanting(scroll, itemToEnchant))
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
			activeChar.sendActionFailed();
			return;
		}

		if(itemToEnchant.getLocation() != L2ItemInstance.ItemLocation.INVENTORY && itemToEnchant.getLocation() != L2ItemInstance.ItemLocation.PAPERDOLL)
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
			activeChar.sendActionFailed();
			return;
		}

		if(activeChar.getPrivateStoreType() != L2Player.STORE_PRIVATE_NONE)
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendPacket(Msg.YOU_CANNOT_PRACTICE_ENCHANTING_WHILE_OPERATING_A_PRIVATE_STORE_OR_PRIVATE_MANUFACTURING_WORKSHOP);
			activeChar.sendActionFailed();
			return;
		}

		if(itemToEnchant.isStackable() || (scroll = inventory.getItemByObjectId(scroll.getObjectId())) == null)
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendActionFailed();
			return;
		}

		int crystalId = itemToEnchant.getEnchantCrystalId(scroll, catalyst);

		// Затычка, разрешающая точить Staff of Master Yogi
		if(crystalId == 0 && !isYogiStaffEnchanting(scroll, itemToEnchant))
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
			activeChar.sendActionFailed();
			return;
		}

		// Staff of Master Yogi можно точить до 23
		if(!isYogiStaffEnchanting(scroll, itemToEnchant) && itemToEnchant.getEnchantLevel() >= Config.ENCHANT_MAX || isYogiStaffEnchanting(scroll, itemToEnchant) && itemToEnchant.getEnchantLevel() >= 23)
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendMessage(new CustomMessage("l2p.gameserver.clientpackets.RequestEnchantItem.MaxLevel", activeChar));
			activeChar.sendActionFailed();
			return;
		}

		// Запрет на заточку чужих вещей, баг может вылезти на серверных лагах
		if(itemToEnchant.getOwnerId() != activeChar.getObjectId())
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendPacket(Msg.INAPPROPRIATE_ENCHANT_CONDITIONS);
			activeChar.sendActionFailed();
			return;
		}

		L2ItemInstance removedScroll, removedCatalyst = null;
		synchronized (inventory)
		{
			removedScroll = inventory.destroyItem(scroll.getObjectId(), 1, true);
			if(catalyst != null)
				removedCatalyst = inventory.destroyItem(catalyst.getObjectId(), 1, true);
		}

		//tries enchant without scrolls
		if(removedScroll == null || catalyst != null && removedCatalyst == null)
		{
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendActionFailed();
			return;
		}

		int itemType = itemToEnchant.getItem().getType2();
		int safeEnchantLevel = itemToEnchant.getItem().getBodyPart() == L2Item.SLOT_FULL_ARMOR ? Config.SAFE_ENCHANT_FULL_BODY : Config.SAFE_ENCHANT_COMMON;

		double chance;
		if(itemToEnchant.getEnchantLevel() < safeEnchantLevel)
			chance = 100;
		else if(itemType == L2Item.TYPE2_WEAPON)
			chance = removedScroll.isCrystallEnchantScroll() ? Config.ENCHANT_CHANCE_CRYSTAL_WEAPON : Config.ENCHANT_CHANCE_WEAPON;
		else if(itemType == L2Item.TYPE2_SHIELD_ARMOR)
			chance = removedScroll.isCrystallEnchantScroll() ? Config.ENCHANT_CHANCE_CRYSTAL_ARMOR : Config.ENCHANT_CHANCE_ARMOR;
		else if(itemType == L2Item.TYPE2_ACCESSORY)
			chance = removedScroll.isCrystallEnchantScroll() ? Config.ENCHANT_CHANCE_CRYSTAL_ACCESSORY : Config.ENCHANT_CHANCE_ACCESSORY;
		else
		{
			System.out.println("WTF? Request to enchant " + itemToEnchant.getItemId());
			activeChar.sendPacket(EnchantResult.CANCEL);
			activeChar.sendActionFailed();
			activeChar.sendPacket(Msg.SYSTEM_ERROR);
			inventory.addItem(removedScroll);
			return;
		}

		if(scroll.isDivineEnchantScroll()) // Item Mall divine
			chance = 100;
		else if(scroll.isItemMallEnchantScroll()) // Item Mall normal/ancient
			chance += 10;

		if(removedCatalyst != null)
			chance += removedCatalyst.getCatalystPower();

		if(Rnd.chance(chance))
		{
			itemToEnchant.setEnchantLevel(itemToEnchant.getEnchantLevel() + 1);
			itemToEnchant.updateDatabase();

			activeChar.sendPacket(new InventoryUpdate().addModifiedItem(itemToEnchant));

			Log.add(activeChar.getName() + "|Successfully enchanted|" + itemToEnchant.getItemId() + "|to+" + itemToEnchant.getEnchantLevel() + "|" + chance, "enchants");
			Log.LogItem(activeChar, Log.EnchantItem, itemToEnchant);
			activeChar.sendPacket(EnchantResult.SUCESS);

			if(itemToEnchant.getEnchantLevel() >= (itemType == L2Item.TYPE2_WEAPON ? 6 : 5))
			{
				activeChar.altUseSkill(SkillTable.getInstance().getInfo(21006, 1), activeChar);
				activeChar.broadcastPacket(new SystemMessage(SystemMessage.C1_HAS_SUCCESSFULY_ENCHANTED_A__S2_S3).addName(activeChar).addNumber(itemToEnchant.getEnchantLevel()).addItemName(itemToEnchant.getItemId()));
			}
		}
		else
		{
			Log.add(activeChar.getName() + "|Failed to enchant|" + itemToEnchant.getItemId() + "|+" + itemToEnchant.getEnchantLevel() + "|" + chance, "enchants");

			if(scroll.isBlessedEnchantScroll()) // фейл, но заточка блесед
			{
				itemToEnchant.setEnchantLevel(0);
				activeChar.sendPacket(new InventoryUpdate().addModifiedItem(itemToEnchant));
				activeChar.sendPacket(Msg.FAILED_IN_BLESSED_ENCHANT_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
				activeChar.sendPacket(EnchantResult.BLESSED_FAILED);
			}
			else if(scroll.isAncientEnchantScroll()) // фейл, но заточка ancient
				activeChar.sendPacket(EnchantResult.ANCIENT_FAILED);
			else
			// фейл, разбиваем вещь
			{
				if(itemToEnchant.isEquipped())
					inventory.unEquipItemInSlot(itemToEnchant.getEquipSlot());

				L2ItemInstance destroyedItem = inventory.destroyItem(itemToEnchant.getObjectId(), 1, true);
				if(destroyedItem == null)
				{
					_log.warning("failed to destroy " + itemToEnchant.getObjectId() + " after unsuccessful enchant attempt by char " + activeChar.getName());
					activeChar.sendActionFailed();
					return;
				}

				Log.LogItem(activeChar, Log.EnchantItemFail, itemToEnchant);

				if(crystalId > 0)
				{
					L2ItemInstance crystalsToAdd = ItemTable.getInstance().createItem(crystalId);

					int count = (int) (itemToEnchant.getItem().getCrystalCount() * 0.87);
					if(destroyedItem.getEnchantLevel() > 3)
						count += itemToEnchant.getItem().getCrystalCount() * 0.25 * (destroyedItem.getEnchantLevel() - 3);
					if(count < 1)
						count = 1;
					crystalsToAdd.setCount(count);

					inventory.addItem(crystalsToAdd);
					Log.LogItem(activeChar, Log.Sys_GetItem, crystalsToAdd);

					activeChar.sendPacket(new EnchantResult(1, crystalsToAdd.getItemId(), count), SystemMessage.obtainItems(crystalId, count, 0));
				}
				else
					activeChar.sendPacket(EnchantResult.FAILED_NO_CRYSTALS);

				activeChar.refreshExpertisePenalty();
			}
		}

		activeChar.refreshOverloaded();
		activeChar.setEnchantScroll(null);
		activeChar.sendChanges();
	}

	private static boolean isYogiStaffEnchanting(L2ItemInstance scroll, L2ItemInstance itemToEnchant)
	{
		if(scroll.getItemId() == 13540 && itemToEnchant.getItemId() == 13539)
			return true;
		return false;
	}
}
влить вот это
Код:
private static boolean checkEnchant(L2ItemInstance itemToEnchant)
{
int itemType = itemToEnchant.getItem().getType2();
int maxWep = 0, maxArmJew = 0; // инициализация(оружие,арм/бижа)
switch(itemToEnchant.getCrystalType())
{
case C:
maxWep = 25;
maxArmJew = 15;
break;
case B:
maxWep = 20;
maxArmJew = 10;
break;
case A:
maxWep = 16;
maxArmJew = 8;
break;
case S:
maxWep = 13;
break;
case S80:
maxWep = 8;
break;
case S84:
maxWep = 7;
break;
default:
maxArmJew = 6;
break;
}
if(itemType == L2Item.TYPE2_WEAPON && itemToEnchant.getEnchantLevel() >= maxWep)
return true;
else if((itemType == L2Item.TYPE1_SHIELD_ARMOR || itemType == L2Item.TYPE2_ACCESSORY) && itemToEnchant.getEnchantLevel() >= maxArmJew)
return true;
return false;
}
да так что бы пахало.
Суть в том, что этот код ставит ограничение заточек по грейду, через клиентпакет.

Добавлено через 13 часов 20 минут
Цитата:
Сообщение от KilRoy Посмотреть сообщение

P.S СОХРАНЯТЬ ВСЁ В UTF-8 БЕЗ BOM
собственно так и делаю. в том то и трабл.

Последний раз редактировалось Amorph1s; 25.02.2011 в 12:01. Причина: Добавлено сообщение
Amorph1s вне форума Отправить сообщение для Amorph1s с помощью ICQ Отправить сообщение для Amorph1s с помощью Skype™ Ответить с цитированием