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

@@ -375,8 +375,7 @@ public class GeoData
// check if the position has geodata
if (hasGeoPos(curX, curY))
{
int beeCurGeoZ = getNearestZ(curX, curY, beeCurZ);
int nswe = GeoUtils.computeNswe(prevX, prevY, curX, curY);// .computeDirection(prevX, prevY, curX, curY);
int nswe = GeoUtils.computeNswe(prevX, prevY, curX, curY);
curGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, curX, curY, nswe);
int maxHeight;
if (ptIndex < ELEVATED_SEE_OVER_DISTANCE)
@@ -389,7 +388,7 @@ public class GeoData
}
boolean canSeeThrough = false;
if ((curGeoZ <= maxHeight) && (curGeoZ <= beeCurGeoZ))
if (curGeoZ <= maxHeight)
{
if ((nswe & Cell.NSWE_NORTH_EAST) == Cell.NSWE_NORTH_EAST)
{

View File

@@ -75,13 +75,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
*/
public static class FearTask implements Runnable
{
private final L2Character _effected;
private final L2AttackableAI _ai;
private final L2Character _effector;
private boolean _start;
public FearTask(L2Character effected, L2Character effector, boolean start)
public FearTask(L2AttackableAI ai, L2Character effector, boolean start)
{
_effected = effected;
_ai = ai;
_effector = effector;
_start = start;
}
@@ -89,9 +89,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
@Override
public void run()
{
final int fearTimeLeft = ((L2AttackableAI) _effected.getAI()).getFearTime() - FEAR_TICKS;
((L2AttackableAI) _effected.getAI()).setFearTime(fearTimeLeft);
_effected.getAI().onEvtAfraid(_effector, _start);
final int fearTimeLeft = _ai.getFearTime() - FEAR_TICKS;
_ai.setFearTime(fearTimeLeft);
_ai.onEvtAfraid(_effector, _start);
_start = false;
}
}
@@ -422,14 +422,14 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
{
if ((_fearTime > 0) && (_fearTask == null))
{
_fearTask = ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new FearTask(_actor, effector, start), 0, FEAR_TICKS, TimeUnit.SECONDS);
_fearTask = ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new FearTask(this, effector, start), 0, FEAR_TICKS, TimeUnit.SECONDS);
_actor.startAbnormalVisualEffect(AbnormalVisualEffect.TURN_FLEE);
}
else
{
super.onEvtAfraid(effector, start);
if ((_fearTime <= 0) && (_fearTask != null))
if ((_actor.isDead() || (_fearTime <= 0)) && (_fearTask != null))
{
_fearTask.cancel(true);
_fearTask = null;

View File

@@ -81,6 +81,7 @@ import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasClanHall;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasFort;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasFreeSummonPoints;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasPet;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasServitor;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerHp;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerImmobile;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerInsideZoneId;
@@ -98,7 +99,6 @@ import com.l2jserver.gameserver.model.conditions.ConditionPlayerPkCount;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerPledgeClass;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerRace;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerRangeFromNpc;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerServitorNpcId;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerSex;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerSiegeSide;
import com.l2jserver.gameserver.model.conditions.ConditionPlayerSouls;
@@ -794,16 +794,9 @@ public abstract class DocumentBase
cond = joinAnd(cond, new ConditionPlayerHasPet(array));
break;
}
case "servitornpcid":
case "hasservitor":
{
StringTokenizer st = new StringTokenizer(a.getNodeValue(), ",");
ArrayList<Integer> array = new ArrayList<>(st.countTokens());
while (st.hasMoreTokens())
{
String item = st.nextToken().trim();
array.add(Integer.decode(getValue(item, null)));
}
cond = joinAnd(cond, new ConditionPlayerServitorNpcId(array));
cond = joinAnd(cond, new ConditionPlayerHasServitor());
break;
}
case "npcidradius":
@@ -875,7 +868,7 @@ public abstract class DocumentBase
}
case "cantakecastle":
{
cond = joinAnd(cond, new ConditionPlayerCanTakeCastle(Boolean.parseBoolean(a.getNodeValue())));
cond = joinAnd(cond, new ConditionPlayerCanTakeCastle());
break;
}
case "cantakefort":

View File

@@ -64,7 +64,7 @@ import com.l2jserver.util.Rnd;
*/
public final class FourSepulchersManager
{
private static final Logger _log = Logger.getLogger(FourSepulchersManager.class.getName());
private static final Logger LOG = Logger.getLogger(FourSepulchersManager.class.getName());
private static final int QUEST_ID = 620;
@@ -207,25 +207,25 @@ public final class FourSepulchersManager
{
clean();
_changeEntryTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(new FourSepulchersChangeEntryTimeTask(), 0);
_log.info(getClass().getSimpleName() + ": Beginning in Entry time");
LOG.info(getClass().getSimpleName() + ": Beginning in Entry time");
}
else if ((currentTime >= _entryTimeEnd) && (currentTime < _warmUpTimeEnd)) // warmup time check
{
clean();
_changeWarmUpTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(new FourSepulchersChangeWarmUpTimeTask(), 0);
_log.info(getClass().getSimpleName() + ": Beginning in WarmUp time");
LOG.info(getClass().getSimpleName() + ": Beginning in WarmUp time");
}
else if ((currentTime >= _warmUpTimeEnd) && (currentTime < _attackTimeEnd)) // attack time check
{
clean();
_changeAttackTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(new FourSepulchersChangeAttackTimeTask(), 0);
_log.info(getClass().getSimpleName() + ": Beginning in Attack time");
LOG.info(getClass().getSimpleName() + ": Beginning in Attack time");
}
else
// else cooldown time and without cleanup because it's already implemented
{
_changeCoolDownTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(new FourSepulchersChangeCoolDownTimeTask(), 0);
_log.info(getClass().getSimpleName() + ": Beginning in Cooldown time");
LOG.info(getClass().getSimpleName() + ": Beginning in Cooldown time");
}
}
@@ -248,6 +248,11 @@ public final class FourSepulchersManager
{
for (int i = 31921; i < 31925; i++)
{
if (!_startHallSpawns.containsKey(i))
{
LOG.warning("[" + i + "] is not inside " + _startHallSpawns);
continue;
}
int[] Location = _startHallSpawns.get(i);
GrandBossManager.getInstance().getZone(Location[0], Location[1], Location[2]).oustAllPlayers();
}
@@ -310,11 +315,11 @@ public final class FourSepulchersManager
SpawnTable.getInstance().addNewSpawn(spawnDat, false);
spawnDat.doSpawn();
spawnDat.startRespawn();
_log.info(getClass().getSimpleName() + ": spawned " + spawnDat.getTemplate().getName());
LOG.info(getClass().getSimpleName() + ": spawned " + spawnDat.getTemplate().getName());
}
catch (Exception e)
{
_log.log(Level.WARNING, "Error while spawning managers: " + e.getMessage(), e);
LOG.log(Level.WARNING, "Error while spawning managers: " + e.getMessage(), e);
}
}
}
@@ -426,12 +431,12 @@ public final class FourSepulchersManager
_mysteriousBoxSpawns.put(keyNpcId, spawnDat);
}
}
_log.info(getClass().getSimpleName() + ": loaded " + _mysteriousBoxSpawns.size() + " Mysterious-Box spawns.");
LOG.info(getClass().getSimpleName() + ": loaded " + _mysteriousBoxSpawns.size() + " Mysterious-Box spawns.");
}
catch (Exception e)
{
// problem with initializing spawn, go to next one
_log.log(Level.WARNING, "FourSepulchersManager.LoadMysteriousBox: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.LoadMysteriousBox: Spawn could not be initialized: " + e.getMessage(), e);
}
}
@@ -453,7 +458,7 @@ public final class FourSepulchersManager
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.InitKeyBoxSpawns: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.InitKeyBoxSpawns: Spawn could not be initialized: " + e.getMessage(), e);
}
}
}
@@ -497,11 +502,11 @@ public final class FourSepulchersManager
_physicalMonsters.put(keyNpcId, _physicalSpawns);
}
}
_log.info(getClass().getSimpleName() + ": loaded " + loaded + " Physical type monsters spawns.");
LOG.info(getClass().getSimpleName() + ": loaded " + loaded + " Physical type monsters spawns.");
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.LoadPhysicalMonsters: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.LoadPhysicalMonsters: Spawn could not be initialized: " + e.getMessage(), e);
}
}
@@ -545,11 +550,11 @@ public final class FourSepulchersManager
_magicalMonsters.put(keyNpcId, _magicalSpawns);
}
}
_log.info(getClass().getSimpleName() + ": loaded " + loaded + " Magical type monsters spawns.");
LOG.info(getClass().getSimpleName() + ": loaded " + loaded + " Magical type monsters spawns.");
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.LoadMagicalMonsters: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.LoadMagicalMonsters: Spawn could not be initialized: " + e.getMessage(), e);
}
}
@@ -597,11 +602,11 @@ public final class FourSepulchersManager
_archonSpawned.put(keyNpcId, false);
}
}
_log.info(getClass().getSimpleName() + ": loaded " + loaded + " Church of duke monsters spawns.");
LOG.info(getClass().getSimpleName() + ": loaded " + loaded + " Church of duke monsters spawns.");
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.LoadDukeMonsters: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.LoadDukeMonsters: Spawn could not be initialized: " + e.getMessage(), e);
}
}
@@ -645,11 +650,11 @@ public final class FourSepulchersManager
_emperorsGraveNpcs.put(keyNpcId, _emperorsGraveSpawns);
}
}
_log.info(getClass().getSimpleName() + ": loaded " + loaded + " Emperor's grave NPC spawns.");
LOG.info(getClass().getSimpleName() + ": loaded " + loaded + " Emperor's grave NPC spawns.");
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.LoadEmperorsGraveMonsters: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.LoadEmperorsGraveMonsters: Spawn could not be initialized: " + e.getMessage(), e);
}
}
@@ -681,7 +686,7 @@ public final class FourSepulchersManager
}
catch (Exception e)
{
_log.log(Level.SEVERE, "Error on InitLocationShadowSpawns", e);
LOG.log(Level.SEVERE, "Error on InitLocationShadowSpawns", e);
}
}
}
@@ -704,7 +709,7 @@ public final class FourSepulchersManager
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.InitExecutionerSpawns: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.InitExecutionerSpawns: Spawn could not be initialized: " + e.getMessage(), e);
}
}
}
@@ -839,7 +844,7 @@ public final class FourSepulchersManager
Quest hostQuest = QuestManager.getInstance().getQuest(QUEST_ID);
if (hostQuest == null)
{
_log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't find quest: " + QUEST_ID);
LOG.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't find quest: " + QUEST_ID);
return;
}
int npcId = npc.getId();
@@ -855,7 +860,7 @@ public final class FourSepulchersManager
default:
if (!player.isGM())
{
_log.warning("Player " + player.getName() + "(" + player.getObjectId() + ") tried to cheat in four sepulchers.");
LOG.warning("Player " + player.getName() + "(" + player.getObjectId() + ") tried to cheat in four sepulchers.");
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " tried to enter four sepulchers with invalid npc id.", Config.DEFAULT_PUNISH);
}
return;
@@ -1138,7 +1143,7 @@ public final class FourSepulchersManager
}
catch (Exception e)
{
_log.log(Level.WARNING, "FourSepulchersManager.SpawnMonster: Spawn could not be initialized: " + e.getMessage(), e);
LOG.log(Level.WARNING, "FourSepulchersManager.SpawnMonster: Spawn could not be initialized: " + e.getMessage(), e);
}
spawnedKeyBoxMob = true;
@@ -1373,7 +1378,7 @@ public final class FourSepulchersManager
}
catch (Exception e)
{
_log.log(Level.SEVERE, getClass().getSimpleName() + ": Failed deleting mob.", e);
LOG.log(Level.SEVERE, getClass().getSimpleName() + ": Failed deleting mob.", e);
}
}
_allMobs.clear();
@@ -1392,19 +1397,19 @@ public final class FourSepulchersManager
}
else
{
_log.warning(getClass().getSimpleName() + ": Attempted to close undefined door. doorId: " + doorId);
LOG.warning(getClass().getSimpleName() + ": Attempted to close undefined door. doorId: " + doorId);
}
}
catch (Exception e)
{
_log.log(Level.SEVERE, getClass().getSimpleName() + ": Failed closing door", e);
LOG.log(Level.SEVERE, getClass().getSimpleName() + ": Failed closing door", e);
}
}
}
protected byte minuteSelect(byte min)
{
if (((double) min % 5) != 0)// if doesn't divides on 5 fully
if (((double) min % 5) != 0) // if doesn't divides on 5 fully
{
// mad table for selecting proper minutes...
// may be there is a better way to do this
@@ -1502,12 +1507,12 @@ public final class FourSepulchersManager
{
if (temp == null)
{
_log.warning(getClass().getSimpleName() + ": managerSay(): manager is null");
LOG.warning(getClass().getSimpleName() + ": managerSay(): manager is null");
continue;
}
if (!(temp.getLastSpawn() instanceof L2SepulcherNpcInstance))
{
_log.warning(getClass().getSimpleName() + ": managerSay(): manager is not Sepulcher instance");
LOG.warning(getClass().getSimpleName() + ": managerSay(): manager is not Sepulcher instance");
continue;
}
// hall not used right now, so its manager will not tell you anything :)
@@ -1529,12 +1534,12 @@ public final class FourSepulchersManager
{
if (temp == null)
{
_log.warning(getClass().getSimpleName() + ": Something goes wrong in managerSay()...");
LOG.warning(getClass().getSimpleName() + ": Something goes wrong in managerSay()...");
continue;
}
if (!(temp.getLastSpawn() instanceof L2SepulcherNpcInstance))
{
_log.warning(getClass().getSimpleName() + ": Something goes wrong in managerSay()...");
LOG.warning(getClass().getSimpleName() + ": Something goes wrong in managerSay()...");
continue;
}
((L2SepulcherNpcInstance) temp.getLastSpawn()).sayInShout(msg1);

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

View File

@@ -45,7 +45,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
_z = cha.getZ();
_heading = cha.getHeading();
_mAtkSpd = cha.getMAtkSpd();
_pAtkSpd = cha.getPAtkSpd();
_pAtkSpd = (int) cha.getPAtkSpd();
_moveMultiplier = cha.getMovementSpeedMultiplier();
_runSpd = (int) Math.round(cha.getRunSpeed() / _moveMultiplier);
_walkSpd = (int) Math.round(cha.getWalkSpeed() / _moveMultiplier);

View File

@@ -83,7 +83,7 @@ public class CharInfo extends L2GameServerPacket
}
_heading = _activeChar.getHeading();
_mAtkSpd = _activeChar.getMAtkSpd();
_pAtkSpd = _activeChar.getPAtkSpd();
_pAtkSpd = (int) _activeChar.getPAtkSpd();
_attackSpeedMultiplier = _activeChar.getAttackSpeedMultiplier();
setInvisible(cha.isInvisible());

View File

@@ -265,7 +265,7 @@ public class ExPetInfo extends AbstractMaskPacket<NpcInfoType>
}
if (containsMask(NpcInfoType.ATK_CAST_SPEED))
{
writeD(_summon.getPAtkSpd());
writeD((int) _summon.getPAtkSpd());
writeD(_summon.getMAtkSpd());
}
if (containsMask(NpcInfoType.SPEED_MULTIPLIER))

View File

@@ -98,7 +98,7 @@ public class GMViewCharacterInfo extends L2GameServerPacket
writeD(0x00);
writeH(0x00);
writeD((int) _activeChar.getPAtk(null));
writeD(_activeChar.getPAtkSpd());
writeD((int) _activeChar.getPAtkSpd());
writeD((int) _activeChar.getPDef(null));
writeD(_activeChar.getEvasionRate(null));
writeD(_activeChar.getAccuracy());
@@ -106,7 +106,7 @@ public class GMViewCharacterInfo extends L2GameServerPacket
writeD((int) _activeChar.getMAtk(null, null));
writeD(_activeChar.getMAtkSpd());
writeD(_activeChar.getPAtkSpd());
writeD((int) _activeChar.getPAtkSpd());
writeD((int) _activeChar.getMDef(null, null));
writeD(_activeChar.getMagicEvasionRate(null));

View File

@@ -278,7 +278,7 @@ public class NpcInfo extends AbstractMaskPacket<NpcInfoType>
}
if (containsMask(NpcInfoType.ATK_CAST_SPEED))
{
writeD(_npc.getPAtkSpd());
writeD((int) _npc.getPAtkSpd());
writeD(_npc.getMAtkSpd());
}
if (containsMask(NpcInfoType.SPEED_MULTIPLIER))

View File

@@ -93,7 +93,7 @@ public class PetInfo extends L2GameServerPacket
writeD(_summon.getHeading());
writeD(_summon.getStat().getMAtkSpd());
writeD(_summon.getStat().getPAtkSpd());
writeD((int) _summon.getStat().getPAtkSpd());
writeH(_runSpd);
writeH(_walkSpd);
@@ -164,7 +164,7 @@ public class PetInfo extends L2GameServerPacket
writeD(_summon.getMagicEvasionRate(null)); // magic evasion
writeD(_summon.getMCriticalHit(null, null)); // mcritical
writeD((int) _summon.getStat().getMoveSpeed());// speed
writeD(_summon.getPAtkSpd());// atkspeed
writeD((int) _summon.getPAtkSpd());// atkspeed
writeD(_summon.getMAtkSpd());// casting speed
writeC(0); // TODO: Check me, might be ride status

View File

@@ -264,7 +264,7 @@ public class SummonInfo extends AbstractMaskPacket<NpcInfoType>
}
if (containsMask(NpcInfoType.ATK_CAST_SPEED))
{
writeD(_summon.getPAtkSpd());
writeD((int) _summon.getPAtkSpd());
writeD(_summon.getMAtkSpd());
}
if (containsMask(NpcInfoType.SPEED_MULTIPLIER))

View File

@@ -215,14 +215,14 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
writeH(56);
writeH(_activeChar.getActiveWeaponItem() != null ? 40 : 20);
writeD((int) _activeChar.getPAtk(null));
writeD(_activeChar.getPAtkSpd());
writeD((int) _activeChar.getPAtkSpd());
writeD((int) _activeChar.getPDef(null));
writeD(_activeChar.getEvasionRate(null));
writeD(_activeChar.getAccuracy());
writeD(_activeChar.getCriticalHit(null, null));
writeD((int) _activeChar.getMAtk(null, null));
writeD(_activeChar.getMAtkSpd());
writeD(_activeChar.getPAtkSpd()); // Seems like atk speed - 1
writeD((int) _activeChar.getPAtkSpd()); // Seems like atk speed - 1
writeD(_activeChar.getMagicEvasionRate(null));
writeD((int) _activeChar.getMDef(null, null));
writeD(_activeChar.getMagicAccuracy());