114 lines
6.0 KiB
Diff
114 lines
6.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: AlphaKR93 <dev@alpha93.kr>
|
|
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<net.minecraft.world.entity.projectile.AbstractHurtingProjectile> 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
|
|
+ }
|
|
+
|
|
+ }
|
|
|
|
}
|
|
|