mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-08-28 00:12:16 +00:00
Fix cables and turtle rendering.
This commit is contained in:
parent
244fd95034
commit
e43dd9f7c6
@ -38,6 +38,7 @@ import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -164,7 +165,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
|
||||
return new WiredNode( element );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Nullable
|
||||
@Override
|
||||
public IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
|
||||
{
|
||||
|
@ -217,7 +217,7 @@ public final class ComputerCraftAPI
|
||||
* @return The element's node
|
||||
* @see IWiredElement#getNode()
|
||||
*/
|
||||
@Nonnull
|
||||
@Nullable
|
||||
public static IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
|
||||
{
|
||||
return getInstance().getWiredElementAt( world, pos, side );
|
||||
@ -274,7 +274,7 @@ public final class ComputerCraftAPI
|
||||
@Nonnull
|
||||
IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element );
|
||||
|
||||
@Nonnull
|
||||
@Nullable
|
||||
IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side );
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,8 @@ import net.minecraft.client.render.model.BakedModel;
|
||||
import net.minecraft.client.render.model.BakedModelManager;
|
||||
import net.minecraft.client.util.ModelIdentifier;
|
||||
import net.minecraft.client.util.math.AffineTransformation;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.client.util.math.Vector3f;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Objects;
|
||||
@ -60,4 +62,16 @@ public final class TransformedModel
|
||||
{
|
||||
return matrix;
|
||||
}
|
||||
|
||||
public void push(MatrixStack matrixStack) {
|
||||
matrixStack.push();
|
||||
|
||||
matrixStack.translate(matrix.translation.getX(), matrix.translation.getY(), matrix.translation.getZ());
|
||||
|
||||
matrixStack.multiply(matrix.getRotation2());
|
||||
|
||||
matrixStack.scale(matrix.scale.getX(), matrix.scale.getY(), matrix.scale.getZ());
|
||||
|
||||
matrixStack.multiply(matrix.rotation1);
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ import dan200.computercraft.client.gui.GuiPrintout;
|
||||
import dan200.computercraft.client.gui.GuiTurtle;
|
||||
import dan200.computercraft.client.render.TileEntityMonitorRenderer;
|
||||
import dan200.computercraft.client.render.TileEntityTurtleRenderer;
|
||||
import dan200.computercraft.client.render.TurtleModelLoader;
|
||||
import dan200.computercraft.client.render.TurtlePlayerRenderer;
|
||||
import dan200.computercraft.shared.ComputerCraftRegistry;
|
||||
import dan200.computercraft.shared.common.IColouredItem;
|
||||
@ -26,21 +27,27 @@ import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
|
||||
import dan200.computercraft.shared.peripheral.monitor.ClientMonitor;
|
||||
import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
|
||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
|
||||
import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry;
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry;
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
|
||||
import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry;
|
||||
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.minecraft.client.item.ModelPredicateProvider;
|
||||
import net.minecraft.client.render.RenderLayer;
|
||||
import net.minecraft.client.texture.SpriteAtlasTexture;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.screen.PlayerScreenHandler;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
|
||||
@SuppressWarnings ("MethodCallSideOnly")
|
||||
@Environment(EnvType.CLIENT)
|
||||
public final class ComputerCraftProxyClient implements ClientModInitializer {
|
||||
|
||||
@SafeVarargs
|
||||
@ -55,16 +62,14 @@ public final class ComputerCraftProxyClient implements ClientModInitializer {
|
||||
// My IDE doesn't think so, but we do actually need these generics.
|
||||
|
||||
ScreenRegistry.<ContainerComputer, GuiComputer<ContainerComputer>>register(ComputerCraftRegistry.ModContainers.COMPUTER, GuiComputer::create);
|
||||
ScreenRegistry.<ContainerPocketComputer, GuiComputer<ContainerPocketComputer>>register(ComputerCraftRegistry.ModContainers.POCKET_COMPUTER,
|
||||
GuiComputer::createPocket);
|
||||
ScreenRegistry.<ContainerPocketComputer, GuiComputer<ContainerPocketComputer>>register(ComputerCraftRegistry.ModContainers.POCKET_COMPUTER, GuiComputer::createPocket);
|
||||
ScreenRegistry.register(ComputerCraftRegistry.ModContainers.TURTLE, GuiTurtle::new);
|
||||
|
||||
ScreenRegistry.register(ComputerCraftRegistry.ModContainers.PRINTER, GuiPrinter::new);
|
||||
ScreenRegistry.register(ComputerCraftRegistry.ModContainers.DISK_DRIVE, GuiDiskDrive::new);
|
||||
ScreenRegistry.register(ComputerCraftRegistry.ModContainers.PRINTOUT, GuiPrintout::new);
|
||||
|
||||
ScreenRegistry.<ContainerViewComputer, GuiComputer<ContainerViewComputer>>register(ComputerCraftRegistry.ModContainers.VIEW_COMPUTER,
|
||||
GuiComputer::createView);
|
||||
ScreenRegistry.<ContainerViewComputer, GuiComputer<ContainerViewComputer>>register(ComputerCraftRegistry.ModContainers.VIEW_COMPUTER, GuiComputer::createView);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -87,6 +92,13 @@ public final class ComputerCraftProxyClient implements ClientModInitializer {
|
||||
BlockEntityRendererRegistry.INSTANCE.register(ComputerCraftRegistry.ModTiles.TURTLE_ADVANCED, TileEntityTurtleRenderer::new);
|
||||
// TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() );
|
||||
|
||||
ClientSpriteRegistryCallback.event(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE)
|
||||
.register(ClientRegistry::onTextureStitchEvent);
|
||||
ModelLoadingRegistry.INSTANCE.registerAppender(ClientRegistry::onMeodelBakeEvent);
|
||||
ModelLoadingRegistry.INSTANCE.registerResourceProvider(loader -> (name, context) -> TurtleModelLoader.INSTANCE.accepts(name) ?
|
||||
TurtleModelLoader.INSTANCE.loadModel(
|
||||
name) : null);
|
||||
|
||||
EntityRendererRegistry.INSTANCE.register(ComputerCraftRegistry.ModEntities.TURTLE_PLAYER, TurtlePlayerRenderer::new);
|
||||
|
||||
registerItemProperty("state",
|
||||
|
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* 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.client.render;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.vecmath.Vector4f;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.render.VertexFormat;
|
||||
import net.minecraft.client.render.VertexFormatElement;
|
||||
import net.minecraft.client.render.VertexFormats;
|
||||
import net.minecraft.client.render.model.BakedQuad;
|
||||
import net.minecraft.util.math.Matrix4f;
|
||||
import net.minecraft.util.math.Quaternion;
|
||||
|
||||
/**
|
||||
* Transforms vertices of a model, remaining aware of winding order, and rearranging vertices if needed.
|
||||
*/
|
||||
@Environment(EnvType.CLIENT)
|
||||
public final class ModelTransformer {
|
||||
private static final Matrix4f identity;
|
||||
|
||||
static {
|
||||
identity = new Matrix4f();
|
||||
identity.loadIdentity();
|
||||
}
|
||||
|
||||
private ModelTransformer() {
|
||||
}
|
||||
|
||||
public static void transformQuadsTo(List<BakedQuad> output, List<BakedQuad> input, Matrix4f transform) {
|
||||
transformQuadsTo(VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, output, input, transform);
|
||||
}
|
||||
|
||||
public static void transformQuadsTo(VertexFormat format, List<BakedQuad> output, List<BakedQuad> input, Matrix4f transform) {
|
||||
if (transform == null || transform.equals(identity)) {
|
||||
output.addAll(input);
|
||||
} else {
|
||||
for (BakedQuad quad : input) {
|
||||
output.add(doTransformQuad(format, quad, transform));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static BakedQuad doTransformQuad(VertexFormat format, BakedQuad quad, Matrix4f transform) {
|
||||
int[] vertexData = quad.getVertexData()
|
||||
.clone();
|
||||
int offset = 0;
|
||||
BakedQuad copy = new BakedQuad(vertexData, -1, quad.getFace(), quad.sprite, true);
|
||||
for (int i = 0; i < format.getElements().size(); ++i) // For each vertex element
|
||||
{
|
||||
VertexFormatElement element = format.getElements().get(i);
|
||||
if (element.getType() == VertexFormatElement.Type.POSITION && element.getFormat() == VertexFormatElement.Format.FLOAT && element.getSize() == 3) // When we find a position
|
||||
// element
|
||||
{
|
||||
for (int j = 0; j < 4; ++j) // For each corner of the quad
|
||||
{
|
||||
int start = offset + j * format.getVertexSize();
|
||||
if ((start % 4) == 0) {
|
||||
start = start / 4;
|
||||
|
||||
// Extract the position
|
||||
Quaternion pos = new Quaternion(Float.intBitsToFloat(vertexData[start]),
|
||||
Float.intBitsToFloat(vertexData[start + 1]),
|
||||
Float.intBitsToFloat(vertexData[start + 2]),
|
||||
1);
|
||||
|
||||
// Transform the position
|
||||
transform.multiply(pos);
|
||||
|
||||
// Insert the position
|
||||
vertexData[start] = Float.floatToRawIntBits(pos.getX());
|
||||
vertexData[start + 1] = Float.floatToRawIntBits(pos.getY());
|
||||
vertexData[start + 2] = Float.floatToRawIntBits(pos.getZ());
|
||||
}
|
||||
}
|
||||
}
|
||||
offset += element.getSize();
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
public static BakedQuad transformQuad(VertexFormat format, BakedQuad input, Matrix4f transform) {
|
||||
if (transform == null || transform.equals(identity)) {
|
||||
return input;
|
||||
}
|
||||
return doTransformQuad(format, input, transform);
|
||||
}
|
||||
}
|
@ -145,7 +145,7 @@ public class TileEntityTurtleRenderer extends BlockEntityRenderer<TileTurtle>
|
||||
transform.translate( 0.0f, -0.5f, -0.5f );
|
||||
|
||||
TransformedModel model = upgrade.getModel( turtle.getAccess(), side );
|
||||
// model.getMatrix().multiply(transform);
|
||||
model.push(transform);
|
||||
renderModel( transform, renderer, lightmapCoord, overlayLight, model.getModel(), null );
|
||||
transform.pop();
|
||||
|
||||
|
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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.client.render;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.render.model.BakedModel;
|
||||
import net.minecraft.client.render.model.ModelBakeSettings;
|
||||
import net.minecraft.client.render.model.ModelLoader;
|
||||
import net.minecraft.client.render.model.UnbakedModel;
|
||||
import net.minecraft.client.texture.Sprite;
|
||||
import net.minecraft.client.util.SpriteIdentifier;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public final class TurtleModelLoader {
|
||||
public static final TurtleModelLoader INSTANCE = new TurtleModelLoader();
|
||||
private static final Identifier NORMAL_TURTLE_MODEL = new Identifier(ComputerCraft.MOD_ID, "block/turtle_normal");
|
||||
private static final Identifier ADVANCED_TURTLE_MODEL = new Identifier(ComputerCraft.MOD_ID, "block/turtle_advanced");
|
||||
private static final Identifier COLOUR_TURTLE_MODEL = new Identifier(ComputerCraft.MOD_ID, "block/turtle_colour");
|
||||
|
||||
private TurtleModelLoader() {
|
||||
}
|
||||
|
||||
public boolean accepts(@Nonnull Identifier name) {
|
||||
return name.getNamespace()
|
||||
.equals(ComputerCraft.MOD_ID) && (name.getPath()
|
||||
.equals("item/turtle_normal") || name.getPath()
|
||||
.equals("item/turtle_advanced"));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public UnbakedModel loadModel(@Nonnull Identifier name) {
|
||||
if (name.getNamespace()
|
||||
.equals(ComputerCraft.MOD_ID)) {
|
||||
switch (name.getPath()) {
|
||||
case "item/turtle_normal":
|
||||
return new TurtleModel(NORMAL_TURTLE_MODEL);
|
||||
case "item/turtle_advanced":
|
||||
return new TurtleModel(ADVANCED_TURTLE_MODEL);
|
||||
}
|
||||
}
|
||||
|
||||
throw new IllegalStateException("Loader does not accept " + name);
|
||||
}
|
||||
|
||||
private static final class TurtleModel implements UnbakedModel {
|
||||
private final Identifier family;
|
||||
|
||||
private TurtleModel(Identifier family) {this.family = family;}
|
||||
|
||||
@Override
|
||||
public Collection<SpriteIdentifier> getTextureDependencies(Function<Identifier, UnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors) {
|
||||
return this.getModelDependencies().stream()
|
||||
.flatMap(x -> modelGetter.apply(x)
|
||||
.getTextureDependencies(modelGetter, missingTextureErrors)
|
||||
.stream())
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public Collection<Identifier> getModelDependencies() {
|
||||
return Arrays.asList(this.family, COLOUR_TURTLE_MODEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BakedModel bake(@Nonnull ModelLoader loader, @Nonnull Function<SpriteIdentifier, Sprite> spriteGetter, @Nonnull ModelBakeSettings state, Identifier modelId) {
|
||||
return new TurtleSmartItemModel(loader.getOrLoadModel(this.family)
|
||||
.bake(loader, spriteGetter, state, modelId),
|
||||
loader.getOrLoadModel(COLOUR_TURTLE_MODEL)
|
||||
.bake(loader, spriteGetter, state, modelId));
|
||||
}
|
||||
}
|
||||
}
|
@ -61,20 +61,20 @@ public class TurtleMultiModel implements BakedModel
|
||||
ArrayList<BakedQuad> quads = new ArrayList<>();
|
||||
|
||||
|
||||
transformQuadsTo( quads, m_baseModel.getQuads( state, side, rand ), m_generalTransform );
|
||||
ModelTransformer.transformQuadsTo( quads, m_baseModel.getQuads( state, side, rand ), m_generalTransform.getMatrix() );
|
||||
if( m_overlayModel != null )
|
||||
{
|
||||
transformQuadsTo( quads, m_overlayModel.getQuads( state, side, rand ), m_generalTransform );
|
||||
ModelTransformer.transformQuadsTo( quads, m_overlayModel.getQuads( state, side, rand ), m_generalTransform.getMatrix() );
|
||||
}
|
||||
if( m_leftUpgradeModel != null )
|
||||
{
|
||||
AffineTransformation upgradeTransform = m_generalTransform.multiply( m_leftUpgradeModel.getMatrix() );
|
||||
transformQuadsTo( quads, m_leftUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform );
|
||||
ModelTransformer.transformQuadsTo( quads, m_leftUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform.getMatrix() );
|
||||
}
|
||||
if( m_rightUpgradeModel != null )
|
||||
{
|
||||
AffineTransformation upgradeTransform = m_generalTransform.multiply( m_rightUpgradeModel.getMatrix() );
|
||||
transformQuadsTo( quads, m_rightUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform );
|
||||
ModelTransformer.transformQuadsTo( quads, m_rightUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform.getMatrix() );
|
||||
}
|
||||
quads.trimToSize();
|
||||
return quads;
|
||||
@ -126,16 +126,4 @@ public class TurtleMultiModel implements BakedModel
|
||||
{
|
||||
return ModelOverrideList.EMPTY;
|
||||
}
|
||||
|
||||
private void transformQuadsTo( List<BakedQuad> output, List<BakedQuad> quads, AffineTransformation transform )
|
||||
{
|
||||
for( BakedQuad quad : quads )
|
||||
{
|
||||
// TODO Figure out what the fuck to do here
|
||||
// BakedQuadBuilder builder = new BakedQuadBuilder();
|
||||
// TRSRTransformer transformer = new TRSRTransformer( builder, transform );
|
||||
// quad.pipe( transformer );
|
||||
// output.add( builder.build() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -320,17 +320,17 @@ public class TileCable extends TileGeneric implements IPeripheralTile
|
||||
if (!world.isChunkLoaded(offset)) continue;
|
||||
|
||||
IWiredElement element = ComputerCraftAPI.getWiredElementAt(world, offset, facing.getOpposite());
|
||||
if (element != null) continue;
|
||||
|
||||
// TODO Figure out why this crashes.
|
||||
IWiredNode node = element.getNode();
|
||||
if (node != null && m_node != null) {
|
||||
if (BlockCable.canConnectIn(state, facing)) {
|
||||
// If we can connect to it then do so
|
||||
m_node.connectTo(node);
|
||||
} else if (m_node.getNetwork() == node.getNetwork()) {
|
||||
// Otherwise if we're on the same network then attempt to void it.
|
||||
m_node.disconnectFrom(node);
|
||||
if (element != null) {
|
||||
// TODO Figure out why this crashes.
|
||||
IWiredNode node = element.getNode();
|
||||
if (node != null && m_node != null) {
|
||||
if (BlockCable.canConnectIn(state, facing)) {
|
||||
// If we can connect to it then do so
|
||||
m_node.connectTo(node);
|
||||
} else if (m_node.getNetwork() == node.getNetwork()) {
|
||||
// Otherwise if we're on the same network then attempt to void it.
|
||||
m_node.disconnectFrom(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
{
|
||||
"loader": "computercraft:turtle",
|
||||
"model": "computercraft:block/turtle_advanced_base"
|
||||
"parent": "computercraft:block/turtle_base",
|
||||
"textures": {
|
||||
"texture": "computercraft:block/turtle_advanced"
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "computercraft:block/turtle_base",
|
||||
"textures": {
|
||||
"texture": "computercraft:block/turtle_advanced"
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"parent": "computercraft:block/turtle_overlay",
|
||||
"parent": "computercraft:block/turtle_normal_overlay",
|
||||
"textures": {
|
||||
"texture": "computercraft:block/turtle_elf_overlay"
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
{
|
||||
"loader": "computercraft:turtle",
|
||||
"model": "computercraft:block/turtle_normal_base"
|
||||
"parent": "computercraft:block/turtle_base",
|
||||
"textures": {
|
||||
"texture": "computercraft:block/turtle_normal"
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "computercraft:block/turtle_base",
|
||||
"textures": {
|
||||
"texture": "computercraft:block/turtle_normal"
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
{
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"particle": "#texture"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [ 2, 2, 2 ],
|
||||
"to": [ 14, 14, 13 ],
|
||||
"faces": {
|
||||
"down": { "uv": [ 2.75, 0, 5.75, 2.75 ], "texture": "#texture" },
|
||||
"up": { "uv": [ 5.75, 0, 8.75, 2.75 ], "texture": "#texture" },
|
||||
"north": { "uv": [ 8.5, 5.75, 11.5, 2.75 ], "texture": "#texture" },
|
||||
"south": { "uv": [ 2.75, 5.75, 5.75, 2.75 ], "texture": "#texture" },
|
||||
"west": { "uv": [ 0, 5.75, 2.75, 2.75 ], "texture": "#texture" },
|
||||
"east": { "uv": [ 5.75, 5.75, 8.5, 2.75 ], "texture": "#texture" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [ 3, 6, 13 ],
|
||||
"to": [ 13, 13, 15 ],
|
||||
"faces": {
|
||||
"down": { "uv": [ 9.25, 0, 11.75, 0.5 ], "texture": "#texture" },
|
||||
"up": { "uv": [ 11.75, 0, 14.25, 0.5 ], "texture": "#texture" },
|
||||
"south": { "uv": [ 9.25, 2.25, 11.75, 0.5 ], "texture": "#texture" },
|
||||
"west": { "uv": [ 8.75, 2.25, 9.25, 0.5 ], "texture": "#texture" },
|
||||
"east": { "uv": [ 11.75, 2.25, 12.25, 0.5 ], "texture": "#texture" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [ 1.5, 1.5, 1.5 ],
|
||||
"to": [ 14.5, 14.5, 13.5 ],
|
||||
"faces": {
|
||||
"down": { "uv": [ 2.75, 8, 5.75, 10.75 ], "texture": "#texture" },
|
||||
"up": { "uv": [ 5.75, 8, 8.75, 10.75 ], "texture": "#texture" },
|
||||
"north": { "uv": [ 8.5, 13.75, 11.5, 10.75 ], "texture": "#texture" },
|
||||
"south": { "uv": [ 2.75, 13.75, 5.75, 10.75 ], "texture": "#texture" },
|
||||
"west": { "uv": [ 0, 13.75, 2.75, 10.75 ], "texture": "#texture" },
|
||||
"east": { "uv": [ 5.75, 13.75, 8.5, 10.75 ], "texture": "#texture" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -16,3 +16,7 @@ accessible method net/minecraft/client/render/model/json/ModelOverrideList <init
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user