diff --git a/gradle.properties b/gradle.properties index 4f622b865..95018b8e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ group = org.purpurmc.purpur -version = 1.21.9-pre3-R0.1-SNAPSHOT +version = 1.21.9-pre4-R0.1-SNAPSHOT -mcVersion = 1.21.9-pre3 -paperCommit = e6f14832db9576c510901c23235dbb5948e94dc8 +mcVersion = 1.21.9-pre4 +paperCommit = 037179fa883eccb48e6676d69dea8ba0cfbbbbbe org.gradle.configuration-cache = true org.gradle.caching = true diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index f516f5b2b..39154b2ec 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -18,10 +18,10 @@ index aa87e93ade4c25a575e7861fef45b70c3e4e3aeb..c92ffd8b2fe4945ccd552eb54154b7be public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 82264fe70854c26150b9afc9109f14c49d78fe2f..c5aa594105b196731ab822d9c1e600fa62db3417 100644 +index bda13adaa9716ed70a7776202dfe58dba0538b8f..1d03d8e11513c59a1dfc2aa1965412cb7db88413 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1682,6 +1682,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - Add EntityMoveEvent serverLevel.updateLagCompensationTick(); // Paper - lag compensation net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers @@ -30,7 +30,7 @@ index 82264fe70854c26150b9afc9109f14c49d78fe2f..c5aa594105b196731ab822d9c1e600fa /* Drop global time updates if (this.tickCount % 20 == 0) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 99675de85425149da8603d0f0de1c3d529e082b0..3886b032e84fe549df7969443dba7a28574af320 100644 +index a54eb6e9c98523715164507023aebfb1e1e8696c..e524d80242ed6aac79854c43b68adef9b05473c8 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -224,6 +224,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -42,7 +42,7 @@ index 99675de85425149da8603d0f0de1c3d529e082b0..3886b032e84fe549df7969443dba7a28 @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index cc362e5a6afa88dcac5eb156af8235e4304a0104..b329ac34ff7fb9fa15daca26e0d2593e2db59a6f 100644 +index abdf441ee5ac0586afe7ca60066163e64fb6a5fc..b405e129cb2a5dba3ea4db29823e8f6964255f3b 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -774,6 +774,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -62,7 +62,7 @@ index cc362e5a6afa88dcac5eb156af8235e4304a0104..b329ac34ff7fb9fa15daca26e0d2593e private void updatePlayerAttributes() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e8028cec76d88822be6c80b38ebde0f35bd781dd..99671cd67df748feb3c2d8b0219619ede8b3dbe4 100644 +index 3c5c7006dc68377a97682b1e73e5b45cface045c..726f2d5471cf536b1ba042dcb7f0120f8526d1d5 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -2862,6 +2862,8 @@ public class ServerGamePacketListenerImpl @@ -75,7 +75,7 @@ index e8028cec76d88822be6c80b38ebde0f35bd781dd..99671cd67df748feb3c2d8b0219619ed if (itemType == Items.WATER_BUCKET && target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && resendData) { target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 18c9409c152468f3914939cad9145a094947eb6b..0dc4962cae6fa15b4cfbfa2938e271f5303cf2bb 100644 +index e7a2d579ab6b2eeacc34da01c8bb9f7c0d224221..ef77be60df1cf44088e684c21dbcaf3032bb3ad6 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3357,6 +3357,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -177,7 +177,7 @@ index f0c452ddc4b299a930de261722cc41a89aa78eeb..8e8ddab59de508c84c4182e105a11554 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 4a91c94d817c3fb9a8fda98eb448f2a6d44030d8..8ae8c9e2f0447634b2a4b0dc1662cd0feb00518f 100644 +index 59e6a2c3e1a02b8778fb31e49fdc19fa14594085..634c8ee07d27985743d2b8774ed923f0ff63dca2 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -239,9 +239,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin @@ -267,7 +267,7 @@ index 4a91c94d817c3fb9a8fda98eb448f2a6d44030d8..8ae8c9e2f0447634b2a4b0dc1662cd0f // Paper end - Add EntityMoveEvent if (this.level() instanceof ServerLevel serverLevel && this.isSensitiveToWater() && this.isInWaterOrRain()) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 8b84ca3de8f73cb3066c3b1df138ea85be2889cd..0ec11f0415bdb44d465c0e57c676eb73c8183be0 100644 +index 73c110a04f17141e6331d5c518780fc5122f2bc3..2bef2cd10447f41d5fc4c37eb574ce32fc2386ab 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -156,8 +156,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @@ -291,7 +291,7 @@ index 8b84ca3de8f73cb3066c3b1df138ea85be2889cd..0ec11f0415bdb44d465c0e57c676eb73 protected void usePlayerItem(Player player, InteractionHand hand, ItemStack stack) { @@ -1673,4 +1673,58 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - registration.register(DebugSubscriptions.BRAINS, () -> DebugBrainDump.takeBrainDump(serverLevel, this)); + registration.register(DebugSubscriptions.BRAINS, () -> DebugBrainDump.takeBrainDump(level, this)); } } + @@ -617,7 +617,7 @@ index b18765bb91b4015bef326663dbc8966945929996..0002e39e2670ad92849ccc0aada163b1 double d = this.wantedX - this.fish.getX(); double d1 = this.wantedY - this.fish.getY(); diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 8cd9159ea562d7a8d89d6b85a0e08b54676167f5..aa90ba822ad00283d0347977f42078120aec7913 100644 +index 924dbe3f82224ce4e68b9829c59586c2efda1781..3da697dfaef1880070ef61a3386adbf20d98e1a1 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java @@ -152,6 +152,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -4166,7 +4166,7 @@ index 4e34833ea5c71b817c9f42a58320fe100981ec93..19dcc657fd2a995638d5e23c2b043d01 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index 4eb35a7a2dfcb4803c00e1e9179fea8186b15d41..028ec7c90e710182717ccd04ea7fb25042331dfd 100644 +index 2661c73bb09e885d68ed57cbbeb9611fb990669e..bb7f93435168da4023ee07585e92192717881acc 100644 --- a/net/minecraft/world/entity/monster/Skeleton.java +++ b/net/minecraft/world/entity/monster/Skeleton.java @@ -25,6 +25,23 @@ public class Skeleton extends AbstractSkeleton { @@ -4719,7 +4719,7 @@ index e320d34b8fb1e34408eff9f5be4e2e5b67c82942..e63328db6af1e2a52c9ebfeefbceda1a } diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index b1a017dd4e6bca642f33534d93c681516a1439b8..4a64ae41f5fa1df735ca62444c2b7bab2a1f4a8d 100644 +index 22a5c966feed50ebb9ed771f7e8a9cc59ac4d2bc..454e2795e04c7b7cac88f782df3dfb4200b192fc 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java @@ -73,6 +73,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -5100,7 +5100,7 @@ index fa281aba7212be33d71d900564783ed23d4f8df5..10f2b2f96418b059c7f6b43e1f060b0c if (this.level().purpurConfig.wanderingTraderAllowTrading) { // Purpur - Add config for villager trading this.setTradingPlayer(player); diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 3bd072720a8f8ca124bf6eb61d2428317076c408..1e14640b74950ecd2abd0ae13a7c83fa6a318703 100644 +index 2ce4e79966a8542896d8870e06b2364e182e512e..3c1641a906f301dbfb0f30a597479fb727f4639c 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -200,6 +200,19 @@ public abstract class Player extends Avatar implements ContainerUser { diff --git a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch index d2bb62595..d0c0d8e47 100644 --- a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch +++ b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Barrels and enderchests 6 rows diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index ac70293264dfcb9db0a0ca29f545be8e87cfa1b2..374c9007cc371d0dd0602dd5e8b5fdbbbcc925eb 100644 +index b99b09118707ab94406fc0472420449e7e88f2ac..042861f45c7ee423614122387ac652d60dfc2852 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -929,6 +929,27 @@ public abstract class PlayerList { +@@ -931,6 +931,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -37,7 +37,7 @@ index ac70293264dfcb9db0a0ca29f545be8e87cfa1b2..374c9007cc371d0dd0602dd5e8b5fdbb // Paper start - whitelist verify event / login event diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 1e14640b74950ecd2abd0ae13a7c83fa6a318703..6a71ec21849b30dd3f0f1ad86ccb01ee472a55b7 100644 +index 3c1641a906f301dbfb0f30a597479fb727f4639c..76d84cb829a7f9b88689986d04497fbfd9d65b87 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -182,6 +182,7 @@ public abstract class Player extends Avatar implements ContainerUser { diff --git a/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch b/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch index 3b7e078e3..2481cd96c 100644 --- a/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch +++ b/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add mobGriefing override to everything affected diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index b1dcb5d8849a1b5e93b01f883f1519aaebba82da..de18e6ac0c4336b089a2c40660256488c9d042d5 100644 +index a022ce7041c47c4d94679a3e322ca4f7486d77bf..7113d74f4684313d67d64a9449424c6e6243ce1f 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -1944,7 +1944,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin @@ -18,7 +18,7 @@ index b1dcb5d8849a1b5e93b01f883f1519aaebba82da..de18e6ac0c4336b089a2c40660256488 BlockState blockState = Blocks.WITHER_ROSE.defaultBlockState(); if (this.level().getBlockState(blockPos).isAir() && blockState.canSurvive(this.level(), blockPos)) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 0ec11f0415bdb44d465c0e57c676eb73c8183be0..b43145dad28a5ee58eaa4559ac5bd462466c114d 100644 +index 2bef2cd10447f41d5fc4c37eb574ce32fc2386ab..8f58641132231f450d0fb0c1fa61559c6cef8dcf 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -554,7 +554,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @@ -268,10 +268,10 @@ index dd0ec97ea4561d2dccf735580faf0d65d6ac4b0d..779879f8d678a5e45e2752e6e033cc35 org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); if (event.callEvent()) { diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java -index 90c0e0a7574529846500e98494246974e836ad9a..0429da7bb95751673b608f5c63a997b09a47fe41 100644 +index d538b1df2b07abd1c4257726891238696bf7a718..c0e83bbdcf3662bed498e0fe5a78d2b25c22a94e 100644 --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java -@@ -430,7 +430,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -436,7 +436,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @Override public boolean mayInteract(ServerLevel level, BlockPos pos) { Entity owner = this.getOwner(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch index c8090ef03..eb9757758 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch @@ -25,8 +25,8 @@ + protected boolean upnp = false; // Purpur - UPnP Port Forwarding public static S spin(Function threadFunction) { - AtomicReference atomicReference = new AtomicReference<>(); -@@ -927,6 +_,15 @@ + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system +@@ -928,6 +_,15 @@ LOGGER.info("Stopping server"); Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing @@ -42,16 +42,16 @@ // CraftBukkit start if (this.server != null) { this.server.spark.disable(); // Paper - spark -@@ -1025,6 +_,8 @@ - this.safeShutdown(waitForServer, false); +@@ -1026,6 +_,8 @@ + this.safeShutdown(waitForShutdown, false); } - public void safeShutdown(boolean waitForServer, boolean isRestarting) { + public void safeShutdown(boolean waitForShutdown, boolean isRestarting) { + org.purpurmc.purpur.task.BossBarTask.stopAll(); // Purpur - Implement TPSBar + org.purpurmc.purpur.task.BeehiveTask.instance().unregister(); // Purpur - Give bee counts in beehives to Purpur clients this.isRestarting = isRestarting; this.hasLoggedStop = true; // Paper - Debugging if (isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging -@@ -1044,6 +_,7 @@ +@@ -1045,6 +_,7 @@ private static final long MAX_CATCHUP_BUFFER = TICK_TIME * TPS * 60L; private long lastTick = 0; private long catchupTime = 0; @@ -59,7 +59,7 @@ public final RollingAverage tps1 = new RollingAverage(60); public final RollingAverage tps5 = new RollingAverage(60 * 5); public final RollingAverage tps15 = new RollingAverage(60 * 15); -@@ -1130,6 +_,16 @@ +@@ -1131,6 +_,16 @@ } // Paper end - Add onboarding message for initial server start @@ -76,7 +76,7 @@ while (this.running) { long l; if (!this.isPaused() && this.tickRateManager.isSprinting() && this.tickRateManager.checkShouldSprintThisTick()) { -@@ -1154,14 +_,19 @@ +@@ -1155,14 +_,19 @@ if (++MinecraftServer.currentTick % MinecraftServer.SAMPLE_INTERVAL == 0) { final long diff = currentTime - tickSection; final java.math.BigDecimal currentTps = TPS_BASE.divide(new java.math.BigDecimal(diff), 30, java.math.RoundingMode.HALF_UP); @@ -99,7 +99,7 @@ tickSection = currentTime; } // Paper end - further improve server tick loop -@@ -1193,6 +_,12 @@ +@@ -1194,6 +_,12 @@ profilerFiller.popPush("nextTickWait"); this.mayHaveDelayedTasks = true; this.delayedTasksMaxNextTickTimeNanos = Math.max(Util.getNanos() + l, this.nextTickTimeNanos); @@ -112,7 +112,7 @@ this.startMeasuringTaskExecutionTime(); this.waitUntilNextTick(); this.finishMeasuringTaskExecutionTime(); -@@ -1627,7 +_,7 @@ +@@ -1628,7 +_,7 @@ long worldTime = level.getGameTime(); final ClientboundSetTimePacket worldPacket = new ClientboundSetTimePacket(worldTime, dayTime, doDaylight); for (Player entityhuman : level.players()) { @@ -121,7 +121,7 @@ continue; } ServerPlayer entityplayer = (ServerPlayer) entityhuman; -@@ -1799,7 +_,7 @@ +@@ -1800,7 +_,7 @@ @DontObfuscate public String getServerModName() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch index bd0a05826..5ceee457e 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch @@ -86,7 +86,7 @@ + // Purpur end - Configurable daylight cycle } - public void tickCustomSpawners(boolean flag) { + public void tickCustomSpawners(boolean spawnEnemies) { @@ -983,9 +_,17 @@ && this.random.nextDouble() < currentDifficultyAt.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01) // Paper - Configurable spawn chances for skeleton horses && !this.getBlockState(blockPos.below()).is(BlockTags.LIGHTNING_RODS); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch index c407cb56c..ab3717684 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch @@ -37,7 +37,7 @@ public void broadcastAll(Packet packet, ResourceKey dimension) { for (ServerPlayer serverPlayer : this.players) { if (serverPlayer.level().dimension() == dimension) { -@@ -904,6 +_,7 @@ +@@ -906,6 +_,7 @@ } else { b = (byte)(24 + permLevel); } @@ -45,7 +45,7 @@ player.connection.send(new ClientboundEntityEventPacket(player, b)); } -@@ -916,7 +_,7 @@ +@@ -918,7 +_,7 @@ // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch index 329d3bf6f..e5078d28c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch @@ -8,7 +8,7 @@ protected AbstractArrow(EntityType entityType, Level level) { super(entityType, level); -@@ -349,7 +_,7 @@ +@@ -350,7 +_,7 @@ this.setInGround(false); Vec3 deltaMovement = this.getDeltaMovement(); this.setDeltaMovement(deltaMovement.multiply(this.random.nextFloat() * 0.2F, this.random.nextFloat() * 0.2F, this.random.nextFloat() * 0.2F)); @@ -17,7 +17,7 @@ } public boolean isInGround() { -@@ -573,6 +_,12 @@ +@@ -574,6 +_,12 @@ public ItemStack getWeaponItem() { return this.firedFromWeapon; }