Created
January 23, 2022 21:27
-
-
Save Williams0ff/76716c90c14c54922ab223e5a365d71c to your computer and use it in GitHub Desktop.
Fix Festive Sweeper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java | |
index a18f4de..38e83cf 100644 | |
--- a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java | |
+++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java | |
@@ -49,6 +49,9 @@ | |
// Reset variables. | |
monster.getSpoilState().clear(); | |
} | |
+ | |
+ if (skill.hasSelfEffects()) | |
+ skill.getEffectsSelf(activeChar); | |
} | |
@Override | |
diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetAreaCorpseMob.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetAreaCorpseMob.java | |
index a88f6ba..5613cdb 100644 | |
--- a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetAreaCorpseMob.java | |
+++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetAreaCorpseMob.java | |
@@ -4,13 +4,18 @@ | |
import java.util.List; | |
import net.sf.l2j.gameserver.enums.skills.SkillTargetType; | |
+import net.sf.l2j.gameserver.enums.skills.SkillType; | |
import net.sf.l2j.gameserver.geoengine.GeoEngine; | |
import net.sf.l2j.gameserver.handler.ITargetHandler; | |
import net.sf.l2j.gameserver.model.actor.Attackable; | |
import net.sf.l2j.gameserver.model.actor.Creature; | |
import net.sf.l2j.gameserver.model.actor.Playable; | |
+import net.sf.l2j.gameserver.model.actor.instance.Monster; | |
+import net.sf.l2j.gameserver.model.actor.instance.Pet; | |
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; | |
import net.sf.l2j.gameserver.network.SystemMessageId; | |
import net.sf.l2j.gameserver.skills.L2Skill; | |
+import net.sf.l2j.gameserver.taskmanager.DecayTaskManager; | |
public class TargetAreaCorpseMob implements ITargetHandler | |
{ | |
@@ -28,7 +33,17 @@ | |
for (Creature creature : target.getKnownTypeInRadius(Creature.class, skill.getSkillRadius())) | |
{ | |
- if (creature == caster || creature.isDead() || !GeoEngine.getInstance().canSeeTarget(target, creature)) | |
+ if (creature == caster || !GeoEngine.getInstance().canSeeTarget(target, creature)) | |
+ continue; | |
+ | |
+ if (skill.getId() == 444) | |
+ { | |
+ if (creature instanceof Attackable && creature.isDead()) | |
+ list.add(creature); | |
+ | |
+ continue; | |
+ } | |
+ else if (creature.isDead()) | |
continue; | |
if (caster instanceof Playable && (creature instanceof Attackable || creature instanceof Playable)) | |
@@ -55,11 +70,44 @@ | |
@Override | |
public boolean meetCastConditions(Playable caster, Creature target, L2Skill skill, boolean isCtrlPressed) | |
{ | |
- if ((!(target instanceof Attackable)) || !target.isDead()) | |
+ // Verify if a corpse exists. Can't do anything on Pets. | |
+ final Long time = DecayTaskManager.getInstance().get(target); | |
+ if (time == null || target instanceof Pet) | |
{ | |
caster.sendPacket(SystemMessageId.INVALID_TARGET); | |
return false; | |
} | |
+ | |
+ // Harvest can be done anytime. | |
+ if (skill.getSkillType() == SkillType.HARVEST) | |
+ { | |
+ if (!(target instanceof Monster)) | |
+ { | |
+ caster.sendPacket(SystemMessageId.THE_HARVEST_FAILED_BECAUSE_THE_SEED_WAS_NOT_SOWN); | |
+ return false; | |
+ } | |
+ | |
+ return true; | |
+ } | |
+ | |
+ // Cast NpcTemplate over Creature template since only pets, servitors and NPCs are stored into DecayTaskManager, and all inherits from NpcTemplate. | |
+ final NpcTemplate template = (NpcTemplate) target.getTemplate(); | |
+ | |
+ // Check last corpse action time. That behavior exists whenever the target isn't seeded or spoiled. | |
+ final boolean isSeededOrSpoiled = target instanceof Monster && (((Monster) target).getSeedState().isSeeded() || ((Monster) target).getSpoilState().isSpoiled()); | |
+ if (!isSeededOrSpoiled && System.currentTimeMillis() >= time - (template.getCorpseTime() * 1000 / 2)) | |
+ { | |
+ caster.sendPacket(SystemMessageId.CORPSE_TOO_OLD_SKILL_NOT_USED); | |
+ return false; | |
+ } | |
+ | |
+ // Sweep always end as true if the target is a Monster ; otherwise, it's always false. | |
+ if (skill.getSkillType() == SkillType.SWEEP && !(target instanceof Monster)) | |
+ { | |
+ caster.sendPacket(SystemMessageId.SWEEPER_FAILED_TARGET_NOT_SPOILED); | |
+ return false; | |
+ } | |
+ | |
return true; | |
} | |
} | |
\ No newline at end of file | |
diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetCorpseMob.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetCorpseMob.java | |
index 4fc5947..03b4055 100644 | |
--- a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetCorpseMob.java | |
+++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/handler/targethandlers/TargetCorpseMob.java | |
@@ -3,10 +3,11 @@ | |
import net.sf.l2j.gameserver.enums.skills.SkillTargetType; | |
import net.sf.l2j.gameserver.enums.skills.SkillType; | |
import net.sf.l2j.gameserver.handler.ITargetHandler; | |
-import net.sf.l2j.gameserver.model.actor.Attackable; | |
import net.sf.l2j.gameserver.model.actor.Creature; | |
import net.sf.l2j.gameserver.model.actor.Playable; | |
import net.sf.l2j.gameserver.model.actor.instance.Monster; | |
+import net.sf.l2j.gameserver.model.actor.instance.Pet; | |
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; | |
import net.sf.l2j.gameserver.network.SystemMessageId; | |
import net.sf.l2j.gameserver.skills.L2Skill; | |
import net.sf.l2j.gameserver.taskmanager.DecayTaskManager; | |
@@ -37,18 +38,44 @@ | |
@Override | |
public boolean meetCastConditions(Playable caster, Creature target, L2Skill skill, boolean isCtrlPressed) | |
{ | |
- if (!(target instanceof Attackable) || !target.isDead()) | |
+ // Verify if a corpse exists. Can't do anything on Pets. | |
+ final Long time = DecayTaskManager.getInstance().get(target); | |
+ if (time == null || target instanceof Pet) | |
{ | |
caster.sendPacket(SystemMessageId.INVALID_TARGET); | |
return false; | |
} | |
+ | |
+ // Harvest can be done anytime. | |
+ if (skill.getSkillType() == SkillType.HARVEST) | |
+ { | |
+ if (!(target instanceof Monster)) | |
+ { | |
+ caster.sendPacket(SystemMessageId.THE_HARVEST_FAILED_BECAUSE_THE_SEED_WAS_NOT_SOWN); | |
+ return false; | |
+ } | |
+ | |
+ return true; | |
+ } | |
+ | |
+ // Cast NpcTemplate over Creature template since only pets, servitors and NPCs are stored into DecayTaskManager, and all inherits from NpcTemplate. | |
+ final NpcTemplate template = (NpcTemplate) target.getTemplate(); | |
- if (target instanceof Monster && skill.getSkillType() == SkillType.DRAIN && !DecayTaskManager.getInstance().isCorpseActionAllowed((Monster) target)) | |
+ // Check last corpse action time. That behavior exists whenever the target isn't seeded or spoiled. | |
+ final boolean isSeededOrSpoiled = target instanceof Monster && (((Monster) target).getSeedState().isSeeded() || ((Monster) target).getSpoilState().isSpoiled()); | |
+ if (!isSeededOrSpoiled && System.currentTimeMillis() >= time - (template.getCorpseTime() * 1000 / 2)) | |
{ | |
caster.sendPacket(SystemMessageId.CORPSE_TOO_OLD_SKILL_NOT_USED); | |
return false; | |
} | |
+ // Sweep always end as true if the target is a Monster ; otherwise, it's always false. | |
+ if (skill.getSkillType() == SkillType.SWEEP && !(target instanceof Monster)) | |
+ { | |
+ caster.sendPacket(SystemMessageId.SWEEPER_FAILED_TARGET_NOT_SPOILED); | |
+ return false; | |
+ } | |
+ | |
return true; | |
} | |
} | |
diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java | |
index 1b5bfb7..17dc930 100644 | |
--- a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java | |
+++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/taskmanager/DecayTaskManager.java | |
@@ -56,6 +56,11 @@ | |
} | |
} | |
+ public final Long get(Creature creature) | |
+ { | |
+ return _creatures.get(creature); | |
+ } | |
+ | |
/** | |
* Adds a {@link Creature} to the {@link DecayTaskManager} with additional interval. | |
* @param creature : The {@link Creature} to be added. | |
@@ -79,33 +84,11 @@ | |
/** | |
* Removes the {@link Creature} passed as parameter from the {@link DecayTaskManager}. | |
* @param creature : The {@link Creature} to be removed. | |
+ * @return True if an entry was successfully removed or false otherwise. | |
*/ | |
- public final void cancel(Creature creature) | |
+ public final boolean cancel(Creature creature) | |
{ | |
- _creatures.remove(creature); | |
- } | |
- | |
- /** | |
- * Removes the {@link Monster} passed as parameter from the {@link DecayTaskManager}. | |
- * @param monster : The {@link Monster} to be tested. | |
- * @return boolean : True, when action can be applied on a corpse. | |
- */ | |
- public final boolean isCorpseActionAllowed(Monster monster) | |
- { | |
- // Verify if a corpse exists. | |
- Long time = _creatures.get(monster); | |
- if (time == null) | |
- return false; | |
- | |
- // Get corpse action interval, which is half the corpse decay. | |
- int corpseTime = monster.getTemplate().getCorpseTime() * 1000 / 2; | |
- | |
- // If the Monster is spoiled or seeded, double the corpse action interval. | |
- if (monster.getSpoilState().isSpoiled() || monster.getSeedState().isSeeded()) | |
- corpseTime *= 2; | |
- | |
- // Check last corpse action time. | |
- return System.currentTimeMillis() < time - corpseTime; | |
+ return _creatures.remove(creature) != null; | |
} | |
public static final DecayTaskManager getInstance() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It worked perfectly, thank you very much. I used it in Acis 401