Sync with L2jServer HighFive Sep 18th 2015.

This commit is contained in:
MobiusDev
2015-09-19 22:37:08 +00:00
parent 339cab601b
commit a2d764aaf8
134 changed files with 1440 additions and 1014 deletions

View File

@ -1350,6 +1350,11 @@ public final class CharEffectList
continue;
}
if (bi.getSkill().getAbnormalType() == AbnormalType.SUMMON_CONDITION)
{
continue;
}
stopAndRemove(bi, effects);
buffsToRemove--;

View File

@ -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();
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}

View File

@ -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));
}
}

View File

@ -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()

View File

@ -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));
}
/**

View File

@ -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))
{

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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())
{

View File

@ -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)

View File

@ -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);
}
}
}
}