1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-08-28 08:12:18 +00:00

Merge remote-tracking branch 'origin/fabric' into fabric

This commit is contained in:
Jacob Farley 2020-09-07 10:54:52 -05:00
commit deea552d99
35 changed files with 207 additions and 119 deletions

View File

@ -19,10 +19,6 @@ repositories {
}
}
minecraft {
accessWidener = file("src/main/resources/computercraft.accesswidener")
}
configurations {
compile.extendsFrom shade
}

View File

@ -28,6 +28,7 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.core.apis.ApiFactories;
import dan200.computercraft.core.filesystem.FileMount;
import dan200.computercraft.core.filesystem.ResourceMount;
import dan200.computercraft.mixin.MinecraftServerAccess;
import dan200.computercraft.shared.BundledRedstone;
import dan200.computercraft.shared.MediaProviders;
import dan200.computercraft.shared.Peripherals;
@ -62,7 +63,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
public static InputStream getResourceFile(String domain, String subPath) {
MinecraftServer server = GameInstanceUtils.getServer();
if (server != null) {
ReloadableResourceManager manager = (ReloadableResourceManager) server.serverResourceManager.getResourceManager();
ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess)server).getServerResourceManager().getResourceManager();
try {
return manager.getResource(new Identifier(domain, subPath))
.getInputStream();
@ -105,7 +106,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
public IMount createResourceMount(@Nonnull String domain, @Nonnull String subPath) {
MinecraftServer server = GameInstanceUtils.getServer();
if (server != null) {
ReloadableResourceManager manager = (ReloadableResourceManager) server.serverResourceManager.getResourceManager();
ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess)server).getServerResourceManager().getResourceManager();
ResourceMount mount = ResourceMount.get(domain, subPath, manager);
return mount.exists("") ? mount : null;
}

View File

@ -10,6 +10,8 @@ import java.util.Objects;
import javax.annotation.Nonnull;
import dan200.computercraft.mixin.AffineTransformationAccess;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.BakedModelManager;
@ -66,15 +68,16 @@ public final class TransformedModel {
public void push(MatrixStack matrixStack) {
matrixStack.push();
if (matrix.translation != null)
matrixStack.translate(this.matrix.translation.getX(), this.matrix.translation.getY(), this.matrix.translation.getZ());
AffineTransformationAccess access = (AffineTransformationAccess) (Object) this.matrix;
if (access.getTranslation() != null)
matrixStack.translate(access.getTranslation().getX(), access.getTranslation().getY(), access.getTranslation().getZ());
matrixStack.multiply(this.matrix.getRotation2());
if (matrix.scale != null)
matrixStack.scale(this.matrix.scale.getX(), this.matrix.scale.getY(), this.matrix.scale.getZ());
if (access.getScale() != null)
matrixStack.scale(access.getScale().getX(), access.getScale().getY(), access.getScale().getZ());
if (matrix.rotation1 != null)
matrixStack.multiply(this.matrix.rotation1);
if (access.getRotation1() != null)
matrixStack.multiply(access.getRotation1());
}
}

View File

@ -8,6 +8,7 @@ package dan200.computercraft.client;
import javax.annotation.Nullable;
import dan200.computercraft.mixin.ChatHudAccess;
import dan200.computercraft.shared.command.text.ChatHelpers;
import dan200.computercraft.shared.command.text.TableBuilder;
import dan200.computercraft.shared.command.text.TableFormatter;
@ -21,6 +22,10 @@ import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.MathHelper;
@SuppressWarnings ({
"MethodCallSideOnly",
"LocalVariableDeclarationSideOnly"
})
public class ClientTableFormatter implements TableFormatter {
public static final ClientTableFormatter INSTANCE = new ClientTableFormatter();
@ -66,7 +71,7 @@ public class ClientTableFormatter implements TableFormatter {
// int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() );
// List<ITextProperties> list = RenderComponentsUtil.func_238505_a_( component, maxWidth, mc.fontRenderer );
// if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id );
chat.addMessage(component, id);
((ChatHudAccess)chat).callAddMessage(component, id);
}
@Override
@ -79,7 +84,7 @@ public class ClientTableFormatter implements TableFormatter {
lastHeights.put(table.getId(), height);
for (int i = height; i < lastHeight; i++) {
chat.removeMessage(i + table.getId());
((ChatHudAccess)chat).callRemoveMessage(i + table.getId());
}
return height;
}

View File

@ -6,6 +6,8 @@
package dan200.computercraft.client.render;
import dan200.computercraft.mixin.HeldItemRendererAccess;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.item.HeldItemRenderer;
@ -66,14 +68,15 @@ public abstract class ItemMapLikeRenderer {
float tZ = -0.4f * MathHelper.sin(swingRt * (float) Math.PI);
transform.translate(0, -tX / 2, tZ);
float pitchAngle = renderer.getMapAngle(pitch);
HeldItemRendererAccess access = (HeldItemRendererAccess) render;
float pitchAngle = access.callGetMapAngle(pitch);
transform.translate(0, 0.04F + equipProgress * -1.2f + pitchAngle * -0.5f, -0.72f);
transform.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(pitchAngle * -85.0f));
if (!minecraft.player.isInvisible()) {
transform.push();
transform.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(90.0F));
renderer.renderArm(transform, render, combinedLight, Arm.RIGHT);
renderer.renderArm(transform, render, combinedLight, Arm.LEFT);
access.callRenderArm(transform, render, combinedLight, Arm.RIGHT);
access.callRenderArm(transform, render, combinedLight, Arm.LEFT);
transform.pop();
}
@ -105,8 +108,8 @@ public abstract class ItemMapLikeRenderer {
if (!minecraft.player.isInvisible()) {
transform.push();
transform.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(offset * 10f));
minecraft.getHeldItemRenderer()
.renderArmHoldingItem(transform, render, combinedLight, equipProgress, swingProgress, side);
((HeldItemRendererAccess)minecraft.getHeldItemRenderer())
.callRenderArmHoldingItem(transform, render, combinedLight, equipProgress, swingProgress, side);
transform.pop();
}

View File

@ -8,6 +8,8 @@ package dan200.computercraft.client.render;
import java.util.List;
import dan200.computercraft.mixin.BakedQuadAccess;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormatElement;
import net.minecraft.client.render.VertexFormats;
@ -51,7 +53,7 @@ public final class ModelTransformer {
int[] vertexData = quad.getVertexData()
.clone();
int offset = 0;
BakedQuad copy = new BakedQuad(vertexData, -1, quad.getFace(), quad.sprite, true);
BakedQuad copy = new BakedQuad(vertexData, -1, quad.getFace(), ((BakedQuadAccess)quad).getSprite(), true);
for (int i = 0; i < format.getElements()
.size(); ++i) // For each vertex element
{

View File

@ -6,6 +6,7 @@
package dan200.computercraft.client.render;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
@ -64,7 +65,8 @@ public class TurtleSmartItemModel implements BakedModel {
this.familyModel = familyModel;
this.colourModel = colourModel;
this.m_overrides = new ModelOverrideList() {
// this actually works I think, trust me
this.m_overrides = new ModelOverrideList(null, null, null, Collections.emptyList()) {
@Nonnull
@Override
public BakedModel apply(@Nonnull BakedModel originalModel, @Nonnull ItemStack stack, @Nullable ClientWorld world,

View File

@ -0,0 +1,20 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.client.util.math.AffineTransformation;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.Quaternion;
@Mixin (AffineTransformation.class)
public interface AffineTransformationAccess {
@Accessor
Vector3f getTranslation();
@Accessor
Vector3f getScale();
@Accessor
Quaternion getRotation1();
}

View File

@ -0,0 +1,13 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.client.render.model.BakedQuad;
import net.minecraft.client.texture.Sprite;
@Mixin (BakedQuad.class)
public interface BakedQuadAccess {
@Accessor
Sprite getSprite();
}

View File

@ -0,0 +1,16 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.client.gui.hud.ChatHud;
import net.minecraft.text.Text;
@Mixin (ChatHud.class)
public interface ChatHudAccess {
@Invoker
void callAddMessage(Text text, int messageId);
@Invoker
void callRemoveMessage(int messageId);
}

View File

@ -0,0 +1,21 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.item.HeldItemRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Arm;
@Mixin (HeldItemRenderer.class)
public interface HeldItemRendererAccess {
@Invoker
float callGetMapAngle(float tickDelta);
@Invoker
void callRenderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, Arm arm);
@Invoker
void callRenderArmHoldingItem(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, float equipProgress, float swingProgress, Arm arm);
}

View File

@ -0,0 +1,13 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.resource.ServerResourceManager;
import net.minecraft.server.MinecraftServer;
@Mixin (MinecraftServer.class)
public interface MinecraftServerAccess {
@Accessor
ServerResourceManager getServerResourceManager();
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,13 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.text.Text;
@Mixin (SignBlockEntity.class)
public interface SignBlockEntityAccess {
@Accessor
Text[] getText();
}

View File

@ -0,0 +1,13 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier;
@Mixin (SoundEvent.class)
public interface SoundEventAccess {
@Accessor
Identifier getId();
}

View File

@ -0,0 +1,12 @@
package dan200.computercraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.util.WorldSavePath;
@Mixin (WorldSavePath.class)
public interface WorldSavePathAccess {
@Invoker
static WorldSavePath createWorldSavePath(String relativePath) { throw new UnsupportedOperationException(); }
}

View File

@ -8,6 +8,7 @@ package dan200.computercraft.shared.network.client;
import javax.annotation.Nonnull;
import dan200.computercraft.mixin.SoundEventAccess;
import dan200.computercraft.shared.network.NetworkMessage;
import net.minecraft.client.MinecraftClient;
@ -64,7 +65,7 @@ public class PlayRecordClientMessage implements NetworkMessage {
} else {
buf.writeBoolean(true);
buf.writeString(this.name);
buf.writeIdentifier(this.soundEvent.id);
buf.writeIdentifier(((SoundEventAccess)this.soundEvent).getId());
}
}

View File

@ -18,6 +18,7 @@ import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.mixin.SoundEventAccess;
import net.minecraft.block.enums.Instrument;
import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket;
@ -153,7 +154,7 @@ public abstract class SpeakerPeripheral implements IPeripheral {
// If the resource location for note block notes changes, this method call will need to be updated
boolean success = this.playSound(context,
instrument.getSound().id,
((SoundEventAccess)instrument.getSound()).getId(),
volume,
(float) Math.pow(2.0, (pitch - 12.0) / 12.0),
true);

View File

@ -6,6 +6,8 @@ import java.util.Map;
import com.google.common.eventbus.Subscribe;
import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
import dan200.computercraft.mixin.SignBlockEntityAccess;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.SignBlockEntity;
@ -17,7 +19,7 @@ public class SignInspectHandler {
SignBlockEntity sbe = (SignBlockEntity)be;
Map<Integer, String> textTable = new HashMap<>();
for(int k = 0; k < 4; k++) {
textTable.put(k+1, sbe.text[k].asString());
textTable.put(k+1, ((SignBlockEntityAccess)sbe).getText()[k].asString());
}
event.getData().put("text", textTable);
}

View File

@ -26,11 +26,8 @@ import dan200.computercraft.shared.TurtlePermissions;
import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand;
import dan200.computercraft.shared.turtle.core.TurtlePlayer;
import dan200.computercraft.shared.util.DropConsumer;
import dan200.computercraft.shared.util.FillableMatrix4f;
import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.*;
import org.apache.commons.lang3.tuple.Pair;
import net.minecraft.block.Block;
@ -38,6 +35,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.util.math.AffineTransformation;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.entity.Entity;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.damage.DamageSource;
@ -48,12 +46,14 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.event.player.AttackEntityCallback;
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
public class TurtleTool extends AbstractTurtleUpgrade {
protected final ItemStack item;

View File

@ -1,24 +0,0 @@
package dan200.computercraft.shared.util;
import net.minecraft.util.math.Matrix4f;
public class FillableMatrix4f extends Matrix4f {
public FillableMatrix4f(float[] input) {
this.a00 = input[0];
this.a01 = input[1];
this.a02 = input[2];
this.a03 = input[3];
this.a10 = input[4];
this.a11 = input[5];
this.a12 = input[6];
this.a13 = input[7];
this.a20 = input[8];
this.a21 = input[9];
this.a22 = input[10];
this.a23 = input[11];
this.a30 = input[12];
this.a31 = input[13];
this.a32 = input[14];
this.a33 = input[15];
}
}

View File

@ -21,13 +21,14 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.mixin.WorldSavePathAccess;
import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.WorldSavePath;
public final class IDAssigner {
private static final WorldSavePath FOLDER = new WorldSavePath(ComputerCraft.MOD_ID);
private static final WorldSavePath FOLDER = WorldSavePathAccess.createWorldSavePath(ComputerCraft.MOD_ID);
private static final Gson GSON = new GsonBuilder().setPrettyPrinting()
.create();
private static final Type ID_TOKEN = new TypeToken<Map<String, Integer>>() {}.getType();

View File

@ -1,24 +0,0 @@
accessWidener v1 named
accessible method net/minecraft/client/gui/hud/ChatHud addMessage (Lnet/minecraft/text/Text;I)V
accessible method net/minecraft/client/gui/hud/ChatHud removeMessage (I)V
accessible field net/minecraft/block/entity/BlockEntity invalid Z
accessible method net/minecraft/world/World isValid (Lnet/minecraft/util/math/BlockPos;)Z
accessible method net/minecraft/client/render/item/HeldItemRenderer renderArmHoldingItem (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IFFLnet/minecraft/util/Arm;)V
accessible method net/minecraft/client/render/item/HeldItemRenderer renderArm (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/util/Arm;)V
accessible method net/minecraft/client/render/item/HeldItemRenderer getMapAngle (F)F
accessible method net/minecraft/client/texture/TextureManager bindTextureInner (Lnet/minecraft/util/Identifier;)V
accessible field net/minecraft/entity/Entity pos Lnet/minecraft/util/math/Vec3d;
extendable method net/minecraft/entity/Entity getCameraPosVec (F)Lnet/minecraft/util/math/Vec3d;
accessible method net/minecraft/screen/ScreenHandlerType <init> (Lnet/minecraft/screen/ScreenHandlerType$Factory;)V
accessible class net/minecraft/screen/ScreenHandlerType$Factory
accessible method net/minecraft/client/render/model/json/ModelOverrideList <init> ()V
extendable class net/minecraft/util/math/Matrix4f
accessible method net/minecraft/util/WorldSavePath <init> (Ljava/lang/String;)V
accessible field net/minecraft/server/MinecraftServer serverResourceManager Lnet/minecraft/resource/ServerResourceManager;
accessible field net/minecraft/client/render/model/BakedQuad sprite Lnet/minecraft/client/texture/Sprite;
accessible field net/minecraft/client/util/math/AffineTransformation translation Lnet/minecraft/client/util/math/Vector3f;
accessible field net/minecraft/client/util/math/AffineTransformation scale Lnet/minecraft/client/util/math/Vector3f;
accessible field net/minecraft/client/util/math/AffineTransformation rotation1 Lnet/minecraft/util/math/Quaternion;
accessible field net/minecraft/sound/SoundEvent id Lnet/minecraft/util/Identifier;
accessible field net/minecraft/block/entity/SignBlockEntity text [Lnet/minecraft/text/Text;

View File

@ -1,15 +0,0 @@
{
"required": true,
"package": "dan200.computercraft.shared.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"MixinHeldItemRenderer",
"MixinItemFrameEntityRenderer",
"MixinMinecraftGame",
"MixinScreen",
"MixinWorldRenderer"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@ -1,14 +0,0 @@
{
"required": true,
"package": "dan200.computercraft.shared.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"MixinBlock",
"MixinEntity",
"MixinServerWorld",
"MixinWorld"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@ -0,0 +1,29 @@
{
"required": true,
"package": "dan200.computercraft.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"AffineTransformationAccess",
"BakedQuadAccess",
"ChatHudAccess",
"HeldItemRendererAccess",
"MinecraftServerAccess",
"MixinBlock",
"MixinEntity",
"MixinServerWorld",
"MixinWorld",
"SignBlockEntityAccess",
"SoundEventAccess",
"WorldSavePathAccess"
],
"client": [
"MixinHeldItemRenderer",
"MixinItemFrameEntityRenderer",
"MixinMinecraftGame",
"MixinScreen",
"MixinWorldRenderer"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@ -30,8 +30,6 @@
"client": ["dan200.computercraft.client.proxy.ComputerCraftProxyClient"]
},
"mixins": [
{ "config": "computercraft.client.json", "environment": "client" },
"computercraft.common.json"
],
"accessWidener" : "computercraft.accesswidener"
"computercraft.mixins.json"
]
}