Skip to content

Instantly share code, notes, and snippets.

@Williams0ff
Created January 23, 2022 21:27
Show Gist options
  • Save Williams0ff/76716c90c14c54922ab223e5a365d71c to your computer and use it in GitHub Desktop.
Save Williams0ff/76716c90c14c54922ab223e5a365d71c to your computer and use it in GitHub Desktop.
Fix Festive Sweeper
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