1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-08-27 16:02:17 +00:00

Merge pull request #42 from Toad-Dev/merith-buffer-fix

Fix: Monitor render buffers not being released properly.
This commit is contained in:
Merith 2021-06-03 15:28:23 -07:00 committed by GitHub
commit 4d1a950fbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 153 additions and 118 deletions

View File

@ -30,7 +30,7 @@ import dan200.computercraft.core.apis.ApiFactories;
import dan200.computercraft.core.asm.GenericMethod; import dan200.computercraft.core.asm.GenericMethod;
import dan200.computercraft.core.filesystem.FileMount; import dan200.computercraft.core.filesystem.FileMount;
import dan200.computercraft.core.filesystem.ResourceMount; import dan200.computercraft.core.filesystem.ResourceMount;
import dan200.computercraft.mixin.MinecraftServerAccess; import dan200.computercraft.fabric.mixin.MinecraftServerAccess;
import dan200.computercraft.shared.BundledRedstone; import dan200.computercraft.shared.BundledRedstone;
import dan200.computercraft.shared.MediaProviders; import dan200.computercraft.shared.MediaProviders;
import dan200.computercraft.shared.Peripherals; import dan200.computercraft.shared.Peripherals;

View File

@ -10,7 +10,7 @@ import java.util.Objects;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import dan200.computercraft.mixin.AffineTransformationAccess; import dan200.computercraft.fabric.mixin.AffineTransformationAccess;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModel;

View File

@ -8,7 +8,7 @@ package dan200.computercraft.client;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import dan200.computercraft.mixin.ChatHudAccess; import dan200.computercraft.fabric.mixin.ChatHudAccess;
import dan200.computercraft.shared.command.text.ChatHelpers; import dan200.computercraft.shared.command.text.ChatHelpers;
import dan200.computercraft.shared.command.text.TableBuilder; import dan200.computercraft.shared.command.text.TableBuilder;
import dan200.computercraft.shared.command.text.TableFormatter; import dan200.computercraft.shared.command.text.TableFormatter;

View File

@ -20,9 +20,11 @@ import dan200.computercraft.client.render.TileEntityMonitorRenderer;
import dan200.computercraft.client.render.TileEntityTurtleRenderer; import dan200.computercraft.client.render.TileEntityTurtleRenderer;
import dan200.computercraft.client.render.TurtleModelLoader; import dan200.computercraft.client.render.TurtleModelLoader;
import dan200.computercraft.client.render.TurtlePlayerRenderer; import dan200.computercraft.client.render.TurtlePlayerRenderer;
import dan200.computercraft.fabric.events.ClientUnloadWorldEvent;
import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.ComputerCraftRegistry;
import dan200.computercraft.shared.common.ContainerHeldItem; import dan200.computercraft.shared.common.ContainerHeldItem;
import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.computer.inventory.ContainerComputer; import dan200.computercraft.shared.computer.inventory.ContainerComputer;
import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive;
@ -32,6 +34,7 @@ import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientBlockEntityEvents;
import net.minecraft.client.item.ModelPredicateProvider; import net.minecraft.client.item.ModelPredicateProvider;
import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayer;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -47,14 +50,19 @@ import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegi
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry;
import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
import net.fabricmc.fabric.mixin.object.builder.ModelPredicateProviderRegistrySpecificAccessor; import net.fabricmc.fabric.mixin.object.builder.ModelPredicateProviderRegistrySpecificAccessor;
@Environment (EnvType.CLIENT) @Environment (EnvType.CLIENT)
public final class ComputerCraftProxyClient implements ClientModInitializer { public final class ComputerCraftProxyClient implements ClientModInitializer {
public static void initEvents() { private static void initEvents() {
ClientBlockEntityEvents.BLOCK_ENTITY_UNLOAD.register( ( blockEntity, world ) -> {
if(blockEntity instanceof TileGeneric ) {
((TileGeneric)blockEntity).onChunkUnloaded();
}
});
ClientUnloadWorldEvent.EVENT.register( () -> ClientMonitor.destroyAll() );
} }
@Override @Override
@ -96,13 +104,9 @@ public final class ComputerCraftProxyClient implements ClientModInitializer {
() -> ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED); () -> ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED);
ClientRegistry.onItemColours(); ClientRegistry.onItemColours();
// TODO Verify this does things properly initEvents();
ServerWorldEvents.UNLOAD.register(((minecraftServer, serverWorld) -> {
ClientMonitor.destroyAll();
}));
} }
// My IDE doesn't think so, but we do actually need these generics. // My IDE doesn't think so, but we do actually need these generics.
private static void registerContainers() { private static void registerContainers() {
ScreenRegistry.<ContainerComputer, GuiComputer<ContainerComputer>>register(ComputerCraftRegistry.ModContainers.COMPUTER, GuiComputer::create); ScreenRegistry.<ContainerComputer, GuiComputer<ContainerComputer>>register(ComputerCraftRegistry.ModContainers.COMPUTER, GuiComputer::create);
@ -125,15 +129,4 @@ public final class ComputerCraftProxyClient implements ClientModInitializer {
ModelPredicateProviderRegistrySpecificAccessor.callRegister(item.get(), id, getter); ModelPredicateProviderRegistrySpecificAccessor.callRegister(item.get(), id, getter);
} }
} }
// @Mod.EventBusSubscriber (modid = ComputerCraft.MOD_ID, value = Dist.CLIENT)
// public static final class ForgeHandlers {
// @SubscribeEvent
// public static void onWorldUnload(WorldEvent.Unload event) {
// if (event.getWorld()
// .isClient()) {
// ClientMonitor.destroyAll();
// }
// }
// }
} }

View File

@ -6,7 +6,7 @@
package dan200.computercraft.client.render; package dan200.computercraft.client.render;
import dan200.computercraft.mixin.HeldItemRendererAccess; import dan200.computercraft.fabric.mixin.HeldItemRendererAccess;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;

View File

@ -8,7 +8,7 @@ package dan200.computercraft.client.render;
import java.util.List; import java.util.List;
import dan200.computercraft.mixin.BakedQuadAccess; import dan200.computercraft.fabric.mixin.BakedQuadAccess;
import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormatElement; import net.minecraft.client.render.VertexFormatElement;

View File

@ -0,0 +1,17 @@
package dan200.computercraft.fabric.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
@FunctionalInterface
public interface ClientUnloadWorldEvent
{
Event<ClientUnloadWorldEvent> EVENT = EventFactory.createArrayBacked( ClientUnloadWorldEvent.class,
callbacks -> () -> {
for( ClientUnloadWorldEvent callback : callbacks) {
callback.onClientUnloadWorld();
}
});
void onClientUnloadWorld();
}

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.shared.util.DropConsumer; import dan200.computercraft.shared.util.DropConsumer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.shared.util.DropConsumer; import dan200.computercraft.shared.util.DropConsumer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;

View File

@ -4,12 +4,11 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.client.render.ItemPocketRenderer; import dan200.computercraft.client.render.ItemPocketRenderer;
import dan200.computercraft.client.render.ItemPrintoutRenderer; import dan200.computercraft.client.render.ItemPrintoutRenderer;
import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.media.items.ItemPrintout;
import dan200.computercraft.shared.mixed.MixedFirstPersonRenderer;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@ -30,22 +29,12 @@ import net.fabricmc.api.Environment;
@Mixin (HeldItemRenderer.class) @Mixin (HeldItemRenderer.class)
@Environment (EnvType.CLIENT) @Environment (EnvType.CLIENT)
public class MixinHeldItemRenderer implements MixedFirstPersonRenderer { public class MixinHeldItemRenderer {
@Override
public void renderArmFirstPerson_CC(MatrixStack stack, VertexConsumerProvider consumerProvider, int light, float equip, float swing, Arm hand) {
this.renderArmHoldingItem(stack, consumerProvider, light, equip, swing, hand);
}
@Shadow @Shadow
private void renderArmHoldingItem(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, float equipProgress, float swingProgress, private void renderArmHoldingItem(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, float equipProgress, float swingProgress,
Arm arm) { Arm arm) {
} }
@Override
public float getMapAngleFromPitch_CC(float pitch) {
return this.getMapAngle(pitch);
}
@Shadow @Shadow
private float getMapAngle(float pitch) { private float getMapAngle(float pitch) {
return 0; return 0;

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.client.render.ItemPrintoutRenderer; import dan200.computercraft.client.render.ItemPrintoutRenderer;
import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.media.items.ItemPrintout;

View File

@ -0,0 +1,37 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.fabric.mixin;
import dan200.computercraft.client.FrameInfo;
import dan200.computercraft.fabric.events.ClientUnloadWorldEvent;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.world.ClientWorld;
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.CallbackInfo;
import net.minecraft.client.MinecraftClient;
@Mixin (MinecraftClient.class)
public abstract class MixinMinecraftClient
{
@Inject (method = "render", at = @At ("HEAD"))
private void onRender(CallbackInfo info) {
FrameInfo.onRenderFrame();
}
@Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At ("RETURN"))
private void disconnectAfter(Screen screen, CallbackInfo info) {
ClientUnloadWorldEvent.EVENT.invoker().onClientUnloadWorld();
}
@Inject(method = "joinWorld", at = @At("RETURN"))
private void joinWorldAfter(ClientWorld world, CallbackInfo info) {
ClientUnloadWorldEvent.EVENT.invoker().onClientUnloadWorld();
}
}

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.shared.command.ClientCommands; import dan200.computercraft.shared.command.ClientCommands;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.shared.util.DropConsumer; import dan200.computercraft.shared.util.DropConsumer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import java.util.Collection; import java.util.Collection;

View File

@ -4,7 +4,7 @@
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import dan200.computercraft.client.render.CableHighlightRenderer; import dan200.computercraft.client.render.CableHighlightRenderer;
import dan200.computercraft.client.render.MonitorHighlightRenderer; import dan200.computercraft.client.render.MonitorHighlightRenderer;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;

View File

@ -1,4 +1,4 @@
package dan200.computercraft.mixin; package dan200.computercraft.fabric.mixin;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;

View File

@ -1,23 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.mixin;
import dan200.computercraft.client.FrameInfo;
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.CallbackInfo;
import net.minecraft.client.MinecraftClient;
@Mixin (MinecraftClient.class)
public abstract class MixinMinecraftGame {
@Inject (method = "render", at = @At ("HEAD"))
private void onRender(CallbackInfo info) {
FrameInfo.onRenderFrame();
}
}

View File

@ -28,6 +28,9 @@ public abstract class TileGeneric extends BlockEntity implements BlockEntityClie
public void destroy() { public void destroy() {
} }
public void onChunkUnloaded() {
}
public final void updateBlock() { public final void updateBlock() {
this.markDirty(); this.markDirty();
BlockPos pos = this.getPos(); BlockPos pos = this.getPos();

View File

@ -77,6 +77,12 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
} }
} }
@Override
public void onChunkUnloaded()
{
unload();
}
protected void unload() { protected void unload() {
if (this.m_instanceID >= 0) { if (this.m_instanceID >= 0) {
if (!this.getWorld().isClient) { if (!this.getWorld().isClient) {

View File

@ -1,17 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.mixed;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Arm;
public interface MixedFirstPersonRenderer {
void renderArmFirstPerson_CC(MatrixStack stack, VertexConsumerProvider consumerProvider, int light, float equip, float swing, Arm hand);
float getMapAngleFromPitch_CC(float pitch);
}

View File

@ -8,7 +8,7 @@ package dan200.computercraft.shared.network.client;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import dan200.computercraft.mixin.SoundEventAccess; import dan200.computercraft.fabric.mixin.SoundEventAccess;
import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.network.NetworkMessage;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;

View File

@ -83,6 +83,13 @@ public class TileCable extends TileGeneric implements IPeripheralTile {
} }
} }
@Override
public void onChunkUnloaded()
{
super.onChunkUnloaded();
onRemove();
}
private void onRemove() { private void onRemove() {
if (this.world == null || !this.world.isClient) { if (this.world == null || !this.world.isClient) {
this.m_node.remove(); this.m_node.remove();

View File

@ -74,6 +74,13 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile {
super.destroy(); super.destroy();
} }
@Override
public void onChunkUnloaded()
{
super.onChunkUnloaded();
doRemove();
}
private void doRemove() { private void doRemove() {
if (this.world == null || !this.world.isClient) { if (this.world == null || !this.world.isClient) {
this.m_node.remove(); this.m_node.remove();

View File

@ -79,6 +79,23 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile {
} }
} }
@Override
public void markRemoved() {
super.markRemoved();
if (this.m_clientMonitor != null && this.m_xIndex == 0 && this.m_yIndex == 0) {
this.m_clientMonitor.destroy();
}
}
@Override
public void onChunkUnloaded() {
super.onChunkUnloaded();
if (this.m_clientMonitor != null && this.m_xIndex == 0 && this.m_yIndex == 0) {
this.m_clientMonitor.destroy();
}
this.m_clientMonitor = null;
}
@Nonnull @Nonnull
@Override @Override
public ActionResult onActivate(PlayerEntity player, Hand hand, BlockHitResult hit) { public ActionResult onActivate(PlayerEntity player, Hand hand, BlockHitResult hit) {
@ -262,15 +279,6 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile {
return ComputerCraft.monitorDistanceSq; return ComputerCraft.monitorDistanceSq;
} }
@Override
@Environment (EnvType.CLIENT)
public void markRemoved() {
super.markRemoved();
if (this.m_clientMonitor != null && this.m_xIndex == 0 && this.m_yIndex == 0) {
this.m_clientMonitor.destroy();
}
}
// Sizing and placement stuff // Sizing and placement stuff
@Override @Override

View File

@ -18,7 +18,7 @@ import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.mixin.SoundEventAccess; import dan200.computercraft.fabric.mixin.SoundEventAccess;
import net.minecraft.block.enums.Instrument; import net.minecraft.block.enums.Instrument;
import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket; import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket;

View File

@ -17,6 +17,7 @@ import dan200.computercraft.shared.TurtlePermissions;
import dan200.computercraft.shared.command.CommandComputerCraft; import dan200.computercraft.shared.command.CommandComputerCraft;
import dan200.computercraft.shared.command.arguments.ArgumentSerializers; import dan200.computercraft.shared.command.arguments.ArgumentSerializers;
import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider; import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider;
import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition; import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
import dan200.computercraft.shared.data.HasComputerIdLootCondition; import dan200.computercraft.shared.data.HasComputerIdLootCondition;
import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
@ -28,6 +29,7 @@ import dan200.computercraft.shared.turtle.FurnaceRefuelHandler;
import dan200.computercraft.shared.turtle.SignInspectHandler; import dan200.computercraft.shared.turtle.SignInspectHandler;
import dan200.computercraft.shared.util.TickScheduler; import dan200.computercraft.shared.util.TickScheduler;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.CommandBlockBlockEntity; import net.minecraft.block.entity.CommandBlockBlockEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -106,6 +108,12 @@ public final class ComputerCraftProxyCommon {
ComputerCraftProxyCommon.server = null; ComputerCraftProxyCommon.server = null;
}); });
ServerBlockEntityEvents.BLOCK_ENTITY_UNLOAD.register( ( blockEntity, world ) -> {
if(blockEntity instanceof TileGeneric ) {
((TileGeneric)blockEntity).onChunkUnloaded();
}
});
TurtleEvent.EVENT_BUS.register(FurnaceRefuelHandler.INSTANCE); TurtleEvent.EVENT_BUS.register(FurnaceRefuelHandler.INSTANCE);
TurtleEvent.EVENT_BUS.register(new TurtlePermissions()); TurtleEvent.EVENT_BUS.register(new TurtlePermissions());
TurtleEvent.EVENT_BUS.register(new SignInspectHandler()); TurtleEvent.EVENT_BUS.register(new SignInspectHandler());

View File

@ -6,7 +6,7 @@ import java.util.Map;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import dan200.computercraft.api.turtle.event.TurtleBlockEvent; import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
import dan200.computercraft.mixin.SignBlockEntityAccess; import dan200.computercraft.fabric.mixin.SignBlockEntityAccess;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;

View File

@ -21,7 +21,7 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.mixin.WorldSavePathAccess; import dan200.computercraft.fabric.mixin.WorldSavePathAccess;
import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;

View File

@ -1,6 +1,6 @@
{ {
"required": true, "required": true,
"package": "dan200.computercraft.mixin", "package": "dan200.computercraft.fabric.mixin",
"compatibilityLevel": "JAVA_8", "compatibilityLevel": "JAVA_8",
"mixins": [ "mixins": [
"MinecraftServerAccess", "MinecraftServerAccess",
@ -20,7 +20,7 @@
"HeldItemRendererAccess", "HeldItemRendererAccess",
"MixinHeldItemRenderer", "MixinHeldItemRenderer",
"MixinItemFrameEntityRenderer", "MixinItemFrameEntityRenderer",
"MixinMinecraftGame", "MixinMinecraftClient",
"MixinScreen", "MixinScreen",
"MixinWorldRenderer" "MixinWorldRenderer"
], ],