diff --git a/src/main/java/io/github/pylonmc/pylon/PylonConfig.java b/src/main/java/io/github/pylonmc/pylon/PylonConfig.java index e72ba650c..18e2ac65f 100644 --- a/src/main/java/io/github/pylonmc/pylon/PylonConfig.java +++ b/src/main/java/io/github/pylonmc/pylon/PylonConfig.java @@ -2,6 +2,7 @@ import io.github.pylonmc.rebar.config.Config; import io.github.pylonmc.rebar.config.adapter.ConfigAdapter; +import io.github.pylonmc.rebar.util.RandomizedSound; public final class PylonConfig { @@ -9,6 +10,10 @@ public final class PylonConfig { private static final Config config = new Config(Pylon.getInstance(), "config.yml"); public static final double RUNE_CHECK_RANGE = config.getOrThrow("rune-check-range", ConfigAdapter.DOUBLE); public static final long DEFAULT_TALISMAN_TICK_INTERVAL = config.getOrThrow("default-talisman-tick-interval", ConfigAdapter.LONG); + public static final RandomizedSound BARTERING_TALISMAN_TRIGGER_SOUND = config.getOrThrow("talismans.bartering-trigger-sound", ConfigAdapter.RANDOMIZED_SOUND); + public static final RandomizedSound ENCHANTING_TALISMAN_TRIGGER_SOUND = config.getOrThrow("talismans.enchanting-trigger-sound", ConfigAdapter.RANDOMIZED_SOUND); + public static final RandomizedSound FARMING_TALISMAN_TRIGGER_SOUND = config.getOrThrow("talismans.farming-trigger-sound", ConfigAdapter.RANDOMIZED_SOUND); + public static final RandomizedSound HUNTING_TALISMAN_TRIGGER_SOUND = config.getOrThrow("talismans.hunting-trigger-sound", ConfigAdapter.RANDOMIZED_SOUND); private PylonConfig() {} } diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBreaker.java b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBreaker.java index 633795e5b..cbe68951f 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBreaker.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBreaker.java @@ -23,7 +23,6 @@ import io.github.pylonmc.rebar.util.gui.unit.UnitFormat; import io.github.pylonmc.rebar.util.position.ChunkPosition; import io.github.pylonmc.rebar.waila.WailaDisplay; -import io.papermc.paper.datacomponent.DataComponentTypes; import io.papermc.paper.event.block.BlockBreakBlockEvent; import io.papermc.paper.event.block.BlockPreDispenseEvent; import net.kyori.adventure.text.Component; @@ -179,10 +178,11 @@ public void tick() { .count(0) .extra(0.05) .spawn(); - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) + .extra(0.05) .location(getBlock().getLocation().toCenterLocation().add(0, 0.6, 0)) - .data(drilling.getBlockData()) + .data(new ItemStack(drilling.getType())) .spawn(); } diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBrickMolder.java b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBrickMolder.java index 1ec69244c..678ca9434 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBrickMolder.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselBrickMolder.java @@ -171,10 +171,11 @@ public void tick() { .count(0) .extra(0.05) .spawn(); - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) + .extra(0.05) .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) - .data(getHeldEntityOrThrow(ItemDisplay.class, "item").getItemStack().getType().createBlockData()) + .data(getHeldEntityOrThrow(ItemDisplay.class, "item").getItemStack()) .spawn(); } diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselHammerHead.java b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselHammerHead.java index 6b83dc952..c1bc380f5 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselHammerHead.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselHammerHead.java @@ -286,4 +286,4 @@ public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreak public @NotNull Map getVirtualInventories() { return Map.of("hammer", hammerInventory); } -} +} \ No newline at end of file diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselTableSaw.java b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselTableSaw.java index 36914dfc2..6d7d74f11 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/diesel/machines/DieselTableSaw.java @@ -174,10 +174,11 @@ public void tick() { .count(0) .extra(0.05) .spawn(); - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) + .extra(0.05) .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) - .data(getCurrentRecipe().particleData()) + .data(getCurrentRecipe().particleItem()) .spawn(); progressRecipe(tickInterval); } diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicBreaker.java b/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicBreaker.java index 6a6906aa8..821ace654 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicBreaker.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicBreaker.java @@ -22,7 +22,6 @@ import io.github.pylonmc.rebar.util.gui.unit.UnitFormat; import io.github.pylonmc.rebar.util.position.ChunkPosition; import io.github.pylonmc.rebar.waila.WailaDisplay; -import io.papermc.paper.datacomponent.DataComponentTypes; import io.papermc.paper.event.block.BlockBreakBlockEvent; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; @@ -167,10 +166,11 @@ public void tick() { progressProcess(tickInterval); Block drilling = getBlock().getRelative(getFacing()); - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) + .extra(0.05) .location(getBlock().getLocation().toCenterLocation().add(0, 0.6, 0)) - .data(drilling.getBlockData()) + .data(new ItemStack(drilling.getType())) .spawn(); } diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicPipeBender.java b/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicPipeBender.java index 8f900418e..ac3817786 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicPipeBender.java @@ -180,10 +180,11 @@ public void tick() { } if (isProcessingRecipe()) { - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) + .extra(0.05) .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) - .data(getCurrentRecipe().particleData()) + .data(getCurrentRecipe().particleItem()) .spawn(); removeFluid(PylonFluids.HYDRAULIC_FLUID, hydraulicFluidToConsume); addFluid(PylonFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidToConsume); diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicTableSaw.java b/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicTableSaw.java index 0edf73e8f..6a19c0ab9 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/hydraulics/HydraulicTableSaw.java @@ -150,10 +150,11 @@ public void tick() { } if (isProcessingRecipe()) { - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) + .extra(0.05) .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) - .data(getCurrentRecipe().particleData()) + .data(getCurrentRecipe().particleItem()) .spawn(); removeFluid(PylonFluids.HYDRAULIC_FLUID, hydraulicFluidToConsume); addFluid(PylonFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidToConsume); diff --git a/src/main/java/io/github/pylonmc/pylon/content/machines/simple/CoreDrill.java b/src/main/java/io/github/pylonmc/pylon/content/machines/simple/CoreDrill.java index f5b70d7f7..719ef8a87 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/machines/simple/CoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/content/machines/simple/CoreDrill.java @@ -34,7 +34,6 @@ import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; -import java.time.Duration; import java.util.List; public abstract class CoreDrill extends RebarBlock implements @@ -145,9 +144,10 @@ private void doRotationAnimation() { PylonUtils.animate(getDrillDisplay(), rotationDuration / 4, getDrillDisplayMatrix(rotation)); if (spawnBlockParticles) { - new ParticleBuilder(Particle.BLOCK) + new ParticleBuilder(Particle.ITEM) .count(5) - .data(getBlock().getRelative(BlockFace.DOWN, 3).getBlockData()) + .extra(0.05) + .data(new ItemStack(getBlock().getRelative(BlockFace.DOWN, 3).getType())) .location(getBlock() .getRelative(BlockFace.DOWN, 2) .getLocation() diff --git a/src/main/java/io/github/pylonmc/pylon/content/resources/IronBloom.java b/src/main/java/io/github/pylonmc/pylon/content/resources/IronBloom.java index 894d3498a..74b8a4f85 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/resources/IronBloom.java +++ b/src/main/java/io/github/pylonmc/pylon/content/resources/IronBloom.java @@ -94,8 +94,9 @@ public long getBaseTickInterval() { @Override public void onTick(@NotNull Player player) { - if (player.getInventory().getItemInMainHand().isSimilar(PylonItems.TONGS) || - player.getInventory().getItemInOffHand().isSimilar(PylonItems.TONGS)) { + if (getTemperature() == 0 + || player.getInventory().getItemInMainHand().isSimilar(PylonItems.TONGS) + || player.getInventory().getItemInOffHand().isSimilar(PylonItems.TONGS)) { return; } player.damage(UNPROTECTED_DAMAGE, DamageSource.builder(DamageType.HOT_FLOOR).build()); diff --git a/src/main/java/io/github/pylonmc/pylon/content/talismans/BarteringTalisman.java b/src/main/java/io/github/pylonmc/pylon/content/talismans/BarteringTalisman.java index 818196146..af99cf186 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/talismans/BarteringTalisman.java +++ b/src/main/java/io/github/pylonmc/pylon/content/talismans/BarteringTalisman.java @@ -1,5 +1,6 @@ package io.github.pylonmc.pylon.content.talismans; +import io.github.pylonmc.pylon.PylonConfig; import io.github.pylonmc.pylon.util.PylonUtils; import io.github.pylonmc.rebar.config.adapter.ConfigAdapter; import io.github.pylonmc.rebar.i18n.RebarArgument; @@ -68,6 +69,8 @@ public void onBarter(PiglinBarterEvent event) { Item item = event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), event.getInput().clone()); if (!new EntityDropItemEvent(event.getEntity(), item).callEvent()) { item.remove(); + } else { + item.getWorld().playSound(PylonConfig.BARTERING_TALISMAN_TRIGGER_SOUND.create(), item); } } } diff --git a/src/main/java/io/github/pylonmc/pylon/content/talismans/EnchantingTalisman.java b/src/main/java/io/github/pylonmc/pylon/content/talismans/EnchantingTalisman.java index 6a61254d4..a180f67d7 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/talismans/EnchantingTalisman.java +++ b/src/main/java/io/github/pylonmc/pylon/content/talismans/EnchantingTalisman.java @@ -1,5 +1,6 @@ package io.github.pylonmc.pylon.content.talismans; +import io.github.pylonmc.pylon.PylonConfig; import io.github.pylonmc.pylon.util.PylonUtils; import io.github.pylonmc.rebar.config.adapter.ConfigAdapter; import io.github.pylonmc.rebar.i18n.RebarArgument; @@ -107,6 +108,7 @@ public void onEnchant(EnchantItemEvent event) { return; } UUID itemId = UUID.fromString(itemIdStr); + Player player = event.getEnchanter(); for (Enchantment enchant : event.getEnchantsToAdd().keySet()) { // regenerate the seed used to set the offers and check the rng again Random randGen = new Random(etableView.getEnchantmentSeed() @@ -119,6 +121,7 @@ public void onEnchant(EnchantItemEvent event) { } // if the offer level was increased, then also increase the applied enchant event.getEnchantsToAdd().replace(enchant, Math.min(event.getEnchantsToAdd().get(enchant) + 1, enchant.getMaxLevel())); + player.playSound(PylonConfig.ENCHANTING_TALISMAN_TRIGGER_SOUND.create(), player); } } } diff --git a/src/main/java/io/github/pylonmc/pylon/content/talismans/ExperienceTalisman.java b/src/main/java/io/github/pylonmc/pylon/content/talismans/ExperienceTalisman.java index 9fdd501c3..2b6fbc94e 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/talismans/ExperienceTalisman.java +++ b/src/main/java/io/github/pylonmc/pylon/content/talismans/ExperienceTalisman.java @@ -52,7 +52,7 @@ public static class XPTalismanListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerGainXP(PlayerPickupExperienceEvent event){ Float xpMultiplier = event.getPlayer().getPersistentDataContainer().get(XP_MULTIPLIER_KEY, PersistentDataType.FLOAT); - if(xpMultiplier == null){ + if (xpMultiplier == null){ return; } event.getExperienceOrb().setExperience( diff --git a/src/main/java/io/github/pylonmc/pylon/content/talismans/FarmingTalisman.java b/src/main/java/io/github/pylonmc/pylon/content/talismans/FarmingTalisman.java index 41c1e37dc..2f25c08e9 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/talismans/FarmingTalisman.java +++ b/src/main/java/io/github/pylonmc/pylon/content/talismans/FarmingTalisman.java @@ -1,11 +1,15 @@ package io.github.pylonmc.pylon.content.talismans; +import io.github.pylonmc.pylon.PylonConfig; import io.github.pylonmc.pylon.util.PylonUtils; import io.github.pylonmc.rebar.config.adapter.ConfigAdapter; import io.github.pylonmc.rebar.i18n.RebarArgument; import io.github.pylonmc.rebar.util.gui.unit.UnitFormat; +import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.Tag; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.Ageable; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -53,18 +57,22 @@ public void removeEffect(@NotNull Player player) { public static class FarmingTalismanListener implements Listener { @EventHandler public void onBlockBreak(BlockDropItemEvent event) { - if (!event.getPlayer().getPersistentDataContainer().has(FARMING_TALISMAN_CHANCE_KEY)) { + BlockState block = event.getBlockState(); + Location loc = block.getLocation(); + if (!Tag.CROPS.isTagged(block.getType()) + || !event.getPlayer().getPersistentDataContainer().has(FARMING_TALISMAN_CHANCE_KEY) + || !(block.getBlockData() instanceof Ageable ageable) + || ageable.getAge() != ageable.getMaximumAge()) + { return; } List additionalDrops = new ArrayList<>(); for (Item drop : event.getItems()) { - if (!Tag.CROPS.isTagged(drop.getItemStack().getType())) { - continue; - } if (ThreadLocalRandom.current().nextFloat() > event.getPlayer().getPersistentDataContainer().get(FARMING_TALISMAN_CHANCE_KEY, PersistentDataType.FLOAT)) { continue; } additionalDrops.add(drop.getWorld().dropItem(drop.getLocation(), drop.getItemStack().clone())); + loc.getWorld().playSound(PylonConfig.FARMING_TALISMAN_TRIGGER_SOUND.create(), loc.getX(), loc.getY(), loc.getZ()); } event.getItems().addAll(additionalDrops); } diff --git a/src/main/java/io/github/pylonmc/pylon/content/talismans/HuntingTalisman.java b/src/main/java/io/github/pylonmc/pylon/content/talismans/HuntingTalisman.java index 980d2ea3d..5225f5ccb 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/talismans/HuntingTalisman.java +++ b/src/main/java/io/github/pylonmc/pylon/content/talismans/HuntingTalisman.java @@ -1,9 +1,11 @@ package io.github.pylonmc.pylon.content.talismans; +import io.github.pylonmc.pylon.PylonConfig; import io.github.pylonmc.pylon.util.PylonUtils; import io.github.pylonmc.rebar.config.adapter.ConfigAdapter; import io.github.pylonmc.rebar.i18n.RebarArgument; import io.github.pylonmc.rebar.util.gui.unit.UnitFormat; +import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -65,6 +67,7 @@ public void onEntityDeath(EntityDeathEvent event) { if (event.getEntity().getType() == EntityType.PLAYER) { return; } + Location source = event.getEntity().getLocation(); @SuppressWarnings("DataFlowIssue") double chanceForExtraItem = player.getPersistentDataContainer().get(HUNTING_TALISMAN_BONUS_KEY, PersistentDataType.DOUBLE); for (ItemStack drop : event.getDrops()) { @@ -75,6 +78,7 @@ public void onEntityDeath(EntityDeathEvent event) { continue; } drop.setAmount(drop.getAmount() + 1); + source.getWorld().playSound(PylonConfig.HUNTING_TALISMAN_TRIGGER_SOUND.create(), source.getX(), source.getY(), source.getZ()); } } } diff --git a/src/main/java/io/github/pylonmc/pylon/content/tools/Hammer.java b/src/main/java/io/github/pylonmc/pylon/content/tools/Hammer.java index 10e8f140e..5dc2ac344 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/tools/Hammer.java +++ b/src/main/java/io/github/pylonmc/pylon/content/tools/Hammer.java @@ -273,4 +273,4 @@ private static MiningLevel getMiningLevel(@NotNull NamespacedKey key) { PylonKeys.DIAMOND_HAMMER, MiningLevel.DIAMOND ).get(key); } -} +} \ No newline at end of file diff --git a/src/main/java/io/github/pylonmc/pylon/content/tools/HydraulicCannon.java b/src/main/java/io/github/pylonmc/pylon/content/tools/HydraulicCannon.java index 9bc046e2c..0ee55100f 100644 --- a/src/main/java/io/github/pylonmc/pylon/content/tools/HydraulicCannon.java +++ b/src/main/java/io/github/pylonmc/pylon/content/tools/HydraulicCannon.java @@ -14,11 +14,15 @@ import io.github.pylonmc.rebar.event.api.annotation.MultiHandler; import io.github.pylonmc.rebar.i18n.RebarArgument; import io.github.pylonmc.rebar.item.RebarItem; +import io.github.pylonmc.rebar.item.RebarItemSchema; import io.github.pylonmc.rebar.item.base.RebarInteractor; +import io.github.pylonmc.rebar.util.RandomizedSound; import io.github.pylonmc.rebar.util.gui.unit.UnitFormat; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Particle; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; @@ -39,6 +43,7 @@ public class HydraulicCannon extends RebarItem implements RebarInteractor, Hydra private final Config settings = getSettings(); public final int cooldownTicks = settings.getOrThrow("cooldown-ticks", ConfigAdapter.INTEGER); + public final double recoilVelocity = settings.getOrThrow("recoil-velocity", ConfigAdapter.DOUBLE); public final double hydraulicFluidPerShot = settings.getOrThrow("hydraulic-fluid-per-shot", ConfigAdapter.DOUBLE); public final Material projectileMaterial = settings.getOrThrow("projectile.material", ConfigAdapter.MATERIAL); public final float projectileThickness = settings.getOrThrow("projectile.thickness", ConfigAdapter.FLOAT); @@ -47,6 +52,12 @@ public class HydraulicCannon extends RebarItem implements RebarInteractor, Hydra public final double projectileDamage = settings.getOrThrow("projectile.damage", ConfigAdapter.DOUBLE); public final int projectileTickInterval = settings.getOrThrow("projectile.tick-interval", ConfigAdapter.INTEGER); public final int projectileLifetimeTicks = settings.getOrThrow("projectile.lifetime-ticks", ConfigAdapter.INTEGER); + public final RandomizedSound sound = settings.getOrThrow("sound", ConfigAdapter.RANDOMIZED_SOUND); + public final RandomizedSound emptySound = settings.getOrThrow("empty-sound", ConfigAdapter.RANDOMIZED_SOUND); + public final RandomizedSound fullSound = settings.getOrThrow("full-sound", ConfigAdapter.RANDOMIZED_SOUND); + public final RandomizedSound noAmmoSound = settings.getOrThrow("no-ammo-sound", ConfigAdapter.RANDOMIZED_SOUND); + public final RandomizedSound hitSound = settings.getOrThrow("hit-sound", ConfigAdapter.RANDOMIZED_SOUND); + public final RandomizedSound playerHitSound = settings.getOrThrow("player-hit-sound", ConfigAdapter.RANDOMIZED_SOUND); @SuppressWarnings("unused") public HydraulicCannon(@NotNull ItemStack stack) { @@ -78,27 +89,41 @@ public HydraulicCannon(@NotNull ItemStack stack) { @Override @MultiHandler(priorities = { EventPriority.NORMAL, EventPriority.MONITOR }) public void onUsedToClick(@NotNull PlayerInteractEvent event, @NotNull EventPriority priority) { - if (!event.getAction().isRightClick() - || event.useItemInHand() == Event.Result.DENY - || getHydraulicFluid() < hydraulicFluidPerShot - || getDirtyHydraulicFluidSpace() < hydraulicFluidPerShot) { + Player player = event.getPlayer(); + Location source = player.getEyeLocation(); + if (!event.getAction().isRightClick() || event.useItemInHand() == Event.Result.DENY) { + return; + } + + if (priority == EventPriority.NORMAL) { + event.setUseInteractedBlock(Event.Result.DENY); + return; + } + + if (getHydraulicFluid() < hydraulicFluidPerShot) { + player.sendMessage(Component.translatable("pylon.message.hydraulic-cannon.empty")); + source.getWorld().playSound(emptySound.create(), source.getX(), source.getY(), source.getZ()); + return; + } + + if (getDirtyHydraulicFluidSpace() < hydraulicFluidPerShot) { + player.sendMessage(Component.translatable("pylon.message.hydraulic-cannon.full")); + source.getWorld().playSound(fullSound.create(), source.getX(), source.getY(), source.getZ()); return; } ItemStack projectile = null; for (ItemStack stack : event.getPlayer().getInventory()) { - if (PylonItems.TIN_PROJECTILE.isSimilar(stack)) { + RebarItemSchema schema = RebarItemSchema.fromStack(stack); + if (schema != null && schema.getKey().equals(PylonKeys.TIN_PROJECTILE)) { projectile = stack; break; } } if (projectile == null) { - return; - } - - if (priority == EventPriority.NORMAL) { - event.setUseInteractedBlock(Event.Result.DENY); + player.sendMessage(Component.translatable("pylon.message.hydraulic-cannon.no-ammo")); + source.getWorld().playSound(noAmmoSound.create(), source.getX(), source.getY(), source.getZ()); return; } @@ -106,11 +131,8 @@ public void onUsedToClick(@NotNull PlayerInteractEvent event, @NotNull EventPrio setHydraulicFluid(getHydraulicFluid() - hydraulicFluidPerShot); setDirtyHydraulicFluid(getDirtyHydraulicFluid() + hydraulicFluidPerShot); - Player player = event.getPlayer(); player.setCooldown(getStack(), cooldownTicks); Vector direction = player.getEyeLocation().getDirection(); - Location source = player.getEyeLocation() - .subtract(0, 0.5, 0); EntityStorage.add(new DisplayProjectile( player, projectileMaterial, @@ -121,8 +143,21 @@ public void onUsedToClick(@NotNull PlayerInteractEvent event, @NotNull EventPrio projectileSpeedBlocksPerSecond, projectileDamage, projectileTickInterval, - projectileLifetimeTicks + projectileLifetimeTicks, + hitSound.create(), + playerHitSound.create() )); + + player.getWorld().spawnParticle( + Particle.FLAME, + source.subtract(0, 0.4, 0).add(direction.clone().multiply(0.25)), + 6, + 0.3, 0.3, 0.3, + 0.01 + ); + + source.getWorld().playSound(sound.create(), source.getX(), source.getY(), source.getZ()); + player.setVelocity(player.getVelocity().subtract(direction.clone().multiply(recoilVelocity))); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/recipes/GrindstoneRecipe.java b/src/main/java/io/github/pylonmc/pylon/recipes/GrindstoneRecipe.java index 1e86b8d71..283814dd6 100644 --- a/src/main/java/io/github/pylonmc/pylon/recipes/GrindstoneRecipe.java +++ b/src/main/java/io/github/pylonmc/pylon/recipes/GrindstoneRecipe.java @@ -14,6 +14,7 @@ import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.NamespacedKey; +import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; @@ -29,7 +30,6 @@ * @param results the result items and their corresponding probabilities * (respects item amount) (maximum 9 items) * @param cycles the number of full rotations needed to complete the recipe - * @param particleBlockData the block data to use for the particles shown while grinding */ public record GrindstoneRecipe( @NotNull NamespacedKey key, diff --git a/src/main/java/io/github/pylonmc/pylon/recipes/PipeBendingRecipe.java b/src/main/java/io/github/pylonmc/pylon/recipes/PipeBendingRecipe.java index 2d7ca3bc1..cfff491bf 100644 --- a/src/main/java/io/github/pylonmc/pylon/recipes/PipeBendingRecipe.java +++ b/src/main/java/io/github/pylonmc/pylon/recipes/PipeBendingRecipe.java @@ -8,7 +8,6 @@ import io.github.pylonmc.rebar.recipe.*; import io.github.pylonmc.rebar.util.gui.GuiItems; import org.bukkit.NamespacedKey; -import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.invui.gui.Gui; @@ -20,14 +19,14 @@ /** * @param input the input item (respects amount) * @param result the output item (respects amount) - * @param particleData the block data to use for particles + * @param particleItem the item to use for particles * @param timeTicks the recipe time in ticks */ public record PipeBendingRecipe( @NotNull NamespacedKey key, @NotNull RecipeInput.Item input, @NotNull ItemStack result, - @NotNull BlockData particleData, + @NotNull ItemStack particleItem, int timeTicks ) implements RebarRecipe { @@ -43,7 +42,7 @@ public record PipeBendingRecipe( key, section.getOrThrow("input", ConfigAdapter.RECIPE_INPUT_ITEM), section.getOrThrow("result", ConfigAdapter.ITEM_STACK), - section.getOrThrow("particle-data", ConfigAdapter.BLOCK_DATA), + section.getOrThrow("particle-item", ConfigAdapter.ITEM_STACK), section.getOrThrow("time-ticks", ConfigAdapter.INTEGER) ); } diff --git a/src/main/java/io/github/pylonmc/pylon/recipes/TableSawRecipe.java b/src/main/java/io/github/pylonmc/pylon/recipes/TableSawRecipe.java index fc9749a22..5fc55934e 100644 --- a/src/main/java/io/github/pylonmc/pylon/recipes/TableSawRecipe.java +++ b/src/main/java/io/github/pylonmc/pylon/recipes/TableSawRecipe.java @@ -8,7 +8,6 @@ import io.github.pylonmc.rebar.recipe.*; import io.github.pylonmc.rebar.util.gui.GuiItems; import org.bukkit.NamespacedKey; -import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.invui.gui.Gui; @@ -20,14 +19,14 @@ /** * @param input the input item (respects amount) * @param result the output item (respects amount) - * @param particleData the block data to use for particles + * @param particleItem the item to use for particles * @param timeTicks the recipe time in ticks */ public record TableSawRecipe( @NotNull NamespacedKey key, @NotNull ItemStack input, @NotNull ItemStack result, - @NotNull BlockData particleData, + @NotNull ItemStack particleItem, int timeTicks ) implements RebarRecipe { @@ -43,7 +42,7 @@ public record TableSawRecipe( key, section.getOrThrow("input", ConfigAdapter.ITEM_STACK), section.getOrThrow("result", ConfigAdapter.ITEM_STACK), - section.getOrThrow("particle-data", ConfigAdapter.BLOCK_DATA), + section.getOrThrow("particle-item", ConfigAdapter.ITEM_STACK), section.getOrThrow("time-ticks", ConfigAdapter.INTEGER) ); } diff --git a/src/main/java/io/github/pylonmc/pylon/util/DisplayProjectile.java b/src/main/java/io/github/pylonmc/pylon/util/DisplayProjectile.java index 0a10bd7dd..8ca60456d 100644 --- a/src/main/java/io/github/pylonmc/pylon/util/DisplayProjectile.java +++ b/src/main/java/io/github/pylonmc/pylon/util/DisplayProjectile.java @@ -17,10 +17,12 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Vector3d; import java.util.List; import java.util.Optional; +import net.kyori.adventure.sound.Sound; public final class DisplayProjectile extends RebarEntity implements RebarTickingEntity { @@ -29,6 +31,8 @@ public final class DisplayProjectile extends RebarEntity implements private final double damage; private final Vector locationStep; private int remainingLifetimeTicks; + private final @Nullable Sound hitSound; + private final @Nullable Sound playerHitSound; public DisplayProjectile( Player player, @@ -40,7 +44,9 @@ public DisplayProjectile( float speedBlockPerSecond, double damage, int tickInterval, - int remainingLifetimeTicks + int remainingLifetimeTicks, + @Nullable Sound hitSound, + @Nullable Sound playerHitSound ) { super(PylonKeys.DISPLAY_PROJECTILE, new ItemDisplayBuilder() .transformation(new LineBuilder() @@ -57,6 +63,8 @@ public DisplayProjectile( this.damage = damage; this.locationStep = direction.clone().multiply(speedBlockPerSecond * tickInterval / 20.0); this.remainingLifetimeTicks = remainingLifetimeTicks; + this.hitSound = hitSound; + this.playerHitSound = playerHitSound; setTickInterval(tickInterval); getEntity().setPersistent(false); } @@ -106,8 +114,14 @@ public void tick() { damage ); if (event.callEvent()) { - hitEntity.damage(damage); + hitEntity.damage(damage, player); hitEntity.setVelocity(locationStep.clone().normalize().multiply(0.2)); + if (hitSound != null) { + player.getWorld().playSound(hitSound, hitEntity); + } + if (hitEntity instanceof Player && playerHitSound != null) { + player.playSound(playerHitSound, player); + } } entity.remove(); }); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index db8324913..4b4d0b36b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,26 @@ rune-check-range: 1.75 # This number multiplied by the inventory ticker base rate in the core config.yml equals the update rate for talismans # eg if this is 4 and the inventory ticker base rate is 10, then talismans update every 40 ticks -default-talisman-tick-interval: 4 \ No newline at end of file +default-talisman-tick-interval: 4 + +talismans: + bartering-trigger-sound: + sound: minecraft:block.amethyst_block.resonate + source: neutral + volume: 1 + pitch: 1.5 + enchanting-trigger-sound: + sound: minecraft:block.beacon.power_select + source: player + volume: 0.5 + pitch: 2 + farming-trigger-sound: + sound: minecraft:block.gravel.break + source: block + volume: 1 + pitch: 1.1 + hunting-trigger-sound: + sound: minecraft:block.dispenser.dispense + source: player + volume: 0.5 + pitch: 2 \ No newline at end of file diff --git a/src/main/resources/lang/en.yml b/src/main/resources/lang/en.yml index 9a2c5c073..780b39d9f 100644 --- a/src/main/resources/lang/en.yml +++ b/src/main/resources/lang/en.yml @@ -763,8 +763,6 @@ item: refractory_bricks: name: "Refractory Bricks" lore: |- - Smeltery multiblock component - Bloomery multiblock component The cheapest and most basic smeltery component research_pack_1: @@ -822,13 +820,11 @@ item: smeltery_burner: name: "Smeltery Burner" lore: |- - Smeltery multiblock component Burns fuel to heat the smeltery diesel_smeltery_heater: name: "Diesel Smeltery Heater" lore: |- - Smeltery multiblock component Burns diesel to heat the smeltery Diesel usage: %diesel-usage% Diesel buffer: %diesel-buffer% @@ -854,19 +850,16 @@ item: smeltery_hopper: name: "Smeltery Hopper" lore: |- - Smeltery multiblock component Serves as item input for the smeltery smeltery_input_hatch: name: "Smeltery Input Hatch" lore: |- - Smeltery multiblock component Serves as fluid input for the smeltery smeltery_output_hatch: name: "Smeltery Output Hatch" lore: |- - Smeltery multiblock component Serves as fluid output for the smeltery soulbound_rune: @@ -1107,7 +1100,7 @@ item: Cycle duration: %cycle-duration% Purification efficiency: %purification-efficiency% Buffer: %buffer% - waila: "Manual Hydrualic Purifier | %input-bar% | %output-bar%" + waila: "Manual Hydraulic Purifier | %input-bar% | %output-bar%" solar_hydraulic_purifier_1: name: "Solar Hydraulic Purifier I" @@ -1287,35 +1280,30 @@ item: fluid_tank_casing_wood: name: "Wooden Fluid Tank Casing" lore: |- - Multiblock component Capacity: %capacity% Temperatures: %temperatures% fluid_tank_casing_copper: name: "Copper Fluid Tank Casing" lore: |- - Multiblock component Capacity: %capacity% Temperatures: %temperatures% fluid_tank_casing_tin: name: "Tin Fluid Tank Casing" lore: |- - Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% fluid_tank_casing_iron: name: "Iron Fluid Tank Casing" lore: |- - Fluid Tank component Capacity: %capacity% Temperatures: %temperatures% fluid_tank_casing_bronze: name: "Bronze Fluid Tank Casing" lore: |- - Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% @@ -1329,28 +1317,24 @@ item: fluid_tank_casing_igneous_composite: name: "Igneous Composite Fluid Tank Casing" lore: |- - Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% fluid_tank_casing_steel: name: "Steel Fluid Tank Casing" lore: |- - Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% fluid_tank_casing_palladium: name: "Palladium Fluid Tank Casing" lore: |- - Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% manual_core_drill_lever: name: "Manual Core Drill Lever" lore: |- - Manual Core Drill multiblock component Right click to cycle the attached core drill manual_core_drill: @@ -1401,6 +1385,7 @@ item: 1x 6x 12x + 2 or more Fluid Tank Casing waila: "Hydraulic Core Drill %duration_if_any%" waila_format: "| %duration%" @@ -1422,23 +1407,19 @@ item: 4x 9x 10x + 1 or more Fluid Tank Casing waila: "Diesel Core Drill %duration_if_any%" waila_format: "| %duration%" iron_support_beam: name: "Iron Support Beam" - lore: |- - Multiblock component steel_support_beam: name: "Steel Support Beam" - lore: |- - Multiblock component fluid_input_hatch: name: "Fluid Input Hatch" lore: |- - Multiblock component Acts as a fluid input for multiblock machines Requires a fluid casing above waila: "Fluid Input Hatch | %info%" @@ -1446,7 +1427,6 @@ item: fluid_output_hatch: name: "Fluid Output Hatch" lore: |- - Multiblock component Acts as a fluid output for multiblock machines Requires a fluid casing above waila: "Fluid Output Hatch | %info%" @@ -1454,14 +1434,12 @@ item: item_input_hatch: name: "Item Input Hatch" lore: |- - Multiblock component Acts as an item input for multiblock machines waila: "Item Input Hatch" item_output_hatch: name: "Item Output Hatch" lore: |- - Multiblock component Acts as an item output for multiblock machines waila: "Item Output Hatch" @@ -1760,17 +1738,14 @@ item: 4x 4x 31x + 1 or more Fluid Tank Casing waila: "Fermenter | %sugarcane-bar% %sugarcane-amount% sugarcane" reinforced_glass: name: "Reinforced Glass" - lore: |- - Multiblock component reinforced_glass_casing: name: "Reinforced Glass Casing" - lore: |- - Multiblock component biorefinery: name: "Biorefinery" @@ -1792,37 +1767,26 @@ item: 7x 2x 24x + 3 or more Fluid Tank Casing waila: "Biorefinery | %info%" bronze_foundation: name: "Bronze Foundation" - lore: |- - Multiblock component bronze_grating: name: "Bronze Grating" - lore: |- - Multiblock component reinforced_plating: name: "Reinforced Plating" - lore: |- - Multiblock component distillation_tower_ring: name: "Distillation Tower Ring" - lore: |- - Multiblock component smokestack_ring: name: "Smokestack Ring" - lore: |- - Multiblock component smokestack_cap: name: "Smokestack Cap" - lore: |- - Multiblock component cargo_duct: name: "Cargo Duct" @@ -2364,6 +2328,7 @@ item: 8x 8x 16x + 3 or more Fluid Tank Casing waila: "Palladium Condenser | %duration-if-any%" waila_format: "| %duration%" @@ -2847,6 +2812,10 @@ message: silo: empty: "Empty" not-empty: "%item% (%amount%/%capacity%)" + hydraulic-cannon: + empty: "The cannon is out of hydraulic fluid" + full: "The cannon is full with dirty hydraulic fluid" + no-ammo: "The cannon is out of ammunition" gui: fluid-selector-title: "Select Fluid" diff --git a/src/main/resources/recipes/pylon/pipe_bending.yml b/src/main/resources/recipes/pylon/pipe_bending.yml index 27275469e..babfb3e74 100644 --- a/src/main/resources/recipes/pylon/pipe_bending.yml +++ b/src/main/resources/recipes/pylon/pipe_bending.yml @@ -2,54 +2,54 @@ pylon:fluid_pipe_wood: input: "#minecraft:logs" result: pylon:fluid_pipe_wood: 4 - particle-data: minecraft:oak_log + particle-item: minecraft:oak_log time-ticks: 160 pylon:fluid_pipe_copper: input: minecraft:copper_block result: pylon:fluid_pipe_copper: 18 - particle-data: minecraft:copper_block + particle-item: minecraft:copper_block time-ticks: 360 pylon:fluid_pipe_tin: input: pylon:tin_block result: pylon:fluid_pipe_tin: 18 - particle-data: minecraft:iron_block + particle-item: minecraft:iron_block time-ticks: 360 pylon:fluid_pipe_bronze: input: pylon:bronze_block result: pylon:fluid_pipe_bronze: 18 - particle-data: minecraft:copper_block + particle-item: minecraft:copper_block time-ticks: 360 pylon:fluid_pipe_iron: input: minecraft:iron_block result: pylon:fluid_pipe_iron: 18 - particle-data: minecraft:iron_block + particle-item: minecraft:iron_block time-ticks: 360 pylon:fluid_pipe_steel: input: pylon:steel_block result: pylon:fluid_pipe_steel: 18 - particle-data: minecraft:netherite_block + particle-item: minecraft:netherite_block time-ticks: 360 pylon:fluid_pipe_igneous_composite: input: pylon:igneous_composite result: pylon:fluid_pipe_igneous_composite: 2 - particle-data: minecraft:obsidian + particle-item: minecraft:obsidian time-ticks: 40 pylon:fluid_pipe_palladium: input: pylon:palladium_block result: pylon:fluid_pipe_palladium: 18 - particle-data: minecraft:diamond_block + particle-item: minecraft:diamond_block time-ticks: 400 \ No newline at end of file diff --git a/src/main/resources/recipes/pylon/table_saw.yml b/src/main/resources/recipes/pylon/table_saw.yml index a6a4fece0..62b32a1e6 100644 --- a/src/main/resources/recipes/pylon/table_saw.yml +++ b/src/main/resources/recipes/pylon/table_saw.yml @@ -2,230 +2,230 @@ pylon:oak_planks: input: minecraft:oak_log result: minecraft:oak_planks: 6 - particle-data: minecraft:oak_log + particle-item: minecraft:oak_log time-ticks: 20 pylon:spruce_planks: input: minecraft:spruce_log result: minecraft:spruce_planks: 6 - particle-data: minecraft:spruce_log + particle-item: minecraft:spruce_log time-ticks: 20 pylon:birch_planks: input: minecraft:birch_log result: minecraft:birch_planks: 6 - particle-data: minecraft:birch_log + particle-item: minecraft:birch_log time-ticks: 20 pylon:jungle_planks: input: minecraft:jungle_log result: minecraft:jungle_planks: 6 - particle-data: minecraft:jungle_log + particle-item: minecraft:jungle_log time-ticks: 20 pylon:acacia_planks: input: minecraft:acacia_log result: minecraft:acacia_planks: 6 - particle-data: minecraft:acacia_log + particle-item: minecraft:acacia_log time-ticks: 20 pylon:dark_oak_planks: input: minecraft:dark_oak_log result: minecraft:dark_oak_planks: 6 - particle-data: minecraft:dark_oak_log + particle-item: minecraft:dark_oak_log time-ticks: 20 pylon:mangrove_planks: input: minecraft:mangrove_log result: minecraft:mangrove_planks: 6 - particle-data: minecraft:mangrove_log + particle-item: minecraft:mangrove_log time-ticks: 20 pylon:cherry_planks: input: minecraft:cherry_log result: minecraft:cherry_planks: 6 - particle-data: minecraft:cherry_log + particle-item: minecraft:cherry_log time-ticks: 20 pylon:crimson_planks: input: minecraft:crimson_stem result: minecraft:crimson_planks: 6 - particle-data: minecraft:crimson_stem + particle-item: minecraft:crimson_stem time-ticks: 20 pylon:warped_planks: input: minecraft:warped_stem result: minecraft:warped_planks: 6 - particle-data: minecraft:warped_stem + particle-item: minecraft:warped_stem time-ticks: 20 pylon:pale_oak_planks: input: minecraft:pale_oak_log result: minecraft:pale_oak_planks: 6 - particle-data: minecraft:pale_oak_log + particle-item: minecraft:pale_oak_log time-ticks: 20 pylon:oak_planks_from_wood: input: minecraft:oak_wood result: minecraft:oak_planks: 6 - particle-data: minecraft:oak_wood + particle-item: minecraft:oak_wood time-ticks: 20 pylon:spruce_planks_from_wood: input: minecraft:spruce_wood result: minecraft:spruce_planks: 6 - particle-data: minecraft:spruce_wood + particle-item: minecraft:spruce_wood time-ticks: 20 pylon:birch_planks_from_wood: input: minecraft:birch_wood result: minecraft:birch_planks: 6 - particle-data: minecraft:birch_wood + particle-item: minecraft:birch_wood time-ticks: 20 pylon:jungle_planks_from_wood: input: minecraft:jungle_wood result: minecraft:jungle_planks: 6 - particle-data: minecraft:jungle_wood + particle-item: minecraft:jungle_wood time-ticks: 20 pylon:acacia_planks_from_wood: input: minecraft:acacia_wood result: minecraft:acacia_planks: 6 - particle-data: minecraft:acacia_wood + particle-item: minecraft:acacia_wood time-ticks: 20 pylon:dark_oak_planks_from_wood: input: minecraft:dark_oak_wood result: minecraft:dark_oak_planks: 6 - particle-data: minecraft:dark_oak_wood + particle-item: minecraft:dark_oak_wood time-ticks: 20 pylon:mangrove_planks_from_wood: input: minecraft:mangrove_wood result: minecraft:mangrove_planks: 6 - particle-data: minecraft:mangrove_wood + particle-item: minecraft:mangrove_wood time-ticks: 20 pylon:cherry_planks_from_wood: input: minecraft:cherry_wood result: minecraft:cherry_planks: 6 - particle-data: minecraft:cherry_wood + particle-item: minecraft:cherry_wood time-ticks: 20 pylon:crimson_planks_from_hyphae: input: minecraft:crimson_hyphae result: minecraft:crimson_planks: 6 - particle-data: minecraft:crimson_hyphae + particle-item: minecraft:crimson_hyphae time-ticks: 20 pylon:warped_planks_from_hyphae: input: minecraft:warped_hyphae result: minecraft:warped_planks: 6 - particle-data: minecraft:warped_hyphae + particle-item: minecraft:warped_hyphae time-ticks: 20 pylon:pale_oak_planks_from_wood: input: minecraft:pale_oak_wood result: minecraft:pale_oak_planks: 6 - particle-data: minecraft:pale_oak_wood + particle-item: minecraft:pale_oak_wood time-ticks: 20 pylon:oak_sticks: input: minecraft:oak_planks result: minecraft:stick: 6 - particle-data: minecraft:oak_planks + particle-item: minecraft:oak_planks time-ticks: 20 pylon:spruce_sticks: input: minecraft:spruce_planks result: minecraft:stick: 6 - particle-data: minecraft:spruce_planks + particle-item: minecraft:spruce_planks time-ticks: 20 pylon:birch_sticks: input: minecraft:birch_planks result: minecraft:stick: 6 - particle-data: minecraft:birch_planks + particle-item: minecraft:birch_planks time-ticks: 20 pylon:jungle_sticks: input: minecraft:jungle_planks result: minecraft:stick: 6 - particle-data: minecraft:jungle_planks + particle-item: minecraft:jungle_planks time-ticks: 20 pylon:acacia_sticks: input: minecraft:acacia_planks result: minecraft:stick: 6 - particle-data: minecraft:acacia_planks + particle-item: minecraft:acacia_planks time-ticks: 20 pylon:dark_oak_sticks: input: minecraft:dark_oak_planks result: minecraft:stick: 6 - particle-data: minecraft:dark_oak_planks + particle-item: minecraft:dark_oak_planks time-ticks: 20 pylon:mangrove_sticks: input: minecraft:mangrove_planks result: minecraft:stick: 6 - particle-data: minecraft:mangrove_planks + particle-item: minecraft:mangrove_planks time-ticks: 20 pylon:cherry_sticks: input: minecraft:cherry_planks result: minecraft:stick: 6 - particle-data: minecraft:cherry_planks + particle-item: minecraft:cherry_planks time-ticks: 20 pylon:crimson_sticks: input: minecraft:crimson_planks result: minecraft:stick: 6 - particle-data: minecraft:crimson_planks + particle-item: minecraft:crimson_planks time-ticks: 20 pylon:warped_sticks: input: minecraft:warped_planks result: minecraft:stick: 6 - particle-data: minecraft:warped_planks + particle-item: minecraft:warped_planks time-ticks: 20 pylon:pale_oak_sticks: input: minecraft:pale_oak_planks result: minecraft:stick: 6 - particle-data: minecraft:pale_oak_planks + particle-item: minecraft:pale_oak_planks time-ticks: 20 diff --git a/src/main/resources/researches.yml b/src/main/resources/researches.yml index 54f639426..552500e31 100644 --- a/src/main/resources/researches.yml +++ b/src/main/resources/researches.yml @@ -694,4 +694,4 @@ creative_flight: item: pylon:flight_ring cost: 1000 unlocks: - - pylon:flight_ring + - pylon:flight_ring \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_cannon.yml b/src/main/resources/settings/hydraulic_cannon.yml index 8c0dbefe5..abb1a7cef 100644 --- a/src/main/resources/settings/hydraulic_cannon.yml +++ b/src/main/resources/settings/hydraulic_cannon.yml @@ -1,12 +1,43 @@ cooldown-ticks: 20 - +recoil-velocity: 0.25 hydraulic-fluid-per-shot: 40 projectile: - material: gray_concrete - thickness: 0.08 - length: 0.12 - speed-blocks-per-second: 24 - damage: 8 - tick-interval: 1 - lifetime-ticks: 100 \ No newline at end of file + material: gray_concrete + thickness: 0.08 + length: 0.12 + speed-blocks-per-second: 24 + damage: 8 + tick-interval: 1 + lifetime-ticks: 100 + +sound: + sound: minecraft:entity.generic.explode + source: player + volume: 0.5 + pitch: 2 +empty-sound: + sound: minecraft:block.piston.extend + source: player + volume: 0.5 + pitch: 2 +full-sound: + sound: minecraft:block.piston.contract + source: player + volume: 0.5 + pitch: 2 +no-ammo-sound: + sound: minecraft:block.anvil.land + source: player + volume: 0.5 + pitch: 2 +hit-sound: + sound: minecraft:block.netherite_block.hit + source: player + volume: 1.75 + pitch: 1 +player-hit-sound: + sound: minecraft:entity.arrow.hit_player + source: player + volume: 0.18 + pitch: 0.45 \ No newline at end of file