Index: D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java =================================================================== --- D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java (revision 1508) +++ D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PlayableInstance.java (working copy) @@ -1,12 +1,21 @@ package net.sf.l2j.gameserver.model.actor.instance; +import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.model.actor.knownlist.PlayableKnownList; import net.sf.l2j.gameserver.model.actor.stat.PlayableStat; import net.sf.l2j.gameserver.model.actor.status.PlayableStatus; import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2Summon; +import net.sf.l2j.gameserver.model.L2Attackable; +import net.sf.l2j.gameserver.model.L2Skill; +import net.sf.l2j.gameserver.ClientScheduler; import net.sf.l2j.gameserver.templates.L2CharTemplate; +import net.sf.l2j.gameserver.instancemanager.ZoneManager; +import net.sf.l2j.Config; +import java.util.concurrent.Future; +import java.util.logging.Level; +import java.util.logging.Logger; /** * This class represents all Playable characters in the world.

@@ -41,7 +50,44 @@ public PlayableKnownList getKnownList() { return (PlayableKnownList)super.getKnownList(); } public PlayableStat getStat() { return (PlayableStat)super.getStat(); } public PlayableStatus getStatus() { return (PlayableStatus)super.getStatus(); } + private Future _PvPRegTask; + private long _lastPvpAttack; + protected static final Logger _log = Logger.getLogger(L2PlayableInstance.class.getName()); + + /** Task lauching the function stopPvPFlag() */ + class PvPFlag implements Runnable + { + public void run() + { + try + { + // _log.fine("Checking pvp time: " + getlastPvpAttack()); + // "lastattack: " _lastAttackTime "currenttime: " + // System.currentTimeMillis()); + if (Math.abs(System.currentTimeMillis()-getlastPvpAttack()) > Config.PVP_TIME) + { + // _log.fine("Stopping PvP"); + stopPvPFlag(); + } + else if (Math.abs(System.currentTimeMillis()-getlastPvpAttack()) > Config.PVP_TIME - 5000) + { + updatePvPFlag(2); + } + else + { + updatePvPFlag(1); + // Start a new PvP timer check + //checkPvPFlag(); + } + } + catch (Exception e) + { + _log.log(Level.WARNING, "error in pvp flag task:", e); + } + } + } + public void doDie(L2Character killer) { if (killer != null) @@ -57,7 +103,118 @@ super.doDie(killer); } + + protected void doAttack(L2Character target) + { + super.doAttack(target); + + // do pvp things here.... + updatePvPStatus(target); + } + + public void checkCastPvpFlag(L2Skill skill, L2Character target) + { + L2PlayableInstance activeChar = (L2PlayableInstance) this; + + // buffing, healing, etc of mobs should turn your pvp flags on + if (!(skill.isOffensive()) && !(target instanceof L2PlayableInstance)) + activeChar.updatePvPStatus(); + else if (skill.isOffensive()) + { + if (target instanceof L2PcInstance) activeChar.updatePvPStatus(target); //update also checks if pvp. + } + else + { + if (target instanceof L2PcInstance) + { + // Casting non offensive skill on player with pvp flag set or with karma + if ( + ((L2PcInstance)target).getPvpFlag() > 0 || + ((L2PcInstance)target).getKarma() > 0) activeChar.updatePvPStatus(); + } + else if (target instanceof L2Attackable) + activeChar.updatePvPStatus(); + } + } + public void setlastPvpAttack(long time) + { + _lastPvpAttack = time; + } + + public long getlastPvpAttack() + { + return _lastPvpAttack; + } + + public void startPvPFlag() + { + updatePvPFlag(1); + + _PvPRegTask = ClientScheduler.getInstance().scheduleLowAtFixedRate( + new PvPFlag(), 1000, 1000); + } + + public void stopPvPFlag() { + if (_PvPRegTask != null) _PvPRegTask.cancel(false); + + updatePvPFlag(0); + + _PvPRegTask = null; + } + + public void updatePvPFlag(int value) { + L2PcInstance player = null; + if (this instanceof L2Summon) + player = ((L2Summon)this).getOwner(); + if (this instanceof L2PcInstance) + player = (L2PcInstance)this; + if (player.getPvpFlag() == value) + return; + player.setPvpFlag(value); + + if (player.getKarma() < 1) + { + StatusUpdate su = new StatusUpdate(getObjectId()); + su.addAttribute(StatusUpdate.PVP_FLAG, value); + sendPacket(su); + broadcastPacket(su); + } + else return; + } + +// public void checkPvPFlag() +// { +// if (Config.DEBUG) _log.fine("Checking PvpFlag"); +// _PvPRegTask = ClientScheduler.getInstance().scheduleLowAtFixedRate( +// new PvPFlag(), 1000, 5000); +// _PvPRegActive = true; +// // _log.fine("PvP recheck"); +// } + // + + public void updatePvPStatus() + { + L2PcInstance player = null; + if (this instanceof L2PcInstance) + player = (L2PcInstance) this; + if (this instanceof L2Summon) + player = ((L2Summon)this).getOwner(); + if (player.getPvpFlag() == 0) startPvPFlag(); + if (player.getPvpFlag() != 0) setlastPvpAttack (System.currentTimeMillis()); //update last pvp ATTACK controller + } + + public void updatePvPStatus(L2Character target) + { + if ( + checkIfPvP(target) && + ( + !ZoneManager.getInstance().checkIfInZonePvP(this) || // Player is not inside pvp zone or + !ZoneManager.getInstance().checkIfInZonePvP(target) // Target player is not inside pvp zone + ) + ) updatePvPStatus(); + } + public boolean checkIfPvP(L2Character target) { if (target == null) return false; // Target is null Index: D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 1508) +++ D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -2754,23 +2754,6 @@ return karmaLost; } - public void updatePvPStatus() - { - if (getPvpFlag() == 0) startPvPFlag(); - if (getPvpFlag() != 0) setlastPvpAttack (System.currentTimeMillis()); //update last pvp ATTACK controller - } - - public void updatePvPStatus(L2Character target) - { - if ( - checkIfPvP(target) && - ( - !ZoneManager.getInstance().checkIfInZonePvP(this) || // Player is not inside pvp zone or - !ZoneManager.getInstance().checkIfInZonePvP(target) // Target player is not inside pvp zone - ) - ) updatePvPStatus(); - } - /** * Restore the specified % of experience this L2PcInstance has * lost and sends a Server->Client StatusUpdate packet.

Index: D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java (revision 1508) +++ D:/Source/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java (working copy) @@ -51,6 +51,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance; import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance; import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; +import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance; import net.sf.l2j.gameserver.model.actor.knownlist.CharKnownList; @@ -1569,38 +1570,7 @@ } } - /** Task lauching the function stopPvPFlag() */ - class PvPFlag implements Runnable - { - public void run() - { - try - { - // _log.fine("Checking pvp time: " + getlastPvpAttack()); - // "lastattack: " _lastAttackTime "currenttime: " - // System.currentTimeMillis()); - if (Math.abs(System.currentTimeMillis()-getlastPvpAttack()) > Config.PVP_TIME) - { - // _log.fine("Stopping PvP"); - stopPvPFlag(); - } - else if (Math.abs(System.currentTimeMillis()-getlastPvpAttack()) > Config.PVP_TIME - 5000) - { - updatePvPFlag(2); - } - else - { - updatePvPFlag(1); - // Start a new PvP timer check - //checkPvPFlag(); - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "error in pvp flag task:", e); - } - } - } + // ========================================================= @@ -4174,27 +4144,8 @@ if (player.isRaid() && getLevel() > player.getLevel() + 8) SkillTable.getInstance().getInfo(4515, 99).getEffects(player, this); - if(this instanceof L2PcInstance) - { - L2PcInstance activeChar = (L2PcInstance) this; - - if (skill.isOffensive()) - { - if (player instanceof L2PcInstance && activeChar.checkIfPvP(player)) activeChar.updatePvPStatus(player); - } - else - { - if (player instanceof L2PcInstance) - { - // Casting non offensive skill on player with pvp flag set or with karma - if ( - ((L2PcInstance)player).getPvpFlag() > 0 || - ((L2PcInstance)player).getKarma() > 0) activeChar.updatePvPStatus(); - } - else if (player instanceof L2Attackable) - activeChar.updatePvPStatus(); - } - } + if(this instanceof L2PlayableInstance) + ((L2PlayableInstance) this).checkCastPvpFlag(skill, player); } } @@ -4296,64 +4247,7 @@ { } - private Future _PvPRegTask; - - private long _lastPvpAttack; - - public void setlastPvpAttack(long time) - { - _lastPvpAttack = time; - } - - public long getlastPvpAttack() - { - return _lastPvpAttack; - } - - public void startPvPFlag() - { - updatePvPFlag(1); - - _PvPRegTask = ClientScheduler.getInstance().scheduleLowAtFixedRate( - new PvPFlag(), 1000, 1000); - } - - public void stopPvPFlag() { - if (_PvPRegTask != null) _PvPRegTask.cancel(false); - - updatePvPFlag(0); - - _PvPRegTask = null; - } - - public void updatePvPFlag(int value) { - if (!(this instanceof L2PcInstance)) - return; - L2PcInstance player = (L2PcInstance)this; - if (player.getPvpFlag() == value) - return; - player.setPvpFlag(value); - - if (player.getKarma() < 1) - { - StatusUpdate su = new StatusUpdate(getObjectId()); - su.addAttribute(StatusUpdate.PVP_FLAG, value); - sendPacket(su); - broadcastPacket(su); - } - else return; - } - -// public void checkPvPFlag() -// { -// if (Config.DEBUG) _log.fine("Checking PvpFlag"); -// _PvPRegTask = ClientScheduler.getInstance().scheduleLowAtFixedRate( -// new PvPFlag(), 1000, 5000); -// _PvPRegActive = true; -// // _log.fine("PvP recheck"); -// } -// - + /** * Return a Random Damage in function of the weapon.

*/