Skip to content

Commit 9f62586

Browse files
ShaneBeeesovdeeth
andauthored
ExprLastDamage - fix everything (#6797)
* ExprLastDamage - fix everything * HealthUtils set last damage manually * ExprLastDamage - add test --------- Co-authored-by: sovdee <10354869+sovdeeth@users.noreply.github.com>
1 parent 1e23d7f commit 9f62586

File tree

3 files changed

+39
-31
lines changed

3 files changed

+39
-31
lines changed

src/main/java/ch/njol/skript/bukkitutil/HealthUtils.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@
2626
import org.bukkit.damage.DamageSource;
2727
import org.bukkit.damage.DamageType;
2828
import org.bukkit.entity.Damageable;
29+
import org.bukkit.entity.LivingEntity;
2930
import org.bukkit.event.entity.EntityDamageEvent;
3031
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
3132
import org.jetbrains.annotations.Nullable;
3233

3334
import java.lang.reflect.Constructor;
3435
import java.lang.reflect.InvocationTargetException;
35-
import java.lang.reflect.Method;
3636

3737
public class HealthUtils {
3838

@@ -112,8 +112,11 @@ public static double getFinalDamage(EntityDamageEvent e) {
112112
return e.getFinalDamage() / 2;
113113
}
114114

115-
public static void setDamage(EntityDamageEvent e, double damage) {
116-
e.setDamage(damage * 2);
115+
public static void setDamage(EntityDamageEvent event, double damage) {
116+
event.setDamage(damage * 2);
117+
// Set last damage manually as Bukkit doesn't appear to do that
118+
if (event.getEntity() instanceof LivingEntity)
119+
((LivingEntity) event.getEntity()).setLastDamage(damage * 2);
117120
}
118121

119122
@Nullable

src/main/java/ch/njol/skript/expressions/ExprLastDamage.java

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,47 +19,34 @@
1919
*/
2020
package ch.njol.skript.expressions;
2121

22-
import org.bukkit.entity.LivingEntity;
23-
import org.bukkit.event.Event;
24-
import org.eclipse.jdt.annotation.Nullable;
25-
2622
import ch.njol.skript.classes.Changer.ChangeMode;
2723
import ch.njol.skript.doc.Description;
2824
import ch.njol.skript.doc.Examples;
2925
import ch.njol.skript.doc.Name;
3026
import ch.njol.skript.doc.Since;
3127
import ch.njol.skript.expressions.base.SimplePropertyExpression;
32-
import ch.njol.skript.lang.Expression;
33-
import ch.njol.skript.lang.SkriptParser;
34-
import ch.njol.util.Kleenean;
3528
import ch.njol.util.coll.CollectionUtils;
29+
import org.bukkit.entity.LivingEntity;
30+
import org.bukkit.event.Event;
31+
import org.jetbrains.annotations.Nullable;
3632

3733
@Name("Last Damage")
3834
@Description("The last damage that was done to an entity. Note that changing it doesn't deal more/less damage.")
3935
@Examples({"set last damage of event-entity to 2"})
4036
@Since("2.5.1")
4137
public class ExprLastDamage extends SimplePropertyExpression<LivingEntity, Number> {
42-
38+
4339
static {
4440
register(ExprLastDamage.class, Number.class, "last damage", "livingentities");
4541
}
46-
47-
@Nullable
48-
private ExprDamage damageExpr;
49-
50-
@Override
51-
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
52-
damageExpr = new ExprDamage();
53-
return true;
54-
}
55-
42+
5643
@Nullable
5744
@Override
5845
@SuppressWarnings("null")
5946
public Number convert(LivingEntity livingEntity) {
60-
return damageExpr.get(livingEntity.getLastDamageCause())[0];
47+
return livingEntity.getLastDamage() / 2;
6148
}
62-
49+
6350
@Nullable
6451
@Override
6552
public Class<?>[] acceptChange(ChangeMode mode) {
@@ -72,35 +59,38 @@ public Class<?>[] acceptChange(ChangeMode mode) {
7259
return null;
7360
}
7461
}
75-
62+
63+
@SuppressWarnings("ConstantValue")
7664
@Override
7765
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
78-
if (delta != null) {
66+
if (delta != null && delta[0] instanceof Number) {
67+
double damage = ((Number) delta[0]).doubleValue() * 2;
68+
7969
switch (mode) {
8070
case SET:
8171
for (LivingEntity entity : getExpr().getArray(e))
82-
entity.setLastDamage((Long) delta[0]);
72+
entity.setLastDamage(damage);
8373
break;
8474
case REMOVE:
85-
delta[0] = (Long) delta[0] * -1;
75+
damage = damage * -1;
8676
case ADD:
8777
for (LivingEntity entity : getExpr().getArray(e))
88-
entity.setLastDamage((Long) delta[0] + entity.getLastDamage());
78+
entity.setLastDamage(damage + entity.getLastDamage());
8979
break;
9080
default:
9181
assert false;
9282
}
9383
}
9484
}
95-
85+
9686
@Override
9787
public Class<? extends Number> getReturnType() {
9888
return Number.class;
9989
}
100-
90+
10191
@Override
10292
protected String getPropertyName() {
10393
return "last damage";
10494
}
105-
95+
10696
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
test "last damage":
2+
set {_l} to location 0.5 above highest block at location(1,1,1)
3+
spawn a sheep at {_l}
4+
set {_e} to last spawned entity
5+
6+
assert last damage of {_e} = 0 with "last damage of newly spawned entity should be 0"
7+
8+
damage {_e} by 1
9+
assert last damage of {_e} = 1 with "last damage of entity should be 1 after damaging it by 1"
10+
11+
set last damage of {_e} to 3
12+
assert last damage of {_e} = 3 with "last damage of entity should be 3 after setting to 3"
13+
14+
# thank you for your service
15+
delete entity in {_e}

0 commit comments

Comments
 (0)