С датапаком я имел ввиду, что когда вписываю скиллу свой эффект, он игнорируется. В ядре всё сделано, нужно только заставить "работать" скрипт, то есть засунуть в импорты. Вот только где эти импорты?) Мне на другом форуме подсказали в файле 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 лил и мп и хп не создавая отдельный метод для него?