Added shrinking happy ghasts with fire charges

This commit is contained in:
patience 2026-02-17 17:54:47 +00:00
parent 1bd3b116dc
commit 574a5ea61b
No known key found for this signature in database
6 changed files with 148 additions and 1 deletions

View file

@ -39,4 +39,9 @@ public class ModBlocks {
"acoustic_plush", "acoustic_plush",
true true
); );
public static final Block Parched_Ghast = register(
new ParchedGhast(BlockBehaviour.Properties.of()),
"parched_ghast",
true
);
} }

View file

@ -0,0 +1,86 @@
package xyz.nearmisses.patience.mc_rebalance;
import com.blackgear.vanillabackport.client.registries.ModSoundTypes;
import com.blackgear.vanillabackport.common.level.entities.happyghast.HappyGhast;
import com.blackgear.vanillabackport.common.registries.ModEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.SimpleWaterloggedBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.NotNull;
public class ParchedGhast extends Block implements SimpleWaterloggedBlock {
public ParchedGhast(Properties properties) {
super(properties.noOcclusion().sound(ModSoundTypes.DRIED_GHAST));
this.registerDefaultState(this.stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(WATERLOGGED, false)
);
}
public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(FACING, WATERLOGGED);
}
@Override // New collision box
public @NotNull VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) {
return Block.box(3.0, 0.0, 3.0, 13.0, 15.0, 13.0);
}
// Water functions
@Override
public @NotNull FluidState getFluidState(BlockState blockState) {
return blockState.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(blockState);
}
@Override
public @NotNull BlockState updateShape(BlockState blockState, Direction direction, BlockState blockState2, LevelAccessor levelAccessor, BlockPos blockPos, BlockPos blockPos2) {
if (blockState.getValue(WATERLOGGED)) {
levelAccessor.scheduleTick(blockPos, Fluids.WATER, Fluids.WATER.getTickDelay(levelAccessor));
levelAccessor.scheduleTick(blockPos, ModBlocks.Parched_Ghast, 200);
//ModEntities.HAPPY_GHAST.get().create(levelAccessor)
//levelAccessor.removeBlock(blockPos, true);
}
return super.updateShape(blockState, direction, blockState2, levelAccessor, blockPos, blockPos2);
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
BlockPos blockPos = context.getClickedPos();
FluidState fluidState = context.getLevel().getFluidState(blockPos);
return this.defaultBlockState()
.setValue(FACING, context.getHorizontalDirection().getOpposite())
.setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER);
}
public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (state.getValue(WATERLOGGED)) {
HappyGhast ghast = ModEntities.HAPPY_GHAST.get().create(level);
if(ghast!=null) {
ghast.setPos(pos.getCenter());
level.addFreshEntity(ghast);
level.removeBlock(pos, false);
}
}
}
}

View file

@ -0,0 +1,40 @@
package xyz.nearmisses.patience.mc_rebalance.mixin;
import com.blackgear.vanillabackport.client.registries.ModSoundEvents;
import com.blackgear.vanillabackport.common.level.entities.happyghast.HappyGhast;
import com.blackgear.vanillabackport.core.data.tags.ModItemTags;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import xyz.nearmisses.patience.mc_rebalance.ModBlocks;
@Mixin(HappyGhast.class)
public abstract class HappyGhastTweak extends Animal{
protected HappyGhastTweak(EntityType<? extends Animal> entityType, Level level) {
super(entityType, level);
}
@Inject(method = "mobInteract", at = @At(value="INVOKE", target="Lnet/minecraft/world/entity/player/Player;getItemInHand(Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/item/ItemStack;"), cancellable = true)
private void mobInteract(Player player, InteractionHand hand, CallbackInfoReturnable<InteractionResult> cir){
if(player.getItemInHand(hand).is(Items.FIRE_CHARGE)){
this.playSound(ModSoundEvents.HAPPY_GHAST_AMBIENT.get());
this.spawnAtLocation(ModBlocks.Parched_Ghast);
if(this.getItemBySlot(EquipmentSlot.CHEST).is(ModItemTags.HARNESSES)){ // Drop harness if one is equipped
this.playSound(ModSoundEvents.HARNESS_UNEQUIP.get());
this.spawnAtLocation(this.getItemBySlot(EquipmentSlot.CHEST));
}
this.remove(RemovalReason.DISCARDED);
cir.setReturnValue(InteractionResult.CONSUME);
}
}
}

View file

@ -15,5 +15,7 @@
"item.mc_rebalance.diamond_paxel": "Diamond Paxel", "item.mc_rebalance.diamond_paxel": "Diamond Paxel",
"item.mc_rebalance.netherite_paxel": "Dendrite Paxel", "item.mc_rebalance.netherite_paxel": "Dendrite Paxel",
"effect.mc_rebalance.shattered": "Shattered", "effect.mc_rebalance.shattered": "Shattered",
"enchantment.mc_rebalance.windup": "Windup" "enchantment.mc_rebalance.windup": "Windup",
"block.mc_rebalance.parched_ghast": "Parched Ghast",
"item.mc_rebalance.parched_ghast": "Parched Ghast"
} }

View file

@ -0,0 +1,13 @@
{
"parent": "minecraft:block/dried_ghast",
"textures": {
"bottom": "minecraft:block/dried_ghast_hydration_3_bottom",
"east": "minecraft:block/dried_ghast_hydration_3_east",
"north": "minecraft:block/dried_ghast_hydration_3_north",
"particle": "minecraft:block/dried_ghast_hydration_3_north",
"south": "minecraft:block/dried_ghast_hydration_3_south",
"tentacles": "minecraft:block/dried_ghast_hydration_3_tentacles",
"top": "minecraft:block/dried_ghast_hydration_3_top",
"west": "minecraft:block/dried_ghast_hydration_3_west"
}
}

View file

@ -8,6 +8,7 @@
"CreakingRework", "CreakingRework",
"DiggerItemHitCooldownsTweak", "DiggerItemHitCooldownsTweak",
"ExperienceOrbRework", "ExperienceOrbRework",
"HappyGhastTweak",
"WardenRework", "WardenRework",
"WitherSkeletonRework" "WitherSkeletonRework"
], ],