Files
TiedUp-/src/main/java/com/tiedup/remake/blocks/BlockKidnapBomb.java
NotEvil a71093ba9c Remove internal phase comments and format code
Strip all Phase references, TODO/FUTURE roadmap notes, and internal
planning comments from the codebase. Run Prettier for consistent
formatting across all Java files.
2026-04-12 01:25:55 +02:00

295 lines
8.6 KiB
Java

package com.tiedup.remake.blocks;
import com.tiedup.remake.blocks.entity.KidnapBombBlockEntity;
import com.tiedup.remake.core.SystemMessageManager;
import com.tiedup.remake.core.TiedUpMod;
import com.tiedup.remake.entities.EntityKidnapBomb;
import com.tiedup.remake.util.BondageItemLoaderUtility;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.TntBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
/**
* Kidnap Bomb Block - TNT that applies bondage on explosion.
*
*
* Features:
* - TNT-like block that can be ignited
* - Stores bondage items via BlockEntity
* - On explosion, applies items to entities in radius (no block damage)
* - Can be loaded by right-clicking with bondage items
*
* Based on original BlockKidnapBomb from 1.12.2
*/
public class BlockKidnapBomb
extends TntBlock
implements EntityBlock, ICanBeLoaded
{
public BlockKidnapBomb() {
super(
BlockBehaviour.Properties.of()
.strength(0.0f)
.sound(SoundType.GRASS)
.ignitedByLava()
);
}
// BLOCK ENTITY
@Nullable
@Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new KidnapBombBlockEntity(pos, state);
}
@Nullable
public KidnapBombBlockEntity getBombEntity(
BlockGetter level,
BlockPos pos
) {
BlockEntity be = level.getBlockEntity(pos);
return be instanceof KidnapBombBlockEntity
? (KidnapBombBlockEntity) be
: null;
}
// EXPLOSION HANDLING
@Override
public void onCaughtFire(
BlockState state,
Level level,
BlockPos pos,
@Nullable net.minecraft.core.Direction face,
@Nullable LivingEntity igniter
) {
if (!level.isClientSide) {
KidnapBombBlockEntity bombTile = getBombEntity(level, pos);
explode(level, pos, bombTile, igniter);
}
}
/**
* Spawn the primed kidnap bomb entity.
*/
public void explode(
Level level,
BlockPos pos,
@Nullable KidnapBombBlockEntity bombTile,
@Nullable LivingEntity igniter
) {
if (!level.isClientSide) {
EntityKidnapBomb entity = new EntityKidnapBomb(
level,
pos.getX() + 0.5,
pos.getY(),
pos.getZ() + 0.5,
igniter,
bombTile
);
level.addFreshEntity(entity);
level.playSound(
null,
entity.getX(),
entity.getY(),
entity.getZ(),
SoundEvents.TNT_PRIMED,
SoundSource.BLOCKS,
1.0f,
1.0f
);
level.gameEvent(igniter, GameEvent.PRIME_FUSE, pos);
TiedUpMod.LOGGER.info(
"[BlockKidnapBomb] Bomb primed at {} by {}",
pos,
igniter != null ? igniter.getName().getString() : "unknown"
);
}
}
// LOADING ITEMS
@Override
public InteractionResult use(
BlockState state,
Level level,
BlockPos pos,
Player player,
InteractionHand hand,
BlockHitResult hit
) {
ItemStack heldItem = player.getItemInHand(hand);
// First check if it's flint and steel (default TNT behavior)
if (
heldItem.is(Items.FLINT_AND_STEEL) || heldItem.is(Items.FIRE_CHARGE)
) {
return super.use(state, level, pos, player, hand, hit);
}
if (hand != InteractionHand.MAIN_HAND) {
return InteractionResult.PASS;
}
if (heldItem.isEmpty()) {
return InteractionResult.PASS;
}
// Check if it's a bondage item
if (!BondageItemLoaderUtility.isLoadableBondageItem(heldItem)) {
return InteractionResult.PASS;
}
// Server-side only
if (level.isClientSide) {
return InteractionResult.SUCCESS;
}
KidnapBombBlockEntity bomb = getBombEntity(level, pos);
if (bomb == null) {
return InteractionResult.PASS;
}
// Try to load the held item into the appropriate slot
if (
BondageItemLoaderUtility.loadItemIntoHolder(bomb, heldItem, player)
) {
SystemMessageManager.sendToPlayer(
player,
"Item loaded into bomb",
ChatFormatting.YELLOW
);
return InteractionResult.SUCCESS;
}
return InteractionResult.PASS;
}
// DROPS WITH NBT
@Override
public List<ItemStack> getDrops(
BlockState state,
LootParams.Builder params
) {
BlockEntity be = params.getOptionalParameter(
LootContextParams.BLOCK_ENTITY
);
ItemStack stack = new ItemStack(this);
if (be instanceof KidnapBombBlockEntity bomb) {
CompoundTag beTag = new CompoundTag();
bomb.writeBondageData(beTag);
if (!beTag.isEmpty()) {
stack.addTagElement("BlockEntityTag", beTag);
}
}
return List.of(stack);
}
// TOOLTIP
@Override
public void appendHoverText(
ItemStack stack,
@Nullable BlockGetter level,
List<Component> tooltip,
TooltipFlag flag
) {
tooltip.add(
Component.translatable("block.tiedup.kidnap_bomb.desc").withStyle(
ChatFormatting.GRAY
)
);
CompoundTag nbt = stack.getTag();
if (nbt != null && nbt.contains("BlockEntityTag")) {
CompoundTag beTag = nbt.getCompound("BlockEntityTag");
// Check if loaded with any items
if (
beTag.contains("bind") ||
beTag.contains("gag") ||
beTag.contains("blindfold") ||
beTag.contains("earplugs") ||
beTag.contains("collar")
) {
tooltip.add(
Component.literal("Loaded:").withStyle(
ChatFormatting.YELLOW
)
);
// List loaded items
BondageItemLoaderUtility.addItemToTooltip(
tooltip,
beTag,
"bind"
);
BondageItemLoaderUtility.addItemToTooltip(
tooltip,
beTag,
"gag"
);
BondageItemLoaderUtility.addItemToTooltip(
tooltip,
beTag,
"blindfold"
);
BondageItemLoaderUtility.addItemToTooltip(
tooltip,
beTag,
"earplugs"
);
BondageItemLoaderUtility.addItemToTooltip(
tooltip,
beTag,
"collar"
);
BondageItemLoaderUtility.addItemToTooltip(
tooltip,
beTag,
"clothes"
);
} else {
tooltip.add(
Component.literal("Empty").withStyle(ChatFormatting.GREEN)
);
}
} else {
tooltip.add(
Component.literal("Empty").withStyle(ChatFormatting.GREEN)
);
}
}
}