From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: AlphaKR93 Date: Fri, 13 Dec 2024 11:14:49 +0900 Subject: [PATCH] Add option to allow shoot fireball diff --git a/src/main/java/net/minecraft/world/item/FireChargeItem.java b/src/main/java/net/minecraft/world/item/FireChargeItem.java index 641eb27097740219199ce61ed3e6aa5f42a51b1c..f51be1746fc649d636bc9e3ae451d18e35a04026 100644 --- a/src/main/java/net/minecraft/world/item/FireChargeItem.java +++ b/src/main/java/net/minecraft/world/item/FireChargeItem.java @@ -30,6 +30,58 @@ public class FireChargeItem extends Item implements ProjectileItem { super(settings); } + // Plazma start - Option to shoot fireballs + @Override + public InteractionResult use(Level world, Player user, net.minecraft.world.InteractionHand hand) { + if (!(world instanceof net.minecraft.server.level.ServerLevel level) || !world.plazmaConfig().item.shootableFireCharge.enabled) { + super.use(world, user, hand); + return InteractionResult.PASS; + } + + Vec3 vec = user.getDirection().getUnitVec3().multiply(10, 10, 10); + net.minecraft.world.entity.projectile.AbstractHurtingProjectile fireball = switch(world.plazmaConfig().item.shootableFireCharge.shootType) { + case SMALL_FIREBALL -> new SmallFireball(world, user, vec); + case LARGE_FIREBALL -> new net.minecraft.world.entity.projectile.LargeFireball(world, user, vec, world.plazmaConfig().item.shootableFireCharge.explosionPower); + case DRAGON_FIREBALL -> new net.minecraft.world.entity.projectile.DragonFireball(world, user, vec); + case WITHER_SKULL -> new net.minecraft.world.entity.projectile.WitherSkull(world, user, vec); + }; + + ItemStack itemStack = user.getItemInHand(hand); + net.minecraft.world.entity.projectile.Projectile.Delayed delayed; + delayed = net.minecraft.world.entity.projectile.Projectile.spawnProjectileDelayed( + fireball, + level, + itemStack, + projectile -> { + projectile.setPos(user.getX(), user.getEyeY() - 0.10000000149011612D, user.getZ()); + projectile.shootFromRotation(user, user.getXRot(), user.getYRot(), world.plazmaConfig().item.shootableFireCharge.shootRoll, world.plazmaConfig().item.shootableFireCharge.shootPower, world.plazmaConfig().item.shootableFireCharge.shootOffset); + if (!(projectile instanceof net.minecraft.world.entity.projectile.Fireball ball)) return; + ball.setItem(itemStack); + } + ); + + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event; + event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent( + (org.bukkit.entity.Player) user.getBukkitEntity(), + org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), + (org.bukkit.entity.Projectile) delayed.projectile().getBukkitEntity() + ); + + if (event.callEvent() && delayed.attemptSpawn(org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.FIRE_CHARGE)) { + user.awardStat(net.minecraft.stats.Stats.ITEM_USED.get(this)); + + if (event.shouldConsume()) itemStack.consume(1, user); + else if (user instanceof net.minecraft.server.level.ServerPlayer) ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); + + world.playSound(null, user.getX(), user.getY(), user.getZ(), SoundEvents.FIRECHARGE_USE, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); + return InteractionResult.SUCCESS; + } + + if (user instanceof net.minecraft.server.level.ServerPlayer) ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); + return InteractionResult.FAIL; + } + // Plazma end - Option to shoot fireballs + @Override public InteractionResult useOn(UseOnContext context) { Level world = context.getLevel(); diff --git a/src/main/java/org/plazmamc/plazma/configurations/RemovedConfigurations.java b/src/main/java/org/plazmamc/plazma/configurations/RemovedConfigurations.java index ac0f038de0ce5cf6df0b730af69d3229c3119eff..ba3331a81002304187318ed32fec2dd31e4c23ee 100644 --- a/src/main/java/org/plazmamc/plazma/configurations/RemovedConfigurations.java +++ b/src/main/java/org/plazmamc/plazma/configurations/RemovedConfigurations.java @@ -7,7 +7,8 @@ import static org.spongepowered.configurate.NodePath.path; interface RemovedConfigurations { NodePath[] WORLD_PATHS = { - path("structure", "nether-portal") + path("structure", "nether-portal"), + path("item", "allow-shoot-fireballs") }; NodePath[] GLOBAL_PATHS = { diff --git a/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java b/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java index c1d4a96cf5be77f4460c54ed19622f527d42ca06..bbb51ccf2016987202811ee893f855da2612dd17 100644 --- a/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java +++ b/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java @@ -86,6 +86,25 @@ public class WorldConfigurations extends ConfigurationPart { public Item item; public class Item extends ConfigurationPart { + public ShootableFireCharge shootableFireCharge; + public class ShootableFireCharge extends ConfigurationPart { + + public boolean enabled = false; + public ShootType shootType = ShootType.SMALL_FIREBALL; + public int explosionPower = 1; + + public float shootRoll = 0.0f; + public float shootPower = 1.5f; + public float shootOffset = 1.0f; + + public enum ShootType { + SMALL_FIREBALL, + LARGE_FIREBALL, + DRAGON_FIREBALL, + WITHER_SKULL + } + + } }