Sync with L2jServer HighFive Nov 14th 2015.

This commit is contained in:
MobiusDev
2015-11-14 16:31:37 +00:00
parent 887fbcc6b5
commit e38353e409
125 changed files with 1998 additions and 1419 deletions

View File

@@ -36,7 +36,6 @@ import com.l2jserver.gameserver.GameTimeController;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.datatables.ItemTable;
import com.l2jserver.gameserver.enums.PartyDistributionType;
import com.l2jserver.gameserver.instancemanager.DuelManager;
import com.l2jserver.gameserver.instancemanager.PcCafePointsManager;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Character;
@@ -485,11 +484,6 @@ public class L2Party extends AbstractPlayerGroup
getMembers().remove(player);
recalculatePartyLevel();
if (player.isInDuel())
{
DuelManager.getInstance().onRemoveFromParty(player);
}
try
{
// Channeling a player!
@@ -564,10 +558,6 @@ public class L2Party extends AbstractPlayerGroup
if (getLeader() != null)
{
getLeader().setParty(null);
if (getLeader().isInDuel())
{
DuelManager.getInstance().onRemoveFromParty(getLeader());
}
}
if (_changeDistributionTypeRequestTask != null)
{

View File

@@ -2973,7 +2973,27 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
@Override
public boolean isInvul()
{
return _isInvul || _isTeleporting || isAffected(EffectFlag.INVUL);
return _isInvul || _isTeleporting;
}
public boolean isHpBlocked()
{
return isAffected(EffectFlag.BLOCK_HP);
}
public boolean isMpBlocked()
{
return isAffected(EffectFlag.BLOCK_MP);
}
public boolean isBuffBlocked()
{
return isAffected(EffectFlag.BLOCK_BUFF);
}
public boolean isDebuffBlocked()
{
return isAffected(EffectFlag.BLOCK_DEBUFF);
}
public void setIsMortal(boolean b)

View File

@@ -338,8 +338,8 @@ public final class L2CubicInstance implements IIdentifiable
// Duel targeting
if (_owner.isInDuel())
{
L2PcInstance PlayerA = DuelManager.getInstance().getDuel(_owner.getDuelId()).getPlayerA();
L2PcInstance PlayerB = DuelManager.getInstance().getDuel(_owner.getDuelId()).getPlayerB();
L2PcInstance PlayerA = DuelManager.getInstance().getDuel(_owner.getDuelId()).getTeamLeaderA();
L2PcInstance PlayerB = DuelManager.getInstance().getDuel(_owner.getDuelId()).getTeamLeaderB();
if (DuelManager.getInstance().getDuel(_owner.getDuelId()).isPartyDuel())
{

View File

@@ -83,6 +83,7 @@ import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.enums.CastleSide;
import com.l2jserver.gameserver.enums.CategoryType;
import com.l2jserver.gameserver.enums.ChatType;
import com.l2jserver.gameserver.enums.DuelState;
import com.l2jserver.gameserver.enums.HtmlActionScope;
import com.l2jserver.gameserver.enums.IllegalActionPunishmentType;
import com.l2jserver.gameserver.enums.InstanceType;
@@ -500,10 +501,8 @@ public final class L2PcInstance extends L2Playable
private int _olyBuffsCount = 0;
/** Duel */
private boolean _isInDuel = false;
private int _duelState = Duel.DUELSTATE_NODUEL;
private DuelState _duelState = DuelState.NO_DUEL;
private int _duelId = 0;
private SystemMessageId _noDuelReason = SystemMessageId.THERE_IS_NO_OPPONENT_TO_RECEIVE_YOUR_CHALLENGE_FOR_A_DUEL;
/** Boat and AirShip */
private L2Vehicle _vehicle = null;
@@ -4756,6 +4755,14 @@ public final class L2PcInstance extends L2Playable
@Override
public void doCast(Skill skill)
{
if (getCurrentSkill() != null)
{
if (!checkUseMagicConditions(skill, getCurrentSkill().isCtrlPressed(), getCurrentSkill().isShiftPressed()))
{
setIsCastingNow(false);
return;
}
}
super.doCast(skill);
setRecentFakeDeath(false);
}
@@ -6721,7 +6728,7 @@ public final class L2PcInstance extends L2Playable
@Override
public boolean isInvul()
{
return super.isInvul() || (_teleportProtectEndTime > GameTimeController.getInstance().getGameTicks());
return super.isInvul() || _isTeleporting;
}
/**
@@ -8638,8 +8645,17 @@ public final class L2PcInstance extends L2Playable
}
// is AutoAttackable if both players are in the same duel and the duel is still going on
if (attacker.isPlayable() && (getDuelState() == Duel.DUELSTATE_DUELLING) && (getDuelId() == attacker.getActingPlayer().getDuelId()))
if (attacker.isPlayable() && (getDuelState() == DuelState.DUELLING) && (getDuelId() == attacker.getActingPlayer().getDuelId()))
{
Duel duel = DuelManager.getInstance().getDuel(getDuelId());
if (duel.getTeamA().contains(this) && duel.getTeamA().contains(attacker))
{
return false;
}
else if (duel.getTeamB().contains(this) && duel.getTeamB().contains(attacker))
{
return false;
}
return true;
}
@@ -8814,12 +8830,6 @@ public final class L2PcInstance extends L2Playable
setQueuedSkill(null, false, false);
}
if (!checkUseMagicConditions(skill, forceUse, dontMove))
{
setIsCastingNow(false);
return false;
}
// Check if the target is correct and Notify the AI with AI_INTENTION_CAST and target
L2Object target = null;
switch (skill.getTargetType())
@@ -10181,7 +10191,7 @@ public final class L2PcInstance extends L2Playable
@Override
public boolean isInDuel()
{
return _isInDuel;
return _duelState != DuelState.NO_DUEL;
}
@Override
@@ -10190,12 +10200,12 @@ public final class L2PcInstance extends L2Playable
return _duelId;
}
public void setDuelState(int mode)
public void setDuelState(DuelState mode)
{
_duelState = mode;
}
public int getDuelState()
public DuelState getDuelState()
{
return _duelState;
}
@@ -10208,90 +10218,21 @@ public final class L2PcInstance extends L2Playable
{
if (duelId > 0)
{
_isInDuel = true;
_duelState = Duel.DUELSTATE_DUELLING;
_duelState = DuelState.DUELLING;
_duelId = duelId;
}
else
{
if (_duelState == Duel.DUELSTATE_DEAD)
if (_duelState == DuelState.DEAD)
{
enableAllSkills();
getStatus().startHpMpRegeneration();
}
_isInDuel = false;
_duelState = Duel.DUELSTATE_NODUEL;
_duelState = DuelState.NO_DUEL;
_duelId = 0;
}
}
/**
* This returns a SystemMessage stating why the player is not available for duelling.
* @return S1_CANNOT_DUEL... message
*/
public SystemMessage getNoDuelReason()
{
SystemMessage sm = SystemMessage.getSystemMessage(_noDuelReason);
sm.addPcName(this);
_noDuelReason = SystemMessageId.THERE_IS_NO_OPPONENT_TO_RECEIVE_YOUR_CHALLENGE_FOR_A_DUEL;
return sm;
}
/**
* Checks if this player might join / start a duel.<br>
* To get the reason use getNoDuelReason() after calling this function.
* @return true if the player might join/start a duel.
*/
public boolean canDuel()
{
if (isInCombat() || isJailed())
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_ENGAGED_IN_BATTLE;
return false;
}
if (isDead() || isAlikeDead() || ((getCurrentHp() < (getMaxHp() / 2)) || (getCurrentMp() < (getMaxMp() / 2))))
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_S_HP_OR_MP_IS_BELOW_50;
return false;
}
if (isInDuel())
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_ALREADY_ENGAGED_IN_A_DUEL;
return false;
}
if (isInOlympiadMode())
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_PARTICIPATING_IN_THE_OLYMPIAD_OR_THE_CEREMONY_OF_CHAOS;
return false;
}
if (isCursedWeaponEquipped())
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_IN_A_CHAOTIC_OR_PURPLE_STATE;
return false;
}
if (getPrivateStoreType() != PrivateStoreType.NONE)
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_ENGAGED_IN_A_PRIVATE_STORE_OR_MANUFACTURE;
return false;
}
if (isMounted() || isInBoat())
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_RIDING_A_BOAT_FENRIR_OR_STRIDER;
return false;
}
if (isFishing())
{
_noDuelReason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_FISHING;
return false;
}
if (isInsideZone(ZoneId.PVP) || isInsideZone(ZoneId.PEACE) || isInsideZone(ZoneId.SIEGE))
{
_noDuelReason = SystemMessageId.C1_CANNOT_MAKE_A_CHALLENGE_TO_A_DUEL_BECAUSE_C1_IS_CURRENTLY_IN_A_DUEL_PROHIBITED_AREA_PEACEFUL_ZONE_BATTLE_ZONE_NEAR_WATER_RESTART_PROHIBITED_AREA;
return false;
}
return true;
}
public boolean isNoble()
{
return _noble;
@@ -11959,7 +11900,7 @@ public final class L2PcInstance extends L2Playable
if (inst != null)
{
inst.removePlayer(getObjectId());
final Location loc = inst.getSpawnLoc();
final Location loc = inst.getExitLoc();
if (loc != null)
{
final int x = loc.getX() + Rnd.get(-30, 30);
@@ -12997,7 +12938,7 @@ public final class L2PcInstance extends L2Playable
final SystemMessage sm;
if (target.isInvul() && !target.isVulnerableFor(this) && !target.isNpc())
if ((target.isInvul() || target.isHpBlocked()) && !target.isVulnerableFor(this) && !target.isNpc())
{
sm = SystemMessage.getSystemMessage(SystemMessageId.THE_ATTACK_HAS_BEEN_BLOCKED);
}

View File

@@ -184,40 +184,6 @@ public class L2ServitorInstance extends L2Summon implements Runnable
{
}
/**
* Servitors' skills automatically change their level based on the servitor's level.<br>
* Until level 70, the servitor gets 1 lv of skill per 10 levels.<br>
* After that, it is 1 skill level per 5 servitor levels.<br>
* If the resulting skill level doesn't exist use the max that does exist!
*/
@Override
public void doCast(Skill skill)
{
final int petLevel = getLevel();
int skillLevel = petLevel / 10;
if (petLevel >= 70)
{
skillLevel += (petLevel - 65) / 10;
}
// Adjust the level for servitors less than level 1.
if (skillLevel < 1)
{
skillLevel = 1;
}
final Skill skillToCast = SkillData.getInstance().getSkill(skill.getId(), skillLevel);
if (skillToCast != null)
{
super.doCast(skillToCast);
}
else
{
super.doCast(skill);
}
}
@Override
public void setRestoreSummon(boolean val)
{

View File

@@ -86,13 +86,13 @@ public class L2SiegeFlagInstance extends L2Npc
@Override
public boolean canBeAttacked()
{
return !isInvul();
return !(isInvul() || isHpBlocked());
}
@Override
public boolean isAutoAttackable(L2Character attacker)
{
return !isInvul();
return !(isInvul() || isHpBlocked());
}
@Override

View File

@@ -338,7 +338,7 @@ public final class L2TrapInstance extends L2Npc
OlympiadGameManager.getInstance().notifyCompetitorDamage(getOwner(), damage);
}
if (target.isInvul() && !(target instanceof L2NpcInstance))
if ((target.isInvul() || target.isHpBlocked()) && !target.isNpc())
{
_owner.sendPacket(SystemMessageId.THE_ATTACK_HAS_BEEN_BLOCKED);
}

View File

@@ -141,7 +141,7 @@ public class CharStatus
}
// invul handling
if (getActiveChar().isInvul() && !(isDOT || isHPConsumption))
if ((getActiveChar().isInvul() || getActiveChar().isHpBlocked()) && !(isDOT || isHPConsumption))
{
return;
}

View File

@@ -18,10 +18,10 @@
*/
package com.l2jserver.gameserver.model.actor.status;
import com.l2jserver.gameserver.enums.DuelState;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.Duel;
public class NpcStatus extends CharStatus
{
@@ -49,7 +49,7 @@ public class NpcStatus extends CharStatus
final L2PcInstance attackerPlayer = attacker.getActingPlayer();
if ((attackerPlayer != null) && attackerPlayer.isInDuel())
{
attackerPlayer.setDuelState(Duel.DUELSTATE_INTERRUPTED);
attackerPlayer.setDuelState(DuelState.INTERRUPTED);
}
// Add attackers to npc's attacker list

View File

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.model.actor.status;
import com.l2jserver.Config;
import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.enums.DuelState;
import com.l2jserver.gameserver.enums.PrivateStoreType;
import com.l2jserver.gameserver.instancemanager.DuelManager;
import com.l2jserver.gameserver.model.actor.L2Character;
@@ -27,7 +28,6 @@ import com.l2jserver.gameserver.model.actor.L2Playable;
import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.stat.PcStat;
import com.l2jserver.gameserver.model.entity.Duel;
import com.l2jserver.gameserver.model.stats.Formulas;
import com.l2jserver.gameserver.model.stats.Stats;
import com.l2jserver.gameserver.network.SystemMessageId;
@@ -83,7 +83,7 @@ public class PcStatus extends PlayableStatus
return;
}
if (getActiveChar().isInvul() && !getActiveChar().isVulnerableFor(attacker) && !(isDOT || isHPConsumption))
if ((getActiveChar().isInvul() || getActiveChar().isHpBlocked()) && !getActiveChar().isVulnerableFor(attacker) && !(isDOT || isHPConsumption))
{
return;
}
@@ -129,11 +129,11 @@ public class PcStatus extends PlayableStatus
if (getActiveChar().isInDuel())
{
if (getActiveChar().getDuelState() == Duel.DUELSTATE_DEAD)
if (getActiveChar().getDuelState() == DuelState.DEAD)
{
return;
}
else if (getActiveChar().getDuelState() == Duel.DUELSTATE_WINNER)
else if (getActiveChar().getDuelState() == DuelState.WINNER)
{
return;
}
@@ -141,7 +141,7 @@ public class PcStatus extends PlayableStatus
// cancel duel if player got hit by another player, that is not part of the duel
if (attackerPlayer.getDuelId() != getActiveChar().getDuelId())
{
getActiveChar().setDuelState(Duel.DUELSTATE_INTERRUPTED);
getActiveChar().setDuelState(DuelState.INTERRUPTED);
}
}
}
@@ -280,7 +280,10 @@ public class PcStatus extends PlayableStatus
{
attacker.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
attacker.sendPacket(ActionFailed.STATIC_PACKET);
attacker.setTarget(null);
attacker.abortAttack();
}
// let the DuelManager know of his defeat
DuelManager.getInstance().onPlayerDefeat(getActiveChar());
value = 1;

View File

@@ -18,11 +18,11 @@
*/
package com.l2jserver.gameserver.model.actor.status;
import com.l2jserver.gameserver.enums.DuelState;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Playable;
import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.Duel;
import com.l2jserver.gameserver.model.stats.Stats;
import com.l2jserver.gameserver.util.Util;
@@ -50,7 +50,7 @@ public class SummonStatus extends PlayableStatus
final L2PcInstance attackerPlayer = attacker.getActingPlayer();
if ((attackerPlayer != null) && ((getActiveChar().getOwner() == null) || (getActiveChar().getOwner().getDuelId() != attackerPlayer.getDuelId())))
{
attackerPlayer.setDuelState(Duel.DUELSTATE_INTERRUPTED);
attackerPlayer.setDuelState(DuelState.INTERRUPTED);
}
final L2PcInstance caster = getActiveChar().getTransferingDamageTo();

View File

@@ -24,6 +24,10 @@ package com.l2jserver.gameserver.model.effects;
public enum EffectFlag
{
NONE,
BLOCK_BUFF,
BLOCK_DEBUFF,
BLOCK_HP,
BLOCK_MP,
RESURRECTION_SPECIAL,
NOBLESS_BLESSING,
SILENT_MOVE,
@@ -39,7 +43,6 @@ public enum EffectFlag
SLEEP,
STUNNED,
BETRAYED,
INVUL,
PARALYZED,
BLOCK_RESURRECTION,
SERVITOR_SHARE;

View File

@@ -25,6 +25,9 @@ package com.l2jserver.gameserver.model.effects;
public enum L2EffectType
{
AGGRESSION,
BLOCK_BUFF,
BLOCK_DAMAGE,
BLOCK_DEBUFF,
BUFF,
CHARM_OF_LUCK,
CHAT_BLOCK,
@@ -66,5 +69,5 @@ public enum L2EffectType
SUMMON_PET,
SUMMON_NPC,
TELEPORT,
TELEPORT_TO_TARGET,
TELEPORT_TO_TARGET
}

File diff suppressed because it is too large Load Diff

View File

@@ -82,7 +82,9 @@ public final class Instance
private final List<L2Npc> _npcs = new CopyOnWriteArrayList<>();
private final Map<Integer, L2DoorInstance> _doors = new ConcurrentHashMap<>();
private final Map<String, List<L2Spawn>> _manualSpawn = new HashMap<>();
private Location _spawnLoc = null;
// private StartPosType _enterLocationOrder; TODO implement me
private List<Location> _enterLocations = null;
private Location _exitLocation = null;
private boolean _allowSummon = true;
private long _emptyDestroyTime = -1;
private long _lastLeft = -1;
@@ -323,21 +325,38 @@ public final class Instance
return _timerText;
}
/**
* @return the spawn location for this instance to be used when enter in instance
*/
public List<Location> getEnterLocs()
{
return _enterLocations;
}
/**
* Sets the spawn location for this instance to be used when enter in instance
* @param loc
*/
public void addEnterLoc(Location loc)
{
_enterLocations.add(loc);
}
/**
* @return the spawn location for this instance to be used when leaving the instance
*/
public Location getSpawnLoc()
public Location getExitLoc()
{
return _spawnLoc;
return _exitLocation;
}
/**
* Sets the spawn location for this instance to be used when leaving the instance
* @param loc
*/
public void setSpawnLoc(Location loc)
public void setExitLoc(Location loc)
{
_spawnLoc = loc;
_exitLocation = loc;
}
public void removePlayers()
@@ -348,9 +367,9 @@ public final class Instance
if ((player != null) && (player.getInstanceId() == getId()))
{
player.setInstanceId(0);
if (getSpawnLoc() != null)
if (getExitLoc() != null)
{
player.teleToLocation(getSpawnLoc(), true);
player.teleToLocation(getExitLoc(), true);
}
else
{
@@ -477,257 +496,272 @@ public final class Instance
Node first = n.getFirstChild();
for (n = first; n != null; n = n.getNextSibling())
{
if ("activityTime".equalsIgnoreCase(n.getNodeName()))
switch (n.getNodeName().toLowerCase())
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
case "activitytime":
{
_checkTimeUpTask = ThreadPoolManager.getInstance().scheduleGeneral(new CheckTimeUp(Integer.parseInt(a.getNodeValue()) * 60000), 15000);
_instanceEndTime = System.currentTimeMillis() + (Long.parseLong(a.getNodeValue()) * 60000) + 15000;
}
}
// @formatter:off
/*
else if ("timeDelay".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
instance.setTimeDelay(Integer.parseInt(a.getNodeValue()));
}
}
*/
// @formatter:on
else if ("allowSummon".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
setAllowSummon(Boolean.parseBoolean(a.getNodeValue()));
}
}
else if ("emptyDestroyTime".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
_emptyDestroyTime = Long.parseLong(a.getNodeValue()) * 1000;
}
}
else if ("showTimer".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
_showTimer = Boolean.parseBoolean(a.getNodeValue());
}
a = n.getAttributes().getNamedItem("increase");
if (a != null)
{
_isTimerIncrease = Boolean.parseBoolean(a.getNodeValue());
}
a = n.getAttributes().getNamedItem("text");
if (a != null)
{
_timerText = a.getNodeValue();
}
}
else if ("PvPInstance".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
setPvPInstance(Boolean.parseBoolean(a.getNodeValue()));
}
}
else if ("doorlist".equalsIgnoreCase(n.getNodeName()))
{
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
int doorId = 0;
if ("door".equalsIgnoreCase(d.getNodeName()))
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
doorId = Integer.parseInt(d.getAttributes().getNamedItem("doorId").getNodeValue());
StatsSet set = new StatsSet();
set.add(DoorData.getInstance().getDoorTemplate(doorId));
for (Node bean = d.getFirstChild(); bean != null; bean = bean.getNextSibling())
{
if ("set".equalsIgnoreCase(bean.getNodeName()))
{
NamedNodeMap attrs = bean.getAttributes();
String setname = attrs.getNamedItem("name").getNodeValue();
String value = attrs.getNamedItem("val").getNodeValue();
set.set(setname, value);
}
}
addDoor(doorId, set);
_checkTimeUpTask = ThreadPoolManager.getInstance().scheduleGeneral(new CheckTimeUp(Integer.parseInt(a.getNodeValue()) * 60000), 15000);
_instanceEndTime = System.currentTimeMillis() + (Long.parseLong(a.getNodeValue()) * 60000) + 15000;
}
break;
}
}
else if ("spawnlist".equalsIgnoreCase(n.getNodeName()))
{
for (Node group = n.getFirstChild(); group != null; group = group.getNextSibling())
case "allowsummon":
{
if ("group".equalsIgnoreCase(group.getNodeName()))
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
String spawnGroup = group.getAttributes().getNamedItem("name").getNodeValue();
List<L2Spawn> manualSpawn = new ArrayList<>();
for (Node d = group.getFirstChild(); d != null; d = d.getNextSibling())
setAllowSummon(Boolean.parseBoolean(a.getNodeValue()));
}
break;
}
case "emptydestroytime":
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
_emptyDestroyTime = Long.parseLong(a.getNodeValue()) * 1000;
}
break;
}
case "showtimer":
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
_showTimer = Boolean.parseBoolean(a.getNodeValue());
}
a = n.getAttributes().getNamedItem("increase");
if (a != null)
{
_isTimerIncrease = Boolean.parseBoolean(a.getNodeValue());
}
a = n.getAttributes().getNamedItem("text");
if (a != null)
{
_timerText = a.getNodeValue();
}
break;
}
case "pvpinstance":
{
a = n.getAttributes().getNamedItem("val");
if (a != null)
{
setPvPInstance(Boolean.parseBoolean(a.getNodeValue()));
}
break;
}
case "doorlist":
{
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
int doorId = 0;
if ("door".equalsIgnoreCase(d.getNodeName()))
{
int npcId = 0, x = 0, y = 0, z = 0, heading = 0, respawn = 0, respawnRandom = 0, delay = -1;
Boolean allowRandomWalk = null;
if ("spawn".equalsIgnoreCase(d.getNodeName()))
doorId = Integer.parseInt(d.getAttributes().getNamedItem("doorId").getNodeValue());
StatsSet set = new StatsSet();
set.add(DoorData.getInstance().getDoorTemplate(doorId));
for (Node bean = d.getFirstChild(); bean != null; bean = bean.getNextSibling())
{
npcId = Integer.parseInt(d.getAttributes().getNamedItem("npcId").getNodeValue());
x = Integer.parseInt(d.getAttributes().getNamedItem("x").getNodeValue());
y = Integer.parseInt(d.getAttributes().getNamedItem("y").getNodeValue());
z = Integer.parseInt(d.getAttributes().getNamedItem("z").getNodeValue());
heading = Integer.parseInt(d.getAttributes().getNamedItem("heading").getNodeValue());
respawn = Integer.parseInt(d.getAttributes().getNamedItem("respawn").getNodeValue());
if (d.getAttributes().getNamedItem("onKillDelay") != null)
if ("set".equalsIgnoreCase(bean.getNodeName()))
{
delay = Integer.parseInt(d.getAttributes().getNamedItem("onKillDelay").getNodeValue());
NamedNodeMap attrs = bean.getAttributes();
String setname = attrs.getNamedItem("name").getNodeValue();
String value = attrs.getNamedItem("val").getNodeValue();
set.set(setname, value);
}
if (d.getAttributes().getNamedItem("respawnRandom") != null)
}
addDoor(doorId, set);
}
}
break;
}
case "spawnlist":
{
for (Node group = n.getFirstChild(); group != null; group = group.getNextSibling())
{
if ("group".equalsIgnoreCase(group.getNodeName()))
{
String spawnGroup = group.getAttributes().getNamedItem("name").getNodeValue();
List<L2Spawn> manualSpawn = new ArrayList<>();
for (Node d = group.getFirstChild(); d != null; d = d.getNextSibling())
{
int npcId = 0, x = 0, y = 0, z = 0, heading = 0, respawn = 0, respawnRandom = 0, delay = -1;
Boolean allowRandomWalk = null;
if ("spawn".equalsIgnoreCase(d.getNodeName()))
{
respawnRandom = Integer.parseInt(d.getAttributes().getNamedItem("respawnRandom").getNodeValue());
}
if (d.getAttributes().getNamedItem("allowRandomWalk") != null)
{
allowRandomWalk = Boolean.valueOf(d.getAttributes().getNamedItem("allowRandomWalk").getNodeValue());
}
final L2Spawn spawnDat = new L2Spawn(npcId);
spawnDat.setX(x);
spawnDat.setY(y);
spawnDat.setZ(z);
spawnDat.setAmount(1);
spawnDat.setHeading(heading);
spawnDat.setRespawnDelay(respawn, respawnRandom);
if (respawn == 0)
{
spawnDat.stopRespawn();
}
else
{
spawnDat.startRespawn();
}
spawnDat.setInstanceId(getId());
if (allowRandomWalk == null)
{
spawnDat.setIsNoRndWalk(!_allowRandomWalk);
}
else
{
spawnDat.setIsNoRndWalk(!allowRandomWalk);
}
if (spawnGroup.equals("general"))
{
L2Npc spawned = spawnDat.doSpawn();
if ((delay >= 0) && (spawned instanceof L2Attackable))
npcId = Integer.parseInt(d.getAttributes().getNamedItem("npcId").getNodeValue());
x = Integer.parseInt(d.getAttributes().getNamedItem("x").getNodeValue());
y = Integer.parseInt(d.getAttributes().getNamedItem("y").getNodeValue());
z = Integer.parseInt(d.getAttributes().getNamedItem("z").getNodeValue());
heading = Integer.parseInt(d.getAttributes().getNamedItem("heading").getNodeValue());
respawn = Integer.parseInt(d.getAttributes().getNamedItem("respawn").getNodeValue());
if (d.getAttributes().getNamedItem("onKillDelay") != null)
{
((L2Attackable) spawned).setOnKillDelay(delay);
delay = Integer.parseInt(d.getAttributes().getNamedItem("onKillDelay").getNodeValue());
}
if (d.getAttributes().getNamedItem("respawnRandom") != null)
{
respawnRandom = Integer.parseInt(d.getAttributes().getNamedItem("respawnRandom").getNodeValue());
}
if (d.getAttributes().getNamedItem("allowRandomWalk") != null)
{
allowRandomWalk = Boolean.valueOf(d.getAttributes().getNamedItem("allowRandomWalk").getNodeValue());
}
final L2Spawn spawnDat = new L2Spawn(npcId);
spawnDat.setX(x);
spawnDat.setY(y);
spawnDat.setZ(z);
spawnDat.setAmount(1);
spawnDat.setHeading(heading);
spawnDat.setRespawnDelay(respawn, respawnRandom);
if (respawn == 0)
{
spawnDat.stopRespawn();
}
else
{
spawnDat.startRespawn();
}
spawnDat.setInstanceId(getId());
if (allowRandomWalk == null)
{
spawnDat.setIsNoRndWalk(!_allowRandomWalk);
}
else
{
spawnDat.setIsNoRndWalk(!allowRandomWalk);
}
if (spawnGroup.equals("general"))
{
L2Npc spawned = spawnDat.doSpawn();
if ((delay >= 0) && (spawned instanceof L2Attackable))
{
((L2Attackable) spawned).setOnKillDelay(delay);
}
}
else
{
manualSpawn.add(spawnDat);
}
}
else
}
if (!manualSpawn.isEmpty())
{
_manualSpawn.put(spawnGroup, manualSpawn);
}
}
}
break;
}
case "exitpoint":
{
int x = Integer.parseInt(n.getAttributes().getNamedItem("x").getNodeValue());
int y = Integer.parseInt(n.getAttributes().getNamedItem("y").getNodeValue());
int z = Integer.parseInt(n.getAttributes().getNamedItem("z").getNodeValue());
_exitLocation = new Location(x, y, z);
break;
}
case "spawnpoints":
{
_enterLocations = new ArrayList<>();
for (Node loc = n.getFirstChild(); loc != null; loc = loc.getNextSibling())
{
if (loc.getNodeName().equals("Location"))
{
try
{
int x = Integer.parseInt(loc.getAttributes().getNamedItem("x").getNodeValue());
int y = Integer.parseInt(loc.getAttributes().getNamedItem("y").getNodeValue());
int z = Integer.parseInt(loc.getAttributes().getNamedItem("z").getNodeValue());
_enterLocations.add(new Location(x, y, z));
}
catch (Exception e)
{
_log.log(Level.WARNING, "Error parsing instance xml: " + e.getMessage(), e);
}
}
}
break;
}
case "reenter":
{
a = n.getAttributes().getNamedItem("additionStyle");
if (a != null)
{
_type = InstanceReenterType.valueOf(a.getNodeValue());
}
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
long time = -1;
DayOfWeek day = null;
int hour = -1;
int minute = -1;
if ("reset".equalsIgnoreCase(d.getNodeName()))
{
a = d.getAttributes().getNamedItem("time");
if (a != null)
{
time = Long.parseLong(a.getNodeValue());
if (time > 0)
{
manualSpawn.add(spawnDat);
_resetData.add(new InstanceReenterTimeHolder(time));
break;
}
}
}
if (!manualSpawn.isEmpty())
{
_manualSpawn.put(spawnGroup, manualSpawn);
else if (time == -1)
{
a = d.getAttributes().getNamedItem("day");
if (a != null)
{
day = DayOfWeek.valueOf(a.getNodeValue().toUpperCase());
}
a = d.getAttributes().getNamedItem("hour");
if (a != null)
{
hour = Integer.parseInt(a.getNodeValue());
}
a = d.getAttributes().getNamedItem("minute");
if (a != null)
{
minute = Integer.parseInt(a.getNodeValue());
}
_resetData.add(new InstanceReenterTimeHolder(day, hour, minute));
}
}
}
break;
}
}
else if ("spawnpoint".equalsIgnoreCase(n.getNodeName()))
{
try
case "removebuffs":
{
int x = Integer.parseInt(n.getAttributes().getNamedItem("spawnX").getNodeValue());
int y = Integer.parseInt(n.getAttributes().getNamedItem("spawnY").getNodeValue());
int z = Integer.parseInt(n.getAttributes().getNamedItem("spawnZ").getNodeValue());
_spawnLoc = new Location(x, y, z);
}
catch (Exception e)
{
_log.log(Level.WARNING, "Error parsing instance xml: " + e.getMessage(), e);
_spawnLoc = null;
}
}
else if ("reenter".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("additionStyle");
if (a != null)
{
_type = InstanceReenterType.valueOf(a.getNodeValue());
}
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
long time = -1;
DayOfWeek day = null;
int hour = -1;
int minute = -1;
a = n.getAttributes().getNamedItem("type");
if (a != null)
{
_removeBuffType = InstanceRemoveBuffType.valueOf(a.getNodeValue().toUpperCase());
}
if ("reset".equalsIgnoreCase(d.getNodeName()))
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
a = d.getAttributes().getNamedItem("time");
if (a != null)
if ("skill".equalsIgnoreCase(d.getNodeName()))
{
time = Long.parseLong(a.getNodeValue());
if (time > 0)
{
_resetData.add(new InstanceReenterTimeHolder(time));
break;
}
}
else if (time == -1)
{
a = d.getAttributes().getNamedItem("day");
a = d.getAttributes().getNamedItem("id");
if (a != null)
{
day = DayOfWeek.valueOf(a.getNodeValue().toUpperCase());
_exceptionList.add(Integer.parseInt(a.getNodeValue()));
}
a = d.getAttributes().getNamedItem("hour");
if (a != null)
{
hour = Integer.parseInt(a.getNodeValue());
}
a = d.getAttributes().getNamedItem("minute");
if (a != null)
{
minute = Integer.parseInt(a.getNodeValue());
}
_resetData.add(new InstanceReenterTimeHolder(day, hour, minute));
}
}
}
}
else if ("removeBuffs".equalsIgnoreCase(n.getNodeName()))
{
a = n.getAttributes().getNamedItem("type");
if (a != null)
{
_removeBuffType = InstanceRemoveBuffType.valueOf(a.getNodeValue().toUpperCase());
}
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
if ("skill".equalsIgnoreCase(d.getNodeName()))
{
a = d.getAttributes().getNamedItem("id");
if (a != null)
{
_exceptionList.add(Integer.parseInt(a.getNodeValue()));
}
}
break;
}
}
}
@@ -854,9 +888,9 @@ public final class Instance
if (player.isDead() && (player.getInstanceId() == getId()))
{
player.setInstanceId(0);
if (getSpawnLoc() != null)
if (getExitLoc() != null)
{
player.teleToLocation(getSpawnLoc(), true);
player.teleToLocation(getExitLoc(), true);
}
else
{
@@ -934,4 +968,4 @@ public final class Instance
{
return _exceptionList;
}
}
}

View File

@@ -20,6 +20,7 @@ package com.l2jserver.gameserver.model.entity;
import com.l2jserver.Config;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.enums.DuelState;
import com.l2jserver.gameserver.enums.Team;
import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -77,14 +78,14 @@ public class TvTEventTeleporter implements Runnable
_playerInstance.getServitors().values().forEach(s -> s.unSummon(_playerInstance));
if ((Config.TVT_EVENT_EFFECTS_REMOVAL == 0) || ((Config.TVT_EVENT_EFFECTS_REMOVAL == 1) && ((_playerInstance.getTeam() == Team.NONE) || (_playerInstance.isInDuel() && (_playerInstance.getDuelState() != Duel.DUELSTATE_INTERRUPTED)))))
if ((Config.TVT_EVENT_EFFECTS_REMOVAL == 0) || ((Config.TVT_EVENT_EFFECTS_REMOVAL == 1) && ((_playerInstance.getTeam() == Team.NONE) || (_playerInstance.isInDuel() && (_playerInstance.getDuelState() != DuelState.INTERRUPTED)))))
{
_playerInstance.stopAllEffectsExceptThoseThatLastThroughDeath();
}
if (_playerInstance.isInDuel())
{
_playerInstance.setDuelState(Duel.DUELSTATE_INTERRUPTED);
_playerInstance.setDuelState(DuelState.INTERRUPTED);
}
int TvTInstance = TvTEvent.getTvTEventInstance();

View File

@@ -1372,6 +1372,21 @@ public final class Skill implements IIdentifiable
return;
}
if (isDebuff())
{
if (effected.isDebuffBlocked())
{
return;
}
}
else
{
if (effected.isBuffBlocked() && !isBad())
{
return;
}
}
if (effected.isInvulAgainst(getId(), getLevel()))
{
effected.sendDebugMessage("Skill " + toString() + " has been ignored (invul against)");

View File

@@ -1337,12 +1337,9 @@ public final class Formulas
double attack = 2 * actor.getMAtk(target, skill) * calcGeneralTraitBonus(actor, target, skill.getTraitType(), false);
double d = (attack - defence) / (attack + defence);
if (skill.isDebuff())
if (skill.isDebuff() && target.isDebuffBlocked())
{
if (target.calcStat(Stats.DEBUFF_IMMUNITY, 0, null, skill) > 0)
{
return false;
}
return false;
}
d += 0.5 * Rnd.nextGaussian();
@@ -1372,7 +1369,7 @@ public final class Formulas
return false;
}
if (skill.isDebuff() && (target.calcStat(Stats.DEBUFF_IMMUNITY, 0, attacker, skill) > 0))
if (skill.isDebuff() && target.isDebuffBlocked())
{
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_RESISTED_YOUR_S2);
sm.addCharName(target);
@@ -1470,7 +1467,7 @@ public final class Formulas
{
return true;
}
else if (target.calcStat(Stats.DEBUFF_IMMUNITY, 0, null, skill) > 0)
else if (target.isDebuffBlocked())
{
return false;
}
@@ -2024,6 +2021,7 @@ public final class Formulas
int cancelMagicLvl = skill.getMagicLevel();
final double vuln = target.calcStat(Stats.CANCEL_VULN, 0, target, null);
final double prof = activeChar.calcStat(Stats.CANCEL_PROF, 0, target, null);
double resMod = 1 + (((vuln + prof) * -1) / 100);
double finalRate = rate / resMod;

View File

@@ -136,8 +136,6 @@ public enum Stats
HOLY_RES("holyRes"),
DARK_RES("darkRes"),
MAGIC_SUCCESS_RES("magicSuccRes"),
// BUFF_IMMUNITY("buffImmunity"), //TODO: Implement me
DEBUFF_IMMUNITY("debuffImmunity"),
// ELEMENT POWER
FIRE_POWER("firePower"),