Skip to content

Commit f8e564e

Browse files
committed
Add dispenser place and lit firework mode
1 parent ab98abe commit f8e564e

File tree

5 files changed

+93
-4
lines changed

5 files changed

+93
-4
lines changed

src/main/java/de/fanta/fancyfirework/FancyFirework.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public final class FancyFirework extends JavaPlugin {
3535
private WorldGuardHelper worldGuardHelper;
3636
private long time;
3737
private boolean redstonemode;
38+
private boolean dispenserMode;
39+
private int dispenserDelaSeconds;
3840

3941
private boolean disableFireWorkUse = false;
4042

@@ -132,7 +134,9 @@ public void reloadFireworkConfig() {
132134
public void loadConfig() {
133135
FileConfiguration cfg = getConfig();
134136
cfg.options().copyDefaults(true);
135-
redstonemode = cfg.getBoolean("redstonemode");
137+
redstonemode = cfg.getBoolean("redstonemode", false);
138+
dispenserMode = cfg.getBoolean("dispenserMode", true);
139+
dispenserDelaSeconds = cfg.getInt("dispenserDelaSeconds", 30);
136140

137141
//AFK
138142
AFKListener.maxIdleTime = Math.max(plugin.getConfig().getInt("maxAFKTime"), 2) * 1000;
@@ -142,6 +146,14 @@ public boolean isRedstonemode() {
142146
return redstonemode;
143147
}
144148

149+
public boolean isDispenserMode() {
150+
return dispenserMode;
151+
}
152+
153+
public int getDispenserDelaSeconds() {
154+
return dispenserDelaSeconds;
155+
}
156+
145157
public boolean isDisableFireWorkUse() {
146158
return disableFireWorkUse;
147159
}

src/main/java/de/fanta/fancyfirework/fireworks/BlockFireWork.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
* There are a couple of methods that will be called on interactions or updates.
3131
* <ul>
3232
* <li>{@link #onPlace(Block, ArmorStand, Player)} - Called when a player places the firework.</li>
33+
* <li>{@link #onDispenserPlace(Block, ArmorStand)} Called when a dispenser places the firework.</li>
3334
* <li>{@link #onLit(Entity, Player)} - Called when the firework is lit by a player using flint and steel.</li>
3435
* <li>{@link #onTick(Task, boolean)} - Called when a task of this firework executes a tick.</li>
3536
* </ul>
@@ -51,6 +52,14 @@ protected BlockFireWork(NamespacedKey key) {
5152
*/
5253
public abstract void onPlace(Block block, ArmorStand stand, Player player);
5354

55+
/**
56+
* Called when a dispenser places the firework.
57+
*
58+
* @param block The placed block.
59+
* @param stand The spawned ArmorStand of the firework.
60+
*/
61+
public abstract void onDispenserPlace(Block block, ArmorStand stand);
62+
5463
/**
5564
* Called when the firework is lit by a player using flint and steel.
5665
*
@@ -228,7 +237,6 @@ public void start() {
228237
* This removes the entity from the world!
229238
*/
230239
public void stop() {
231-
Bukkit.getLogger().info("Tick Stop");
232240
Entity entity = getEntity();
233241

234242
if (cancellableTask != null) {

src/main/java/de/fanta/fancyfirework/fireworks/defaults/FireWorkBattery.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public void onPlace(Block block, ArmorStand stand, Player player) {
3737
//Nothing
3838
}
3939

40+
@Override
41+
public void onDispenserPlace(Block block, ArmorStand stand) {
42+
//Nothing
43+
}
44+
4045
@Override
4146
public void onLit(Entity entity, Player player) {
4247
entity.getWorld().playSound(entity.getLocation(), Sound.ENTITY_CREEPER_PRIMED, SoundCategory.AMBIENT, 1f, 1f);

src/main/java/de/fanta/fancyfirework/listners/FireworkListener.java

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
import org.bukkit.block.Block;
1919
import org.bukkit.block.BlockFace;
2020
import org.bukkit.block.DoubleChest;
21-
import org.bukkit.damage.DamageSource;
22-
import org.bukkit.damage.DamageType;
21+
import org.bukkit.block.data.Directional;
2322
import org.bukkit.enchantments.Enchantment;
2423
import org.bukkit.entity.ArmorStand;
2524
import org.bukkit.entity.Entity;
@@ -31,6 +30,7 @@
3130
import org.bukkit.event.EventPriority;
3231
import org.bukkit.event.Listener;
3332
import org.bukkit.event.block.Action;
33+
import org.bukkit.event.block.BlockDispenseEvent;
3434
import org.bukkit.event.block.BlockPlaceEvent;
3535
import org.bukkit.event.block.BlockRedstoneEvent;
3636
import org.bukkit.event.entity.EntityDamageByEntityEvent;
@@ -49,22 +49,27 @@
4949
import org.bukkit.event.player.PlayerQuitEvent;
5050
import org.bukkit.inventory.BlockInventoryHolder;
5151
import org.bukkit.inventory.EquipmentSlot;
52+
import org.bukkit.inventory.Inventory;
5253
import org.bukkit.inventory.InventoryHolder;
5354
import org.bukkit.inventory.ItemStack;
5455
import org.bukkit.inventory.MerchantRecipe;
5556
import org.bukkit.inventory.PlayerInventory;
5657
import org.bukkit.inventory.meta.Damageable;
5758
import org.bukkit.inventory.meta.ItemMeta;
59+
import org.bukkit.util.BlockVector;
5860

5961
import java.util.ArrayList;
6062
import java.util.Collection;
6163
import java.util.List;
6264
import java.util.Random;
65+
import java.util.concurrent.ConcurrentHashMap;
6366

6467
public class FireworkListener implements Listener {
6568

6669
private final FancyFirework plugin = FancyFirework.getPlugin();
6770

71+
private final ConcurrentHashMap<BlockVector, Long> dispenserPlaceTimes = new ConcurrentHashMap<>();
72+
6873
@EventHandler
6974
public void onFireworkExplode(FireworkExplodeEvent e) {
7075
Firework entity = e.getEntity();
@@ -104,6 +109,63 @@ public void onFireWorkPlace(BlockPlaceEvent event) {
104109
}
105110
}
106111

112+
@EventHandler
113+
public void onFireWorkPlaceByDispenser(BlockDispenseEvent event) {
114+
if (!plugin.isDispenserMode()) {
115+
return;
116+
}
117+
118+
ItemStack stack = event.getItem();
119+
AbstractFireWork fireWork = plugin.getRegistry().getByItemStack(stack);
120+
if (!(fireWork instanceof BlockFireWork blockFireWork)) {
121+
return;
122+
}
123+
124+
if (plugin.isDisableFireWorkUse()) {
125+
return;
126+
}
127+
128+
Block block = event.getBlock();
129+
if (!(block.getState() instanceof org.bukkit.block.Dispenser dispenser)) {
130+
return;
131+
}
132+
event.setCancelled(true);
133+
134+
plugin.getScheduler().runLocalDelayed(event.getBlock().getLocation(), () -> {
135+
BlockVector blockVector = block.getLocation().toVector().toBlockVector();
136+
long lastPlaceTime = dispenserPlaceTimes.getOrDefault(blockVector, 0L);
137+
138+
if (System.currentTimeMillis() - lastPlaceTime < (plugin.getDispenserDelaSeconds() * 1000L)) {
139+
return;
140+
}
141+
dispenserPlaceTimes.remove(blockVector);
142+
143+
Inventory dispenserInventory = dispenser.getInventory();
144+
for (int i = 0; i < dispenserInventory.getSize(); i++) {
145+
ItemStack item = dispenserInventory.getItem(i);
146+
147+
if (item != null && item.isSimilar(stack)) {
148+
if (item.getAmount() > 1) {
149+
item.setAmount(item.getAmount() - 1);
150+
dispenserInventory.setItem(i, item);
151+
} else {
152+
dispenserInventory.setItem(i, null);
153+
}
154+
break;
155+
}
156+
}
157+
158+
//Spawn and lit firework
159+
if (block.getBlockData() instanceof Directional directional) {
160+
Block placeBlock = block.getRelative(directional.getFacing());
161+
ArmorStand armorStand = blockFireWork.spawnAtBlock(placeBlock.getRelative(BlockFace.DOWN));
162+
blockFireWork.onDispenserPlace(placeBlock, armorStand);
163+
blockFireWork.onLit(armorStand, null);
164+
dispenserPlaceTimes.put(blockVector, System.currentTimeMillis());
165+
}
166+
}, 1L);
167+
}
168+
107169
@EventHandler(priority = EventPriority.LOW)
108170
public void onInteract(PlayerInteractAtEntityEvent event) {
109171
Entity entity = event.getRightClicked();

src/main/resources/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ enabled: false
22
spawnrate: 100
33
votereward: false
44
redstonemode: false
5+
dispenserMode: true
6+
dispenserDelaSeconds: 30
57
litplayer: true
68
#after X seconds the player is afk (default: 120 Sec = 2 Min
79
maxAFKTime: 120

0 commit comments

Comments
 (0)