Skip to content

Commit 703b81f

Browse files
committed
Fix off hand items, block break events and some more stuff
1 parent b5a4616 commit 703b81f

File tree

4 files changed

+121
-71
lines changed

4 files changed

+121
-71
lines changed

src/main/java/ch/njol/skript/events/EvtBlock.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
package ch.njol.skript.events;
2323

24+
import java.lang.invoke.MethodHandle;
25+
2426
import org.bukkit.Material;
2527
import org.bukkit.entity.Entity;
2628
import org.bukkit.entity.ItemFrame;
@@ -103,8 +105,8 @@ public boolean check(final Event e) {
103105
}
104106
if (types == null)
105107
return true;
106-
final int id;
107-
final short durability;
108+
int id = 0;
109+
short durability = 0;
108110
if (e instanceof BlockEvent) {
109111
id = ((BlockEvent) e).getBlock().getTypeId();
110112
durability = ((BlockEvent) e).getBlock().getData();
@@ -138,10 +140,15 @@ public boolean check(final @Nullable ItemType t) {
138140
assert false;
139141
return false;
140142
}
143+
144+
//Hacky code to fix Java 8 compilation problems... TODO maybe use lambdas instead and break Java 7?
145+
final int idFinal = id;
146+
final short durFinal = durability;
147+
141148
return types.check(e, new Checker<ItemType>() {
142149
@Override
143150
public boolean check(final @Nullable ItemType t) {
144-
return t != null && t.isOfType(id, durability);
151+
return t != null && t.isOfType(idFinal, durFinal);
145152
}
146153
});
147154
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* This file is part of Skript.
3+
*
4+
* Skript is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* Skript is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
16+
*
17+
*
18+
* Copyright 2011-2013 Peter Güttinger
19+
*
20+
*/
21+
22+
package ch.njol.skript.events;
23+
24+
import org.bukkit.entity.LivingEntity;
25+
import org.bukkit.event.Event;
26+
import org.bukkit.event.player.PlayerBucketEvent;
27+
import org.bukkit.event.player.PlayerItemHeldEvent;
28+
import org.bukkit.inventory.EntityEquipment;
29+
import org.bukkit.inventory.ItemStack;
30+
import org.bukkit.inventory.PlayerInventory;
31+
import org.eclipse.jdt.annotation.Nullable;
32+
33+
import ch.njol.skript.Skript;
34+
import ch.njol.skript.effects.Delay;
35+
import ch.njol.skript.expressions.ExprTool;
36+
import ch.njol.skript.lang.ExpressionType;
37+
import ch.njol.skript.util.EquipmentSlot;
38+
import ch.njol.skript.util.Getter;
39+
import ch.njol.skript.util.InventorySlot;
40+
import ch.njol.skript.util.Slot;
41+
42+
/**
43+
* Offhand tool expression for Minecraft 1.9.
44+
* @author bensku
45+
*
46+
*/
47+
public class ExprOffTool extends ExprTool {
48+
static {
49+
if (Skript.isRunningMinecraft(1, 9)) {
50+
Skript.registerExpression(ExprOffTool.class, Slot.class, ExpressionType.PROPERTY, "[the] (off[(-| )]tool|off[(-| )][held ]item|off[(-| )]weapon) [of %livingentities%]", "%livingentities%'[s] (off[(-| )]tool|off[(-| )][held ]item|off[(-| )]weapon)",
51+
"[the] (off[ ]hand tool|off[ ] hand item|shield[ item]) [of %livingentities%]", "%livingentities%'[s] (off[ ]hand tool|off[ ] hand item|shield[ item])");
52+
} else { // Don't break scripts if running older Minecraft
53+
Skript.registerExpression(ExprTool.class, Slot.class, ExpressionType.PROPERTY, "[the] (off[(-| )]tool|off[(-| )][held ]item|off[(-| )]weapon) [of %livingentities%]", "%livingentities%'[s] (off[(-| )]tool|off[(-| )][held ]item|off[(-| )]weapon)",
54+
"[the] (off[ ]hand tool|off[ ] hand item|shield[ item]) [of %livingentities%]", "%livingentities%'[s] (off[ ]hand tool|off[ ] hand item|shield[ item])");
55+
}
56+
}
57+
58+
@Override
59+
protected Slot[] get(final Event e, final LivingEntity[] source) {
60+
final boolean delayed = Delay.isDelayed(e);
61+
return get(source, new Getter<Slot, LivingEntity>() {
62+
@Override
63+
@Nullable
64+
public Slot get(final LivingEntity p) {
65+
if (!delayed) {
66+
if (e instanceof PlayerItemHeldEvent && ((PlayerItemHeldEvent) e).getPlayer() == p) {
67+
Skript.info("ItemHeldEvent");
68+
final PlayerInventory i = ((PlayerItemHeldEvent) e).getPlayer().getInventory();
69+
assert i != null;
70+
return new InventorySlot(i, getTime() >= 0 ? ((PlayerItemHeldEvent) e).getNewSlot() : ((PlayerItemHeldEvent) e).getPreviousSlot());
71+
} else if (e instanceof PlayerBucketEvent && ((PlayerBucketEvent) e).getPlayer() == p) {
72+
Skript.info("PlayerBucketEvent");
73+
final PlayerInventory i = ((PlayerBucketEvent) e).getPlayer().getInventory();
74+
assert i != null;
75+
return new InventorySlot(i, ((PlayerBucketEvent) e).getPlayer().getInventory().getHeldItemSlot()) {
76+
@Override
77+
@Nullable
78+
public ItemStack getItem() {
79+
return getTime() <= 0 ? super.getItem() : ((PlayerBucketEvent) e).getItemStack();
80+
}
81+
82+
@Override
83+
public void setItem(final @Nullable ItemStack item) {
84+
if (getTime() >= 0) {
85+
((PlayerBucketEvent) e).setItemStack(item);
86+
} else {
87+
super.setItem(item);
88+
}
89+
}
90+
};
91+
}
92+
}
93+
final EntityEquipment e = p.getEquipment();
94+
if (e == null)
95+
return null;
96+
return new EquipmentSlot(e, EquipmentSlot.EquipSlot.OFF_HAND) {
97+
@Override
98+
public String toString_i() {
99+
return "the " + (getTime() == 1 ? "future " : getTime() == -1 ? "former " : "") + super.toString_i();
100+
}
101+
};
102+
}
103+
});
104+
}
105+
}

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

Lines changed: 3 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -58,27 +58,17 @@
5858
@Examples({"player is holding a pickaxe",
5959
"# is the same as",
6060
"player's tool is a pickaxe",
61-
"player's offhand tool is shield #Only for Minecraft 1.9"})
61+
"player's off hand tool is shield #Only for Minecraft 1.9"})
6262
@Since("1.0")
6363
public class ExprTool extends PropertyExpression<LivingEntity, Slot> {
6464
static {
65-
Skript.registerExpression(ExprTool.class, Slot.class, ExpressionType.PROPERTY, "[the] (tool|held item|weapon) [of %livingentities%]", "%livingentities%'[s] (tool|held item|weapon)",
66-
"[the] (off[-]tool|off[-][held ]item|off[-]weapon) [of %livingentities%]", "%livingentities%'[s] (off[-]tool|off[-][held ]item|off[-]weapon)");
67-
if (Skript.isRunningMinecraft(1, 9)) {
68-
Skript.registerExpression(ExprTool.class, Slot.class, ExpressionType.PROPERTY, "[the] (tool|held item|weapon) [of %livingentities%]", "%livingentities%'[s] (tool|held item|weapon)",
69-
"[the] (off[(-| )]tool|off[(-| )][held ]item|off[(-| )]weapon) [of %livingentities%]", "%livingentities%'[s] (off[(-| )]tool|off[(-| )][held ]item|off[(-| )]weapon)");
70-
} else {
71-
Skript.registerExpression(ExprTool.class, Slot.class, ExpressionType.PROPERTY, "[the] (tool|held item|weapon) [of %livingentities%]", "%livingentities%'[s] (tool|held item|weapon)");
72-
}
65+
Skript.registerExpression(ExprTool.class, Slot.class, ExpressionType.PROPERTY, "[the] (tool|held item|weapon) [of %livingentities%]", "%livingentities%'[s] (tool|held item|weapon)");
7366
}
7467

75-
boolean offTool; //Is this item offhand tools
76-
7768
@SuppressWarnings({"unchecked", "null"})
7869
@Override
7970
public boolean init(final Expression<?>[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parser) {
8071
setExpr((Expression<Player>) exprs[0]);
81-
offTool = matchedPattern >= 2;
8272
return true;
8373
}
8474

@@ -118,7 +108,7 @@ public void setItem(final @Nullable ItemStack item) {
118108
final EntityEquipment e = p.getEquipment();
119109
if (e == null)
120110
return null;
121-
return new EquipmentSlot(e, offTool ? EquipmentSlot.EquipSlot.OFF_TOOL : EquipmentSlot.EquipSlot.TOOL) {
111+
return new EquipmentSlot(e, EquipmentSlot.EquipSlot.TOOL) {
122112
@Override
123113
public String toString_i() {
124114
return "the " + (getTime() == 1 ? "future " : getTime() == -1 ? "former " : "") + super.toString_i();
@@ -146,56 +136,4 @@ public boolean setTime(final int time) {
146136
return super.setTime(time, getExpr(), PlayerItemHeldEvent.class, PlayerBucketFillEvent.class, PlayerBucketEmptyEvent.class);
147137
}
148138

149-
/**
150-
* Offhand tool expression for Minecraft 1.9.
151-
* @author bensku
152-
*
153-
*/
154-
public class OffTool extends ExprTool {
155-
@Override
156-
protected Slot[] get(final Event e, final LivingEntity[] source) {
157-
final boolean delayed = Delay.isDelayed(e);
158-
return get(source, new Getter<Slot, LivingEntity>() {
159-
@Override
160-
@Nullable
161-
public Slot get(final LivingEntity p) {
162-
if (!delayed) {
163-
if (e instanceof PlayerItemHeldEvent && ((PlayerItemHeldEvent) e).getPlayer() == p) {
164-
final PlayerInventory i = ((PlayerItemHeldEvent) e).getPlayer().getInventory();
165-
assert i != null;
166-
return new InventorySlot(i, getTime() >= 0 ? ((PlayerItemHeldEvent) e).getNewSlot() : ((PlayerItemHeldEvent) e).getPreviousSlot());
167-
} else if (e instanceof PlayerBucketEvent && ((PlayerBucketEvent) e).getPlayer() == p) {
168-
final PlayerInventory i = ((PlayerBucketEvent) e).getPlayer().getInventory();
169-
assert i != null;
170-
return new InventorySlot(i, ((PlayerBucketEvent) e).getPlayer().getInventory().getHeldItemSlot()) {
171-
@Override
172-
@Nullable
173-
public ItemStack getItem() {
174-
return getTime() <= 0 ? super.getItem() : ((PlayerBucketEvent) e).getItemStack();
175-
}
176-
177-
@Override
178-
public void setItem(final @Nullable ItemStack item) {
179-
if (getTime() >= 0) {
180-
((PlayerBucketEvent) e).setItemStack(item);
181-
} else {
182-
super.setItem(item);
183-
}
184-
}
185-
};
186-
}
187-
}
188-
final EntityEquipment e = p.getEquipment();
189-
if (e == null)
190-
return null;
191-
return new EquipmentSlot(e, EquipmentSlot.EquipSlot.OFF_HAND) {
192-
@Override
193-
public String toString_i() {
194-
return "the " + (getTime() == 1 ? "future " : getTime() == -1 ? "former " : "") + super.toString_i();
195-
}
196-
};
197-
}
198-
});
199-
}
200-
}
201139
}

src/main/java/ch/njol/skript/util/EquipmentSlot.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ public void set(final EntityEquipment e, final @Nullable ItemStack item) {
6464
}
6565
}
6666
},
67-
OFF_HAND { // Since Minecraft 1.9 (defaults to main hand if earlier version)
67+
OFF_HAND { // Since Minecraft 1.9 (defaults to empty if earlier version)
6868

6969
@Override
7070
@Nullable
7171
public ItemStack get(EntityEquipment e) {
7272
if (Skript.isRunningMinecraft(1, 9)) {
7373
return e.getItemInOffHand();
7474
}
75-
Skript.warning("No off hand support, but skript would need that!");
75+
Skript.warning("No off hand support, but a skript would need that!");
7676
return new ItemStack(Material.AIR);
7777
}
7878

@@ -81,7 +81,7 @@ public void set(EntityEquipment e, @Nullable ItemStack item) {
8181
if (Skript.isRunningMinecraft(1, 9)) {
8282
e.setItemInOffHand(item);
8383
} else {
84-
Skript.warning("No off hand support, but skript would need that!");
84+
Skript.warning("No off hand support, but a skript would need that!");
8585
}
8686
}
8787

0 commit comments

Comments
 (0)