[Fix] Barrel Plays closing sound early (/quiqueck/BetterEnd#20, paulevsGitch/EdenRing#41)

This commit is contained in:
Frank 2022-06-30 14:51:10 +02:00
parent 59756e6dca
commit d5cf63427b
2 changed files with 90 additions and 55 deletions

View file

@ -1,6 +1,5 @@
package org.betterx.bclib.blockentities; package org.betterx.bclib.blockentities;
import org.betterx.bclib.blocks.BaseBarrelBlock;
import org.betterx.bclib.registry.BaseBlockEntities; import org.betterx.bclib.registry.BaseBlockEntities;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -11,21 +10,49 @@ import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.world.Container;
import net.minecraft.world.ContainerHelper; import net.minecraft.world.ContainerHelper;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.ChestMenu;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BarrelBlock; import net.minecraft.world.level.block.BarrelBlock;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.ContainerOpenersCounter;
import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
public class BaseBarrelBlockEntity extends RandomizableContainerBlockEntity { public class BaseBarrelBlockEntity extends RandomizableContainerBlockEntity {
private NonNullList<ItemStack> inventory; private NonNullList<ItemStack> inventory;
private int viewerCount; private ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() {
@Override
protected void onOpen(Level level, BlockPos blockPos, BlockState blockState) {
BaseBarrelBlockEntity.this.playSound(blockState, SoundEvents.BARREL_OPEN);
BaseBarrelBlockEntity.this.updateBlockState(blockState, true);
}
@Override
protected void onClose(Level level, BlockPos blockPos, BlockState blockState) {
BaseBarrelBlockEntity.this.playSound(blockState, SoundEvents.BARREL_CLOSE);
BaseBarrelBlockEntity.this.updateBlockState(blockState, false);
}
@Override
protected void openerCountChanged(Level level, BlockPos blockPos, BlockState blockState, int i, int j) {
}
@Override
protected boolean isOwnContainer(Player player) {
if (player.containerMenu instanceof ChestMenu) {
Container container = ((ChestMenu) player.containerMenu).getContainer();
return container == BaseBarrelBlockEntity.this;
}
return false;
}
};
private BaseBarrelBlockEntity(BlockEntityType<?> type, BlockPos blockPos, BlockState blockState) { private BaseBarrelBlockEntity(BlockEntityType<?> type, BlockPos blockPos, BlockState blockState) {
super(type, blockPos, blockState); super(type, blockPos, blockState);
@ -42,10 +69,9 @@ public class BaseBarrelBlockEntity extends RandomizableContainerBlockEntity {
if (!this.trySaveLootTable(tag)) { if (!this.trySaveLootTable(tag)) {
ContainerHelper.saveAllItems(tag, this.inventory); ContainerHelper.saveAllItems(tag, this.inventory);
} }
//return tag;
} }
@Override
public void load(CompoundTag tag) { public void load(CompoundTag tag) {
super.load(tag); super.load(tag);
this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);
@ -54,43 +80,51 @@ public class BaseBarrelBlockEntity extends RandomizableContainerBlockEntity {
} }
} }
@Override
public int getContainerSize() { public int getContainerSize() {
return 27; return 27;
} }
@Override
protected NonNullList<ItemStack> getItems() { protected NonNullList<ItemStack> getItems() {
return this.inventory; return this.inventory;
} }
@Override
protected void setItems(NonNullList<ItemStack> list) { protected void setItems(NonNullList<ItemStack> list) {
this.inventory = list; this.inventory = list;
} }
@Override
protected Component getDefaultName() { protected Component getDefaultName() {
return Component.translatable("container.barrel"); return Component.translatable("container.barrel");
} }
@Override
protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) {
return ChestMenu.threeRows(syncId, playerInventory, this); return ChestMenu.threeRows(syncId, playerInventory, this);
} }
public void startOpen(Player player) { public void startOpen(Player player) {
if (!player.isSpectator()) { if (!this.remove && !player.isSpectator()) {
if (viewerCount < 0) { this.openersCounter.incrementOpeners(player, this.getLevel(), this.getBlockPos(), this.getBlockState());
viewerCount = 0;
}
++viewerCount;
BlockState blockState = this.getBlockState();
if (!blockState.getValue(BarrelBlock.OPEN)) {
playSound(blockState, SoundEvents.BARREL_OPEN);
setOpen(blockState, true);
}
if (level != null) {
scheduleUpdate();
}
} }
// if (!player.isSpectator()) {
// if (viewerCount < 0) {
// viewerCount = 0;
// }
//
// ++viewerCount;
// BlockState blockState = this.getBlockState();
// if (!blockState.getValue(BarrelBlock.OPEN)) {
// playSound(blockState, SoundEvents.BARREL_OPEN);
// updateBlockState(blockState, true);
// }
//
// if (level != null) {
// scheduleUpdate();
// }
// }
} }
private void scheduleUpdate() { private void scheduleUpdate() {
@ -98,31 +132,38 @@ public class BaseBarrelBlockEntity extends RandomizableContainerBlockEntity {
} }
public void tick() { public void tick() {
if (level != null) { // if (level != null) {
viewerCount = ChestBlockEntity.getOpenCount(level, worldPosition); // viewerCount = ChestBlockEntity.getOpenCount(level, worldPosition);
if (viewerCount > 0) { // if (viewerCount > 0) {
scheduleUpdate(); // scheduleUpdate();
} else { // } else {
BlockState blockState = getBlockState(); // BlockState blockState = getBlockState();
if (!(blockState.getBlock() instanceof BaseBarrelBlock)) { // if (!(blockState.getBlock() instanceof BaseBarrelBlock)) {
setRemoved(); // setRemoved();
return; // return;
} // }
if (blockState.getValue(BarrelBlock.OPEN)) { // if (blockState.getValue(BarrelBlock.OPEN)) {
playSound(blockState, SoundEvents.BARREL_CLOSE); // playSound(blockState, SoundEvents.BARREL_CLOSE);
setOpen(blockState, false); // updateBlockState(blockState, false);
} // }
} // }
} // }
} }
@Override
public void stopOpen(Player player) { public void stopOpen(Player player) {
if (!player.isSpectator()) { if (!this.remove && !player.isSpectator()) {
--this.viewerCount; this.openersCounter.decrementOpeners(player, this.getLevel(), this.getBlockPos(), this.getBlockState());
} }
} }
private void setOpen(BlockState state, boolean open) { public void recheckOpen() {
if (!this.remove) {
this.openersCounter.recheckOpeners(this.getLevel(), this.getBlockPos(), this.getBlockState());
}
}
private void updateBlockState(BlockState state, boolean open) {
if (level != null) { if (level != null) {
level.setBlock(this.getBlockPos(), state.setValue(BarrelBlock.OPEN, open), 3); level.setBlock(this.getBlockPos(), state.setValue(BarrelBlock.OPEN, open), 3);
} }
@ -130,19 +171,13 @@ public class BaseBarrelBlockEntity extends RandomizableContainerBlockEntity {
private void playSound(BlockState blockState, SoundEvent soundEvent) { private void playSound(BlockState blockState, SoundEvent soundEvent) {
if (level != null) { if (level != null) {
Vec3i vec3i = blockState.getValue(BarrelBlock.FACING).getNormal(); Vec3i facingDir = blockState.getValue(BarrelBlock.FACING).getNormal();
double d = (double) this.worldPosition.getX() + 0.5D + (double) vec3i.getX() / 2.0D; double x = this.worldPosition.getX() + 0.5D + facingDir.getX() / 2.0D;
double e = (double) this.worldPosition.getY() + 0.5D + (double) vec3i.getY() / 2.0D; double y = this.worldPosition.getY() + 0.5D + facingDir.getY() / 2.0D;
double f = (double) this.worldPosition.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; double z = this.worldPosition.getZ() + 0.5D + facingDir.getZ() / 2.0D;
level.playSound( level.playSound(
null, null, x, y, z,
d, soundEvent, SoundSource.BLOCKS, 0.5F, this.level.random.nextFloat() * 0.1F + 0.9F
e,
f,
soundEvent,
SoundSource.BLOCKS,
0.5F,
this.level.random.nextFloat() * 0.1F + 0.9F
); );
} }
} }

View file

@ -66,16 +66,16 @@ public class BaseBarrelBlock extends BarrelBlock implements BlockModelProvider {
@Override @Override
public InteractionResult use( public InteractionResult use(
BlockState state, BlockState state,
Level world, Level level,
BlockPos pos, BlockPos pos,
Player player, Player player,
InteractionHand hand, InteractionHand hand,
BlockHitResult hit BlockHitResult hit
) { ) {
if (world.isClientSide) { if (level.isClientSide) {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
BlockEntity blockEntity = world.getBlockEntity(pos); BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity instanceof BaseBarrelBlockEntity) { if (blockEntity instanceof BaseBarrelBlockEntity) {
player.openMenu((BaseBarrelBlockEntity) blockEntity); player.openMenu((BaseBarrelBlockEntity) blockEntity);
player.awardStat(Stats.OPEN_BARREL); player.awardStat(Stats.OPEN_BARREL);
@ -90,7 +90,7 @@ public class BaseBarrelBlock extends BarrelBlock implements BlockModelProvider {
public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
BlockEntity blockEntity = world.getBlockEntity(pos); BlockEntity blockEntity = world.getBlockEntity(pos);
if (blockEntity instanceof BaseBarrelBlockEntity) { if (blockEntity instanceof BaseBarrelBlockEntity) {
((BaseBarrelBlockEntity) blockEntity).tick(); ((BaseBarrelBlockEntity) blockEntity).recheckOpen();
} }
} }