Sync with L2jServer HighFive Sep 18th 2015.
This commit is contained in:
@ -1350,6 +1350,11 @@ public final class CharEffectList
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bi.getSkill().getAbnormalType() == AbnormalType.SUMMON_CONDITION)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
stopAndRemove(bi, effects);
|
||||
|
||||
buffsToRemove--;
|
||||
|
@ -83,7 +83,6 @@ import com.l2jserver.gameserver.model.actor.tasks.character.HitTask;
|
||||
import com.l2jserver.gameserver.model.actor.tasks.character.MagicUseTask;
|
||||
import com.l2jserver.gameserver.model.actor.tasks.character.NotifyAITask;
|
||||
import com.l2jserver.gameserver.model.actor.tasks.character.QueuedMagicUseTask;
|
||||
import com.l2jserver.gameserver.model.actor.tasks.character.UsePotionTask;
|
||||
import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
|
||||
import com.l2jserver.gameserver.model.actor.transform.Transform;
|
||||
import com.l2jserver.gameserver.model.actor.transform.TransformTemplate;
|
||||
@ -1849,29 +1848,21 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
// queue herbs and potions
|
||||
if (isCastingSimultaneouslyNow() && simultaneously)
|
||||
{
|
||||
ThreadPoolManager.getInstance().scheduleAi(new UsePotionTask(this, skill), 100);
|
||||
ThreadPoolManager.getInstance().scheduleAi(() -> doCast(skill), 100);
|
||||
return;
|
||||
}
|
||||
|
||||
// Set the _castInterruptTime and casting status (L2PcInstance already has this true)
|
||||
if (simultaneously)
|
||||
{
|
||||
setIsCastingSimultaneouslyNow(true);
|
||||
setLastSimultaneousSkillCast(skill);
|
||||
}
|
||||
else
|
||||
{
|
||||
setIsCastingNow(true);
|
||||
}
|
||||
|
||||
if (!simultaneously)
|
||||
{
|
||||
_castInterruptTime = -2 + GameTimeController.getInstance().getGameTicks() + (skillTime / GameTimeController.MILLIS_IN_TICK);
|
||||
setLastSkillCast(skill);
|
||||
}
|
||||
else
|
||||
{
|
||||
setLastSimultaneousSkillCast(skill);
|
||||
}
|
||||
|
||||
// Calculate the Reuse Time of the Skill
|
||||
int reuseDelay;
|
||||
@ -4941,6 +4932,10 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
if ((isNpc() && target.isAlikeDead()) || target.isDead() || (!getKnownList().knowsObject(target) && !isDoor()))
|
||||
{
|
||||
// getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE, null);
|
||||
// Some times attack is processed but target die before the hit
|
||||
// So we need to recharge shot for next attack
|
||||
rechargeShots(true, false);
|
||||
|
||||
getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
|
||||
|
||||
sendPacket(ActionFailed.STATIC_PACKET);
|
||||
@ -5319,9 +5314,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
switch (weapon.getItemType())
|
||||
{
|
||||
case BOW:
|
||||
return (1500 * 345) / getPAtkSpd();
|
||||
return (int) ((1500 * 345) / getPAtkSpd());
|
||||
case CROSSBOW:
|
||||
return (1200 * 345) / getPAtkSpd();
|
||||
return (int) ((1200 * 345) / getPAtkSpd());
|
||||
case DAGGER:
|
||||
// atkSpd /= 1.15;
|
||||
break;
|
||||
@ -5795,6 +5790,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
|
||||
// Stop casting
|
||||
setIsCastingNow(false);
|
||||
setIsCastingSimultaneouslyNow(false);
|
||||
|
||||
final Skill skill = mut.getSkill();
|
||||
final L2Object target = mut.getTargets().length > 0 ? mut.getTargets()[0] : null;
|
||||
@ -6330,7 +6326,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
return getStat().getMaxRecoverableCp();
|
||||
}
|
||||
|
||||
public final double getMAtk(L2Character target, Skill skill)
|
||||
public double getMAtk(L2Character target, Skill skill)
|
||||
{
|
||||
return getStat().getMAtk(target, skill);
|
||||
}
|
||||
@ -6365,7 +6361,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
return getStat().getMCriticalHit(target, skill);
|
||||
}
|
||||
|
||||
public final double getMDef(L2Character target, Skill skill)
|
||||
public double getMDef(L2Character target, Skill skill)
|
||||
{
|
||||
return getStat().getMDef(target, skill);
|
||||
}
|
||||
@ -6375,17 +6371,17 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
return getStat().getMReuseRate(skill);
|
||||
}
|
||||
|
||||
public final double getPAtk(L2Character target)
|
||||
public double getPAtk(L2Character target)
|
||||
{
|
||||
return getStat().getPAtk(target);
|
||||
}
|
||||
|
||||
public int getPAtkSpd()
|
||||
public double getPAtkSpd()
|
||||
{
|
||||
return getStat().getPAtkSpd();
|
||||
return (int) getStat().getPAtkSpd();
|
||||
}
|
||||
|
||||
public final double getPDef(L2Character target)
|
||||
public double getPDef(L2Character target)
|
||||
{
|
||||
return getStat().getPDef(target);
|
||||
}
|
||||
@ -6603,6 +6599,13 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
*/
|
||||
public void sendDamageMessage(L2Character target, int damage, boolean mcrit, boolean pcrit, boolean miss)
|
||||
{
|
||||
if (miss && target.isPlayer())
|
||||
{
|
||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_EVADED_C2_S_ATTACK);
|
||||
sm.addPcName(target.getActingPlayer());
|
||||
sm.addCharName(this);
|
||||
target.sendPacket(sm);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -6921,12 +6924,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
*/
|
||||
public final WeaponType getAttackType()
|
||||
{
|
||||
final L2Weapon weapon = getActiveWeaponItem();
|
||||
if (weapon != null)
|
||||
{
|
||||
return weapon.getItemType();
|
||||
}
|
||||
else if (isTransformed())
|
||||
if (isTransformed())
|
||||
{
|
||||
final TransformTemplate template = getTransformation().getTemplate(getActingPlayer());
|
||||
if (template != null)
|
||||
@ -6934,6 +6932,11 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
return template.getBaseAttackType();
|
||||
}
|
||||
}
|
||||
final L2Weapon weapon = getActiveWeaponItem();
|
||||
if (weapon != null)
|
||||
{
|
||||
return weapon.getItemType();
|
||||
}
|
||||
return getTemplate().getBaseAttackType();
|
||||
}
|
||||
|
||||
|
@ -253,7 +253,7 @@ public class L2DoorInstance extends L2Character
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.log(Level.WARNING, getClass().getSimpleName() + ": cannot find child id: " + getChildId());
|
||||
_log.log(Level.WARNING, getClass().getSimpleName() + ": Cannot find child id: " + getChildId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -833,6 +833,7 @@ public final class L2PcInstance extends L2Playable
|
||||
private Map<Integer, Skill> _customSkills = null;
|
||||
|
||||
private volatile int _actionMask;
|
||||
private Map<Stats, Double> _servitorShare;
|
||||
|
||||
/**
|
||||
* Creates a player.
|
||||
@ -10314,7 +10315,7 @@ public final class L2PcInstance extends L2Playable
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((_transformation != null) && !s.isPassive())
|
||||
if (((_transformation != null) && !s.isPassive()) || (hasTransformSkill(s.getId()) && s.isPassive()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -10327,16 +10328,7 @@ public final class L2PcInstance extends L2Playable
|
||||
if (isEnchantable)
|
||||
{
|
||||
L2EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(s.getId());
|
||||
if (esl != null)
|
||||
{
|
||||
// if player dont have min level to enchant
|
||||
if (s.getLevel() < esl.getBaseLevel())
|
||||
{
|
||||
isEnchantable = false;
|
||||
}
|
||||
}
|
||||
// if no enchant data
|
||||
else
|
||||
if ((esl == null) || (s.getLevel() < esl.getBaseLevel()))
|
||||
{
|
||||
isEnchantable = false;
|
||||
}
|
||||
@ -10356,7 +10348,6 @@ public final class L2PcInstance extends L2Playable
|
||||
{
|
||||
ts.put(holder.getSkillId(), holder.getSkillLvl());
|
||||
}
|
||||
addTransformSkill(holder.getSkill());
|
||||
}
|
||||
|
||||
for (AdditionalSkillHolder holder : _transformation.getTemplate(this).getAdditionalSkills())
|
||||
@ -10368,7 +10359,6 @@ public final class L2PcInstance extends L2Playable
|
||||
{
|
||||
ts.put(holder.getSkillId(), holder.getSkillLvl());
|
||||
}
|
||||
addTransformSkill(holder.getSkill());
|
||||
}
|
||||
}
|
||||
|
||||
@ -10383,6 +10373,8 @@ public final class L2PcInstance extends L2Playable
|
||||
|
||||
for (Entry<Integer, Integer> transformSkill : ts.entrySet())
|
||||
{
|
||||
Skill sk = SkillData.getInstance().getSkill(transformSkill.getKey(), transformSkill.getValue());
|
||||
addTransformSkill(sk);
|
||||
sl.addSkill(transformSkill.getKey(), transformSkill.getValue(), false, false, false);
|
||||
}
|
||||
}
|
||||
@ -13007,6 +12999,10 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
}
|
||||
_transformSkills.put(sk.getId(), sk);
|
||||
if (sk.isPassive())
|
||||
{
|
||||
addSkill(sk, false);
|
||||
}
|
||||
}
|
||||
|
||||
public Skill getTransformSkill(int id)
|
||||
@ -13572,7 +13568,7 @@ public final class L2PcInstance extends L2Playable
|
||||
activeChar.sendPacket(new RecipeShopMsg(this));
|
||||
break;
|
||||
}
|
||||
if (isMounted())
|
||||
if (isTransformed())
|
||||
{
|
||||
// Required double send for fix Mounted H5+
|
||||
sendPacket(new CharInfo(activeChar));
|
||||
@ -15376,4 +15372,18 @@ public final class L2PcInstance extends L2Playable
|
||||
{
|
||||
return _whisperers;
|
||||
}
|
||||
|
||||
public void setServitorShare(Map<Stats, Double> map)
|
||||
{
|
||||
_servitorShare = map;
|
||||
}
|
||||
|
||||
public final double getServitorShareBonus(Stats stat)
|
||||
{
|
||||
if (_servitorShare == null)
|
||||
{
|
||||
return 1.0d;
|
||||
}
|
||||
return _servitorShare.get(stat);
|
||||
}
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ import com.l2jserver.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jserver.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jserver.gameserver.model.skills.EffectScope;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
import com.l2jserver.gameserver.model.stats.Stats;
|
||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
||||
import com.l2jserver.gameserver.network.serverpackets.SetSummonRemainTime;
|
||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
||||
@ -506,4 +507,52 @@ public class L2ServitorInstance extends L2Summon implements Runnable
|
||||
getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, getOwner());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getMAtk(L2Character target, Skill skill)
|
||||
{
|
||||
return super.getMAtk(target, skill) + (getActingPlayer().getMAtk(target, skill) * (getActingPlayer().getServitorShareBonus(Stats.MAGIC_ATTACK) - 1.0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getMDef(L2Character target, Skill skill)
|
||||
{
|
||||
return super.getMDef(target, skill) + (getActingPlayer().getMDef(target, skill) * (getActingPlayer().getServitorShareBonus(Stats.MAGIC_DEFENCE) - 1.0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getPAtk(L2Character target)
|
||||
{
|
||||
return super.getPAtk(target) + (getActingPlayer().getPAtk(target) * (getActingPlayer().getServitorShareBonus(Stats.POWER_ATTACK) - 1.0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getPDef(L2Character target)
|
||||
{
|
||||
return super.getPDef(target) + (getActingPlayer().getPDef(target) * (getActingPlayer().getServitorShareBonus(Stats.POWER_DEFENCE) - 1.0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMAtkSpd()
|
||||
{
|
||||
return (int) (super.getMAtkSpd() + (getActingPlayer().getMAtkSpd() * (getActingPlayer().getServitorShareBonus(Stats.MAGIC_ATTACK_SPEED) - 1.0)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxHp()
|
||||
{
|
||||
return (int) (super.getMaxHp() + (getActingPlayer().getMaxHp() * (getActingPlayer().getServitorShareBonus(Stats.MAX_HP) - 1.0)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCriticalHit(L2Character target, Skill skill)
|
||||
{
|
||||
return (int) (super.getCriticalHit(target, skill) + ((getActingPlayer().getCriticalHit(target, skill)) * (getActingPlayer().getServitorShareBonus(Stats.CRITICAL_RATE) - 1.0)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getPAtkSpd()
|
||||
{
|
||||
return super.getPAtkSpd() + (getActingPlayer().getPAtkSpd() * (getActingPlayer().getServitorShareBonus(Stats.POWER_ATTACK_SPEED) - 1.0));
|
||||
}
|
||||
}
|
||||
|
@ -176,18 +176,19 @@ public final class L2TrapInstance extends L2Npc
|
||||
|
||||
public boolean checkTarget(L2Character target)
|
||||
{
|
||||
// Range seems to be reduced from Freya(300) to H5(150)
|
||||
if (!target.isInsideRadius(this, 150, false, false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Skill.checkForAreaOffensiveSkills(this, target, _skill.getSkill(), _isInArena))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!target.isInsideRadius(this, _skill.getSkill().getAffectRange(), false, false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// observers
|
||||
if ((target instanceof L2PcInstance) && ((L2PcInstance) target).inObserverMode())
|
||||
if (target.isPlayer() && target.getActingPlayer().inObserverMode())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -411,7 +412,7 @@ public final class L2TrapInstance extends L2Npc
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnTrapAction(this, target, TrapAction.TRAP_TRIGGERED), this);
|
||||
|
||||
ThreadPoolManager.getInstance().scheduleGeneral(new TrapTriggerTask(this), 300);
|
||||
ThreadPoolManager.getInstance().scheduleGeneral(new TrapTriggerTask(this), 500);
|
||||
}
|
||||
|
||||
public void unSummon()
|
||||
|
@ -552,15 +552,14 @@ public class CharStat
|
||||
/**
|
||||
* @return the PAtk Speed (base+modifier) of the L2Character in function of the Armour Expertise Penalty.
|
||||
*/
|
||||
public int getPAtkSpd()
|
||||
public double getPAtkSpd()
|
||||
{
|
||||
float bonusAtk = 1;
|
||||
if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
|
||||
{
|
||||
bonusAtk = Config.L2JMOD_CHAMPION_SPD_ATK;
|
||||
}
|
||||
int val = (int) Math.round(calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().getBasePAtkSpd() * bonusAtk, null, null));
|
||||
return val;
|
||||
return Math.round(calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().getBasePAtkSpd() * bonusAtk, null, null));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -643,9 +643,9 @@ public class PcStat extends PlayableStat
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPAtkSpd()
|
||||
public double getPAtkSpd()
|
||||
{
|
||||
int val = super.getPAtkSpd();
|
||||
double val = super.getPAtkSpd();
|
||||
|
||||
if ((val > Config.MAX_PATK_SPEED) && !getActiveChar().canOverrideCond(PcCondOverride.MAX_STATS_VALUE))
|
||||
{
|
||||
|
@ -191,9 +191,9 @@ public class PetStat extends SummonStat
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPAtkSpd()
|
||||
public double getPAtkSpd()
|
||||
{
|
||||
int val = super.getPAtkSpd();
|
||||
double val = super.getPAtkSpd();
|
||||
if (getActiveChar().isHungry())
|
||||
{
|
||||
val = val / 2;
|
||||
|
@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J Server
|
||||
*
|
||||
* This file is part of L2J Server.
|
||||
*
|
||||
* L2J Server is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J Server is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.gameserver.model.actor.tasks.character;
|
||||
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
|
||||
/**
|
||||
* Task dedicated to use potion of character
|
||||
* @author xban1x
|
||||
*/
|
||||
public final class UsePotionTask implements Runnable
|
||||
{
|
||||
private final L2Character _character;
|
||||
private final Skill _skill;
|
||||
|
||||
public UsePotionTask(L2Character character, Skill skill)
|
||||
{
|
||||
_character = character;
|
||||
_skill = skill;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (_character != null)
|
||||
{
|
||||
_character.doSimultaneousCast(_skill);
|
||||
}
|
||||
}
|
||||
}
|
@ -34,26 +34,19 @@ import com.l2jserver.gameserver.util.Util;
|
||||
*/
|
||||
public class ConditionPlayerCanTakeCastle extends Condition
|
||||
{
|
||||
private final boolean _val;
|
||||
|
||||
public ConditionPlayerCanTakeCastle(boolean val)
|
||||
{
|
||||
_val = val;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item)
|
||||
{
|
||||
if ((effector == null) || !effector.isPlayer())
|
||||
{
|
||||
return !_val;
|
||||
return false;
|
||||
}
|
||||
|
||||
final L2PcInstance player = effector.getActingPlayer();
|
||||
boolean canTakeCastle = true;
|
||||
|
||||
if (player.isAlikeDead() || player.isCursedWeaponEquipped() || !player.isClanLeader())
|
||||
{
|
||||
canTakeCastle = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
Castle castle = CastleManager.getInstance().getCastle(player);
|
||||
@ -63,18 +56,19 @@ public class ConditionPlayerCanTakeCastle extends Condition
|
||||
sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS);
|
||||
sm.addSkillName(skill);
|
||||
player.sendPacket(sm);
|
||||
canTakeCastle = false;
|
||||
return false;
|
||||
}
|
||||
else if (!castle.getArtefacts().contains(effected))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.INVALID_TARGET);
|
||||
canTakeCastle = false;
|
||||
return false;
|
||||
}
|
||||
else if (!Util.checkIfInRange(skill.getCastRange(), player, effected, true))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
|
||||
canTakeCastle = false;
|
||||
return false;
|
||||
}
|
||||
return (_val == canTakeCastle);
|
||||
castle.getSiege().announceToPlayer(SystemMessage.getSystemMessage(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED), false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -18,54 +18,32 @@
|
||||
*/
|
||||
package com.l2jserver.gameserver.model.conditions;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.model.actor.L2Summon;
|
||||
import com.l2jserver.gameserver.model.items.L2Item;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* The Class ConditionPlayerServitorNpcId.
|
||||
* The Class ConditionPlayerHasServitor.
|
||||
* @author Zealar
|
||||
*/
|
||||
public class ConditionPlayerServitorNpcId extends Condition
|
||||
public class ConditionPlayerHasServitor extends Condition
|
||||
{
|
||||
private final List<Integer> _npcIds;
|
||||
|
||||
/**
|
||||
* Instantiates a new condition player servitor npc id.
|
||||
* @param npcIds the npc ids
|
||||
*/
|
||||
public ConditionPlayerServitorNpcId(List<Integer> npcIds)
|
||||
{
|
||||
if ((npcIds.size() == 1) && (npcIds.get(0) == 0))
|
||||
{
|
||||
_npcIds = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
_npcIds = npcIds;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item)
|
||||
{
|
||||
if ((effector.getActingPlayer() == null) || !effector.getActingPlayer().hasSummon())
|
||||
if ((effector.getActingPlayer() == null))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (_npcIds == null)
|
||||
|
||||
if (!effector.getActingPlayer().hasSummon())
|
||||
{
|
||||
return true;
|
||||
effector.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_BECAUSE_THE_SERVITOR_HAS_NOT_BEEN_SUMMONED);
|
||||
return false;
|
||||
}
|
||||
for (L2Summon summon : effector.getServitors().values())
|
||||
{
|
||||
if (_npcIds.contains(summon.getId()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -340,8 +340,8 @@ public final class Skill implements IIdentifiable
|
||||
|
||||
_nextActionIsAttack = set.getBoolean("nextActionAttack", false);
|
||||
|
||||
_removedOnAnyActionExceptMove = set.getBoolean("removedOnAnyActionExceptMove", false);
|
||||
_removedOnDamage = set.getBoolean("removedOnDamage", false);
|
||||
_removedOnAnyActionExceptMove = (_abnormalType == AbnormalType.INVINCIBILITY) || (_abnormalType == AbnormalType.HIDE);
|
||||
_removedOnDamage = (_abnormalType == AbnormalType.SLEEP) || (_abnormalType == AbnormalType.FORCE_MEDITATION) || (_abnormalType == AbnormalType.HIDE);
|
||||
|
||||
_blockedInOlympiad = set.getBoolean("blockedInOlympiad", false);
|
||||
|
||||
@ -1400,7 +1400,7 @@ public final class Skill implements IIdentifiable
|
||||
}
|
||||
|
||||
// Support for buff sharing feature including healing herbs.
|
||||
if (effected.isPlayer() && effected.hasServitors() && !isTransformation())
|
||||
if (effected.isPlayer() && effected.hasServitors() && !isTransformation() && (getAbnormalType() != AbnormalType.SUMMON_CONDITION))
|
||||
{
|
||||
if ((addContinuousEffects && isContinuous() && !isDebuff()) || isRecoveryHerb())
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ public class SkillChannelizer implements Runnable
|
||||
}
|
||||
|
||||
// Cancel the task and unset it.
|
||||
_task.cancel(false);
|
||||
_task.cancel(true);
|
||||
_task = null;
|
||||
|
||||
// Cancel target channelization and unset it.
|
||||
@ -126,7 +126,10 @@ public class SkillChannelizer implements Runnable
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_skill == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
if (_skill.getMpPerChanneling() > 0)
|
||||
|
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2015 L2J Server
|
||||
*
|
||||
* This file is part of L2J Server.
|
||||
*
|
||||
* L2J Server is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* L2J Server is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.gameserver.model.stats.functions;
|
||||
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.model.actor.L2Summon;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.conditions.Condition;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
import com.l2jserver.gameserver.model.stats.Stats;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class FuncShare extends AbstractFunction
|
||||
{
|
||||
public FuncShare(Stats stat, int order, Object owner, double value, Condition applayCond)
|
||||
{
|
||||
super(stat, order, owner, value, applayCond);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double calc(L2Character effector, L2Character effected, Skill skill, double initVal)
|
||||
{
|
||||
if ((getApplayCond() == null) || getApplayCond().test(effector, effected, skill))
|
||||
{
|
||||
if ((effector != null) && effector.isServitor())
|
||||
{
|
||||
final L2Summon summon = (L2Summon) effector;
|
||||
final L2PcInstance player = summon.getOwner();
|
||||
if (player != null)
|
||||
{
|
||||
return initVal + (getBaseValue(getStat(), player) * getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
return initVal;
|
||||
}
|
||||
|
||||
public static double getBaseValue(Stats stat, L2PcInstance player)
|
||||
{
|
||||
switch (stat)
|
||||
{
|
||||
case MAX_HP:
|
||||
{
|
||||
return player.getMaxHp();
|
||||
}
|
||||
case MAX_MP:
|
||||
{
|
||||
return player.getMaxMp();
|
||||
}
|
||||
case POWER_ATTACK:
|
||||
{
|
||||
return player.getPAtk(null);
|
||||
}
|
||||
case MAGIC_ATTACK:
|
||||
{
|
||||
return player.getMAtk(null, null);
|
||||
}
|
||||
case POWER_DEFENCE:
|
||||
{
|
||||
return player.getPDef(null);
|
||||
}
|
||||
case MAGIC_DEFENCE:
|
||||
{
|
||||
return player.getMDef(null, null);
|
||||
}
|
||||
case CRITICAL_RATE:
|
||||
{
|
||||
return player.getCriticalHit(null, null);
|
||||
}
|
||||
case POWER_ATTACK_SPEED:
|
||||
{
|
||||
return player.getPAtkSpd();
|
||||
}
|
||||
case MAGIC_ATTACK_SPEED:
|
||||
{
|
||||
return player.getMAtkSpd();
|
||||
}
|
||||
default:
|
||||
{
|
||||
return player.calcStat(stat, 0, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user