12
12
import org .bukkit .NamespacedKey ;
13
13
import org .bukkit .command .Command ;
14
14
import org .bukkit .command .CommandSender ;
15
- import org .bukkit .entity .Entity ;
16
- import org .bukkit .entity .EntityType ;
17
15
import org .bukkit .entity .Player ;
16
+ import org .bukkit .entity .ThrownExpBottle ;
18
17
import org .bukkit .event .EventHandler ;
19
- import org .bukkit .event .EventPriority ;
20
18
import org .bukkit .event .Listener ;
21
- import org .bukkit .event .block .Action ;
22
- import org .bukkit .event .entity .ExpBottleEvent ;
23
- import org .bukkit .event .entity .ProjectileLaunchEvent ;
24
- import org .bukkit .event .player .PlayerInteractEvent ;
19
+ import org .bukkit .event .entity .ProjectileHitEvent ;
25
20
import org .bukkit .inventory .ItemStack ;
26
21
import org .bukkit .inventory .meta .ItemMeta ;
27
22
import org .bukkit .persistence .PersistentDataType ;
28
23
29
- import java .util .*;
24
+ import java .util .ArrayList ;
25
+ import java .util .List ;
30
26
31
27
public class XpStoreFunction implements SubCommandExecutor , SubTabCompleter , Listener {
32
28
private final SpigotLoader pluginInstance ;
33
29
private final NamespacedKey EXPAmountKey ;
34
30
private final NamespacedKey LoreLineIndexKey ;
35
31
private final String EXPBOTTLE_PERMISSION_NODE = "ukit.xpstore" ;
36
- private final Map <UUID , Integer > playerExpBottleMap = new HashMap <>();
37
32
private final List <String > subCommands = List .of ("store" , "take" );
38
33
39
34
public XpStoreFunction (SpigotLoader pluginInstance ) {
@@ -166,10 +161,6 @@ private boolean isExpContainer(ItemStack itemStack) {
166
161
return itemStack .getItemMeta ().getPersistentDataContainer ().has (EXPAmountKey , PersistentDataType .INTEGER );
167
162
}
168
163
169
- private boolean isExpContainer (Entity entity ) {
170
- return entity .getPersistentDataContainer ().has (EXPAmountKey , PersistentDataType .INTEGER );
171
- }
172
-
173
164
private int getExpContained (ItemStack itemStack ) {
174
165
if (!isExpContainer (itemStack )) {
175
166
return 0 ;
@@ -178,13 +169,6 @@ private int getExpContained(ItemStack itemStack) {
178
169
}
179
170
}
180
171
181
- private int getExpContained (Entity entity ) {
182
- if (!isExpContainer (entity ))
183
- return 0 ;
184
- else
185
- return entity .getPersistentDataContainer ().get (EXPAmountKey , PersistentDataType .INTEGER );
186
- }
187
-
188
172
private ItemStack addExpToItemStack (ItemStack itemStack , int amount ) {
189
173
var itemMeta = itemStack .hasItemMeta () ? itemStack .getItemMeta () : Bukkit .getItemFactory ().getItemMeta (itemStack .getType ());
190
174
assert itemMeta != null ;
@@ -198,16 +182,6 @@ private ItemStack addExpToItemStack(ItemStack itemStack, int amount) {
198
182
return itemStack ;
199
183
}
200
184
201
- private void addExpToEntity (Entity entity , int amount ) {
202
- if (!isExpContainer (entity )) {
203
- entity .getPersistentDataContainer ().set (EXPAmountKey , PersistentDataType .INTEGER , amount );
204
- } else {
205
- entity .getPersistentDataContainer ().set (EXPAmountKey , PersistentDataType .INTEGER ,
206
- entity .getPersistentDataContainer ().get (EXPAmountKey , PersistentDataType .INTEGER ) + amount
207
- );
208
- }
209
- }
210
-
211
185
private ItemMeta updateLore (ItemMeta itemMeta ) {
212
186
var loreIndex = itemMeta .getPersistentDataContainer ().get (LoreLineIndexKey , PersistentDataType .INTEGER );
213
187
var amount = itemMeta .getPersistentDataContainer ().get (EXPAmountKey , PersistentDataType .INTEGER );
@@ -236,33 +210,13 @@ private ItemMeta updateLore(ItemMeta itemMeta) {
236
210
return itemMeta ;
237
211
}
238
212
239
- @ EventHandler (priority = EventPriority .HIGHEST , ignoreCancelled = true )
240
- public void onPlayerInteractWithExpBottle (PlayerInteractEvent event ) {
241
- if (event .getAction () != Action .RIGHT_CLICK_BLOCK && event .getAction () != Action .RIGHT_CLICK_AIR ) {
242
- return ;
243
- }
244
- if (event .getItem () == null )
245
- return ;
246
- playerExpBottleMap .put (event .getPlayer ().getUniqueId (), getExpContained (event .getItem ()));
247
- }
248
-
249
- @ EventHandler (ignoreCancelled = true )
250
- public void onThrewExpBottleLaunch (ProjectileLaunchEvent event ) {
251
- if (!(event .getEntity ().getShooter () instanceof Player shooterPlayer ))
252
- return ;
253
- if (event .getEntity ().getType () != EntityType .EXPERIENCE_BOTTLE )
254
- return ;
255
- if (!playerExpBottleMap .containsKey (shooterPlayer .getUniqueId ()))
256
- return ;
257
- var amount = playerExpBottleMap .remove (shooterPlayer .getUniqueId ());
258
- addExpToEntity (event .getEntity (), amount );
259
- }
260
-
261
213
@ EventHandler (ignoreCancelled = true )
262
- public void onExpBottleHitGround ( ExpBottleEvent event ) {
263
- if (!(event .getEntity (). getShooter () instanceof Player ))
214
+ public void onExpBottleHit ( ProjectileHitEvent event ) {
215
+ if (!(event .getEntity () instanceof ThrownExpBottle thrownExpBottle ))
264
216
return ;
265
- var amount = getExpContained (event .getEntity ());
266
- event .setExperience (event .getExperience () + amount );
217
+ var item = thrownExpBottle .getItem ();
218
+ if (!isExpContainer (item )) return ;
219
+ var expAmount = getExpContained (item );
220
+ ExperienceUtils .splashExp (expAmount , thrownExpBottle .getLocation ());
267
221
}
268
222
}
0 commit comments