I created Generator BlockEntity with Screen. And I made an interactive power button on the generator screen and the button works fine. However, the problem arises here, although the power value of some entity( ex: @23343) changes when the power is turned on or off, but the power value of the block( ex: @23434) does not actually change. So can I ask for your help?
My Code is Here!
Block Entity :
public class GeneratorEntity extends BlockEntity implements MenuProvider {
private boolean power = false;
private int progress = 0;
public GeneratorEntity(BlockPos pos, BlockState state) {
super(ModBlockEntities.SMALL_GENERATOR.get(), pos, state);
}
@Nullable
@Override
public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) {
return new SmallGeneratorMenu(id,inventory,this,this.data);
}
@Override
protected void saveAdditional(CompoundTag nbt) {
nbt.putBoolean("IsPowered",this.power);
super.saveAdditional(nbt);
}
@Override
public void load(CompoundTag nbt) {
super.load(nbt);
power = nbt.getBoolean("IsPowered");
}
public static void tick(Level level, BlockPos pos, BlockState state, GeneratorEntity pEntity) {
if (level.isClientSide()) {
return;
}
if (pEntity.getPower()==true) {
if (hasEnough(pEntity)) {
pEntity.progress++;
setChanged(level, pos, state);
} else {
pEntity.resetProgress();
setChanged(level, pos, state);
}
}
else{
pEntity.resetProgress();
setChanged(level, pos, state);
}
}
private void resetProgress() {
this.progress = 0;
}
public boolean getPower() {
return power;
}
public void ChangePower() {
this.power = !this.power;
setChanged();
ModMessages.sendToClients(new GeneratorPowerSync2CPacket(this.power, this.getBlockPos()));
}
public boolean setPower(GeneratorEntity pEntity, boolean power){
if (power) {
pEntity.power = true;
} else {
pEntity.power = false;
}
return power;
}
}
Screen:
public class SmallGeneratorScreen extends AbstractContainerScreen<SmallGeneratorMenu> {
private static final ResourceLocation TEXTURE =
new ResourceLocation(Generator.MOD_ID,"textures/gui/small_generator_gui.png");
private static final ResourceLocation BUTTON =
new ResourceLocation(Generator.MOD_ID,"textures/gui/button.png");
private static final ResourceLocation BUTTON_ON =
new ResourceLocation(Generator.MOD_ID,"textures/gui/button_on.png");
public SmallGeneratorScreen(SmallGeneratorMenu pMenu, Inventory pPlayerInventory, Component component) {
super(pMenu, pPlayerInventory, component);
}
private ImageButton button = new ImageButton(0,0,16,16,0,0,16,BUTTON,16,32,e -> {
if(menu.blockEntity.getPower()){
menu.blockEntity.ChangePower();
}
else{
menu.blockEntity.ChangePower();
}
});
private ImageButton button_on = new ImageButton(0,0,16,16,0,0,16,BUTTON_ON,16,32,e -> {
if(menu.blockEntity.getPower()){
menu.ChangePower();
}
else{
menu.ChangePower();
}
});
@Override
protected void init() {
super.init();
this.addRenderableWidget(button);
this.addRenderableWidget(button_on);
button_on.visible = true;
button_on.active = true;
button.visible = false;
button.active = false;
}
@Override
protected void renderBg(PoseStack pPoseStack, float pPartialTick, int pMouseX, int pMouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F,1.0F,1.0F,1.0F);
RenderSystem.setShaderTexture(0,TEXTURE);
int x = (width-imageWidth)/2;
int y = (height-imageHeight)/2;
this.blit(pPoseStack,x,y,0,0,imageWidth,imageHeight);
renderEnergy(pPoseStack,x,y);
renderButton(pPoseStack,x,y);
renderProgressArrow(pPoseStack,x,y);
}
private void renderButton(PoseStack pPoseStack, int x, int y) {
button.setPosition(x+44,y+50);
button_on.setPosition(x+44,y+50);
if(menu.blockEntity.getPower()){
button_on.visible = false;
button_on.active = false;
button.visible = true;
button.active = true;
}
else{
button_on.visible = true;
button_on.active = true;
button.visible = false;
button.active = false;
}
}
}
Packet:
package com.test.Generator.networking.packet;
import com.test.Generator.block.entity.GeneratorEntity;
import com.test.Generator.screen.SmallGeneratorMenu;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier;
public class GeneratorPowerSync2CPacket {
private final boolean power;
private final BlockPos pos;
public GeneratorPowerSync2CPacket (boolean energy, BlockPos pos) {
this.power = energy;
this.pos = pos;
}
public GeneratorPowerSync2CPacket (FriendlyByteBuf buf) {
this.power = buf.readBoolean();
this.pos = buf.readBlockPos();
}
public void toBytes(FriendlyByteBuf buf) {
buf.writeBoolean(power);
buf.writeBlockPos(pos);
}
public boolean handle(Supplier<NetworkEvent.Context> supplier) {
NetworkEvent.Context context = supplier.get();
context.enqueueWork(() -> {
if(Minecraft.getInstance().level.getBlockEntity(pos) instanceof GeneratorEntity blockEntity) {
blockEntity.setPower(blockEntity,power);
if(Minecraft.getInstance().player.containerMenu instanceof SmallGeneratorMenu menu &&
menu.getBlockEntity().getBlockPos().equals(pos)) {
blockEntity.setPower(blockEntity,power);
}
}
});
return true;
}
}
Thank you for your help