Sync with L2jServer HighFive Sep 18th 2015.
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
@@ -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;
|
||||
|
@@ -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":
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
||||
|
@@ -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))
|
||||
|
@@ -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));
|
||||
|
@@ -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))
|
||||
|
@@ -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
|
||||
|
@@ -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))
|
||||
|
@@ -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());
|
||||
|
Reference in New Issue
Block a user