11package ch .njol .skript .effects ;
22
3+ import ch .njol .skript .doc .*;
4+ import ch .njol .skript .lang .EventRestrictedSyntax ;
5+ import ch .njol .util .coll .CollectionUtils ;
6+ import org .bukkit .entity .Item ;
37import org .bukkit .event .Event ;
48import org .bukkit .event .block .BlockBreakEvent ;
9+ import org .bukkit .event .block .BlockDropItemEvent ;
510import org .bukkit .event .entity .EntityDeathEvent ;
11+ import org .bukkit .event .player .PlayerHarvestBlockEvent ;
612import org .jetbrains .annotations .Nullable ;
713
814import ch .njol .skript .Skript ;
9- import ch .njol .skript .doc .Description ;
10- import ch .njol .skript .doc .Events ;
11- import ch .njol .skript .doc .Examples ;
12- import ch .njol .skript .doc .Name ;
13- import ch .njol .skript .doc .RequiredPlugins ;
14- import ch .njol .skript .doc .Since ;
1515import ch .njol .skript .lang .Effect ;
1616import ch .njol .skript .lang .Expression ;
1717import ch .njol .skript .lang .SkriptParser .ParseResult ;
1818import ch .njol .util .Kleenean ;
1919
2020@ Name ("Cancel Drops" )
21- @ Description ("Cancels drops of items or experiences in a death or block break event. " +
22- "Please note that this doesn't keep items or experiences of a dead player. If you want to do that, " +
23- "use the <a href='effects.html#EffKeepInventory'>Keep Inventory / Experience</a> effect." )
24- @ Examples ({"on death of a zombie:" ,
25- "\t if name of the entity is \" &cSpecial\" :" ,
26- "\t \t cancel drops of items" ,
27- "" ,
28- "on break of a coal ore:" ,
29- "\t cancel the experience drops" })
30- @ Since ("2.4" )
21+ @ Description ({
22+ "Cancels drops of items in a death, block break, block drop, and block harvest events." ,
23+ "The dropped experience can be cancelled in a death and block break events." ,
24+ "Please note that using this in a death event doesn't keep items or experience of a dead player. If you want to do that, "
25+ + "use the <a href='effects.html#EffKeepInventory'>Keep Inventory / Experience</a> effect."
26+ })
27+ @ Example ("""
28+ on death of a zombie:
29+ if name of the entity is "&cSpecial":
30+ cancel drops of items
31+ """ )
32+ @ Example ("""
33+ on break of a coal ore:
34+ cancel the experience drops
35+ """ )
36+ @ Example ("""
37+ on player block harvest:
38+ cancel the item drops
39+ """ )
40+ @ Since ("2.4, INSERT VERSION (harvest event)" )
3141@ RequiredPlugins ("1.12.2 or newer (cancelling item drops of blocks)" )
32- @ Events ({"death" , "break / mine" })
33- public class EffCancelDrops extends Effect {
34-
35- private static final boolean CAN_CANCEL_BLOCK_ITEM_DROPS = Skript .methodExists (BlockBreakEvent .class , "setDropItems" , boolean .class );
42+ @ Events ({"death" , "break / mine" , "block drop" , "harvest" })
43+ public class EffCancelDrops extends Effect implements EventRestrictedSyntax {
3644
3745 static {
3846 Skript .registerEffect (EffCancelDrops .class ,
39- "(cancel|clear|delete) [the] drops [of (1¦ items|2¦ [e]xp[erience][s])]" ,
40- "(cancel|clear|delete) [the] (1¦ item|2¦ [e]xp[erience]) drops" );
47+ "(cancel|clear|delete) [the] drops [of (items:items|xp: [e]xp[erience][s])]" ,
48+ "(cancel|clear|delete) [the] (items: item|xp: [e]xp[erience]) drops" );
4149 }
4250
4351 private boolean cancelItems , cancelExps ;
4452
4553 @ Override
4654 public boolean init (Expression <?>[] exprs , int matchedPattern , Kleenean isDelayed , ParseResult parseResult ) {
47- cancelItems = parseResult .mark == 0 || parseResult .mark == 1 ;
48- cancelExps = parseResult .mark == 0 || parseResult .mark == 2 ;
49- if (getParser ().isCurrentEvent (BlockBreakEvent .class )) {
50- if (cancelItems && !CAN_CANCEL_BLOCK_ITEM_DROPS ) {
51- Skript .error ("Cancelling drops of items in a block break event requires Minecraft 1.12 or newer" );
52- return false ;
53- }
54- } else if (!getParser ().isCurrentEvent (EntityDeathEvent .class )) {
55- Skript .error ("The cancel drops effect can't be used outside of a death" +
56- (CAN_CANCEL_BLOCK_ITEM_DROPS ? " or block break" : "" ) + " event" );
57- return false ;
58- }
55+ cancelItems = !parseResult .hasTag ("xp" );
56+ cancelExps = !parseResult .hasTag ("items" );
5957 if (isDelayed .isTrue ()) {
6058 Skript .error ("Can't cancel the drops anymore after the event has already passed" );
6159 return false ;
@@ -64,24 +62,31 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
6462 }
6563
6664 @ Override
67- protected void execute (Event e ) {
68- if (e instanceof EntityDeathEvent ) {
69- EntityDeathEvent event = (EntityDeathEvent ) e ;
65+ public Class <? extends Event >[] supportedEvents () {
66+ return CollectionUtils .array (EntityDeathEvent .class , BlockBreakEvent .class , BlockDropItemEvent .class , PlayerHarvestBlockEvent .class );
67+ }
68+
69+ @ Override
70+ protected void execute (Event event ) {
71+ if (event instanceof EntityDeathEvent deathEvent ) {
7072 if (cancelItems )
71- event .getDrops ().clear ();
73+ deathEvent .getDrops ().clear ();
7274 if (cancelExps )
73- event .setDroppedExp (0 );
74- } else if (e instanceof BlockBreakEvent ) {
75- BlockBreakEvent event = (BlockBreakEvent ) e ;
75+ deathEvent .setDroppedExp (0 );
76+ } else if (event instanceof BlockBreakEvent breakEvent ) {
7677 if (cancelItems )
77- event .setDropItems (false );
78+ breakEvent .setDropItems (false );
7879 if (cancelExps )
79- event .setExpToDrop (0 );
80+ breakEvent .setExpToDrop (0 );
81+ } else if (event instanceof BlockDropItemEvent dropItemEvent ) {
82+ dropItemEvent .getItems ().forEach (Item ::remove );
83+ } else if (event instanceof PlayerHarvestBlockEvent harvestBlockEvent ) {
84+ harvestBlockEvent .getItemsHarvested ().clear ();
8085 }
8186 }
8287
8388 @ Override
84- public String toString (@ Nullable Event e , boolean debug ) {
89+ public String toString (@ Nullable Event event , boolean debug ) {
8590 if (cancelItems && !cancelExps )
8691 return "cancel the drops of items" ;
8792 else if (cancelExps && !cancelItems )
0 commit comments