Показать сообщение отдельно
Непрочитано 13.10.2010, 18:36   #5
Изгнанные

Автор темы (Топик Стартер) Re: СОздание эффекта (скилла)

С датапаком я имел ввиду, что когда вписываю скиллу свой эффект, он игнорируется. В ядре всё сделано, нужно только заставить "работать" скрипт, то есть засунуть в импорты. Вот только где эти импорты?) Мне на другом форуме подсказали в файле scripts, но ведь там импорты из датапака?

Добавлено через 2 минуты
И, сорри, немного ошибся я именно тип скилла добавляю, а не эффект*

Мне просто нужно для корректной работы некоторых скиллов эффект мгновенного восстановления ХП и МП, а типом BUFF такого не добьешься.

Добавлено через 4 часа 1 минуту
Вот сам код:

Код:
package com.l2emu.gameserver.handler.skillhandlers;
import com.l2emu.gameserver.handler.ISkillHandler;
import com.l2emu.Config;
import com.l2emu.gameserver.handler.SkillHandler;
import com.l2emu.gameserver.model.L2ItemInstance;
import com.l2emu.gameserver.model.L2Object;
import com.l2emu.gameserver.model.L2Skill;
import com.l2emu.gameserver.model.actor.L2Character;
import com.l2emu.gameserver.model.actor.L2Summon;
import com.l2emu.gameserver.model.actor.instance.L2PcInstance;
import com.l2emu.gameserver.network.SystemMessageId;
import com.l2emu.gameserver.network.serverpackets.StatusUpdate;
import com.l2emu.gameserver.network.serverpackets.SystemMessage;
import com.l2emu.gameserver.skills.Stats;
import com.l2emu.gameserver.templates.skills.L2SkillType;
public class HPMPHEAL implements ISkillHandler
{
	private static final L2SkillType[] SKILL_IDS = { L2SkillType.HPMPHEAL_PERCENT };

	public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
	{
		try
		{
			ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(L2SkillType.BUFF);
			if (handler != null)
				handler.useSkill(activeChar, skill, targets);
		}
		catch (Exception e)
		{
		}
		L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance();
		L2PcInstance player = null;
		if (activeChar instanceof L2PcInstance)
			player = (L2PcInstance) activeChar;
		boolean clearSpiritShot = false;
		for (L2Object obj : targets)
		{
			if (!(obj instanceof L2Character))
				continue;
			L2Character target = (L2Character) obj;
			if (target == null || target.isDead())
				continue;	
			if (Config.DISABLE_HEALING_SKILLS && activeChar.isInsideZone(L2Character.ZONE_PEACE) && !target.isInsideZone(L2Character.ZONE_PEACE))
				continue;			
			if (target != activeChar)
			{
				if (target instanceof L2PcInstance && ((L2PcInstance) target).isCursedWeaponEquipped())
					continue;
				else if (player != null && player.isCursedWeaponEquipped())
					continue;
			}
			double hp = skill.getPower();	
			
			
			
			double power = skill.getPower();
			double mp = power;
				{if (skill.getSkillType() == L2SkillType.HPMPHEAL_PERCENT)
				{hp = target.getMaxHp() * hp / 100.0;
				mp = target.getMaxMp() * mp / 100.0;}
					else
				mp = (skill.getSkillType() == L2SkillType.HPMPHEAL_PERCENT) ? target.calcStat(Stats.RECHARGE_MP_RATE, mp, null, null) : mp;
			if (skill.getSkillType() == L2SkillType.HPMPHEAL_PERCENT)
			{
				if (mp > power * 1.7)
					mp = power * 1.7;
				int skilllvl = skill.getMagicLevel();
				if (skilllvl > 0)
				{
					int delta = target.getLevel() - skilllvl;
					if (delta > 15)
						mp = 0;
					else if (delta > 5)
                        mp = mp - mp*(delta-5)/10;
				}
				
				if ((target.getCurrentMp() + mp) >= target.getMaxMp())
					mp = target.getMaxMp() - target.getCurrentMp();
			}
			
			
			if (target.getFirstEffect(1509) != null && mp + target.getCurrentMp() > target.getMaxMp()*0.3)
				mp = target.getMaxMp()*0.3 - target.getCurrentMp();
			if (mp < 0)
				mp = 0;
			target.setCurrentMp(mp + target.getCurrentMp());
			StatusUpdate sump = new StatusUpdate(target.getObjectId());
			sump.addAttribute(StatusUpdate.CUR_MP, (int) target.getCurrentMp());
			target.sendPacket(sump);
			if (activeChar instanceof L2PcInstance && activeChar != target)
			{
				SystemMessage sm = new SystemMessage(SystemMessageId.S2_MP_RESTORED_BY_C1);
				sm.addString(activeChar.getName());
				sm.addNumber((int) mp);
				target.sendPacket(sm);
			}
			else
			{
				SystemMessage sm = new SystemMessage(SystemMessageId.S1_MP_RESTORED);
				sm.addNumber((int) mp);
				target.sendPacket(sm);
			}
		}
					
			if ((target.getCurrentHp() + hp) >= target.getMaxHp())
				hp = target.getMaxHp() - target.getCurrentHp();
			if (target.getFirstEffect(1509) != null && hp + target.getCurrentHp() > target.getMaxHp()*0.3)
				hp = target.getMaxHp()*0.3 - target.getCurrentHp();
			if (hp < 0)
				hp = 0;
			target.setCurrentHp(hp + target.getCurrentHp());
			StatusUpdate su = new StatusUpdate(target.getObjectId());
			su.addAttribute(StatusUpdate.CUR_HP, (int) target.getCurrentHp());
			target.sendPacket(su);
			if (target instanceof L2PcInstance)
			{
				if (skill.getId() == 4051)
				{
					SystemMessage sm = new SystemMessage(SystemMessageId.REJUVENATING_HP);
					target.sendPacket(sm);
				}
				else
				{
					if (activeChar instanceof L2PcInstance && activeChar != target)
					{
						SystemMessage sm = new SystemMessage(SystemMessageId.S2_HP_RESTORED_BY_C1);
						sm.addString(activeChar.getName());
						sm.addNumber((int) hp);
						target.sendPacket(sm);
					}
					else
					{
						SystemMessage sm = new SystemMessage(SystemMessageId.S1_HP_RESTORED);
						sm.addNumber((int) hp);
						target.sendPacket(sm);
					}
				}
			}
		}
		if (clearSpiritShot)
		{
			if (activeChar instanceof L2Summon)
			{
				L2Summon activeSummon = (L2Summon) activeChar;
				activeSummon.setChargedSpiritShot(L2ItemInstance.CHARGED_NONE);
			}
			else
			{
				if (weaponInst != null)
					weaponInst.setChargedSpiritshot(L2ItemInstance.CHARGED_NONE);
			}
		}
	}

	public L2SkillType[] getSkillIds()
	{
		return SKILL_IDS;
	}
}
Но если я заменяю им метод Heal, то все скиллы, которые лечат, заливают еще и мп. Может можно как то сделать так что бы остальные лили только ХП, а именно HPMPHEAL_PERCENT лил и мп и хп не создавая отдельный метод для него?

Последний раз редактировалось wagan; 13.10.2010 в 22:51. Причина: Добавлено сообщение
wagan вне форума Ответить с цитированием