9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-29 03:39:07 +00:00
Files
SakuraMC/sakura-server/minecraft-patches/features/0015-Explosion-Durable-Blocks.patch
Samsuik 40897f76f7 Updated Upstream (Paper 1.21.9)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@7e70636 Initial 1.21.9 update (squashed)
PaperMC/Paper@0a28816 Add Server#getRespawnWorld and Server#setRespawnWorld(World)
PaperMC/Paper@b67fa6d move todos txt content into tracking issue
PaperMC/Paper@68f26a1 Drop no-longer-needed packet diffs
PaperMC/Paper@f9434d2 Use pitch when setting spawn position with Location
PaperMC/Paper@810b3c6 Deprecate the Conversation API (for removal), Metadata API, and PlayerSpawnLocationEvent (for removal)
PaperMC/Paper@1870261 Update Moonrise to 1.21.9-pre1
PaperMC/Paper@1141058 Shift feature patch #s for Moonrise being first
PaperMC/Paper@510aa9b Update 'Optimize Network Manager and add advanced packet support'
PaperMC/Paper@89cc24a Update 'Allow Saving of Oversized Chunks'
PaperMC/Paper@bcd75d8 Update EAR 2.0 patch and enable oldPaperCommit for better 3-way merges
PaperMC/Paper@6b44820 Update 'Use Velocity compression and cipher natives'
PaperMC/Paper@87f3e2f Update 'Optimize GoalSelector Goal.Flag Set operations'
PaperMC/Paper@5323486 Update 'Optimize Voxel Shape Merging'
PaperMC/Paper@5aac8b4 Update 'Handle Oversized block entities in chunks'
PaperMC/Paper@f0b3d62 Update 'optimize dirt and snow spreading' and drop 'Optimise getChunkAt calls for loaded chunks' patch to code replaced by Moonrise
PaperMC/Paper@92f822d Update 'Optimize Bit Operations by inlining', 'Remove streams from hot code'
PaperMC/Paper@98e745a Update 'Optimize Pathfinder - Remove Streams / Optimized collections'
PaperMC/Paper@49e49d0 Update 'Fix entity tracker desync when new players are added to the tracker'
PaperMC/Paper@87e0525 Update alternate redstone impls
PaperMC/Paper@35e973d Update 'Improve exact choice recipe ingredients', 'Only write chunk data to disk if it serializes without throwing'
PaperMC/Paper@181f9bb Update 'Entity load/save limit per chunk', 'Attempt to recalculate regionfile header if it is corrupt'
PaperMC/Paper@b31ca18 Update 'Incremental chunk and player saving', 'Optimise general POI access'
PaperMC/Paper@9b69cc5 Add some more Mannequin API
PaperMC/Paper@8bb12cb Fix compile
PaperMC/Paper@e3aca92 Replace ConcurrentUtil's Validate with Objects
PaperMC/Paper@9a626dd Rewrite ticket counter system
PaperMC/Paper@65250cb Drop "Optimize Collision to not load chunks"
PaperMC/Paper@55d56d9 Apply "Flush regionfiles on save configuration option"
PaperMC/Paper@920e8d3 Apply "Optimise collision checking in player move packet handling"
PaperMC/Paper@ec492d3 Apply "Improve keepalive ping system"
PaperMC/Paper@8f65947 Apply "Optimise EntityScheduler ticking"
PaperMC/Paper@086b4fd Apply "Optional per player mob spawns"
PaperMC/Paper@2f4211e Apply "Improve cancelling PreCreatureSpawnEvent with per player mob spawns"
PaperMC/Paper@b6d9557 Apply "Optimize Hoppers"
PaperMC/Paper@388e693 update generator
PaperMC/Paper@a3c89a8 add javadocs for new api
PaperMC/Paper@fcc763a Call BlockRedstoneEvent for the shelf
PaperMC/Paper@03eb18b replace requireNonNull by checkArgument and deprecate MCUtil#toLocation
PaperMC/Paper@6b7bf01 bump built-in datapack version
PaperMC/Paper@2779a53 deprecate #lanterns material tag in favour of vanilla tag
PaperMC/Paper@6f9957e Mannequin#createDefaultProfile -> Mannequin#defaultProfile
PaperMC/Paper@24874e5 Also rename Mannequin profile getter/setters for consistency
PaperMC/Paper@bc2ae10 Fix default respawn dimension being null for new worlds
PaperMC/Paper@eb42158 Use 0.0.4 release of ConcurrentUtil
PaperMC/Paper@bb01745 1.21.9-pre2
PaperMC/Paper@0249204 1.21.9-pre2 feature patches
PaperMC/Paper@9360ba4 Identifying comments for MinecraftServer
PaperMC/Paper@5d3aa53 Some diff improvements in prepare spawn task
PaperMC/Paper@22ad451 Move some stuff to ATs
PaperMC/Paper@0ea15c9 Drop no longer applicable ATs
PaperMC/Paper@cf78f2a bump api-version/datapack format and add a copper torch tag
PaperMC/Paper@60cb0df generate ClientOption enums and mark CraftBlockData impl as null marked
PaperMC/Paper@4025289 Add pre2 to api version
PaperMC/Paper@f2cb073 Set build channel to alpha
PaperMC/Paper@90b29c4 Port most of the anti-xray patch
PaperMC/Paper@4a8e88d Disable oldPaperCommit to fix CI build
PaperMC/Paper@121ac2e Port the last Anti-XRay hunk
PaperMC/Paper@f43641f Use ConcurrentUtil 0.0.5
PaperMC/Paper@1f79388 fix end portal teleportation
PaperMC/Paper@2efb400 [ci skip] Adjust spawn location event docs
PaperMC/Paper@cb9fc05 simplify overloads
PaperMC/Paper@25ecc59 Enable Anti-Xray
PaperMC/Paper@4d7185f Add AsyncPlayerSpawnLocationEvent#isNewPlayer (#13081)
PaperMC/Paper@dc474a8 Fixup vanilla code for Anti-Xray changes
PaperMC/Paper@0e23b02 Add back null check for chunkPacketBlockController
PaperMC/Paper@e6f1483 Update to 1.21.9-pre3
PaperMC/Paper@44259ea Add ResolvableProfile.SkinPatch (#13091)
PaperMC/Paper@634f51e Update to 1.21.9-pre4
PaperMC/Paper@fada3a7 Update DataConverter to 1.21.9-pre4
PaperMC/Paper@037179f Update Starlight stored version
PaperMC/Paper@6b0b29a Update publishing endpoint
PaperMC/Paper@f6fabc5 Call EntityChangeBlockEvent for copper golem statue changes (#13090)
PaperMC/Paper@1d6ee7d Update adventure
PaperMC/Paper@404e49f Update to 1.21.9-rc1
PaperMC/Paper@4055274 Fix empty SkinPatch initialization and swapped dynamic/static heuristic in ResolvableProfile build method
PaperMC/Paper@51fe7aa Fixed modern forwarding support (#13098)
PaperMC/Paper@5613a35 fix PlayerGameModeChangeEvent#cancelMessage
PaperMC/Paper@673abf4 use PlayerShieldDisableEvent#getCooldown
PaperMC/Paper@3a0dc7f Fix a couple PlayerProfile mutability issues
PaperMC/Paper@e97fb40 Remove parallel generation config option
PaperMC/Paper@c3a60b8 Use ThreadLocal for Starlight and ticket level propagator cache
PaperMC/Paper@e16b369 Resize propagator queues less aggressively
2025-09-29 01:59:24 +01:00

103 lines
6.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <kfian294ma4@gmail.com>
Date: Wed, 15 Nov 2023 23:18:38 +0000
Subject: [PATCH] Explosion Durable Blocks
diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java
index dceb2b683064bbf4286c3fe71e0fd0c5a644cb07..40b76310d311a8d4cbe028d575f9220f55e70da2 100644
--- a/net/minecraft/world/item/BlockItem.java
+++ b/net/minecraft/world/item/BlockItem.java
@@ -37,8 +37,30 @@ public class BlockItem extends Item {
this.block = block;
}
+ // Sakura start - explosion durable blocks
+ private void sendBlockDurabilityToPlayer(final UseOnContext context) {
+ final Player player = context.getPlayer();
+ final Level level = context.getLevel();
+ final BlockPos clickedPos = context.getClickedPos();
+
+ // If the clicked block is a durable material then send the durability to the player
+ final BlockState state = level.getBlockState(clickedPos);
+ final Block clickedBlock = state.getBlock();
+ final me.samsuik.sakura.explosion.durable.DurableMaterial material = level.localConfig().at(clickedPos).durableMaterials.get(clickedBlock);
+
+ if (material != null) {
+ final int remaining = context.getLevel().durabilityManager.durability(clickedPos, material);
+ final int durability = material.durability();
+ player.getBukkitEntity().sendMessage(me.samsuik.sakura.configuration.GlobalConfiguration.get().messages.durableBlockInteractionComponent(remaining, durability));
+ }
+ }
+
@Override
public InteractionResult useOn(UseOnContext context) {
+ if (this.getBlock() == net.minecraft.world.level.block.Blocks.POTATOES && context.getPlayer() != null) {
+ this.sendBlockDurabilityToPlayer(context);
+ }
+ // Sakura end - explosion durable blocks
InteractionResult interactionResult = this.place(new BlockPlaceContext(context));
return !interactionResult.consumesAction() && context.getItemInHand().has(DataComponents.CONSUMABLE)
? super.use(context.getLevel(), context.getPlayer(), context.getHand())
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
index af39222e08bc7957ac40ea9fd6aae517e7cee45a..1da42c11174bb7eae9a827a17a57d5e7f1d80f09 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -835,6 +835,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
// Sakura end - track block changes and tick scheduler
public final me.samsuik.sakura.entity.merge.EntityMergeHandler mergeHandler = new me.samsuik.sakura.entity.merge.EntityMergeHandler(); // Sakura - merge cannon entities
public final me.samsuik.sakura.explosion.density.BlockDensityCache densityCache = new me.samsuik.sakura.explosion.density.BlockDensityCache(this); // Sakura - optimise explosion density cache
+ public final me.samsuik.sakura.explosion.durable.DurableBlockManager durabilityManager = new me.samsuik.sakura.explosion.durable.DurableBlockManager(); // Sakura - explosion durable blocks
protected Level(
WritableLevelData levelData,
diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java
index 0f95ffa2551289cb74d0210673b942ca90be74d3..976ebf4c62d1cc96f2e147c2240a5886d6b022ed 100644
--- a/net/minecraft/world/level/ServerExplosion.java
+++ b/net/minecraft/world/level/ServerExplosion.java
@@ -133,7 +133,7 @@ public class ServerExplosion implements Explosion {
BlockState blockState = ((ca.spottedleaf.moonrise.patches.getblock.GetBlockChunk)chunk).moonrise$getBlock(x, y, z);
FluidState fluidState = blockState.getFluidState();
- Optional<Float> resistance = !calculateResistance ? Optional.empty() : this.damageCalculator.getBlockExplosionResistance((Explosion)(Object)this, this.level, pos, blockState, fluidState);
+ Optional<Float> resistance = !calculateResistance ? Optional.empty() : this.calculateBlockResistance(blockState, fluidState, pos); // Sakura - explosion durable blocks
ret = new ca.spottedleaf.moonrise.patches.collisions.ExplosionBlockCache(
key, pos, blockState, fluidState,
@@ -359,6 +359,20 @@ public class ServerExplosion implements Explosion {
}
}
// Sakura end - specialised explosions
+ // Sakura start - explosion durable blocks
+ private Optional<Float> calculateBlockResistance(final BlockState blockState, final FluidState fluidState, final BlockPos pos) {
+ if (!blockState.isAir()) {
+ final Block block = blockState.getBlock();
+ final me.samsuik.sakura.explosion.durable.DurableMaterial material = this.level.localConfig().at(pos).durableMaterials.get(block);
+
+ if (material != null && material.replaceBlastResistance() && pos.getY() > this.level.getMinY()) {
+ return Optional.of(material.resistance());
+ }
+ }
+
+ return this.damageCalculator.getBlockExplosionResistance(this, this.level, pos, blockState, fluidState);
+ }
+ // Sakura end - explosion durable blocks
public ServerExplosion(
ServerLevel level,
@@ -697,6 +711,14 @@ public class ServerExplosion implements Explosion {
}
}
// CraftBukkit end
+ // Sakura start - explosion durable blocks
+ final me.samsuik.sakura.explosion.durable.DurableMaterial material = this.level.localConfig().at(blockPos).durableMaterials.get(block);
+ if (material != null && material.applyDurability()) { // if durability is < 0 then only altar the blast resistance
+ if (material.onlyDamagedByTnt() && !(this.source instanceof PrimedTnt) || !this.level.durabilityManager.damage(blockPos, material)) {
+ continue;
+ }
+ }
+ // Sakura end - explosion durable blocks
this.level
.getBlockState(blockPos)