mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-04 07:32:59 +00:00 
			
		
		
		
	Compare commits
	
		
			35 Commits
		
	
	
		
			v1.14.4-1.
			...
			v1.15.2-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					fb440b0d2e | ||
| 
						 | 
					bf6d017ad1 | ||
| 
						 | 
					8b1773dd60 | ||
| 
						 | 
					a706300598 | ||
| 
						 | 
					2541c3c5e6 | ||
| 
						 | 
					41a1b99f7d | ||
| 
						 | 
					1862a439e2 | ||
| 
						 | 
					018ecfbaa0 | ||
| 
						 | 
					4c8fd4fc35 | ||
| 
						 | 
					35c1b10224 | ||
| 
						 | 
					c1c01bef7c | ||
| 
						 | 
					a48c3d0ba8 | ||
| 
						 | 
					93a9ebc4f6 | ||
| 
						 | 
					7cc2bd43c6 | ||
| 
						 | 
					393e628721 | ||
| 
						 | 
					0bcd28e58c | ||
| 
						 | 
					42f5389fb8 | ||
| 
						 | 
					041cfe91b4 | ||
| 
						 | 
					0f82a4589b | ||
| 
						 | 
					4320a4f851 | ||
| 
						 | 
					037cbabb32 | ||
| 
						 | 
					0dde859582 | ||
| 
						 | 
					e59c043fb6 | ||
| 
						 | 
					ae928c4397 | ||
| 
						 | 
					da41c65128 | ||
| 
						 | 
					4d18234714 | ||
| 
						 | 
					d254c6464b | ||
| 
						 | 
					3a5d50e572 | ||
| 
						 | 
					03b6d2f1ab | ||
| 
						 | 
					b0397ed3c5 | ||
| 
						 | 
					fa70ebcac2 | ||
| 
						 | 
					86e0330100 | ||
| 
						 | 
					92567b4d7e | ||
| 
						 | 
					0ae70fed13 | ||
| 
						 | 
					3b7300543a | 
@@ -11,5 +11,8 @@ insert_final_newline = true
 | 
			
		||||
[*.md]
 | 
			
		||||
trim_trailing_whitespace = false
 | 
			
		||||
 | 
			
		||||
[*.sexp]
 | 
			
		||||
indent_size = 2
 | 
			
		||||
 | 
			
		||||
[*.properties]
 | 
			
		||||
insert_final_newline = false
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								.github/workflows/main-ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/main-ci.yml
									
									
									
									
										vendored
									
									
								
							@@ -4,6 +4,7 @@ on: [push, pull_request]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    name: Build
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
@@ -16,3 +17,23 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    - name: Build with Gradle
 | 
			
		||||
      run: ./gradlew build --no-daemon
 | 
			
		||||
 | 
			
		||||
    - name: Upload Jar
 | 
			
		||||
      uses: actions/upload-artifact@v1
 | 
			
		||||
      with:
 | 
			
		||||
        name: CC-Tweaked
 | 
			
		||||
        path: build/libs
 | 
			
		||||
 | 
			
		||||
  lint-lua:
 | 
			
		||||
    name: Lint Lua
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v1
 | 
			
		||||
 | 
			
		||||
    - name: Lint Lua code
 | 
			
		||||
      run: |
 | 
			
		||||
        test -d bin || mkdir bin
 | 
			
		||||
        test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/bin/illuaminate
 | 
			
		||||
        chmod +x bin/illuaminate
 | 
			
		||||
        bin/illuaminate lint
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								.luacheckrc
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								.luacheckrc
									
									
									
									
									
								
							@@ -1,35 +0,0 @@
 | 
			
		||||
std = "max"
 | 
			
		||||
 | 
			
		||||
ignore = {
 | 
			
		||||
    -- Allow access to undefined globals or their fields. In the future we'll
 | 
			
		||||
    -- define all of CC's globals within this file
 | 
			
		||||
    '113', '143',
 | 
			
		||||
 | 
			
		||||
    -- FIXME: Ignore unused arguments and loop variables
 | 
			
		||||
    '212', '213',
 | 
			
		||||
 | 
			
		||||
    -- Disable line is too long for now. It would be possible to clean
 | 
			
		||||
    -- this up in the future.
 | 
			
		||||
    '631',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- Only run the linter on ROM and bios for now, as the treasure disks
 | 
			
		||||
-- are largely unsupported.
 | 
			
		||||
include_files = {
 | 
			
		||||
    'src/main/resources/assets/computercraft/lua/rom',
 | 
			
		||||
    'src/main/resources/assets/computercraft/lua/bios.lua',
 | 
			
		||||
    'src/test/resources/test-rom',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
files['src/main/resources/assets/computercraft/lua/bios.lua'] = {
 | 
			
		||||
    -- Allow declaring and mutating globals
 | 
			
		||||
    allow_defined_top = true,
 | 
			
		||||
    ignore = { '112', '121', '122', '131', '142' },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
files['src/main/resources/assets/computercraft/lua/rom/apis'] = {
 | 
			
		||||
    -- APIs may define globals on the top level. We'll ignore unused globals,
 | 
			
		||||
    -- as obviously they may be used outside that API.
 | 
			
		||||
    allow_defined_top = true,
 | 
			
		||||
    ignore = { '131' },
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										36
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								build.gradle
									
									
									
									
									
								
							@@ -9,7 +9,7 @@ buildscript {
 | 
			
		||||
    }
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.google.code.gson:gson:2.8.1'
 | 
			
		||||
        classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.154'
 | 
			
		||||
        classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.159'
 | 
			
		||||
        classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
 | 
			
		||||
        classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
 | 
			
		||||
    }
 | 
			
		||||
@@ -73,13 +73,9 @@ repositories {
 | 
			
		||||
        name "SquidDev"
 | 
			
		||||
        url "https://squiddev.cc/maven"
 | 
			
		||||
    }
 | 
			
		||||
    ivy {
 | 
			
		||||
        name "Charset"
 | 
			
		||||
        artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]"
 | 
			
		||||
    }
 | 
			
		||||
    maven {
 | 
			
		||||
        name "Amadornes"
 | 
			
		||||
        url "https://maven.amadornes.com/"
 | 
			
		||||
        name "CraftTweaker"
 | 
			
		||||
        url "https://maven.blamejared.com/"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -94,11 +90,8 @@ dependencies {
 | 
			
		||||
 | 
			
		||||
    minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
 | 
			
		||||
 | 
			
		||||
    compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25:api")
 | 
			
		||||
    // deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
 | 
			
		||||
    // deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
 | 
			
		||||
 | 
			
		||||
    runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25")
 | 
			
		||||
    compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.2:api")
 | 
			
		||||
    runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.2")
 | 
			
		||||
 | 
			
		||||
    shade 'org.squiddev:Cobalt:0.5.0-SNAPSHOT'
 | 
			
		||||
 | 
			
		||||
@@ -108,6 +101,15 @@ dependencies {
 | 
			
		||||
    deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceSets {
 | 
			
		||||
    main {
 | 
			
		||||
        java {
 | 
			
		||||
            exclude 'dan200/computercraft/client/render_old'
 | 
			
		||||
            exclude 'dan200/computercraft/shared/integration/crafttweaker'
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Compile tasks
 | 
			
		||||
 | 
			
		||||
javadoc {
 | 
			
		||||
@@ -136,7 +138,7 @@ jar {
 | 
			
		||||
 | 
			
		||||
[compileJava, compileTestJava].forEach {
 | 
			
		||||
    it.configure {
 | 
			
		||||
        options.compilerArgs << "-Xlint" << "-Xlint:-processing" << "-Werror"
 | 
			
		||||
        options.compilerArgs << "-Xlint" << "-Xlint:-processing"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -162,6 +164,7 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
 | 
			
		||||
 | 
			
		||||
    // Add the main runtime jar and all non-shadowed dependencies
 | 
			
		||||
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
 | 
			
		||||
    libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
 | 
			
		||||
    doFirst {
 | 
			
		||||
        sourceSets.main.compileClasspath
 | 
			
		||||
            .filter { !it.name.contains("Cobalt") }
 | 
			
		||||
@@ -177,9 +180,6 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
 | 
			
		||||
    // Preserve ComputerCraft classes - we only want to strip shadowed files.
 | 
			
		||||
    keep 'class dan200.computercraft.** { *; }'
 | 
			
		||||
 | 
			
		||||
    // Preserve the constructors in Cobalt library class, as we init them via reflection
 | 
			
		||||
    keepclassmembers 'class org.squiddev.cobalt.lib.** { <init>(...); }'
 | 
			
		||||
 | 
			
		||||
    // LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard
 | 
			
		||||
    dontwarn 'module-info'
 | 
			
		||||
    dontwarn 'org.apache.**,org.lwjgl.**'
 | 
			
		||||
@@ -371,7 +371,7 @@ curseforge {
 | 
			
		||||
    apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : ''
 | 
			
		||||
    project {
 | 
			
		||||
        id = '282001'
 | 
			
		||||
        releaseType = 'release'
 | 
			
		||||
        releaseType = 'alpha'
 | 
			
		||||
        changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
 | 
			
		||||
 | 
			
		||||
        relations {
 | 
			
		||||
@@ -449,7 +449,7 @@ githubRelease {
 | 
			
		||||
            .takeWhile { it != 'Type "help changelog" to see the full version history.' }
 | 
			
		||||
            .join("\n").trim()
 | 
			
		||||
    }
 | 
			
		||||
    prerelease false
 | 
			
		||||
    prerelease true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def uploadTasks = ["uploadArchives", "curseforge", "githubRelease"]
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,10 @@
 | 
			
		||||
        <property name="file" value="config/checkstyle/suppressions.xml" />
 | 
			
		||||
    </module>
 | 
			
		||||
 | 
			
		||||
    <module name="BeforeExecutionExclusionFileFilter">
 | 
			
		||||
        <property name="fileNamePattern" value="render_old"/>
 | 
			
		||||
    </module>
 | 
			
		||||
 | 
			
		||||
    <module name="TreeWalker">
 | 
			
		||||
        <!-- Annotations -->
 | 
			
		||||
        <module name="AnnotationLocation" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# Mod properties
 | 
			
		||||
mod_version=1.85.1
 | 
			
		||||
mod_version=1.86.2
 | 
			
		||||
 | 
			
		||||
# Minecraft properties (update mods.toml when changing)
 | 
			
		||||
mc_version=1.14.4
 | 
			
		||||
forge_version=28.1.71
 | 
			
		||||
mappings_version=20191123-1.14.3
 | 
			
		||||
mc_version=1.15.2
 | 
			
		||||
forge_version=31.0.1
 | 
			
		||||
mappings_version=20200124-1.15.1
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								illuaminate.sexp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								illuaminate.sexp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
; -*- mode: Lisp;-*-
 | 
			
		||||
 | 
			
		||||
(sources
 | 
			
		||||
  /src/main/resources/assets/computercraft/lua/bios.lua
 | 
			
		||||
  /src/main/resources/assets/computercraft/lua/rom/
 | 
			
		||||
  /src/test/resources/test-rom)
 | 
			
		||||
 | 
			
		||||
(at /
 | 
			
		||||
  (linters
 | 
			
		||||
    ;; It'd be nice to avoid this, but right now there's a lot of instances of
 | 
			
		||||
    ;; it.
 | 
			
		||||
    -var:set-loop
 | 
			
		||||
 | 
			
		||||
    ;; It's useful to name arguments for documentation, so we allow this. It'd
 | 
			
		||||
    ;; be good to find a compromise in the future, but this works for now.
 | 
			
		||||
    -var:unused-arg))
 | 
			
		||||
 | 
			
		||||
;; We disable the unused global linter in bios.lua and the APIs. In the future
 | 
			
		||||
;; hopefully we'll get illuaminate to handle this.
 | 
			
		||||
(at
 | 
			
		||||
  (/src/main/resources/assets/computercraft/lua/bios.lua
 | 
			
		||||
   /src/main/resources/assets/computercraft/lua/rom/apis/)
 | 
			
		||||
  (linters -var:unused-global)
 | 
			
		||||
  (lint
 | 
			
		||||
    (allow-toplevel-global true)))
 | 
			
		||||
 | 
			
		||||
;; These warnings are broken right now
 | 
			
		||||
(at (bios.lua worm.lua) (linters -control:unreachable))
 | 
			
		||||
@@ -1,16 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleAction;
 | 
			
		||||
import dan200.computercraft.core.apis.AddressPredicate;
 | 
			
		||||
import dan200.computercraft.core.apis.http.websocket.Websocket;
 | 
			
		||||
import dan200.computercraft.core.filesystem.ResourceMount;
 | 
			
		||||
import dan200.computercraft.shared.Config;
 | 
			
		||||
import dan200.computercraft.shared.computer.blocks.BlockComputer;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
 | 
			
		||||
@@ -194,13 +191,6 @@ public final class ComputerCraft
 | 
			
		||||
        return "${version}";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static IMount createResourceMount( String domain, String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
        ResourceMount mount = new ResourceMount( domain, subPath, manager );
 | 
			
		||||
        return mount.exists( "" ) ? mount : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static InputStream getResourceFile( String domain, String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft;
 | 
			
		||||
 | 
			
		||||
import com.google.common.collect.MapMaker;
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI.IComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IWritableMount;
 | 
			
		||||
@@ -20,20 +20,26 @@ import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
 | 
			
		||||
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.shared.*;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
 | 
			
		||||
import dan200.computercraft.shared.util.IDAssigner;
 | 
			
		||||
import dan200.computercraft.shared.wired.CapabilityWiredElement;
 | 
			
		||||
import dan200.computercraft.shared.wired.WiredNode;
 | 
			
		||||
import net.minecraft.resources.IReloadableResourceManager;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.IBlockReader;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
import net.minecraftforge.fml.server.ServerLifecycleHooks;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.lang.ref.WeakReference;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
{
 | 
			
		||||
@@ -43,6 +49,9 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private WeakReference<IReloadableResourceManager> currentResources;
 | 
			
		||||
    private final Map<ResourceLocation, ResourceMount> mountCache = new MapMaker().weakValues().concurrencyLevel( 1 ).makeMap();
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getInstalledVersion()
 | 
			
		||||
@@ -72,7 +81,9 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
    @Override
 | 
			
		||||
    public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        return ComputerCraft.createResourceMount( domain, subPath );
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
        ResourceMount mount = ResourceMount.get( domain, subPath, manager );
 | 
			
		||||
        return mount.exists( "" ) ? mount : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,61 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.client;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelManager;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A model to render, combined with a transformation matrix to apply.
 | 
			
		||||
 */
 | 
			
		||||
public final class TransformedModel
 | 
			
		||||
{
 | 
			
		||||
    private final IBakedModel model;
 | 
			
		||||
    private final TransformationMatrix matrix;
 | 
			
		||||
 | 
			
		||||
    public TransformedModel( @Nonnull IBakedModel model, @Nonnull TransformationMatrix matrix )
 | 
			
		||||
    {
 | 
			
		||||
        this.model = Objects.requireNonNull( model );
 | 
			
		||||
        this.matrix = Objects.requireNonNull( matrix );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TransformedModel( @Nonnull IBakedModel model )
 | 
			
		||||
    {
 | 
			
		||||
        this.model = Objects.requireNonNull( model );
 | 
			
		||||
        this.matrix = TransformationMatrix.identity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static TransformedModel of( @Nonnull ModelResourceLocation location )
 | 
			
		||||
    {
 | 
			
		||||
        ModelManager modelManager = Minecraft.getInstance().getModelManager();
 | 
			
		||||
        return new TransformedModel( modelManager.getModel( location ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static TransformedModel of( @Nonnull ItemStack item, @Nonnull TransformationMatrix transform )
 | 
			
		||||
    {
 | 
			
		||||
        IBakedModel model = Minecraft.getInstance().getItemRenderer().getItemModelMesher().getItemModel( item );
 | 
			
		||||
        return new TransformedModel( model, transform );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public IBakedModel getModel()
 | 
			
		||||
    {
 | 
			
		||||
        return model;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public TransformationMatrix getMatrix()
 | 
			
		||||
    {
 | 
			
		||||
        return matrix;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IFileSystem;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.media;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.media;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.network.IPacketNetwork;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.network.IPacketSender;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ArgumentHelper;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.pocket;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.pocket;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.pocket;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.redstone;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import com.mojang.authlib.GameProfile;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleAttackEvent;
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
@@ -19,11 +18,9 @@ import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.api.distmarker.OnlyIn;
 | 
			
		||||
import net.minecraftforge.event.entity.player.AttackEntityEvent;
 | 
			
		||||
import net.minecraftforge.event.world.BlockEvent;
 | 
			
		||||
import org.apache.commons.lang3.tuple.Pair;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import javax.vecmath.Matrix4f;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The primary interface for defining an update for Turtles. A turtle update
 | 
			
		||||
@@ -127,12 +124,11 @@ public interface ITurtleUpgrade
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle that the upgrade resides on. This will be null when getting item models!
 | 
			
		||||
     * @param side   Which side of the turtle (left or right) the upgrade resides on.
 | 
			
		||||
     * @return The model that you wish to be used to render your upgrade, and a transformation to apply to it. Returning
 | 
			
		||||
     * a transformation of {@code null} has the same effect as the identify matrix.
 | 
			
		||||
     * @return The model that you wish to be used to render your upgrade.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @OnlyIn( Dist.CLIENT )
 | 
			
		||||
    Pair<IBakedModel, Matrix4f> getModel( @Nullable ITurtleAccess turtle, @Nonnull TurtleSide side );
 | 
			
		||||
    TransformedModel getModel( @Nullable ITurtleAccess turtle, @Nonnull TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called once per tick for each turtle which has the upgrade equipped.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
@@ -12,20 +11,19 @@ import dan200.computercraft.shared.common.IColouredItem;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemDisk;
 | 
			
		||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.IUnbakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.inventory.container.PlayerContainer;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.ColorHandlerEvent;
 | 
			
		||||
import net.minecraftforge.client.event.ModelBakeEvent;
 | 
			
		||||
import net.minecraftforge.client.event.ModelRegistryEvent;
 | 
			
		||||
import net.minecraftforge.client.event.TextureStitchEvent;
 | 
			
		||||
import net.minecraftforge.client.model.BasicState;
 | 
			
		||||
import net.minecraftforge.client.model.ModelLoader;
 | 
			
		||||
import net.minecraftforge.client.model.ModelLoaderRegistry;
 | 
			
		||||
import net.minecraftforge.client.model.SimpleModelTransform;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
 | 
			
		||||
@@ -72,13 +70,13 @@ public final class ClientRegistry
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
    public static void registerModels( ModelRegistryEvent event )
 | 
			
		||||
    {
 | 
			
		||||
        ModelLoaderRegistry.registerLoader( TurtleModelLoader.INSTANCE );
 | 
			
		||||
        ModelLoaderRegistry.registerLoader( new ResourceLocation( ComputerCraft.MOD_ID, "turtle" ), TurtleModelLoader.INSTANCE );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
    public static void onTextureStitchEvent( TextureStitchEvent.Pre event )
 | 
			
		||||
    {
 | 
			
		||||
        if( event.getMap() != Minecraft.getInstance().getTextureMap() ) return;
 | 
			
		||||
        if( !event.getMap().getBasePath().equals( PlayerContainer.LOCATION_BLOCKS_TEXTURE ) ) return;
 | 
			
		||||
 | 
			
		||||
        for( String extra : EXTRA_TEXTURES )
 | 
			
		||||
        {
 | 
			
		||||
@@ -93,29 +91,18 @@ public final class ClientRegistry
 | 
			
		||||
        ModelLoader loader = event.getModelLoader();
 | 
			
		||||
        Map<ResourceLocation, IBakedModel> registry = event.getModelRegistry();
 | 
			
		||||
 | 
			
		||||
        for( String model : EXTRA_MODELS )
 | 
			
		||||
        for( String modelName : EXTRA_MODELS )
 | 
			
		||||
        {
 | 
			
		||||
            IBakedModel bakedModel = bake( loader, loader.getUnbakedModel( new ResourceLocation( ComputerCraft.MOD_ID, "item/" + model ) ) );
 | 
			
		||||
            ResourceLocation location = new ResourceLocation( ComputerCraft.MOD_ID, "item/" + modelName );
 | 
			
		||||
            IUnbakedModel model = loader.getUnbakedModel( location );
 | 
			
		||||
            model.getTextures( loader::getUnbakedModel, new HashSet<>() );
 | 
			
		||||
 | 
			
		||||
            if( bakedModel != null )
 | 
			
		||||
            IBakedModel baked = model.bakeModel( loader, ModelLoader.defaultTextureGetter(), SimpleModelTransform.IDENTITY, location );
 | 
			
		||||
            if( baked != null )
 | 
			
		||||
            {
 | 
			
		||||
                registry.put(
 | 
			
		||||
                    new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, model ), "inventory" ),
 | 
			
		||||
                    bakedModel
 | 
			
		||||
                );
 | 
			
		||||
                registry.put( new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, modelName ), "inventory" ), baked );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // And load the custom turtle models in too.
 | 
			
		||||
        registry.put(
 | 
			
		||||
            new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, "turtle_normal" ), "inventory" ),
 | 
			
		||||
            bake( loader, TurtleModelLoader.INSTANCE.loadModel( new ResourceLocation( ComputerCraft.MOD_ID, "item/turtle_normal" ) ) )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        registry.put(
 | 
			
		||||
            new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, "turtle_advanced" ), "inventory" ),
 | 
			
		||||
            bake( loader, TurtleModelLoader.INSTANCE.loadModel( new ResourceLocation( ComputerCraft.MOD_ID, "item/turtle_advanced" ) ) )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
@@ -154,15 +141,4 @@ public final class ClientRegistry
 | 
			
		||||
            ComputerCraft.Blocks.turtleNormal, ComputerCraft.Blocks.turtleAdvanced
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static IBakedModel bake( ModelLoader loader, IUnbakedModel model )
 | 
			
		||||
    {
 | 
			
		||||
        model.getTextures( loader::getUnbakedModel, new HashSet<>() );
 | 
			
		||||
 | 
			
		||||
        return model.bake(
 | 
			
		||||
            loader,
 | 
			
		||||
            ModelLoader.defaultTextureGetter(),
 | 
			
		||||
            new BasicState( model.getDefaultState(), false ), DefaultVertexFormats.BLOCK
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.shared.command.text.ChatHelpers;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,200 +1,326 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.client.FrameInfo;
 | 
			
		||||
import dan200.computercraft.core.terminal.Terminal;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureManager;
 | 
			
		||||
import net.minecraft.client.renderer.*;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexFormat;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
public final class FixedWidthFontRenderer
 | 
			
		||||
{
 | 
			
		||||
    private static final Matrix4f IDENTITY = TransformationMatrix.identity().getMatrix();
 | 
			
		||||
 | 
			
		||||
    private static final ResourceLocation FONT = new ResourceLocation( "computercraft", "textures/gui/term_font.png" );
 | 
			
		||||
    public static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/term_background.png" );
 | 
			
		||||
 | 
			
		||||
    public static final int FONT_HEIGHT = 9;
 | 
			
		||||
    public static final int FONT_WIDTH = 6;
 | 
			
		||||
    public static final float WIDTH = 256.0f;
 | 
			
		||||
 | 
			
		||||
    private static FixedWidthFontRenderer instance;
 | 
			
		||||
    public static final float BACKGROUND_START = (WIDTH - 6.0f) / WIDTH;
 | 
			
		||||
    public static final float BACKGROUND_END = (WIDTH - 4.0f) / WIDTH;
 | 
			
		||||
 | 
			
		||||
    public static FixedWidthFontRenderer instance()
 | 
			
		||||
    {
 | 
			
		||||
        if( instance != null ) return instance;
 | 
			
		||||
        return instance = new FixedWidthFontRenderer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private final TextureManager m_textureManager;
 | 
			
		||||
    public static final RenderType TYPE = Type.MAIN;
 | 
			
		||||
 | 
			
		||||
    private FixedWidthFontRenderer()
 | 
			
		||||
    {
 | 
			
		||||
        m_textureManager = Minecraft.getInstance().getTextureManager();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void greyscaleify( double[] rgb )
 | 
			
		||||
    private static float toGreyscale( double[] rgb )
 | 
			
		||||
    {
 | 
			
		||||
        Arrays.fill( rgb, (rgb[0] + rgb[1] + rgb[2]) / 3.0f );
 | 
			
		||||
        return (float) ((rgb[0] + rgb[1] + rgb[2]) / 3);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void drawChar( BufferBuilder renderer, double x, double y, int index, int color, Palette p, boolean greyscale )
 | 
			
		||||
    private static void drawChar( Matrix4f transform, IVertexBuilder buffer, float x, float y, int index, float r, float g, float b )
 | 
			
		||||
    {
 | 
			
		||||
        int column = index % 16;
 | 
			
		||||
        int row = index / 16;
 | 
			
		||||
 | 
			
		||||
        double[] colour = p.getColour( 15 - color );
 | 
			
		||||
        if( greyscale )
 | 
			
		||||
        {
 | 
			
		||||
            greyscaleify( colour );
 | 
			
		||||
        }
 | 
			
		||||
        float r = (float) colour[0];
 | 
			
		||||
        float g = (float) colour[1];
 | 
			
		||||
        float b = (float) colour[2];
 | 
			
		||||
 | 
			
		||||
        int xStart = 1 + column * (FONT_WIDTH + 2);
 | 
			
		||||
        int yStart = 1 + row * (FONT_HEIGHT + 2);
 | 
			
		||||
 | 
			
		||||
        renderer.pos( x, y, 0.0 ).tex( xStart / 256.0, yStart / 256.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x, y + FONT_HEIGHT, 0.0 ).tex( xStart / 256.0, (yStart + FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x + FONT_WIDTH, y, 0.0 ).tex( (xStart + FONT_WIDTH) / 256.0, yStart / 256.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x + FONT_WIDTH, y, 0.0 ).tex( (xStart + FONT_WIDTH) / 256.0, yStart / 256.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x, y + FONT_HEIGHT, 0.0 ).tex( xStart / 256.0, (yStart + FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x + FONT_WIDTH, y + FONT_HEIGHT, 0.0 ).tex( (xStart + FONT_WIDTH) / 256.0, (yStart + FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x, y, 0f ).color( r, g, b, 1.0f ).tex( xStart / WIDTH, yStart / WIDTH ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).tex( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x + FONT_WIDTH, y, 0f ).color( r, g, b, 1.0f ).tex( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x + FONT_WIDTH, y, 0f ).color( r, g, b, 1.0f ).tex( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).tex( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x + FONT_WIDTH, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).tex( (xStart + FONT_WIDTH) / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).endVertex();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void drawQuad( BufferBuilder renderer, double x, double y, int color, double width, Palette p, boolean greyscale )
 | 
			
		||||
    private static void drawQuad( Matrix4f transform, IVertexBuilder buffer, float x, float y, float width, float height, float r, float g, float b )
 | 
			
		||||
    {
 | 
			
		||||
        double[] colour = p.getColour( 15 - color );
 | 
			
		||||
        buffer.pos( transform, x, y, 0 ).color( r, g, b, 1.0f ).tex( BACKGROUND_START, BACKGROUND_START ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x, y + height, 0 ).color( r, g, b, 1.0f ).tex( BACKGROUND_START, BACKGROUND_END ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x + width, y, 0 ).color( r, g, b, 1.0f ).tex( BACKGROUND_END, BACKGROUND_START ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x + width, y, 0 ).color( r, g, b, 1.0f ).tex( BACKGROUND_END, BACKGROUND_START ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x, y + height, 0 ).color( r, g, b, 1.0f ).tex( BACKGROUND_START, BACKGROUND_END ).endVertex();
 | 
			
		||||
        buffer.pos( transform, x + width, y + height, 0 ).color( r, g, b, 1.0f ).tex( BACKGROUND_END, BACKGROUND_END ).endVertex();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void drawBackground(
 | 
			
		||||
        @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y,
 | 
			
		||||
        @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale,
 | 
			
		||||
        float leftMarginSize, float rightMarginSize, float height
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        if( leftMarginSize > 0 )
 | 
			
		||||
        {
 | 
			
		||||
            double[] colour = palette.getColour( 15 - "0123456789abcdef".indexOf( backgroundColour.charAt( 0 ) ) );
 | 
			
		||||
            float r, g, b;
 | 
			
		||||
            if( greyscale )
 | 
			
		||||
            {
 | 
			
		||||
            greyscaleify( colour );
 | 
			
		||||
                r = g = b = toGreyscale( colour );
 | 
			
		||||
            }
 | 
			
		||||
        float r = (float) colour[0];
 | 
			
		||||
        float g = (float) colour[1];
 | 
			
		||||
        float b = (float) colour[2];
 | 
			
		||||
 | 
			
		||||
        renderer.pos( x, y, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x, y + FONT_HEIGHT, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x + width, y, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x + width, y, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x, y + FONT_HEIGHT, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
        renderer.pos( x + width, y + FONT_HEIGHT, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                r = (float) colour[0];
 | 
			
		||||
                g = (float) colour[1];
 | 
			
		||||
                b = (float) colour[2];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
    private boolean isGreyScale( int colour )
 | 
			
		||||
    {
 | 
			
		||||
        return colour == 0 || colour == 15 || colour == 7 || colour == 8;
 | 
			
		||||
            drawQuad( transform, renderer, x - leftMarginSize, y, leftMarginSize, height, r, g, b );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    public void drawStringBackgroundPart( int x, int y, TextBuffer backgroundColour, double leftMarginSize, double rightMarginSize, boolean greyScale, Palette p )
 | 
			
		||||
        if( rightMarginSize > 0 )
 | 
			
		||||
        {
 | 
			
		||||
        // Draw the quads
 | 
			
		||||
        Tessellator tessellator = Tessellator.getInstance();
 | 
			
		||||
        BufferBuilder renderer = tessellator.getBuffer();
 | 
			
		||||
        renderer.begin( GL11.GL_TRIANGLES, DefaultVertexFormats.POSITION_COLOR );
 | 
			
		||||
        if( leftMarginSize > 0.0 )
 | 
			
		||||
            double[] colour = palette.getColour( 15 - "0123456789abcdef".indexOf( backgroundColour.charAt( backgroundColour.length() - 1 ) ) );
 | 
			
		||||
            float r, g, b;
 | 
			
		||||
            if( greyscale )
 | 
			
		||||
            {
 | 
			
		||||
            int colour1 = "0123456789abcdef".indexOf( backgroundColour.charAt( 0 ) );
 | 
			
		||||
            if( colour1 < 0 || (greyScale && !isGreyScale( colour1 )) )
 | 
			
		||||
            {
 | 
			
		||||
                colour1 = 15;
 | 
			
		||||
                r = g = b = toGreyscale( colour );
 | 
			
		||||
            }
 | 
			
		||||
            drawQuad( renderer, x - leftMarginSize, y, colour1, leftMarginSize, p, greyScale );
 | 
			
		||||
        }
 | 
			
		||||
        if( rightMarginSize > 0.0 )
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
            int colour2 = "0123456789abcdef".indexOf( backgroundColour.charAt( backgroundColour.length() - 1 ) );
 | 
			
		||||
            if( colour2 < 0 || (greyScale && !isGreyScale( colour2 )) )
 | 
			
		||||
            {
 | 
			
		||||
                colour2 = 15;
 | 
			
		||||
                r = (float) colour[0];
 | 
			
		||||
                g = (float) colour[1];
 | 
			
		||||
                b = (float) colour[2];
 | 
			
		||||
            }
 | 
			
		||||
            drawQuad( renderer, x + backgroundColour.length() * FONT_WIDTH, y, colour2, rightMarginSize, p, greyScale );
 | 
			
		||||
 | 
			
		||||
            drawQuad( transform, renderer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, r, g, b );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for( int i = 0; i < backgroundColour.length(); i++ )
 | 
			
		||||
        {
 | 
			
		||||
            int colour = "0123456789abcdef".indexOf( backgroundColour.charAt( i ) );
 | 
			
		||||
            if( colour < 0 || (greyScale && !isGreyScale( colour )) )
 | 
			
		||||
            double[] colour = palette.getColour( 15 - "0123456789abcdef".indexOf( backgroundColour.charAt( i ) ) );
 | 
			
		||||
            float r, g, b;
 | 
			
		||||
            if( greyscale )
 | 
			
		||||
            {
 | 
			
		||||
                colour = 15;
 | 
			
		||||
                r = g = b = toGreyscale( colour );
 | 
			
		||||
            }
 | 
			
		||||
            drawQuad( renderer, x + i * FONT_WIDTH, y, colour, FONT_WIDTH, p, greyScale );
 | 
			
		||||
        }
 | 
			
		||||
        GlStateManager.disableTexture();
 | 
			
		||||
        tessellator.draw();
 | 
			
		||||
        GlStateManager.enableTexture();
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                r = (float) colour[0];
 | 
			
		||||
                g = (float) colour[1];
 | 
			
		||||
                b = (float) colour[2];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
    public void drawStringTextPart( int x, int y, TextBuffer s, TextBuffer textColour, boolean greyScale, Palette p )
 | 
			
		||||
            drawQuad( transform, renderer, x + i * FONT_WIDTH, y, FONT_WIDTH, height, r, g, b );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawString(
 | 
			
		||||
        @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y,
 | 
			
		||||
        @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour,
 | 
			
		||||
        @Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw the quads
 | 
			
		||||
        Tessellator tessellator = Tessellator.getInstance();
 | 
			
		||||
        BufferBuilder renderer = tessellator.getBuffer();
 | 
			
		||||
        renderer.begin( GL11.GL_TRIANGLES, DefaultVertexFormats.POSITION_TEX_COLOR );
 | 
			
		||||
        for( int i = 0; i < s.length(); i++ )
 | 
			
		||||
        if( backgroundColour != null )
 | 
			
		||||
        {
 | 
			
		||||
            // Switch colour
 | 
			
		||||
            int colour = "0123456789abcdef".indexOf( textColour.charAt( i ) );
 | 
			
		||||
            if( colour < 0 || (greyScale && !isGreyScale( colour )) )
 | 
			
		||||
            drawBackground( transform, renderer, x, y, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for( int i = 0; i < text.length(); i++ )
 | 
			
		||||
        {
 | 
			
		||||
                colour = 0;
 | 
			
		||||
            double[] colour = palette.getColour( 15 - "0123456789abcdef".indexOf( textColour.charAt( i ) ) );
 | 
			
		||||
            float r, g, b;
 | 
			
		||||
            if( greyscale )
 | 
			
		||||
            {
 | 
			
		||||
                r = g = b = toGreyscale( colour );
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                r = (float) colour[0];
 | 
			
		||||
                g = (float) colour[1];
 | 
			
		||||
                b = (float) colour[2];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Draw char
 | 
			
		||||
            int index = s.charAt( i );
 | 
			
		||||
            if( index < 0 || index > 255 )
 | 
			
		||||
            {
 | 
			
		||||
                index = '?';
 | 
			
		||||
            }
 | 
			
		||||
            drawChar( renderer, x + i * FONT_WIDTH, y, index, colour, p, greyScale );
 | 
			
		||||
        }
 | 
			
		||||
        tessellator.draw();
 | 
			
		||||
            int index = text.charAt( i );
 | 
			
		||||
            if( index > 255 ) index = '?';
 | 
			
		||||
            drawChar( transform, renderer, x + i * FONT_WIDTH, y, index, r, g, b );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    public void drawString( TextBuffer s, int x, int y, TextBuffer textColour, TextBuffer backgroundColour, double leftMarginSize, double rightMarginSize, boolean greyScale, Palette p )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw background
 | 
			
		||||
        if( backgroundColour != null )
 | 
			
		||||
        {
 | 
			
		||||
            // Bind the background texture
 | 
			
		||||
            m_textureManager.bindTexture( BACKGROUND );
 | 
			
		||||
 | 
			
		||||
            // Draw the quads
 | 
			
		||||
            drawStringBackgroundPart( x, y, backgroundColour, leftMarginSize, rightMarginSize, greyScale, p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Draw text
 | 
			
		||||
        if( s != null && textColour != null )
 | 
			
		||||
    public static void drawString(
 | 
			
		||||
        float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour,
 | 
			
		||||
        @Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
            // Bind the font texture
 | 
			
		||||
            bindFont();
 | 
			
		||||
        Minecraft.getInstance().getTextureManager().bindTexture( FONT );
 | 
			
		||||
        // TODO: RenderSystem.texParameter( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP );
 | 
			
		||||
 | 
			
		||||
            // Draw the quads
 | 
			
		||||
            drawStringTextPart( x, y, s, textColour, greyScale, p );
 | 
			
		||||
        IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
 | 
			
		||||
        drawString( IDENTITY, ((IRenderTypeBuffer) renderer).getBuffer( TYPE ), x, y, text, textColour, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize );
 | 
			
		||||
        renderer.finish();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawTerminalWithoutCursor(
 | 
			
		||||
        @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y,
 | 
			
		||||
        @Nonnull Terminal terminal, boolean greyscale,
 | 
			
		||||
        float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        Palette palette = terminal.getPalette();
 | 
			
		||||
        int height = terminal.getHeight();
 | 
			
		||||
 | 
			
		||||
        // Top and bottom margins
 | 
			
		||||
        drawBackground(
 | 
			
		||||
            transform, buffer, x, y - topMarginSize,
 | 
			
		||||
            terminal.getBackgroundColourLine( 0 ), palette, greyscale,
 | 
			
		||||
            leftMarginSize, rightMarginSize, topMarginSize
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        drawBackground(
 | 
			
		||||
            transform, buffer, x, y + height * FONT_HEIGHT,
 | 
			
		||||
            terminal.getBackgroundColourLine( height - 1 ), palette, greyscale,
 | 
			
		||||
            leftMarginSize, rightMarginSize, bottomMarginSize
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // The main text
 | 
			
		||||
        for( int i = 0; i < height; i++ )
 | 
			
		||||
        {
 | 
			
		||||
            drawString(
 | 
			
		||||
                transform, buffer, x, y + FixedWidthFontRenderer.FONT_HEIGHT * i,
 | 
			
		||||
                terminal.getLine( i ), terminal.getTextColourLine( i ), terminal.getBackgroundColourLine( i ),
 | 
			
		||||
                palette, greyscale, leftMarginSize, rightMarginSize
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getStringWidth( String s )
 | 
			
		||||
    public static void drawCursor(
 | 
			
		||||
        @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y,
 | 
			
		||||
        @Nonnull Terminal terminal, boolean greyscale
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        if( s == null )
 | 
			
		||||
        Palette palette = terminal.getPalette();
 | 
			
		||||
        int width = terminal.getWidth();
 | 
			
		||||
        int height = terminal.getHeight();
 | 
			
		||||
 | 
			
		||||
        int cursorX = terminal.getCursorX();
 | 
			
		||||
        int cursorY = terminal.getCursorY();
 | 
			
		||||
        if( terminal.getCursorBlink() && cursorX >= 0 && cursorX < width && cursorY >= 0 && cursorY < height && FrameInfo.getGlobalCursorBlink() )
 | 
			
		||||
        {
 | 
			
		||||
            return 0;
 | 
			
		||||
            double[] colour = palette.getColour( 15 - terminal.getTextColour() );
 | 
			
		||||
            float r, g, b;
 | 
			
		||||
            if( greyscale )
 | 
			
		||||
            {
 | 
			
		||||
                r = g = b = toGreyscale( colour );
 | 
			
		||||
            }
 | 
			
		||||
        return s.length() * FONT_WIDTH;
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                r = (float) colour[0];
 | 
			
		||||
                g = (float) colour[1];
 | 
			
		||||
                b = (float) colour[2];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
    public void bindFont()
 | 
			
		||||
            drawChar( transform, buffer, x + cursorX * FONT_WIDTH, y + cursorY * FONT_HEIGHT, '_', r, g, b );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawTerminal(
 | 
			
		||||
        @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y,
 | 
			
		||||
        @Nonnull Terminal terminal, boolean greyscale,
 | 
			
		||||
        float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        m_textureManager.bindTexture( FONT );
 | 
			
		||||
        GlStateManager.texParameter( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP );
 | 
			
		||||
        drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
 | 
			
		||||
        drawCursor( transform, buffer, x, y, terminal, greyscale );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawTerminal(
 | 
			
		||||
        float x, float y, @Nonnull Terminal terminal, boolean greyscale,
 | 
			
		||||
        float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft.getInstance().getTextureManager().bindTexture( FONT );
 | 
			
		||||
        // TODO: Is this the most sane thing?
 | 
			
		||||
        RenderSystem.texParameter( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP );
 | 
			
		||||
 | 
			
		||||
        IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
 | 
			
		||||
        IVertexBuilder buffer = renderer.getBuffer( TYPE );
 | 
			
		||||
        drawTerminal( IDENTITY, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
 | 
			
		||||
        renderer.finish( TYPE );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull IRenderTypeBuffer renderer, float x, float y, float width, float height )
 | 
			
		||||
    {
 | 
			
		||||
        Colour colour = Colour.Black;
 | 
			
		||||
        drawQuad( transform, renderer.getBuffer( TYPE ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawEmptyTerminal( float x, float y, float width, float height )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft.getInstance().getTextureManager().bindTexture( FONT );
 | 
			
		||||
        RenderSystem.texParameter( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP );
 | 
			
		||||
 | 
			
		||||
        IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
 | 
			
		||||
        drawEmptyTerminal( IDENTITY, renderer, x, y, width, height );
 | 
			
		||||
        renderer.finish();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawBlocker( @Nonnull Matrix4f transform, @Nonnull IRenderTypeBuffer renderer, float x, float y, float width, float height )
 | 
			
		||||
    {
 | 
			
		||||
        Colour colour = Colour.Black;
 | 
			
		||||
        drawQuad( transform, renderer.getBuffer( Type.BLOCKER ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static final class Type extends RenderState
 | 
			
		||||
    {
 | 
			
		||||
        private static final int GL_MODE = GL11.GL_TRIANGLES;
 | 
			
		||||
 | 
			
		||||
        private static final VertexFormat FORMAT = DefaultVertexFormats.POSITION_COLOR_TEX;
 | 
			
		||||
 | 
			
		||||
        static final RenderType MAIN = RenderType.get(
 | 
			
		||||
            "terminal_font", FORMAT, GL_MODE, 1024,
 | 
			
		||||
            false, false, // useDelegate, needsSorting
 | 
			
		||||
            RenderType.State.builder()
 | 
			
		||||
                .texture( new RenderState.TextureState( FONT, false, false ) ) // blur, minimap
 | 
			
		||||
                .alpha( DEFAULT_ALPHA )
 | 
			
		||||
                .lightmap( LIGHTMAP_DISABLED )
 | 
			
		||||
                .writeMask( COLOR_WRITE )
 | 
			
		||||
                .build( false )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        static final RenderType BLOCKER = RenderType.get(
 | 
			
		||||
            "terminal_blocker", FORMAT, GL_MODE, 256,
 | 
			
		||||
            false, false, // useDelegate, needsSorting
 | 
			
		||||
            RenderType.State.builder()
 | 
			
		||||
                .texture( new RenderState.TextureState( FONT, false, false ) ) // blur, minimap
 | 
			
		||||
                .alpha( DEFAULT_ALPHA )
 | 
			
		||||
                .writeMask( DEPTH_WRITE )
 | 
			
		||||
                .lightmap( LIGHTMAP_DISABLED )
 | 
			
		||||
                .build( false )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        private Type( String name, Runnable setup, Runnable destroy )
 | 
			
		||||
        {
 | 
			
		||||
            super( name, setup, destroy );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.gui.widgets.WidgetTerminal;
 | 
			
		||||
import dan200.computercraft.client.gui.widgets.WidgetWrapper;
 | 
			
		||||
@@ -135,7 +134,7 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
 | 
			
		||||
        terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
 | 
			
		||||
 | 
			
		||||
        // Draw a border around the terminal
 | 
			
		||||
        GlStateManager.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        switch( m_family )
 | 
			
		||||
        {
 | 
			
		||||
            case Normal:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive;
 | 
			
		||||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
 | 
			
		||||
import net.minecraft.entity.player.PlayerInventory;
 | 
			
		||||
@@ -33,7 +32,7 @@ public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( BACKGROUND );
 | 
			
		||||
        blit( guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.printer.ContainerPrinter;
 | 
			
		||||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
 | 
			
		||||
import net.minecraft.client.resources.I18n;
 | 
			
		||||
@@ -34,7 +33,7 @@ public class GuiPrinter extends ContainerScreen<ContainerPrinter>
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( BACKGROUND );
 | 
			
		||||
        blit( guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.common.ContainerHeldItem;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemPrintout;
 | 
			
		||||
@@ -89,10 +88,10 @@ public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
 | 
			
		||||
    public void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw the printout
 | 
			
		||||
        GlStateManager.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        GlStateManager.enableDepthTest();
 | 
			
		||||
        RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        RenderSystem.enableDepthTest();
 | 
			
		||||
 | 
			
		||||
        drawBorder( guiLeft, guiTop, blitOffset, m_page, m_pages, m_book );
 | 
			
		||||
        drawBorder( guiLeft, guiTop, getBlitOffset(), m_page, m_pages, m_book );
 | 
			
		||||
        drawText( guiLeft + X_TEXT_MARGIN, guiTop + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -100,9 +99,9 @@ public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
 | 
			
		||||
    public void render( int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    {
 | 
			
		||||
        // We must take the background further back in order to not overlap with our printed pages.
 | 
			
		||||
        blitOffset--;
 | 
			
		||||
        setBlitOffset( getBlitOffset() - 1 );
 | 
			
		||||
        renderBackground();
 | 
			
		||||
        blitOffset++;
 | 
			
		||||
        setBlitOffset( getBlitOffset() + 1 );
 | 
			
		||||
 | 
			
		||||
        super.render( mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredToolTip( mouseX, mouseY );
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.gui.widgets.WidgetTerminal;
 | 
			
		||||
import dan200.computercraft.client.gui.widgets.WidgetWrapper;
 | 
			
		||||
@@ -99,7 +98,7 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
 | 
			
		||||
        int slot = m_container.getSelectedSlot();
 | 
			
		||||
        if( slot >= 0 )
 | 
			
		||||
        {
 | 
			
		||||
            GlStateManager.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
            RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
            int slotX = slot % 4;
 | 
			
		||||
            int slotY = slot / 4;
 | 
			
		||||
            minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
 | 
			
		||||
@@ -115,7 +114,7 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
 | 
			
		||||
        terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
 | 
			
		||||
 | 
			
		||||
        // Draw border/inventory
 | 
			
		||||
        GlStateManager.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
 | 
			
		||||
        blit( guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui.widgets;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import dan200.computercraft.client.FrameInfo;
 | 
			
		||||
import dan200.computercraft.client.gui.FixedWidthFontRenderer;
 | 
			
		||||
import dan200.computercraft.core.terminal.Terminal;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ClientComputer;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.IComputer;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.gui.IGuiEventListener;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.util.SharedConstants;
 | 
			
		||||
import org.lwjgl.glfw.GLFW;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import java.util.BitSet;
 | 
			
		||||
import java.util.function.Supplier;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.BACKGROUND;
 | 
			
		||||
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT;
 | 
			
		||||
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_WIDTH;
 | 
			
		||||
 | 
			
		||||
public class WidgetTerminal implements IGuiEventListener
 | 
			
		||||
{
 | 
			
		||||
@@ -185,8 +176,8 @@ public class WidgetTerminal implements IGuiEventListener
 | 
			
		||||
        Terminal term = computer.getTerminal();
 | 
			
		||||
        if( term != null )
 | 
			
		||||
        {
 | 
			
		||||
            int charX = (int) (mouseX / FixedWidthFontRenderer.FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FixedWidthFontRenderer.FONT_HEIGHT);
 | 
			
		||||
            int charX = (int) (mouseX / FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FONT_HEIGHT);
 | 
			
		||||
            charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 );
 | 
			
		||||
            charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 );
 | 
			
		||||
 | 
			
		||||
@@ -209,8 +200,8 @@ public class WidgetTerminal implements IGuiEventListener
 | 
			
		||||
        Terminal term = computer.getTerminal();
 | 
			
		||||
        if( term != null )
 | 
			
		||||
        {
 | 
			
		||||
            int charX = (int) (mouseX / FixedWidthFontRenderer.FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FixedWidthFontRenderer.FONT_HEIGHT);
 | 
			
		||||
            int charX = (int) (mouseX / FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FONT_HEIGHT);
 | 
			
		||||
            charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 );
 | 
			
		||||
            charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 );
 | 
			
		||||
 | 
			
		||||
@@ -236,8 +227,8 @@ public class WidgetTerminal implements IGuiEventListener
 | 
			
		||||
        Terminal term = computer.getTerminal();
 | 
			
		||||
        if( term != null )
 | 
			
		||||
        {
 | 
			
		||||
            int charX = (int) (mouseX / FixedWidthFontRenderer.FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FixedWidthFontRenderer.FONT_HEIGHT);
 | 
			
		||||
            int charX = (int) (mouseX / FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FONT_HEIGHT);
 | 
			
		||||
            charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 );
 | 
			
		||||
            charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 );
 | 
			
		||||
 | 
			
		||||
@@ -261,8 +252,8 @@ public class WidgetTerminal implements IGuiEventListener
 | 
			
		||||
        Terminal term = computer.getTerminal();
 | 
			
		||||
        if( term != null )
 | 
			
		||||
        {
 | 
			
		||||
            int charX = (int) (mouseX / FixedWidthFontRenderer.FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FixedWidthFontRenderer.FONT_HEIGHT);
 | 
			
		||||
            int charX = (int) (mouseX / FONT_WIDTH);
 | 
			
		||||
            int charY = (int) (mouseY / FONT_HEIGHT);
 | 
			
		||||
            charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 );
 | 
			
		||||
            charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 );
 | 
			
		||||
 | 
			
		||||
@@ -330,89 +321,15 @@ public class WidgetTerminal implements IGuiEventListener
 | 
			
		||||
            Terminal terminal = computer != null ? computer.getTerminal() : null;
 | 
			
		||||
            if( terminal != null )
 | 
			
		||||
            {
 | 
			
		||||
                // Draw the terminal
 | 
			
		||||
                boolean greyscale = !computer.isColour();
 | 
			
		||||
                Palette palette = terminal.getPalette();
 | 
			
		||||
 | 
			
		||||
                // Get the data from the terminal first
 | 
			
		||||
                // Unfortunately we have to keep the lock for the whole of drawing, so the text doesn't change under us.
 | 
			
		||||
                FixedWidthFontRenderer fontRenderer = FixedWidthFontRenderer.instance();
 | 
			
		||||
                boolean tblink = terminal.getCursorBlink() && FrameInfo.getGlobalCursorBlink();
 | 
			
		||||
                int tw = terminal.getWidth();
 | 
			
		||||
                int th = terminal.getHeight();
 | 
			
		||||
                int tx = terminal.getCursorX();
 | 
			
		||||
                int ty = terminal.getCursorY();
 | 
			
		||||
 | 
			
		||||
                // Draw margins
 | 
			
		||||
                TextBuffer emptyLine = new TextBuffer( ' ', tw );
 | 
			
		||||
                if( topMargin > 0 )
 | 
			
		||||
                {
 | 
			
		||||
                    fontRenderer.drawString( emptyLine, originX, originY - topMargin,
 | 
			
		||||
                        terminal.getTextColourLine( 0 ), terminal.getBackgroundColourLine( 0 ),
 | 
			
		||||
                        leftMargin, rightMargin, greyscale, palette );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if( bottomMargin > 0 )
 | 
			
		||||
                {
 | 
			
		||||
                    fontRenderer.drawString( emptyLine, originX, originY + bottomMargin + (th - 1) * FixedWidthFontRenderer.FONT_HEIGHT,
 | 
			
		||||
                        terminal.getTextColourLine( th - 1 ), terminal.getBackgroundColourLine( th - 1 ),
 | 
			
		||||
                        leftMargin, rightMargin, greyscale, palette );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Draw lines
 | 
			
		||||
                int y = originY;
 | 
			
		||||
                for( int line = 0; line < th; line++ )
 | 
			
		||||
                {
 | 
			
		||||
                    TextBuffer text = terminal.getLine( line );
 | 
			
		||||
                    TextBuffer colour = terminal.getTextColourLine( line );
 | 
			
		||||
                    TextBuffer backgroundColour = terminal.getBackgroundColourLine( line );
 | 
			
		||||
                    fontRenderer.drawString( text, originX, y, colour, backgroundColour, leftMargin, rightMargin, greyscale, palette );
 | 
			
		||||
                    y += FixedWidthFontRenderer.FONT_HEIGHT;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if( tblink && tx >= 0 && ty >= 0 && tx < tw && ty < th )
 | 
			
		||||
                {
 | 
			
		||||
                    TextBuffer cursor = new TextBuffer( '_', 1 );
 | 
			
		||||
                    TextBuffer cursorColour = new TextBuffer( "0123456789abcdef".charAt( terminal.getTextColour() ), 1 );
 | 
			
		||||
 | 
			
		||||
                    fontRenderer.drawString(
 | 
			
		||||
                        cursor,
 | 
			
		||||
                        originX + FixedWidthFontRenderer.FONT_WIDTH * tx,
 | 
			
		||||
                        originY + FixedWidthFontRenderer.FONT_HEIGHT * ty,
 | 
			
		||||
                        cursorColour, null,
 | 
			
		||||
                        0, 0,
 | 
			
		||||
                        greyscale,
 | 
			
		||||
                        palette
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                FixedWidthFontRenderer.drawTerminal( originX, originY, terminal, !computer.isColour(), topMargin, bottomMargin, leftMargin, rightMargin );
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // Draw a black background
 | 
			
		||||
                Colour black = Colour.Black;
 | 
			
		||||
                GlStateManager.color4f( black.getR(), black.getG(), black.getB(), 1.0f );
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    int x = originX - leftMargin;
 | 
			
		||||
                    int y = originY - rightMargin;
 | 
			
		||||
                    int width = termWidth * FixedWidthFontRenderer.FONT_WIDTH + leftMargin + rightMargin;
 | 
			
		||||
                    int height = termHeight * FixedWidthFontRenderer.FONT_HEIGHT + topMargin + bottomMargin;
 | 
			
		||||
 | 
			
		||||
                    client.getTextureManager().bindTexture( BACKGROUND );
 | 
			
		||||
 | 
			
		||||
                    Tessellator tesslector = Tessellator.getInstance();
 | 
			
		||||
                    BufferBuilder buffer = tesslector.getBuffer();
 | 
			
		||||
                    buffer.begin( GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX );
 | 
			
		||||
                    buffer.pos( x, y + height, 0 ).tex( 0 / 256.0, height / 256.0 ).endVertex();
 | 
			
		||||
                    buffer.pos( x + width, y + height, 0 ).tex( width / 256.0, height / 256.0 ).endVertex();
 | 
			
		||||
                    buffer.pos( x + width, y, 0 ).tex( width / 256.0, 0 / 256.0 ).endVertex();
 | 
			
		||||
                    buffer.pos( x, y, 0 ).tex( 0 / 256.0, 0 / 256.0 ).endVertex();
 | 
			
		||||
                    tesslector.draw();
 | 
			
		||||
                }
 | 
			
		||||
                finally
 | 
			
		||||
                {
 | 
			
		||||
                    GlStateManager.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
                }
 | 
			
		||||
                FixedWidthFontRenderer.drawEmptyTerminal(
 | 
			
		||||
                    originX - leftMargin, originY - rightMargin,
 | 
			
		||||
                    termWidth * FONT_WIDTH + leftMargin + rightMargin,
 | 
			
		||||
                    termHeight * FONT_HEIGHT + topMargin + bottomMargin
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.gui.widgets;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.client.gui.IGuiEventListener;
 | 
			
		||||
@@ -55,7 +54,8 @@ public class WidgetWrapper implements IGuiEventListener
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean mouseScrolled( double x, double y, double delta )
 | 
			
		||||
    {
 | 
			
		||||
        return listener.mouseScrolled( x, y, delta );
 | 
			
		||||
        double dx = x - this.x, dy = y - this.y;
 | 
			
		||||
        return dx >= 0 && dx < width && dy >= 0 && dy < height && listener.mouseScrolled( dx, dy, delta );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,18 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.proxy;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.gui.*;
 | 
			
		||||
import dan200.computercraft.client.render.TileEntityCableRenderer;
 | 
			
		||||
import dan200.computercraft.client.render.TileEntityMonitorRenderer;
 | 
			
		||||
import dan200.computercraft.client.render.TileEntityTurtleRenderer;
 | 
			
		||||
import dan200.computercraft.shared.common.ContainerHeldItem;
 | 
			
		||||
import dan200.computercraft.shared.computer.inventory.ContainerComputer;
 | 
			
		||||
import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.TileCable;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.ClientMonitor;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.printer.ContainerPrinter;
 | 
			
		||||
@@ -23,6 +20,8 @@ import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.turtle.blocks.TileTurtle;
 | 
			
		||||
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
 | 
			
		||||
import net.minecraft.client.gui.ScreenManager;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.client.renderer.RenderTypeLookup;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.event.world.WorldEvent;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
@@ -38,10 +37,21 @@ public final class ComputerCraftProxyClient
 | 
			
		||||
    {
 | 
			
		||||
        registerContainers();
 | 
			
		||||
 | 
			
		||||
        // While turtles themselves are not transparent, their upgrades may be.
 | 
			
		||||
        RenderTypeLookup.setRenderLayer( ComputerCraft.Blocks.turtleNormal, RenderType.translucent() );
 | 
			
		||||
        RenderTypeLookup.setRenderLayer( ComputerCraft.Blocks.turtleAdvanced, RenderType.translucent() );
 | 
			
		||||
 | 
			
		||||
        // Monitors' textures have _entirely_ transparent sections which, while not translucent, requires being rendered
 | 
			
		||||
        // as transparent.
 | 
			
		||||
        RenderTypeLookup.setRenderLayer( ComputerCraft.Blocks.monitorNormal, RenderType.translucent() );
 | 
			
		||||
        RenderTypeLookup.setRenderLayer( ComputerCraft.Blocks.monitorAdvanced, RenderType.translucent() );
 | 
			
		||||
 | 
			
		||||
        // Setup TESRs
 | 
			
		||||
        ClientRegistry.bindTileEntitySpecialRenderer( TileMonitor.class, new TileEntityMonitorRenderer() );
 | 
			
		||||
        ClientRegistry.bindTileEntitySpecialRenderer( TileCable.class, new TileEntityCableRenderer() );
 | 
			
		||||
        ClientRegistry.bindTileEntitySpecialRenderer( TileTurtle.class, new TileEntityTurtleRenderer() );
 | 
			
		||||
        ClientRegistry.bindTileEntityRenderer( TileMonitor.FACTORY_NORMAL, TileEntityMonitorRenderer::new );
 | 
			
		||||
        ClientRegistry.bindTileEntityRenderer( TileMonitor.FACTORY_ADVANCED, TileEntityMonitorRenderer::new );
 | 
			
		||||
        ClientRegistry.bindTileEntityRenderer( TileTurtle.FACTORY_NORMAL, TileEntityTurtleRenderer::new );
 | 
			
		||||
        ClientRegistry.bindTileEntityRenderer( TileTurtle.FACTORY_ADVANCED, TileEntityTurtleRenderer::new );
 | 
			
		||||
        // TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void registerContainers()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,118 +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.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.FirstPersonRenderer;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.HandSide;
 | 
			
		||||
import net.minecraft.util.math.MathHelper;
 | 
			
		||||
 | 
			
		||||
public abstract class ItemMapLikeRenderer
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The main rendering method for the item.
 | 
			
		||||
     *
 | 
			
		||||
     * @param stack The stack to render
 | 
			
		||||
     * @see FirstPersonRenderer#renderMapFirstPerson(ItemStack)
 | 
			
		||||
     */
 | 
			
		||||
    protected abstract void renderItem( ItemStack stack );
 | 
			
		||||
 | 
			
		||||
    protected void renderItemFirstPerson( Hand hand, float pitch, float equipProgress, float swingProgress, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        PlayerEntity player = Minecraft.getInstance().player;
 | 
			
		||||
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        if( hand == Hand.MAIN_HAND && player.getHeldItemOffhand().isEmpty() )
 | 
			
		||||
        {
 | 
			
		||||
            renderItemFirstPersonCenter( pitch, equipProgress, swingProgress, stack );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            renderItemFirstPersonSide(
 | 
			
		||||
                hand == Hand.MAIN_HAND ? player.getPrimaryHand() : player.getPrimaryHand().opposite(),
 | 
			
		||||
                equipProgress, swingProgress, stack
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        GlStateManager.popMatrix();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Renders the item to one side of the player.
 | 
			
		||||
     *
 | 
			
		||||
     * @param side          The side to render on
 | 
			
		||||
     * @param equipProgress The equip progress of this item
 | 
			
		||||
     * @param swingProgress The swing progress of this item
 | 
			
		||||
     * @param stack         The stack to render
 | 
			
		||||
     * @see FirstPersonRenderer#renderMapFirstPersonSide(float, HandSide, float, ItemStack)
 | 
			
		||||
     */
 | 
			
		||||
    private void renderItemFirstPersonSide( HandSide side, float equipProgress, float swingProgress, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft minecraft = Minecraft.getInstance();
 | 
			
		||||
        float offset = side == HandSide.RIGHT ? 1f : -1f;
 | 
			
		||||
        GlStateManager.translatef( offset * 0.125f, -0.125f, 0f );
 | 
			
		||||
 | 
			
		||||
        // If the player is not invisible then render a single arm
 | 
			
		||||
        if( !minecraft.player.isInvisible() )
 | 
			
		||||
        {
 | 
			
		||||
            GlStateManager.pushMatrix();
 | 
			
		||||
            GlStateManager.rotatef( offset * 10f, 0f, 0f, 1f );
 | 
			
		||||
            minecraft.getFirstPersonRenderer().renderArmFirstPerson( equipProgress, swingProgress, side );
 | 
			
		||||
            GlStateManager.popMatrix();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Setup the appropriate transformations. This is just copied from the
 | 
			
		||||
        // corresponding method in ItemRenderer.
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        GlStateManager.translatef( offset * 0.51f, -0.08f + equipProgress * -1.2f, -0.75f );
 | 
			
		||||
        float f1 = MathHelper.sqrt( swingProgress );
 | 
			
		||||
        float f2 = MathHelper.sin( f1 * (float) Math.PI );
 | 
			
		||||
        float f3 = -0.5f * f2;
 | 
			
		||||
        float f4 = 0.4f * MathHelper.sin( f1 * ((float) Math.PI * 2f) );
 | 
			
		||||
        float f5 = -0.3f * MathHelper.sin( swingProgress * (float) Math.PI );
 | 
			
		||||
        GlStateManager.translatef( offset * f3, f4 - 0.3f * f2, f5 );
 | 
			
		||||
        GlStateManager.rotatef( f2 * -45f, 1f, 0f, 0f );
 | 
			
		||||
        GlStateManager.rotatef( offset * f2 * -30f, 0f, 1f, 0f );
 | 
			
		||||
 | 
			
		||||
        renderItem( stack );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.popMatrix();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Render an item in the middle of the screen.
 | 
			
		||||
     *
 | 
			
		||||
     * @param pitch         The pitch of the player
 | 
			
		||||
     * @param equipProgress The equip progress of this item
 | 
			
		||||
     * @param swingProgress The swing progress of this item
 | 
			
		||||
     * @param stack         The stack to render
 | 
			
		||||
     * @see FirstPersonRenderer#renderMapFirstPerson(float, float, float)
 | 
			
		||||
     */
 | 
			
		||||
    private void renderItemFirstPersonCenter( float pitch, float equipProgress, float swingProgress, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        FirstPersonRenderer renderer = Minecraft.getInstance().getFirstPersonRenderer();
 | 
			
		||||
 | 
			
		||||
        // Setup the appropriate transformations. This is just copied from the
 | 
			
		||||
        // corresponding method in ItemRenderer.
 | 
			
		||||
        float swingRt = MathHelper.sqrt( swingProgress );
 | 
			
		||||
        float tX = -0.2f * MathHelper.sin( swingProgress * (float) Math.PI );
 | 
			
		||||
        float tZ = -0.4f * MathHelper.sin( swingRt * (float) Math.PI );
 | 
			
		||||
        GlStateManager.translatef( 0f, -tX / 2f, tZ );
 | 
			
		||||
        float pitchAngle = renderer.getMapAngleFromPitch( pitch );
 | 
			
		||||
        GlStateManager.translatef( 0f, 0.04f + equipProgress * -1.2f + pitchAngle * -0.5f, -0.72f );
 | 
			
		||||
        GlStateManager.rotatef( pitchAngle * -85f, 1f, 0f, 0f );
 | 
			
		||||
        renderer.renderArms();
 | 
			
		||||
        float rX = MathHelper.sin( swingRt * (float) Math.PI );
 | 
			
		||||
        GlStateManager.rotatef( rX * 20f, 1f, 0f, 0f );
 | 
			
		||||
        GlStateManager.scalef( 2f, 2f, 2f );
 | 
			
		||||
 | 
			
		||||
        renderItem( stack );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,270 +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.client.render;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.client.renderer.model.BakedQuad;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexFormat;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.LightUtil;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.VertexTransformer;
 | 
			
		||||
import net.minecraftforge.common.model.TRSRTransformation;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.vecmath.Matrix4f;
 | 
			
		||||
import javax.vecmath.Point3f;
 | 
			
		||||
import javax.vecmath.Vector3f;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Transforms vertices of a model, remaining aware of winding order, and rearranging
 | 
			
		||||
 * vertices if needed.
 | 
			
		||||
 */
 | 
			
		||||
public final class ModelTransformer
 | 
			
		||||
{
 | 
			
		||||
    private static final Matrix4f identity;
 | 
			
		||||
 | 
			
		||||
    static
 | 
			
		||||
    {
 | 
			
		||||
        identity = new Matrix4f();
 | 
			
		||||
        identity.setIdentity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private ModelTransformer()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void transformQuadsTo( List<BakedQuad> output, List<BakedQuad> input, Matrix4f transform )
 | 
			
		||||
    {
 | 
			
		||||
        if( transform == null || transform.equals( identity ) )
 | 
			
		||||
        {
 | 
			
		||||
            output.addAll( input );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            Matrix4f normalMatrix = new Matrix4f( transform );
 | 
			
		||||
            normalMatrix.invert();
 | 
			
		||||
            normalMatrix.transpose();
 | 
			
		||||
 | 
			
		||||
            for( BakedQuad quad : input ) output.add( doTransformQuad( quad, transform, normalMatrix ) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static BakedQuad transformQuad( BakedQuad input, Matrix4f transform )
 | 
			
		||||
    {
 | 
			
		||||
        if( transform == null || transform.equals( identity ) ) return input;
 | 
			
		||||
 | 
			
		||||
        Matrix4f normalMatrix = new Matrix4f( transform );
 | 
			
		||||
        normalMatrix.invert();
 | 
			
		||||
        normalMatrix.transpose();
 | 
			
		||||
        return doTransformQuad( input, transform, normalMatrix );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static BakedQuad doTransformQuad( BakedQuad input, Matrix4f positionMatrix, Matrix4f normalMatrix )
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        BakedQuadBuilder builder = new BakedQuadBuilder( input.getFormat() );
 | 
			
		||||
        NormalAwareTransformer transformer = new NormalAwareTransformer( builder, positionMatrix, normalMatrix );
 | 
			
		||||
        input.pipe( transformer );
 | 
			
		||||
 | 
			
		||||
        if( transformer.areNormalsInverted() )
 | 
			
		||||
        {
 | 
			
		||||
            builder.swap( 1, 3 );
 | 
			
		||||
            transformer.areNormalsInverted();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return builder.build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A vertex transformer that tracks whether the normals have been inverted and so the vertices
 | 
			
		||||
     * should be reordered so backface culling works as expected.
 | 
			
		||||
     */
 | 
			
		||||
    private static class NormalAwareTransformer extends VertexTransformer
 | 
			
		||||
    {
 | 
			
		||||
        private final Matrix4f positionMatrix;
 | 
			
		||||
        private final Matrix4f normalMatrix;
 | 
			
		||||
 | 
			
		||||
        private int vertexIndex = 0, elementIndex = 0;
 | 
			
		||||
        private final Point3f[] before = new Point3f[4];
 | 
			
		||||
        private final Point3f[] after = new Point3f[4];
 | 
			
		||||
 | 
			
		||||
        NormalAwareTransformer( IVertexConsumer parent, Matrix4f positionMatrix, Matrix4f normalMatrix )
 | 
			
		||||
        {
 | 
			
		||||
            super( parent );
 | 
			
		||||
            this.positionMatrix = positionMatrix;
 | 
			
		||||
            this.normalMatrix = normalMatrix;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setQuadOrientation( @Nonnull Direction orientation )
 | 
			
		||||
        {
 | 
			
		||||
            super.setQuadOrientation( orientation == null ? orientation : TRSRTransformation.rotate( positionMatrix, orientation ) );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void put( int element, @Nonnull float... data )
 | 
			
		||||
        {
 | 
			
		||||
            switch( getVertexFormat().getElement( element ).getUsage() )
 | 
			
		||||
            {
 | 
			
		||||
                case POSITION:
 | 
			
		||||
                {
 | 
			
		||||
                    Point3f vec = new Point3f( data );
 | 
			
		||||
                    Point3f newVec = new Point3f();
 | 
			
		||||
                    positionMatrix.transform( vec, newVec );
 | 
			
		||||
 | 
			
		||||
                    float[] newData = new float[4];
 | 
			
		||||
                    newVec.get( newData );
 | 
			
		||||
                    super.put( element, newData );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    before[vertexIndex] = vec;
 | 
			
		||||
                    after[vertexIndex] = newVec;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                case NORMAL:
 | 
			
		||||
                {
 | 
			
		||||
                    Vector3f vec = new Vector3f( data );
 | 
			
		||||
                    normalMatrix.transform( vec );
 | 
			
		||||
 | 
			
		||||
                    float[] newData = new float[4];
 | 
			
		||||
                    vec.get( newData );
 | 
			
		||||
                    super.put( element, newData );
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                default:
 | 
			
		||||
                    super.put( element, data );
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            elementIndex++;
 | 
			
		||||
            if( elementIndex == getVertexFormat().getElementCount() )
 | 
			
		||||
            {
 | 
			
		||||
                vertexIndex++;
 | 
			
		||||
                elementIndex = 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public boolean areNormalsInverted()
 | 
			
		||||
        {
 | 
			
		||||
            Vector3f temp1 = new Vector3f(), temp2 = new Vector3f();
 | 
			
		||||
            Vector3f crossBefore = new Vector3f(), crossAfter = new Vector3f();
 | 
			
		||||
 | 
			
		||||
            // Determine what cross product we expect to have
 | 
			
		||||
            temp1.sub( before[1], before[0] );
 | 
			
		||||
            temp2.sub( before[1], before[2] );
 | 
			
		||||
            crossBefore.cross( temp1, temp2 );
 | 
			
		||||
            normalMatrix.transform( crossBefore );
 | 
			
		||||
 | 
			
		||||
            // And determine what cross product we actually have
 | 
			
		||||
            temp1.sub( after[1], after[0] );
 | 
			
		||||
            temp2.sub( after[1], after[2] );
 | 
			
		||||
            crossAfter.cross( temp1, temp2 );
 | 
			
		||||
 | 
			
		||||
            // If the angle between expected and actual cross product is greater than
 | 
			
		||||
            // pi/2 radians then we will need to reorder our quads.
 | 
			
		||||
            return Math.abs( crossBefore.angle( crossAfter ) ) >= Math.PI / 2;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A vertex consumer which is capable of building {@link BakedQuad}s.
 | 
			
		||||
     *
 | 
			
		||||
     * Equivalent to {@link net.minecraftforge.client.model.pipeline.UnpackedBakedQuad.Builder} but more memory
 | 
			
		||||
     * efficient.
 | 
			
		||||
     *
 | 
			
		||||
     * This also provides the ability to swap vertices through {@link #swap(int, int)} to allow reordering.
 | 
			
		||||
     */
 | 
			
		||||
    private static final class BakedQuadBuilder implements IVertexConsumer
 | 
			
		||||
    {
 | 
			
		||||
        private final VertexFormat format;
 | 
			
		||||
 | 
			
		||||
        private final int[] vertexData;
 | 
			
		||||
        private int vertexIndex = 0, elementIndex = 0;
 | 
			
		||||
 | 
			
		||||
        private Direction orientation;
 | 
			
		||||
        private int quadTint;
 | 
			
		||||
        private boolean diffuse;
 | 
			
		||||
        private TextureAtlasSprite texture;
 | 
			
		||||
 | 
			
		||||
        private BakedQuadBuilder( VertexFormat format )
 | 
			
		||||
        {
 | 
			
		||||
            this.format = format;
 | 
			
		||||
            vertexData = new int[format.getSize()];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public VertexFormat getVertexFormat()
 | 
			
		||||
        {
 | 
			
		||||
            return format;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setQuadTint( int tint )
 | 
			
		||||
        {
 | 
			
		||||
            quadTint = tint;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setQuadOrientation( @Nonnull Direction orientation )
 | 
			
		||||
        {
 | 
			
		||||
            this.orientation = orientation;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setApplyDiffuseLighting( boolean diffuse )
 | 
			
		||||
        {
 | 
			
		||||
            this.diffuse = diffuse;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setTexture( @Nonnull TextureAtlasSprite texture )
 | 
			
		||||
        {
 | 
			
		||||
            this.texture = texture;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void put( int element, @Nonnull float... data )
 | 
			
		||||
        {
 | 
			
		||||
            LightUtil.pack( data, vertexData, format, vertexIndex, element );
 | 
			
		||||
 | 
			
		||||
            elementIndex++;
 | 
			
		||||
            if( elementIndex == getVertexFormat().getElementCount() )
 | 
			
		||||
            {
 | 
			
		||||
                vertexIndex++;
 | 
			
		||||
                elementIndex = 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void swap( int a, int b )
 | 
			
		||||
        {
 | 
			
		||||
            int length = vertexData.length / 4;
 | 
			
		||||
            for( int i = 0; i < length; i++ )
 | 
			
		||||
            {
 | 
			
		||||
                int temp = vertexData[a * length + i];
 | 
			
		||||
                vertexData[a * length + i] = vertexData[b * length + i];
 | 
			
		||||
                vertexData[b * length + i] = temp;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public BakedQuad build()
 | 
			
		||||
        {
 | 
			
		||||
            if( elementIndex != 0 || vertexIndex != 4 )
 | 
			
		||||
            {
 | 
			
		||||
                throw new IllegalStateException( "Got an unexpected number of elements/vertices" );
 | 
			
		||||
            }
 | 
			
		||||
            if( texture == null )
 | 
			
		||||
            {
 | 
			
		||||
                throw new IllegalStateException( "Texture has not been set" );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return new BakedQuad( vertexData, quadTint, orientation, texture, diffuse, format );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager.DestFactor;
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager.SourceFactor;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.client.gui.FixedWidthFontRenderer;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
@@ -25,7 +24,7 @@ import static dan200.computercraft.shared.media.items.ItemPrintout.LINES_PER_PAG
 | 
			
		||||
public final class PrintoutRenderer
 | 
			
		||||
{
 | 
			
		||||
    private static final ResourceLocation BG = new ResourceLocation( "computercraft", "textures/gui/printout.png" );
 | 
			
		||||
    private static final double BG_SIZE = 256.0;
 | 
			
		||||
    private static final float BG_SIZE = 256.0f;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Width of a page.
 | 
			
		||||
@@ -64,35 +63,21 @@ public final class PrintoutRenderer
 | 
			
		||||
 | 
			
		||||
    public static void drawText( int x, int y, int start, TextBuffer[] text, TextBuffer[] colours )
 | 
			
		||||
    {
 | 
			
		||||
        FixedWidthFontRenderer fontRenderer = FixedWidthFontRenderer.instance();
 | 
			
		||||
 | 
			
		||||
        for( int line = 0; line < LINES_PER_PAGE && line < text.length; line++ )
 | 
			
		||||
        {
 | 
			
		||||
            fontRenderer.drawString( text[start + line], x, y + line * FONT_HEIGHT, colours[start + line], null, 0, 0, false, Palette.DEFAULT );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawText( int x, int y, int start, String[] text, String[] colours )
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.enableTexture();
 | 
			
		||||
        GlStateManager.blendFuncSeparate( SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO );
 | 
			
		||||
 | 
			
		||||
        FixedWidthFontRenderer fontRenderer = FixedWidthFontRenderer.instance();
 | 
			
		||||
 | 
			
		||||
        for( int line = 0; line < LINES_PER_PAGE && line < text.length; line++ )
 | 
			
		||||
        {
 | 
			
		||||
            fontRenderer.drawString( new TextBuffer( text[start + line] ), x, y + line * FONT_HEIGHT, new TextBuffer( colours[start + line] ), null, 0, 0, false, Palette.DEFAULT );
 | 
			
		||||
            FixedWidthFontRenderer.drawString(
 | 
			
		||||
                x, y + line * FONT_HEIGHT, text[start + line], colours[start + line], null, Palette.DEFAULT,
 | 
			
		||||
                false, 0, 0
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void drawBorder( double x, double y, double z, int page, int pages, boolean isBook )
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.enableTexture();
 | 
			
		||||
        GlStateManager.blendFuncSeparate( SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO );
 | 
			
		||||
        RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        RenderSystem.enableBlend();
 | 
			
		||||
        RenderSystem.enableTexture();
 | 
			
		||||
        RenderSystem.blendFuncSeparate( SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO );
 | 
			
		||||
 | 
			
		||||
        Minecraft.getInstance().getTextureManager().bindTexture( BG );
 | 
			
		||||
 | 
			
		||||
@@ -124,8 +109,8 @@ public final class PrintoutRenderer
 | 
			
		||||
            while( borderX < right )
 | 
			
		||||
            {
 | 
			
		||||
                double thisWidth = Math.min( right - borderX, X_SIZE );
 | 
			
		||||
                drawTexture( buffer, borderX, y - 8, z - 0.02, 0, COVER_Y, thisWidth, COVER_SIZE );
 | 
			
		||||
                drawTexture( buffer, borderX, y + Y_SIZE - 4, z - 0.02, 0, COVER_Y + COVER_SIZE, thisWidth, COVER_SIZE );
 | 
			
		||||
                drawTexture( buffer, borderX, y - 8, z - 0.02, 0, COVER_Y, (float) thisWidth, COVER_SIZE );
 | 
			
		||||
                drawTexture( buffer, borderX, y + Y_SIZE - 4, z - 0.02, 0, COVER_Y + COVER_SIZE, (float) thisWidth, COVER_SIZE );
 | 
			
		||||
                borderX += thisWidth;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -157,7 +142,7 @@ public final class PrintoutRenderer
 | 
			
		||||
        tessellator.draw();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void drawTexture( BufferBuilder buffer, double x, double y, double z, double u, double v, double width, double height )
 | 
			
		||||
    private static void drawTexture( BufferBuilder buffer, double x, double y, double z, float u, float v, float width, float height )
 | 
			
		||||
    {
 | 
			
		||||
        buffer.pos( x, y + height, z ).tex( u / BG_SIZE, (v + height) / BG_SIZE ).endVertex();
 | 
			
		||||
        buffer.pos( x + width, y + height, z ).tex( (u + width) / BG_SIZE, (v + height) / BG_SIZE ).endVertex();
 | 
			
		||||
@@ -165,7 +150,7 @@ public final class PrintoutRenderer
 | 
			
		||||
        buffer.pos( x, y, z ).tex( u / BG_SIZE, v / BG_SIZE ).endVertex();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void drawTexture( BufferBuilder buffer, double x, double y, double z, double width, double height, double u, double v, double tWidth, double tHeight )
 | 
			
		||||
    private static void drawTexture( BufferBuilder buffer, double x, double y, double z, double width, double height, float u, float v, float tWidth, float tHeight )
 | 
			
		||||
    {
 | 
			
		||||
        buffer.pos( x, y + height, z ).tex( u / BG_SIZE, (v + tHeight) / BG_SIZE ).endVertex();
 | 
			
		||||
        buffer.pos( x + width, y + height, z ).tex( (u + tWidth) / BG_SIZE, (v + tHeight) / BG_SIZE ).endVertex();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,43 +1,44 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GLX;
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.client.FrameInfo;
 | 
			
		||||
import dan200.computercraft.client.gui.FixedWidthFontRenderer;
 | 
			
		||||
import dan200.computercraft.core.terminal.Terminal;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.ClientMonitor;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import dan200.computercraft.shared.util.DirectionUtil;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.*;
 | 
			
		||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexBuffer;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
 | 
			
		||||
{
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( TileMonitor tileEntity, double posX, double posY, double posZ, float f, int i )
 | 
			
		||||
    /**
 | 
			
		||||
     * {@link TileMonitor#RENDER_MARGIN}, but a tiny bit of additional padding to ensure that there is no space between
 | 
			
		||||
     * the monitor frame and contents.
 | 
			
		||||
     */
 | 
			
		||||
    private static final float MARGIN = (float) (TileMonitor.RENDER_MARGIN * 1.1);
 | 
			
		||||
 | 
			
		||||
    private static final Matrix4f IDENTITY = TransformationMatrix.identity().getMatrix();
 | 
			
		||||
 | 
			
		||||
    public TileEntityMonitorRenderer( TileEntityRendererDispatcher rendererDispatcher )
 | 
			
		||||
    {
 | 
			
		||||
        if( tileEntity != null )
 | 
			
		||||
        {
 | 
			
		||||
            renderMonitorAt( tileEntity, posX, posY, posZ, f, i );
 | 
			
		||||
        }
 | 
			
		||||
        super( rendererDispatcher );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void renderMonitorAt( TileMonitor monitor, double posX, double posY, double posZ, float f, int i )
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( @Nonnull TileMonitor monitor, float partialTicks, @Nonnull MatrixStack transform, @Nonnull IRenderTypeBuffer renderer, int lightmapCoord, int overlayLight )
 | 
			
		||||
    {
 | 
			
		||||
        // Render from the origin monitor
 | 
			
		||||
        ClientMonitor originTerminal = monitor.getClientMonitor();
 | 
			
		||||
@@ -59,9 +60,6 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
 | 
			
		||||
        originTerminal.lastRenderPos = monitorPos;
 | 
			
		||||
 | 
			
		||||
        BlockPos originPos = origin.getPos();
 | 
			
		||||
        posX += originPos.getX() - monitorPos.getX();
 | 
			
		||||
        posY += originPos.getY() - monitorPos.getY();
 | 
			
		||||
        posZ += originPos.getZ() - monitorPos.getZ();
 | 
			
		||||
 | 
			
		||||
        // Determine orientation
 | 
			
		||||
        Direction dir = origin.getDirection();
 | 
			
		||||
@@ -69,14 +67,17 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
 | 
			
		||||
        float yaw = dir.getHorizontalAngle();
 | 
			
		||||
        float pitch = DirectionUtil.toPitchAngle( front );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
        // Setup initial transform
 | 
			
		||||
            GlStateManager.translated( posX + 0.5, posY + 0.5, posZ + 0.5 );
 | 
			
		||||
            GlStateManager.rotatef( -yaw, 0.0f, 1.0f, 0.0f );
 | 
			
		||||
            GlStateManager.rotatef( pitch, 1.0f, 0.0f, 0.0f );
 | 
			
		||||
            GlStateManager.translated(
 | 
			
		||||
        transform.push();
 | 
			
		||||
        transform.translate(
 | 
			
		||||
            originPos.getX() - monitorPos.getX() + 0.5,
 | 
			
		||||
            originPos.getY() - monitorPos.getY() + 0.5,
 | 
			
		||||
            originPos.getZ() - monitorPos.getZ() + 0.5
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        transform.rotate( Vector3f.YN.rotationDegrees( yaw ) );
 | 
			
		||||
        transform.rotate( Vector3f.XP.rotationDegrees( pitch ) );
 | 
			
		||||
        transform.translate(
 | 
			
		||||
            -0.5 + TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN,
 | 
			
		||||
            origin.getHeight() - 0.5 - (TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN) + 0,
 | 
			
		||||
            0.5
 | 
			
		||||
@@ -84,209 +85,76 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
 | 
			
		||||
        double xSize = origin.getWidth() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER);
 | 
			
		||||
        double ySize = origin.getHeight() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER);
 | 
			
		||||
 | 
			
		||||
            // Get renderers
 | 
			
		||||
            Minecraft mc = Minecraft.getInstance();
 | 
			
		||||
            Tessellator tessellator = Tessellator.getInstance();
 | 
			
		||||
            BufferBuilder renderer = tessellator.getBuffer();
 | 
			
		||||
 | 
			
		||||
            // Get terminal
 | 
			
		||||
            boolean redraw = originTerminal.pollTerminalChanged();
 | 
			
		||||
 | 
			
		||||
        // Draw the contents
 | 
			
		||||
            GlStateManager.depthMask( false );
 | 
			
		||||
            GLX.glMultiTexCoord2f( GLX.GL_TEXTURE1, 0xFFFF, 0xFFFF );
 | 
			
		||||
            GlStateManager.disableLighting();
 | 
			
		||||
            mc.gameRenderer.disableLightmap();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
        Terminal terminal = originTerminal.getTerminal();
 | 
			
		||||
        if( terminal != null )
 | 
			
		||||
        {
 | 
			
		||||
                    Palette palette = terminal.getPalette();
 | 
			
		||||
 | 
			
		||||
                    // Allocate display lists
 | 
			
		||||
                    if( originTerminal.renderDisplayLists == null )
 | 
			
		||||
            boolean redraw = originTerminal.pollTerminalChanged();
 | 
			
		||||
            if( originTerminal.buffer == null )
 | 
			
		||||
            {
 | 
			
		||||
                        originTerminal.createLists();
 | 
			
		||||
                originTerminal.createBuffer();
 | 
			
		||||
                redraw = true;
 | 
			
		||||
            }
 | 
			
		||||
            VertexBuffer vbo = originTerminal.buffer;
 | 
			
		||||
 | 
			
		||||
            // Draw a terminal
 | 
			
		||||
                    boolean greyscale = !originTerminal.isColour();
 | 
			
		||||
                    int width = terminal.getWidth();
 | 
			
		||||
                    int height = terminal.getHeight();
 | 
			
		||||
                    int cursorX = terminal.getCursorX();
 | 
			
		||||
                    int cursorY = terminal.getCursorY();
 | 
			
		||||
                    FixedWidthFontRenderer fontRenderer = FixedWidthFontRenderer.instance();
 | 
			
		||||
            double xScale = xSize / (terminal.getWidth() * FixedWidthFontRenderer.FONT_WIDTH);
 | 
			
		||||
            double yScale = ySize / (terminal.getHeight() * FixedWidthFontRenderer.FONT_HEIGHT);
 | 
			
		||||
            transform.push();
 | 
			
		||||
            transform.scale( (float) xScale, (float) -yScale, 1.0f );
 | 
			
		||||
 | 
			
		||||
                    GlStateManager.pushMatrix();
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        double xScale = xSize / (width * FixedWidthFontRenderer.FONT_WIDTH);
 | 
			
		||||
                        double yScale = ySize / (height * FixedWidthFontRenderer.FONT_HEIGHT);
 | 
			
		||||
                        GlStateManager.scaled( xScale, -yScale, 1.0 );
 | 
			
		||||
            float xMargin = (float) (MARGIN / xScale);
 | 
			
		||||
            float yMargin = (float) (MARGIN / yScale);
 | 
			
		||||
 | 
			
		||||
            Matrix4f matrix = transform.getLast().getPositionMatrix();
 | 
			
		||||
 | 
			
		||||
                        // Draw background
 | 
			
		||||
                        mc.getTextureManager().bindTexture( FixedWidthFontRenderer.BACKGROUND );
 | 
			
		||||
            if( redraw )
 | 
			
		||||
            {
 | 
			
		||||
                            // Build background display list
 | 
			
		||||
                            GlStateManager.newList( originTerminal.renderDisplayLists[0], GL11.GL_COMPILE );
 | 
			
		||||
                            try
 | 
			
		||||
                            {
 | 
			
		||||
                                double marginXSize = TileMonitor.RENDER_MARGIN / xScale;
 | 
			
		||||
                                double marginYSize = TileMonitor.RENDER_MARGIN / yScale;
 | 
			
		||||
                                double marginSquash = marginYSize / FixedWidthFontRenderer.FONT_HEIGHT;
 | 
			
		||||
 | 
			
		||||
                                // Top and bottom margins
 | 
			
		||||
                                GlStateManager.pushMatrix();
 | 
			
		||||
                                try
 | 
			
		||||
                                {
 | 
			
		||||
                                    GlStateManager.scaled( 1.0, marginSquash, 1.0 );
 | 
			
		||||
                                    GlStateManager.translated( 0.0, -marginYSize / marginSquash, 0.0 );
 | 
			
		||||
                                    fontRenderer.drawStringBackgroundPart( 0, 0, terminal.getBackgroundColourLine( 0 ), marginXSize, marginXSize, greyscale, palette );
 | 
			
		||||
                                    GlStateManager.translated( 0.0, (marginYSize + height * FixedWidthFontRenderer.FONT_HEIGHT) / marginSquash, 0.0 );
 | 
			
		||||
                                    fontRenderer.drawStringBackgroundPart( 0, 0, terminal.getBackgroundColourLine( height - 1 ), marginXSize, marginXSize, greyscale, palette );
 | 
			
		||||
                                }
 | 
			
		||||
                                finally
 | 
			
		||||
                                {
 | 
			
		||||
                                    GlStateManager.popMatrix();
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                // Backgrounds
 | 
			
		||||
                                for( int y = 0; y < height; y++ )
 | 
			
		||||
                                {
 | 
			
		||||
                                    fontRenderer.drawStringBackgroundPart(
 | 
			
		||||
                                        0, FixedWidthFontRenderer.FONT_HEIGHT * y,
 | 
			
		||||
                                        terminal.getBackgroundColourLine( y ),
 | 
			
		||||
                                        marginXSize, marginXSize,
 | 
			
		||||
                                        greyscale,
 | 
			
		||||
                                        palette
 | 
			
		||||
                Tessellator tessellator = Tessellator.getInstance();
 | 
			
		||||
                BufferBuilder builder = tessellator.getBuffer();
 | 
			
		||||
                builder.begin( FixedWidthFontRenderer.TYPE.getGlMode(), FixedWidthFontRenderer.TYPE.getVertexFormat() );
 | 
			
		||||
                FixedWidthFontRenderer.drawTerminalWithoutCursor(
 | 
			
		||||
                    IDENTITY, builder, 0, 0,
 | 
			
		||||
                    terminal, !originTerminal.isColour(), yMargin, yMargin, xMargin, xMargin
 | 
			
		||||
                );
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            finally
 | 
			
		||||
                            {
 | 
			
		||||
                                GlStateManager.endList();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        GlStateManager.callList( originTerminal.renderDisplayLists[0] );
 | 
			
		||||
                        GlStateManager.clearCurrentColor();
 | 
			
		||||
 | 
			
		||||
                        // Draw text
 | 
			
		||||
                        fontRenderer.bindFont();
 | 
			
		||||
                        if( redraw )
 | 
			
		||||
                        {
 | 
			
		||||
                            // Build text display list
 | 
			
		||||
                            GlStateManager.newList( originTerminal.renderDisplayLists[1], GL11.GL_COMPILE );
 | 
			
		||||
                            try
 | 
			
		||||
                            {
 | 
			
		||||
                                // Lines
 | 
			
		||||
                                for( int y = 0; y < height; y++ )
 | 
			
		||||
                                {
 | 
			
		||||
                                    fontRenderer.drawStringTextPart(
 | 
			
		||||
                                        0, FixedWidthFontRenderer.FONT_HEIGHT * y,
 | 
			
		||||
                                        terminal.getLine( y ),
 | 
			
		||||
                                        terminal.getTextColourLine( y ),
 | 
			
		||||
                                        greyscale,
 | 
			
		||||
                                        palette
 | 
			
		||||
                                    );
 | 
			
		||||
                builder.finishDrawing();
 | 
			
		||||
                vbo.upload( builder );
 | 
			
		||||
            }
 | 
			
		||||
                            }
 | 
			
		||||
                            finally
 | 
			
		||||
                            {
 | 
			
		||||
                                GlStateManager.endList();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        GlStateManager.callList( originTerminal.renderDisplayLists[1] );
 | 
			
		||||
                        GlStateManager.clearCurrentColor();
 | 
			
		||||
 | 
			
		||||
                        // Draw cursor
 | 
			
		||||
                        fontRenderer.bindFont();
 | 
			
		||||
                        if( redraw )
 | 
			
		||||
                        {
 | 
			
		||||
                            // Build cursor display list
 | 
			
		||||
                            GlStateManager.newList( originTerminal.renderDisplayLists[2], GL11.GL_COMPILE );
 | 
			
		||||
                            try
 | 
			
		||||
                            {
 | 
			
		||||
                                // Cursor
 | 
			
		||||
                                if( terminal.getCursorBlink() && cursorX >= 0 && cursorX < width && cursorY >= 0 && cursorY < height )
 | 
			
		||||
                                {
 | 
			
		||||
                                    TextBuffer cursor = new TextBuffer( "_" );
 | 
			
		||||
                                    TextBuffer cursorColour = new TextBuffer( "0123456789abcdef".charAt( terminal.getTextColour() ), 1 );
 | 
			
		||||
                                    fontRenderer.drawString(
 | 
			
		||||
                                        cursor,
 | 
			
		||||
                                        FixedWidthFontRenderer.FONT_WIDTH * cursorX,
 | 
			
		||||
                                        FixedWidthFontRenderer.FONT_HEIGHT * cursorY,
 | 
			
		||||
                                        cursorColour, null,
 | 
			
		||||
                                        0, 0,
 | 
			
		||||
                                        greyscale,
 | 
			
		||||
                                        palette
 | 
			
		||||
                                    );
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            finally
 | 
			
		||||
                            {
 | 
			
		||||
                                GlStateManager.endList();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        if( FrameInfo.getGlobalCursorBlink() )
 | 
			
		||||
                        {
 | 
			
		||||
                            GlStateManager.callList( originTerminal.renderDisplayLists[2] );
 | 
			
		||||
                            GlStateManager.clearCurrentColor();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    finally
 | 
			
		||||
                    {
 | 
			
		||||
                        GlStateManager.popMatrix();
 | 
			
		||||
                    }
 | 
			
		||||
            // Sneaky hack here: we get a buffer now in order to flush existing ones and set up the appropriate
 | 
			
		||||
            // render state. I've no clue how well this'll work in future versions of Minecraft, but it does the trick
 | 
			
		||||
            // for now.
 | 
			
		||||
            IVertexBuilder buffer = renderer.getBuffer( FixedWidthFontRenderer.TYPE );
 | 
			
		||||
            FixedWidthFontRenderer.TYPE.enable();
 | 
			
		||||
 | 
			
		||||
            vbo.bindBuffer();
 | 
			
		||||
            FixedWidthFontRenderer.TYPE.getVertexFormat().setupBufferState( 0L );
 | 
			
		||||
            vbo.draw( matrix, FixedWidthFontRenderer.TYPE.getGlMode() );
 | 
			
		||||
            VertexBuffer.unbindBuffer();
 | 
			
		||||
            FixedWidthFontRenderer.TYPE.getVertexFormat().clearBufferState();
 | 
			
		||||
 | 
			
		||||
            // We don't draw the cursor with the VBO, as it's dynamic and so we'll end up refreshing far more than is
 | 
			
		||||
            // reasonable.
 | 
			
		||||
            FixedWidthFontRenderer.drawCursor( matrix, buffer, 0, 0, terminal, !originTerminal.isColour() );
 | 
			
		||||
 | 
			
		||||
            transform.pop();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
                    // Draw a big black quad
 | 
			
		||||
                    mc.getTextureManager().bindTexture( FixedWidthFontRenderer.BACKGROUND );
 | 
			
		||||
                    final Colour colour = Colour.Black;
 | 
			
		||||
 | 
			
		||||
                    final float r = colour.getR();
 | 
			
		||||
                    final float g = colour.getG();
 | 
			
		||||
                    final float b = colour.getB();
 | 
			
		||||
 | 
			
		||||
                    renderer.begin( GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_TEX_COLOR );
 | 
			
		||||
                    renderer.pos( -TileMonitor.RENDER_MARGIN, TileMonitor.RENDER_MARGIN, 0.0D ).tex( 0.0, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
                    renderer.pos( -TileMonitor.RENDER_MARGIN, -ySize - TileMonitor.RENDER_MARGIN, 0.0 ).tex( 0.0, 1.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
                    renderer.pos( xSize + TileMonitor.RENDER_MARGIN, TileMonitor.RENDER_MARGIN, 0.0D ).tex( 1.0, 0.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
                    renderer.pos( xSize + TileMonitor.RENDER_MARGIN, -ySize - TileMonitor.RENDER_MARGIN, 0.0 ).tex( 1.0, 1.0 ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
                    tessellator.draw();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            finally
 | 
			
		||||
            {
 | 
			
		||||
                GlStateManager.depthMask( true );
 | 
			
		||||
                mc.gameRenderer.enableLightmap();
 | 
			
		||||
                GlStateManager.enableLighting();
 | 
			
		||||
            FixedWidthFontRenderer.drawEmptyTerminal(
 | 
			
		||||
                transform.getLast().getPositionMatrix(), renderer,
 | 
			
		||||
                -MARGIN, MARGIN,
 | 
			
		||||
                (float) (xSize + 2 * MARGIN), (float) -(ySize + MARGIN * 2)
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            // Draw the depth blocker
 | 
			
		||||
            GlStateManager.colorMask( false, false, false, false );
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                mc.getTextureManager().bindTexture( FixedWidthFontRenderer.BACKGROUND );
 | 
			
		||||
                renderer.begin( GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION );
 | 
			
		||||
                renderer.pos( -TileMonitor.RENDER_MARGIN, TileMonitor.RENDER_MARGIN, 0.0 ).endVertex();
 | 
			
		||||
                renderer.pos( -TileMonitor.RENDER_MARGIN, -ySize - TileMonitor.RENDER_MARGIN, 0.0 ).endVertex();
 | 
			
		||||
                renderer.pos( xSize + TileMonitor.RENDER_MARGIN, TileMonitor.RENDER_MARGIN, 0.0 ).endVertex();
 | 
			
		||||
                renderer.pos( xSize + TileMonitor.RENDER_MARGIN, -ySize - TileMonitor.RENDER_MARGIN, 0.0 ).endVertex();
 | 
			
		||||
                tessellator.draw();
 | 
			
		||||
            }
 | 
			
		||||
            finally
 | 
			
		||||
            {
 | 
			
		||||
                GlStateManager.colorMask( true, true, true, true );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            GlStateManager.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
            GlStateManager.popMatrix();
 | 
			
		||||
        }
 | 
			
		||||
        FixedWidthFontRenderer.drawBlocker(
 | 
			
		||||
            transform.getLast().getPositionMatrix(), renderer,
 | 
			
		||||
            (float) -TileMonitor.RENDER_MARGIN, (float) TileMonitor.RENDER_MARGIN,
 | 
			
		||||
            (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), (float) -(ySize + TileMonitor.RENDER_MARGIN * 2)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleSide;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
 | 
			
		||||
@@ -14,31 +15,26 @@ import dan200.computercraft.shared.turtle.blocks.TileTurtle;
 | 
			
		||||
import dan200.computercraft.shared.util.DirectionUtil;
 | 
			
		||||
import dan200.computercraft.shared.util.Holiday;
 | 
			
		||||
import dan200.computercraft.shared.util.HolidayUtil;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.GameRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.gui.FontRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.Atlases;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.Vector3f;
 | 
			
		||||
import net.minecraft.client.renderer.model.BakedQuad;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelManager;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.client.renderer.texture.AtlasTexture;
 | 
			
		||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexFormat;
 | 
			
		||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.RayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraftforge.client.ForgeHooksClient;
 | 
			
		||||
import net.minecraftforge.client.model.data.EmptyModelData;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.LightUtil;
 | 
			
		||||
import org.apache.commons.lang3.tuple.Pair;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import javax.vecmath.Matrix4f;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
 | 
			
		||||
@@ -49,10 +45,11 @@ public class TileEntityTurtleRenderer extends TileEntityRenderer<TileTurtle>
 | 
			
		||||
    private static final ModelResourceLocation COLOUR_TURTLE_MODEL = new ModelResourceLocation( "computercraft:turtle_colour", "inventory" );
 | 
			
		||||
    private static final ModelResourceLocation ELF_OVERLAY_MODEL = new ModelResourceLocation( "computercraft:turtle_elf_overlay", "inventory" );
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( TileTurtle tileEntity, double posX, double posY, double posZ, float partialTicks, int breaking )
 | 
			
		||||
    private final Random random = new Random( 0 );
 | 
			
		||||
 | 
			
		||||
    public TileEntityTurtleRenderer( TileEntityRendererDispatcher renderDispatcher )
 | 
			
		||||
    {
 | 
			
		||||
        if( tileEntity != null ) renderTurtleAt( tileEntity, posX, posY, posZ, partialTicks );
 | 
			
		||||
        super( renderDispatcher );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ModelResourceLocation getTurtleModel( ComputerFamily family, boolean coloured )
 | 
			
		||||
@@ -69,169 +66,126 @@ public class TileEntityTurtleRenderer extends TileEntityRenderer<TileTurtle>
 | 
			
		||||
 | 
			
		||||
    public static ModelResourceLocation getTurtleOverlayModel( ResourceLocation overlay, boolean christmas )
 | 
			
		||||
    {
 | 
			
		||||
        if( overlay != null )
 | 
			
		||||
        {
 | 
			
		||||
            return new ModelResourceLocation( overlay, "inventory" );
 | 
			
		||||
        }
 | 
			
		||||
        else if( christmas )
 | 
			
		||||
        {
 | 
			
		||||
            return ELF_OVERLAY_MODEL;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
        if( overlay != null ) return new ModelResourceLocation( overlay, "inventory" );
 | 
			
		||||
        if( christmas ) return ELF_OVERLAY_MODEL;
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void renderTurtleAt( TileTurtle turtle, double posX, double posY, double posZ, float partialTicks )
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( @Nonnull TileTurtle turtle, float partialTicks, @Nonnull MatrixStack transform, @Nonnull IRenderTypeBuffer renderer, int lightmapCoord, int overlayLight )
 | 
			
		||||
    {
 | 
			
		||||
        // Render the label
 | 
			
		||||
        String label = turtle.createProxy().getLabel();
 | 
			
		||||
        RayTraceResult hit = rendererDispatcher.cameraHitResult;
 | 
			
		||||
        RayTraceResult hit = renderDispatcher.cameraHitResult;
 | 
			
		||||
        if( label != null && hit.getType() == RayTraceResult.Type.BLOCK && turtle.getPos().equals( ((BlockRayTraceResult) hit).getPos() ) )
 | 
			
		||||
        {
 | 
			
		||||
            setLightmapDisabled( true );
 | 
			
		||||
            GameRenderer.drawNameplate(
 | 
			
		||||
                getFontRenderer(), label,
 | 
			
		||||
                (float) posX + 0.5F, (float) posY + 1.2F, (float) posZ + 0.5F, 0,
 | 
			
		||||
                rendererDispatcher.renderInfo.getYaw(), rendererDispatcher.renderInfo.getPitch(), false
 | 
			
		||||
            );
 | 
			
		||||
            setLightmapDisabled( false );
 | 
			
		||||
            Minecraft mc = Minecraft.getInstance();
 | 
			
		||||
            FontRenderer font = renderDispatcher.fontRenderer;
 | 
			
		||||
 | 
			
		||||
            transform.push();
 | 
			
		||||
            transform.translate( 0.5, 1.2, 0.5 );
 | 
			
		||||
            transform.rotate( mc.getRenderManager().getCameraOrientation() );
 | 
			
		||||
            transform.scale( -0.025f, -0.025f, 0.025f );
 | 
			
		||||
 | 
			
		||||
            Matrix4f matrix = transform.getLast().getPositionMatrix();
 | 
			
		||||
            int opacity = (int) (mc.gameSettings.getTextBackgroundOpacity( 0.25f ) * 255) << 24;
 | 
			
		||||
            float width = -font.getStringWidth( label ) / 2.0f;
 | 
			
		||||
            font.renderString( label, width, (float) 0, 0x20ffffff, false, matrix, renderer, true, opacity, lightmapCoord );
 | 
			
		||||
            font.renderString( label, width, (float) 0, 0xffffffff, false, matrix, renderer, false, 0, lightmapCoord );
 | 
			
		||||
 | 
			
		||||
            transform.pop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            BlockState state = turtle.getBlockState();
 | 
			
		||||
            // Setup the transform
 | 
			
		||||
        transform.push();
 | 
			
		||||
 | 
			
		||||
        // Setup the transform.
 | 
			
		||||
        Vec3d offset = turtle.getRenderOffset( partialTicks );
 | 
			
		||||
        float yaw = turtle.getRenderYaw( partialTicks );
 | 
			
		||||
            GlStateManager.translated( posX + offset.x, posY + offset.y, posZ + offset.z );
 | 
			
		||||
            // Render the turtle
 | 
			
		||||
            GlStateManager.translatef( 0.5f, 0.5f, 0.5f );
 | 
			
		||||
            GlStateManager.rotatef( 180.0f - yaw, 0.0f, 1.0f, 0.0f );
 | 
			
		||||
        transform.translate( offset.x, offset.y, offset.z );
 | 
			
		||||
 | 
			
		||||
        transform.translate( 0.5f, 0.5f, 0.5f );
 | 
			
		||||
        transform.rotate( Vector3f.YP.rotationDegrees( 180.0f - yaw ) );
 | 
			
		||||
        if( label != null && (label.equals( "Dinnerbone" ) || label.equals( "Grumm" )) )
 | 
			
		||||
        {
 | 
			
		||||
                // Flip the model and swap the cull face as winding order will have changed.
 | 
			
		||||
                GlStateManager.scalef( 1.0f, -1.0f, 1.0f );
 | 
			
		||||
                GlStateManager.cullFace( GlStateManager.CullFace.FRONT );
 | 
			
		||||
            // Flip the model
 | 
			
		||||
            transform.scale( 1.0f, -1.0f, 1.0f );
 | 
			
		||||
        }
 | 
			
		||||
            GlStateManager.translatef( -0.5f, -0.5f, -0.5f );
 | 
			
		||||
        transform.translate( -0.5f, -0.5f, -0.5f );
 | 
			
		||||
 | 
			
		||||
        // Render the turtle
 | 
			
		||||
        int colour = turtle.getColour();
 | 
			
		||||
        ComputerFamily family = turtle.getFamily();
 | 
			
		||||
        ResourceLocation overlay = turtle.getOverlay();
 | 
			
		||||
 | 
			
		||||
            renderModel( state, getTurtleModel( family, colour != -1 ), colour == -1 ? null : new int[] { colour } );
 | 
			
		||||
        IVertexBuilder buffer = renderer.getBuffer( Atlases.getTranslucentCullBlockType() );
 | 
			
		||||
        renderModel( transform, buffer, lightmapCoord, overlayLight, getTurtleModel( family, colour != -1 ), colour == -1 ? null : new int[] { colour } );
 | 
			
		||||
 | 
			
		||||
        // Render the overlay
 | 
			
		||||
            ModelResourceLocation overlayModel = getTurtleOverlayModel(
 | 
			
		||||
                overlay,
 | 
			
		||||
                HolidayUtil.getCurrentHoliday() == Holiday.Christmas
 | 
			
		||||
            );
 | 
			
		||||
        ModelResourceLocation overlayModel = getTurtleOverlayModel( overlay, HolidayUtil.getCurrentHoliday() == Holiday.Christmas );
 | 
			
		||||
        if( overlayModel != null )
 | 
			
		||||
        {
 | 
			
		||||
                GlStateManager.disableCull();
 | 
			
		||||
                GlStateManager.enableBlend();
 | 
			
		||||
                GlStateManager.blendFunc( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA );
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    renderModel( state, overlayModel, null );
 | 
			
		||||
                }
 | 
			
		||||
                finally
 | 
			
		||||
                {
 | 
			
		||||
                    GlStateManager.disableBlend();
 | 
			
		||||
                    GlStateManager.enableCull();
 | 
			
		||||
                }
 | 
			
		||||
            renderModel( transform, buffer, lightmapCoord, overlayLight, overlayModel, null );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Render the upgrades
 | 
			
		||||
            renderUpgrade( state, turtle, TurtleSide.Left, partialTicks );
 | 
			
		||||
            renderUpgrade( state, turtle, TurtleSide.Right, partialTicks );
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            GlStateManager.popMatrix();
 | 
			
		||||
            GlStateManager.cullFace( GlStateManager.CullFace.BACK );
 | 
			
		||||
        }
 | 
			
		||||
        renderUpgrade( transform, buffer, lightmapCoord, overlayLight, turtle, TurtleSide.Left, partialTicks );
 | 
			
		||||
        renderUpgrade( transform, buffer, lightmapCoord, overlayLight, turtle, TurtleSide.Right, partialTicks );
 | 
			
		||||
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void renderUpgrade( BlockState state, TileTurtle turtle, TurtleSide side, float f )
 | 
			
		||||
    private void renderUpgrade( @Nonnull MatrixStack transform, @Nonnull IVertexBuilder renderer, int lightmapCoord, int overlayLight, TileTurtle turtle, TurtleSide side, float f )
 | 
			
		||||
    {
 | 
			
		||||
        ITurtleUpgrade upgrade = turtle.getUpgrade( side );
 | 
			
		||||
        if( upgrade != null )
 | 
			
		||||
        {
 | 
			
		||||
            GlStateManager.pushMatrix();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
        if( upgrade == null ) return;
 | 
			
		||||
        transform.push();
 | 
			
		||||
 | 
			
		||||
        float toolAngle = turtle.getToolRenderAngle( side, f );
 | 
			
		||||
                GlStateManager.translatef( 0.0f, 0.5f, 0.5f );
 | 
			
		||||
                GlStateManager.rotatef( -toolAngle, 1.0f, 0.0f, 0.0f );
 | 
			
		||||
                GlStateManager.translatef( 0.0f, -0.5f, -0.5f );
 | 
			
		||||
        transform.translate( 0.0f, 0.5f, 0.5f );
 | 
			
		||||
        transform.rotate( Vector3f.XN.rotationDegrees( toolAngle ) );
 | 
			
		||||
        transform.translate( 0.0f, -0.5f, -0.5f );
 | 
			
		||||
 | 
			
		||||
                Pair<IBakedModel, Matrix4f> pair = upgrade.getModel( turtle.getAccess(), side );
 | 
			
		||||
                if( pair != null )
 | 
			
		||||
                {
 | 
			
		||||
                    if( pair.getRight() != null )
 | 
			
		||||
                    {
 | 
			
		||||
                        ForgeHooksClient.multiplyCurrentGlMatrix( pair.getRight() );
 | 
			
		||||
                    }
 | 
			
		||||
                    if( pair.getLeft() != null )
 | 
			
		||||
                    {
 | 
			
		||||
                        renderModel( state, pair.getLeft(), null );
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            finally
 | 
			
		||||
            {
 | 
			
		||||
                GlStateManager.popMatrix();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        TransformedModel model = upgrade.getModel( turtle.getAccess(), side );
 | 
			
		||||
        model.getMatrix().push( transform );
 | 
			
		||||
        renderModel( transform, renderer, lightmapCoord, overlayLight, model.getModel(), null );
 | 
			
		||||
        transform.pop();
 | 
			
		||||
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void renderModel( BlockState state, ModelResourceLocation modelLocation, int[] tints )
 | 
			
		||||
    private void renderModel( @Nonnull MatrixStack transform, @Nonnull IVertexBuilder renderer, int lightmapCoord, int overlayLight, ModelResourceLocation modelLocation, int[] tints )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft mc = Minecraft.getInstance();
 | 
			
		||||
        ModelManager modelManager = mc.getItemRenderer().getItemModelMesher().getModelManager();
 | 
			
		||||
        renderModel( state, modelManager.getModel( modelLocation ), tints );
 | 
			
		||||
        ModelManager modelManager = Minecraft.getInstance().getItemRenderer().getItemModelMesher().getModelManager();
 | 
			
		||||
        renderModel( transform, renderer, lightmapCoord, overlayLight, modelManager.getModel( modelLocation ), tints );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void renderModel( BlockState state, IBakedModel model, int[] tints )
 | 
			
		||||
    private void renderModel( @Nonnull MatrixStack transform, @Nonnull IVertexBuilder renderer, int lightmapCoord, int overlayLight, IBakedModel model, int[] tints )
 | 
			
		||||
    {
 | 
			
		||||
        Random random = new Random( 0 );
 | 
			
		||||
        Tessellator tessellator = Tessellator.getInstance();
 | 
			
		||||
        rendererDispatcher.textureManager.bindTexture( AtlasTexture.LOCATION_BLOCKS_TEXTURE );
 | 
			
		||||
        renderQuads( tessellator, model.getQuads( state, null, random, EmptyModelData.INSTANCE ), tints );
 | 
			
		||||
        random.setSeed( 0 );
 | 
			
		||||
        renderQuads( transform, renderer, lightmapCoord, overlayLight, model.getQuads( null, null, random, EmptyModelData.INSTANCE ), tints );
 | 
			
		||||
        for( Direction facing : DirectionUtil.FACINGS )
 | 
			
		||||
        {
 | 
			
		||||
            renderQuads( tessellator, model.getQuads( state, facing, random, EmptyModelData.INSTANCE ), tints );
 | 
			
		||||
            renderQuads( transform, renderer, lightmapCoord, overlayLight, model.getQuads( null, facing, random, EmptyModelData.INSTANCE ), tints );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void renderQuads( Tessellator tessellator, List<BakedQuad> quads, int[] tints )
 | 
			
		||||
    private static void renderQuads( @Nonnull MatrixStack transform, @Nonnull IVertexBuilder buffer, int lightmapCoord, int overlayLight, List<BakedQuad> quads, int[] tints )
 | 
			
		||||
    {
 | 
			
		||||
        BufferBuilder buffer = tessellator.getBuffer();
 | 
			
		||||
        VertexFormat format = DefaultVertexFormats.ITEM;
 | 
			
		||||
        buffer.begin( GL11.GL_QUADS, format );
 | 
			
		||||
        for( BakedQuad quad : quads )
 | 
			
		||||
        MatrixStack.Entry matrix = transform.getLast();
 | 
			
		||||
 | 
			
		||||
        for( BakedQuad bakedquad : quads )
 | 
			
		||||
        {
 | 
			
		||||
            VertexFormat quadFormat = quad.getFormat();
 | 
			
		||||
            if( quadFormat != format )
 | 
			
		||||
            int tint = -1;
 | 
			
		||||
            if( tints != null && bakedquad.hasTintIndex() )
 | 
			
		||||
            {
 | 
			
		||||
                tessellator.draw();
 | 
			
		||||
                format = quadFormat;
 | 
			
		||||
                buffer.begin( GL11.GL_QUADS, format );
 | 
			
		||||
                int idx = bakedquad.getTintIndex();
 | 
			
		||||
                if( idx >= 0 && idx < tints.length ) tint = tints[bakedquad.getTintIndex()];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int colour = 0xFFFFFFFF;
 | 
			
		||||
            if( quad.hasTintIndex() && tints != null )
 | 
			
		||||
            {
 | 
			
		||||
                int index = quad.getTintIndex();
 | 
			
		||||
                if( index >= 0 && index < tints.length ) colour = tints[index] | 0xFF000000;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            LightUtil.renderQuadColor( buffer, quad, colour );
 | 
			
		||||
        }
 | 
			
		||||
        tessellator.draw();
 | 
			
		||||
            float f = (float) (tint >> 16 & 255) / 255.0F;
 | 
			
		||||
            float f1 = (float) (tint >> 8 & 255) / 255.0F;
 | 
			
		||||
            float f2 = (float) (tint & 255) / 255.0F;
 | 
			
		||||
            buffer.addVertexData( matrix, bakedquad, f, f1, f2, lightmapCoord, overlayLight, true );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,31 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.google.gson.JsonDeserializationContext;
 | 
			
		||||
import com.google.gson.JsonObject;
 | 
			
		||||
import com.mojang.datafixers.util.Pair;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.IUnbakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelBakery;
 | 
			
		||||
import net.minecraft.client.renderer.texture.ISprite;
 | 
			
		||||
import net.minecraft.client.renderer.model.*;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexFormat;
 | 
			
		||||
import net.minecraft.resources.IResourceManager;
 | 
			
		||||
import net.minecraft.util.JSONUtils;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.client.model.ICustomModelLoader;
 | 
			
		||||
import net.minecraftforge.client.model.IModelConfiguration;
 | 
			
		||||
import net.minecraftforge.client.model.IModelLoader;
 | 
			
		||||
import net.minecraftforge.client.model.geometry.IModelGeometry;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
public final class TurtleModelLoader implements ICustomModelLoader
 | 
			
		||||
public final class TurtleModelLoader implements IModelLoader<TurtleModelLoader.TurtleModel>
 | 
			
		||||
{
 | 
			
		||||
    private static final ResourceLocation NORMAL_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle_normal" );
 | 
			
		||||
    private static final ResourceLocation ADVANCED_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle_advanced" );
 | 
			
		||||
    private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle_colour" );
 | 
			
		||||
 | 
			
		||||
    public static final TurtleModelLoader INSTANCE = new TurtleModelLoader();
 | 
			
		||||
@@ -41,32 +39,15 @@ public final class TurtleModelLoader implements ICustomModelLoader
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean accepts( @Nonnull ResourceLocation name )
 | 
			
		||||
    {
 | 
			
		||||
        return name.getNamespace().equals( ComputerCraft.MOD_ID )
 | 
			
		||||
            && (name.getPath().equals( "item/turtle_normal" ) || name.getPath().equals( "item/turtle_advanced" ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public IUnbakedModel loadModel( @Nonnull ResourceLocation name )
 | 
			
		||||
    public TurtleModel read( @Nonnull JsonDeserializationContext deserializationContext, @Nonnull JsonObject modelContents )
 | 
			
		||||
    {
 | 
			
		||||
        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 );
 | 
			
		||||
            }
 | 
			
		||||
        ResourceLocation model = new ResourceLocation( JSONUtils.getString( modelContents, "model" ) );
 | 
			
		||||
        return new TurtleModel( model );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        throw new IllegalStateException( "Loader does not accept " + name );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static final class TurtleModel implements IUnbakedModel
 | 
			
		||||
    public static final class TurtleModel implements IModelGeometry<TurtleModel>
 | 
			
		||||
    {
 | 
			
		||||
        private final ResourceLocation family;
 | 
			
		||||
 | 
			
		||||
@@ -75,29 +56,21 @@ public final class TurtleModelLoader implements ICustomModelLoader
 | 
			
		||||
            this.family = family;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Collection<ResourceLocation> getDependencies()
 | 
			
		||||
        public Collection<Material> getTextures( IModelConfiguration owner, Function<ResourceLocation, IUnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors )
 | 
			
		||||
        {
 | 
			
		||||
            return Arrays.asList( family, COLOUR_TURTLE_MODEL );
 | 
			
		||||
            Set<Material> materials = new HashSet<>();
 | 
			
		||||
            materials.addAll( modelGetter.apply( family ).getTextures( modelGetter, missingTextureErrors ) );
 | 
			
		||||
            materials.addAll( modelGetter.apply( COLOUR_TURTLE_MODEL ).getTextures( modelGetter, missingTextureErrors ) );
 | 
			
		||||
            return materials;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Collection<ResourceLocation> getTextures( @Nonnull Function<ResourceLocation, IUnbakedModel> modelGetter, @Nonnull Set<String> missingTextureErrors )
 | 
			
		||||
        {
 | 
			
		||||
            return getDependencies().stream()
 | 
			
		||||
                .flatMap( x -> modelGetter.apply( x ).getTextures( modelGetter, missingTextureErrors ).stream() )
 | 
			
		||||
                .collect( Collectors.toSet() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public IBakedModel bake( @Nonnull ModelBakery bakery, @Nonnull Function<ResourceLocation, TextureAtlasSprite> spriteGetter, @Nonnull ISprite sprite, @Nonnull VertexFormat format )
 | 
			
		||||
        public IBakedModel bake( IModelConfiguration owner, ModelBakery bakery, Function<Material, TextureAtlasSprite> spriteGetter, IModelTransform transform, ItemOverrideList overrides, ResourceLocation modelLocation )
 | 
			
		||||
        {
 | 
			
		||||
            return new TurtleSmartItemModel(
 | 
			
		||||
                bakery.getBakedModel( family, sprite, spriteGetter, format ),
 | 
			
		||||
                bakery.getBakedModel( COLOUR_TURTLE_MODEL, sprite, spriteGetter, format )
 | 
			
		||||
                bakery.getBakedModel( family, transform, spriteGetter ),
 | 
			
		||||
                bakery.getBakedModel( COLOUR_TURTLE_MODEL, transform, spriteGetter )
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.client.renderer.model.BakedQuad;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ItemOverrideList;
 | 
			
		||||
@@ -14,32 +15,29 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraftforge.client.model.data.EmptyModelData;
 | 
			
		||||
import net.minecraftforge.client.model.data.IModelData;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.vecmath.Matrix4f;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
public class TurtleMultiModel implements IBakedModel
 | 
			
		||||
{
 | 
			
		||||
    private final IBakedModel m_baseModel;
 | 
			
		||||
    private final IBakedModel m_overlayModel;
 | 
			
		||||
    private final Matrix4f m_generalTransform;
 | 
			
		||||
    private final IBakedModel m_leftUpgradeModel;
 | 
			
		||||
    private final Matrix4f m_leftUpgradeTransform;
 | 
			
		||||
    private final IBakedModel m_rightUpgradeModel;
 | 
			
		||||
    private final Matrix4f m_rightUpgradeTransform;
 | 
			
		||||
    private final TransformationMatrix m_generalTransform;
 | 
			
		||||
    private final TransformedModel m_leftUpgradeModel;
 | 
			
		||||
    private final TransformedModel m_rightUpgradeModel;
 | 
			
		||||
    private List<BakedQuad> m_generalQuads = null;
 | 
			
		||||
    private Map<Direction, List<BakedQuad>> m_faceQuads = new EnumMap<>( Direction.class );
 | 
			
		||||
 | 
			
		||||
    public TurtleMultiModel( IBakedModel baseModel, IBakedModel overlayModel, Matrix4f generalTransform, IBakedModel leftUpgradeModel, Matrix4f leftUpgradeTransform, IBakedModel rightUpgradeModel, Matrix4f rightUpgradeTransform )
 | 
			
		||||
    public TurtleMultiModel( IBakedModel baseModel, IBakedModel overlayModel, TransformationMatrix generalTransform, TransformedModel leftUpgradeModel, TransformedModel rightUpgradeModel )
 | 
			
		||||
    {
 | 
			
		||||
        // Get the models
 | 
			
		||||
        m_baseModel = baseModel;
 | 
			
		||||
        m_overlayModel = overlayModel;
 | 
			
		||||
        m_leftUpgradeModel = leftUpgradeModel;
 | 
			
		||||
        m_leftUpgradeTransform = leftUpgradeTransform;
 | 
			
		||||
        m_rightUpgradeModel = rightUpgradeModel;
 | 
			
		||||
        m_rightUpgradeTransform = rightUpgradeTransform;
 | 
			
		||||
        m_generalTransform = generalTransform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -70,30 +68,22 @@ public class TurtleMultiModel implements IBakedModel
 | 
			
		||||
    private List<BakedQuad> buildQuads( BlockState state, Direction side, Random rand )
 | 
			
		||||
    {
 | 
			
		||||
        ArrayList<BakedQuad> quads = new ArrayList<>();
 | 
			
		||||
        ModelTransformer.transformQuadsTo( quads, m_baseModel.getQuads( state, side, rand, EmptyModelData.INSTANCE ), m_generalTransform );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        transformQuadsTo( quads, m_baseModel.getQuads( state, side, rand, EmptyModelData.INSTANCE ), m_generalTransform );
 | 
			
		||||
        if( m_overlayModel != null )
 | 
			
		||||
        {
 | 
			
		||||
            ModelTransformer.transformQuadsTo( quads, m_overlayModel.getQuads( state, side, rand, EmptyModelData.INSTANCE ), m_generalTransform );
 | 
			
		||||
            transformQuadsTo( quads, m_overlayModel.getQuads( state, side, rand, EmptyModelData.INSTANCE ), m_generalTransform );
 | 
			
		||||
        }
 | 
			
		||||
        if( m_leftUpgradeModel != null )
 | 
			
		||||
        {
 | 
			
		||||
            Matrix4f upgradeTransform = m_generalTransform;
 | 
			
		||||
            if( m_leftUpgradeTransform != null )
 | 
			
		||||
            {
 | 
			
		||||
                upgradeTransform = new Matrix4f( m_generalTransform );
 | 
			
		||||
                upgradeTransform.mul( m_leftUpgradeTransform );
 | 
			
		||||
            }
 | 
			
		||||
            ModelTransformer.transformQuadsTo( quads, m_leftUpgradeModel.getQuads( state, side, rand, EmptyModelData.INSTANCE ), upgradeTransform );
 | 
			
		||||
            TransformationMatrix upgradeTransform = m_generalTransform.compose( m_leftUpgradeModel.getMatrix() );
 | 
			
		||||
            transformQuadsTo( quads, m_leftUpgradeModel.getModel().getQuads( state, side, rand, EmptyModelData.INSTANCE ), upgradeTransform );
 | 
			
		||||
        }
 | 
			
		||||
        if( m_rightUpgradeModel != null )
 | 
			
		||||
        {
 | 
			
		||||
            Matrix4f upgradeTransform = m_generalTransform;
 | 
			
		||||
            if( m_rightUpgradeTransform != null )
 | 
			
		||||
            {
 | 
			
		||||
                upgradeTransform = new Matrix4f( m_generalTransform );
 | 
			
		||||
                upgradeTransform.mul( m_rightUpgradeTransform );
 | 
			
		||||
            }
 | 
			
		||||
            ModelTransformer.transformQuadsTo( quads, m_rightUpgradeModel.getQuads( state, side, rand, EmptyModelData.INSTANCE ), upgradeTransform );
 | 
			
		||||
            TransformationMatrix upgradeTransform = m_generalTransform.compose( m_rightUpgradeModel.getMatrix() );
 | 
			
		||||
            transformQuadsTo( quads, m_rightUpgradeModel.getModel().getQuads( state, side, rand, EmptyModelData.INSTANCE ), upgradeTransform );
 | 
			
		||||
        }
 | 
			
		||||
        quads.trimToSize();
 | 
			
		||||
        return quads;
 | 
			
		||||
@@ -117,6 +107,12 @@ public class TurtleMultiModel implements IBakedModel
 | 
			
		||||
        return m_baseModel.isBuiltInRenderer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean func_230044_c_()
 | 
			
		||||
    {
 | 
			
		||||
        return m_baseModel.func_230044_c_();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
@@ -139,4 +135,15 @@ public class TurtleMultiModel implements IBakedModel
 | 
			
		||||
    {
 | 
			
		||||
        return ItemOverrideList.EMPTY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void transformQuadsTo( List<BakedQuad> output, List<BakedQuad> quads, TransformationMatrix transform )
 | 
			
		||||
    {
 | 
			
		||||
        for( BakedQuad quad : quads )
 | 
			
		||||
        {
 | 
			
		||||
            BakedQuadBuilder builder = new BakedQuadBuilder();
 | 
			
		||||
            TRSRTransformer transformer = new TRSRTransformer( builder, transform );
 | 
			
		||||
            quad.pipe( transformer );
 | 
			
		||||
            output.add( builder.build() );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.google.common.base.Objects;
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleSide;
 | 
			
		||||
import dan200.computercraft.shared.turtle.items.ItemTurtle;
 | 
			
		||||
@@ -14,6 +15,7 @@ import dan200.computercraft.shared.util.Holiday;
 | 
			
		||||
import dan200.computercraft.shared.util.HolidayUtil;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.client.renderer.model.*;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | 
			
		||||
import net.minecraft.entity.LivingEntity;
 | 
			
		||||
@@ -22,28 +24,25 @@ import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.client.model.data.IModelData;
 | 
			
		||||
import org.apache.commons.lang3.tuple.Pair;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import javax.vecmath.Matrix4f;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
 | 
			
		||||
public class TurtleSmartItemModel implements IBakedModel
 | 
			
		||||
{
 | 
			
		||||
    private static final Matrix4f s_identity, s_flip;
 | 
			
		||||
    private static final TransformationMatrix identity, flip;
 | 
			
		||||
 | 
			
		||||
    static
 | 
			
		||||
    {
 | 
			
		||||
        s_identity = new Matrix4f();
 | 
			
		||||
        s_identity.setIdentity();
 | 
			
		||||
        MatrixStack stack = new MatrixStack();
 | 
			
		||||
        stack.scale( 0, -1, 0 );
 | 
			
		||||
        stack.translate( 0, 0, 1 );
 | 
			
		||||
 | 
			
		||||
        s_flip = new Matrix4f();
 | 
			
		||||
        s_flip.setIdentity();
 | 
			
		||||
        s_flip.m11 = -1; // Flip on the y axis
 | 
			
		||||
        s_flip.m13 = 1; // Models go from (0,0,0) to (1,1,1), so push back up.
 | 
			
		||||
        identity = TransformationMatrix.identity();
 | 
			
		||||
        flip = new TransformationMatrix( stack.getLast().getPositionMatrix() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class TurtleModelCombination
 | 
			
		||||
@@ -145,25 +144,10 @@ public class TurtleSmartItemModel implements IBakedModel
 | 
			
		||||
 | 
			
		||||
        IBakedModel baseModel = combo.m_colour ? colourModel : familyModel;
 | 
			
		||||
        IBakedModel overlayModel = overlayModelLocation != null ? modelManager.getModel( overlayModelLocation ) : null;
 | 
			
		||||
        Matrix4f transform = combo.m_flip ? s_flip : s_identity;
 | 
			
		||||
        Pair<IBakedModel, Matrix4f> leftModel = combo.m_leftUpgrade != null ? combo.m_leftUpgrade.getModel( null, TurtleSide.Left ) : null;
 | 
			
		||||
        Pair<IBakedModel, Matrix4f> rightModel = combo.m_rightUpgrade != null ? combo.m_rightUpgrade.getModel( null, TurtleSide.Right ) : null;
 | 
			
		||||
        if( leftModel != null && rightModel != null )
 | 
			
		||||
        {
 | 
			
		||||
            return new TurtleMultiModel( baseModel, overlayModel, transform, leftModel.getLeft(), leftModel.getRight(), rightModel.getLeft(), rightModel.getRight() );
 | 
			
		||||
        }
 | 
			
		||||
        else if( leftModel != null )
 | 
			
		||||
        {
 | 
			
		||||
            return new TurtleMultiModel( baseModel, overlayModel, transform, leftModel.getLeft(), leftModel.getRight(), null, null );
 | 
			
		||||
        }
 | 
			
		||||
        else if( rightModel != null )
 | 
			
		||||
        {
 | 
			
		||||
            return new TurtleMultiModel( baseModel, overlayModel, transform, null, null, rightModel.getLeft(), rightModel.getRight() );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return new TurtleMultiModel( baseModel, overlayModel, transform, null, null, null, null );
 | 
			
		||||
        }
 | 
			
		||||
        TransformationMatrix transform = combo.m_flip ? flip : identity;
 | 
			
		||||
        TransformedModel leftModel = combo.m_leftUpgrade != null ? combo.m_leftUpgrade.getModel( null, TurtleSide.Left ) : null;
 | 
			
		||||
        TransformedModel rightModel = combo.m_rightUpgrade != null ? combo.m_rightUpgrade.getModel( null, TurtleSide.Right ) : null;
 | 
			
		||||
        return new TurtleMultiModel( baseModel, overlayModel, transform, leftModel, rightModel );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
@@ -200,6 +184,12 @@ public class TurtleSmartItemModel implements IBakedModel
 | 
			
		||||
        return familyModel.isBuiltInRenderer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean func_230044_c_()
 | 
			
		||||
    {
 | 
			
		||||
        return familyModel.func_230044_c_();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.BlockCable;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.CableShapes;
 | 
			
		||||
@@ -22,7 +22,7 @@ import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.shapes.VoxelShape;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
 | 
			
		||||
import net.minecraftforge.client.event.DrawHighlightEvent;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
@@ -41,11 +41,9 @@ public final class CableHighlightRenderer
 | 
			
		||||
     * @see WorldRenderer#drawSelectionBox(ActiveRenderInfo, RayTraceResult, int)
 | 
			
		||||
     */
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
    public static void drawHighlight( DrawBlockHighlightEvent event )
 | 
			
		||||
    public static void drawHighlight( DrawHighlightEvent.HighlightBlock event )
 | 
			
		||||
    {
 | 
			
		||||
        if( event.getTarget().getType() != RayTraceResult.Type.BLOCK ) return;
 | 
			
		||||
 | 
			
		||||
        BlockRayTraceResult hit = (BlockRayTraceResult) event.getTarget();
 | 
			
		||||
        BlockRayTraceResult hit = event.getTarget();
 | 
			
		||||
        BlockPos pos = hit.getPos();
 | 
			
		||||
        World world = event.getInfo().getRenderViewEntity().getEntityWorld();
 | 
			
		||||
        ActiveRenderInfo info = event.getInfo();
 | 
			
		||||
@@ -62,14 +60,14 @@ public final class CableHighlightRenderer
 | 
			
		||||
 | 
			
		||||
        Minecraft mc = Minecraft.getInstance();
 | 
			
		||||
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.blendFuncSeparate( GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO );
 | 
			
		||||
        GlStateManager.lineWidth( Math.max( 2.5F, mc.mainWindow.getFramebufferWidth() / 1920.0F * 2.5F ) );
 | 
			
		||||
        GlStateManager.disableTexture();
 | 
			
		||||
        GlStateManager.depthMask( false );
 | 
			
		||||
        GlStateManager.matrixMode( GL11.GL_PROJECTION );
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        GlStateManager.scalef( 1.0F, 1.0F, 0.999F );
 | 
			
		||||
        RenderSystem.enableBlend();
 | 
			
		||||
        RenderSystem.blendFuncSeparate( GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO );
 | 
			
		||||
        RenderSystem.lineWidth( Math.max( 2.5F, mc.getMainWindow().getFramebufferWidth() / 1920.0F * 2.5F ) );
 | 
			
		||||
        RenderSystem.disableTexture();
 | 
			
		||||
        RenderSystem.depthMask( false );
 | 
			
		||||
        RenderSystem.matrixMode( GL11.GL_PROJECTION );
 | 
			
		||||
        RenderSystem.pushMatrix();
 | 
			
		||||
        RenderSystem.scalef( 1.0F, 1.0F, 0.999F );
 | 
			
		||||
 | 
			
		||||
        VoxelShape shape = WorldUtil.isVecInside( CableShapes.getModemShape( state ), hit.getHitVec().subtract( pos.getX(), pos.getY(), pos.getZ() ) )
 | 
			
		||||
            ? CableShapes.getModemShape( state )
 | 
			
		||||
@@ -81,10 +79,10 @@ public final class CableHighlightRenderer
 | 
			
		||||
            0.0F, 0.0F, 0.0F, 0.4F
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.popMatrix();
 | 
			
		||||
        GlStateManager.matrixMode( GL11.GL_MODELVIEW );
 | 
			
		||||
        GlStateManager.depthMask( true );
 | 
			
		||||
        GlStateManager.enableTexture();
 | 
			
		||||
        GlStateManager.disableBlend();
 | 
			
		||||
        RenderSystem.popMatrix();
 | 
			
		||||
        RenderSystem.matrixMode( GL11.GL_MODELVIEW );
 | 
			
		||||
        RenderSystem.depthMask( true );
 | 
			
		||||
        RenderSystem.enableTexture();
 | 
			
		||||
        RenderSystem.disableBlend();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,133 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
 | 
			
		||||
import net.minecraft.client.renderer.FirstPersonRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Vector3f;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.HandSide;
 | 
			
		||||
import net.minecraft.util.math.MathHelper;
 | 
			
		||||
 | 
			
		||||
public abstract class ItemMapLikeRenderer
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The main rendering method for the item.
 | 
			
		||||
     *
 | 
			
		||||
     * @param transform The matrix transformation stack
 | 
			
		||||
     * @param render    The buffer to render to
 | 
			
		||||
     * @param stack     The stack to render
 | 
			
		||||
     * @see FirstPersonRenderer#renderItemInFirstPerson(AbstractClientPlayerEntity, float, float, Hand, float, ItemStack, float, MatrixStack, IRenderTypeBuffer, int)
 | 
			
		||||
     */
 | 
			
		||||
    protected abstract void renderItem( MatrixStack transform, IRenderTypeBuffer render, ItemStack stack );
 | 
			
		||||
 | 
			
		||||
    protected void renderItemFirstPerson( MatrixStack transform, IRenderTypeBuffer render, int lightTexture, Hand hand, float pitch, float equipProgress, float swingProgress, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        PlayerEntity player = Minecraft.getInstance().player;
 | 
			
		||||
 | 
			
		||||
        transform.push();
 | 
			
		||||
        if( hand == Hand.MAIN_HAND && player.getHeldItemOffhand().isEmpty() )
 | 
			
		||||
        {
 | 
			
		||||
            renderItemFirstPersonCenter( transform, render, lightTexture, pitch, equipProgress, swingProgress, stack );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            renderItemFirstPersonSide(
 | 
			
		||||
                transform, render, lightTexture,
 | 
			
		||||
                hand == Hand.MAIN_HAND ? player.getPrimaryHand() : player.getPrimaryHand().opposite(),
 | 
			
		||||
                equipProgress, swingProgress, stack
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Renders the item to one side of the player.
 | 
			
		||||
     *
 | 
			
		||||
     * @param side          The side to render on
 | 
			
		||||
     * @param equipProgress The equip progress of this item
 | 
			
		||||
     * @param swingProgress The swing progress of this item
 | 
			
		||||
     * @param stack         The stack to render
 | 
			
		||||
     * @see FirstPersonRenderer#renderMapFirstPersonSide(MatrixStack, IRenderTypeBuffer, int, float, HandSide, float, ItemStack)
 | 
			
		||||
     */
 | 
			
		||||
    private void renderItemFirstPersonSide( MatrixStack transform, IRenderTypeBuffer render, int lightTexture, HandSide side, float equipProgress, float swingProgress, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft minecraft = Minecraft.getInstance();
 | 
			
		||||
        float offset = side == HandSide.RIGHT ? 1f : -1f;
 | 
			
		||||
        transform.translate( offset * 0.125f, -0.125f, 0f );
 | 
			
		||||
 | 
			
		||||
        // If the player is not invisible then render a single arm
 | 
			
		||||
        if( !minecraft.player.isInvisible() )
 | 
			
		||||
        {
 | 
			
		||||
            transform.push();
 | 
			
		||||
            transform.rotate( Vector3f.field_229183_f_.func_229187_a_( offset * 10f ) );
 | 
			
		||||
            minecraft.getFirstPersonRenderer().renderArmFirstPerson( transform, render, lightTexture, equipProgress, swingProgress, side );
 | 
			
		||||
            transform.pop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Setup the appropriate transformations. This is just copied from the
 | 
			
		||||
        // corresponding method in ItemRenderer.
 | 
			
		||||
        transform.push();
 | 
			
		||||
        transform.translate( offset * 0.51f, -0.08f + equipProgress * -1.2f, -0.75f );
 | 
			
		||||
        float f1 = MathHelper.sqrt( swingProgress );
 | 
			
		||||
        float f2 = MathHelper.sin( f1 * (float) Math.PI );
 | 
			
		||||
        float f3 = -0.5f * f2;
 | 
			
		||||
        float f4 = 0.4f * MathHelper.sin( f1 * ((float) Math.PI * 2f) );
 | 
			
		||||
        float f5 = -0.3f * MathHelper.sin( swingProgress * (float) Math.PI );
 | 
			
		||||
        transform.translate( offset * f3, f4 - 0.3f * f2, f5 );
 | 
			
		||||
        transform.rotate( Vector3f.field_229179_b_.func_229187_a_( f2 * -45f ) );
 | 
			
		||||
        transform.rotate( Vector3f.field_229181_d_.func_229187_a_( offset * f2 * -30f ) );
 | 
			
		||||
 | 
			
		||||
        renderItem( transform, render, stack );
 | 
			
		||||
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Render an item in the middle of the screen.
 | 
			
		||||
     *
 | 
			
		||||
     * @param pitch         The pitch of the player
 | 
			
		||||
     * @param equipProgress The equip progress of this item
 | 
			
		||||
     * @param swingProgress The swing progress of this item
 | 
			
		||||
     * @param stack         The stack to render
 | 
			
		||||
     * @see FirstPersonRenderer#renderMapFirstPerson(MatrixStack, IRenderTypeBuffer, int, float, float, float)
 | 
			
		||||
     */
 | 
			
		||||
    private void renderItemFirstPersonCenter( MatrixStack transform, IRenderTypeBuffer render, int lightTexture, float pitch, float equipProgress, float swingProgress, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft minecraft = Minecraft.getInstance();
 | 
			
		||||
        FirstPersonRenderer renderer = minecraft.getFirstPersonRenderer();
 | 
			
		||||
 | 
			
		||||
        // Setup the appropriate transformations. This is just copied from the
 | 
			
		||||
        // corresponding method in ItemRenderer.
 | 
			
		||||
        float swingRt = MathHelper.sqrt( swingProgress );
 | 
			
		||||
        float tX = -0.2f * MathHelper.sin( swingProgress * (float) Math.PI );
 | 
			
		||||
        float tZ = -0.4f * MathHelper.sin( swingRt * (float) Math.PI );
 | 
			
		||||
        transform.translate( 0, -tX / 2, tZ );
 | 
			
		||||
 | 
			
		||||
        float pitchAngle = renderer.getMapAngleFromPitch( pitch );
 | 
			
		||||
        transform.translate( 0, 0.04F + equipProgress * -1.2f + pitchAngle * -0.5f, -0.72f );
 | 
			
		||||
        transform.rotate( Vector3f.field_229179_b_.func_229187_a_( pitchAngle * -85.0f ) );
 | 
			
		||||
        if( !minecraft.player.isInvisible() )
 | 
			
		||||
        {
 | 
			
		||||
            transform.push();
 | 
			
		||||
            transform.rotate( Vector3f.field_229181_d_.func_229187_a_( 90.0F ) );
 | 
			
		||||
            renderer.renderArm( transform, render, lightTexture, HandSide.RIGHT );
 | 
			
		||||
            renderer.renderArm( transform, render, lightTexture, HandSide.LEFT );
 | 
			
		||||
            transform.pop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        float rX = MathHelper.sin( swingRt * (float) Math.PI );
 | 
			
		||||
        transform.rotate( Vector3f.field_229179_b_.func_229187_a_( rX * 20.0F ) );
 | 
			
		||||
        transform.scale( 2.0F, 2.0F, 2.0F );
 | 
			
		||||
 | 
			
		||||
        renderItem( transform, render, stack );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.FrameInfo;
 | 
			
		||||
import dan200.computercraft.client.gui.FixedWidthFontRenderer;
 | 
			
		||||
@@ -19,6 +20,7 @@ import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
@@ -54,11 +56,16 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
        if( !(stack.getItem() instanceof ItemPocketComputer) ) return;
 | 
			
		||||
 | 
			
		||||
        event.setCanceled( true );
 | 
			
		||||
        INSTANCE.renderItemFirstPerson( event.getHand(), event.getInterpolatedPitch(), event.getEquipProgress(), event.getSwingProgress(), event.getItemStack() );
 | 
			
		||||
        Minecraft minecraft = Minecraft.getInstance();
 | 
			
		||||
        INSTANCE.renderItemFirstPerson(
 | 
			
		||||
            event.getMatrixStack(), minecraft.func_228019_au_().func_228487_b_(),
 | 
			
		||||
            minecraft.getRenderManager().func_229085_a_( minecraft.player, event.getPartialTicks() ),
 | 
			
		||||
            event.getHand(), event.getInterpolatedPitch(), event.getEquipProgress(), event.getSwingProgress(), event.getItemStack()
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void renderItem( ItemStack stack )
 | 
			
		||||
    protected void renderItem( MatrixStack transform, IRenderTypeBuffer render, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        ClientComputer computer = ItemPocketComputer.createClientComputer( stack );
 | 
			
		||||
        Terminal terminal = computer == null ? null : computer.getTerminal();
 | 
			
		||||
@@ -80,18 +87,17 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
 | 
			
		||||
        // Setup various transformations. Note that these are partially adapted from the corresponding method
 | 
			
		||||
        // in ItemRenderer
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        transform.push();
 | 
			
		||||
        // TODO: RenderSystem.disableLighting();
 | 
			
		||||
        // TODO: RenderSystem.disableDepthTest();
 | 
			
		||||
 | 
			
		||||
        GlStateManager.disableLighting();
 | 
			
		||||
        GlStateManager.disableDepthTest();
 | 
			
		||||
        RenderSystem.rotatef( 180f, 0f, 1f, 0f );
 | 
			
		||||
        RenderSystem.rotatef( 180f, 0f, 0f, 1f );
 | 
			
		||||
        transform.scale( 0.5f, 0.5f, 0.5f );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.rotatef( 180f, 0f, 1f, 0f );
 | 
			
		||||
        GlStateManager.rotatef( 180f, 0f, 0f, 1f );
 | 
			
		||||
        GlStateManager.scalef( 0.5f, 0.5f, 0.5f );
 | 
			
		||||
 | 
			
		||||
        double scale = 0.75 / Math.max( width + FRAME * 2, height + FRAME * 2 + LIGHT_HEIGHT );
 | 
			
		||||
        GlStateManager.scaled( scale, scale, 0 );
 | 
			
		||||
        GlStateManager.translated( -0.5 * width, -0.5 * height, 0 );
 | 
			
		||||
        float scale = 0.75f / Math.max( width + FRAME * 2, height + FRAME * 2 + LIGHT_HEIGHT );
 | 
			
		||||
        transform.scale( scale, scale, 0 );
 | 
			
		||||
        transform.translate( -0.5 * width, -0.5 * height, 0 );
 | 
			
		||||
 | 
			
		||||
        // Render the main frame
 | 
			
		||||
        ItemPocketComputer item = (ItemPocketComputer) stack.getItem();
 | 
			
		||||
@@ -107,7 +113,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
        if( computer != null && terminal != null )
 | 
			
		||||
        {
 | 
			
		||||
            // If we've a computer and terminal then attempt to render it.
 | 
			
		||||
            renderTerminal( terminal, !computer.isColour(), width, height );
 | 
			
		||||
            renderTerminal( terminal, !computer.isColour() );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
@@ -123,9 +129,9 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
            tessellator.draw();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        GlStateManager.enableDepthTest();
 | 
			
		||||
        GlStateManager.enableLighting();
 | 
			
		||||
        GlStateManager.popMatrix();
 | 
			
		||||
        // TODO: RenderSystem.enableDepthTest();
 | 
			
		||||
        // TODO: RenderSystem.enableLighting();
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void renderFrame( ComputerFamily family, int colour, int width, int height )
 | 
			
		||||
@@ -172,8 +178,8 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
 | 
			
		||||
    private static void renderLight( int colour, int width, int height )
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.disableTexture();
 | 
			
		||||
        RenderSystem.enableBlend();
 | 
			
		||||
        RenderSystem.disableTexture();
 | 
			
		||||
 | 
			
		||||
        float r = ((colour >>> 16) & 0xFF) / 255.0f;
 | 
			
		||||
        float g = ((colour >>> 8) & 0xFF) / 255.0f;
 | 
			
		||||
@@ -188,10 +194,10 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
        buffer.pos( width - LIGHT_HEIGHT * 2, height + FRAME / 2.0f, 0.0D ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
 | 
			
		||||
        tessellator.draw();
 | 
			
		||||
        GlStateManager.enableTexture();
 | 
			
		||||
        RenderSystem.enableTexture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void renderTerminal( Terminal terminal, boolean greyscale, int width, int height )
 | 
			
		||||
    private static void renderTerminal( Terminal terminal, boolean greyscale )
 | 
			
		||||
    {
 | 
			
		||||
        synchronized( terminal )
 | 
			
		||||
        {
 | 
			
		||||
@@ -238,12 +244,12 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void renderTexture( BufferBuilder builder, int x, int y, int textureX, int textureY, int width, int height, float r, float g, float b )
 | 
			
		||||
    private static void renderTexture( IVertexBuilder builder, int x, int y, int textureX, int textureY, int width, int height, float r, float g, float b )
 | 
			
		||||
    {
 | 
			
		||||
        renderTexture( builder, x, y, textureX, textureY, width, height, width, height, r, g, b );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void renderTexture( BufferBuilder builder, int x, int y, int textureX, int textureY, int width, int height, int textureWidth, int textureHeight, float r, float g, float b )
 | 
			
		||||
    private static void renderTexture( IVertexBuilder builder, int x, int y, int textureX, int textureY, int width, int height, int textureWidth, int textureHeight, float r, float g, float b )
 | 
			
		||||
    {
 | 
			
		||||
        float scale = 1 / 255.0f;
 | 
			
		||||
        builder.pos( x, y + height, 0 ).tex( textureX * scale, (textureY + textureHeight) * scale ).color( r, g, b, 1.0f ).endVertex();
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemPrintout;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
@@ -49,16 +48,16 @@ public final class ItemPrintoutRenderer extends ItemMapLikeRenderer
 | 
			
		||||
    {
 | 
			
		||||
        // Setup various transformations. Note that these are partially adapated from the corresponding method
 | 
			
		||||
        // in FirstPersonRenderer.renderFirstPersonMap
 | 
			
		||||
        GlStateManager.disableLighting();
 | 
			
		||||
        RenderSystem.disableLighting();
 | 
			
		||||
 | 
			
		||||
        GlStateManager.rotatef( 180f, 0f, 1f, 0f );
 | 
			
		||||
        GlStateManager.rotatef( 180f, 0f, 0f, 1f );
 | 
			
		||||
        GlStateManager.scalef( 0.42f, 0.42f, -0.42f );
 | 
			
		||||
        GlStateManager.translatef( -0.5f, -0.48f, 0.0f );
 | 
			
		||||
        RenderSystem.rotatef( 180f, 0f, 1f, 0f );
 | 
			
		||||
        RenderSystem.rotatef( 180f, 0f, 0f, 1f );
 | 
			
		||||
        RenderSystem.scalef( 0.42f, 0.42f, -0.42f );
 | 
			
		||||
        RenderSystem.translatef( -0.5f, -0.48f, 0.0f );
 | 
			
		||||
 | 
			
		||||
        drawPrintout( stack );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.enableLighting();
 | 
			
		||||
        RenderSystem.enableLighting();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
@@ -69,18 +68,18 @@ public final class ItemPrintoutRenderer extends ItemMapLikeRenderer
 | 
			
		||||
 | 
			
		||||
        event.setCanceled( true );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.disableLighting();
 | 
			
		||||
        RenderSystem.disableLighting();
 | 
			
		||||
 | 
			
		||||
        // Move a little bit forward to ensure we're not clipping with the frame
 | 
			
		||||
        GlStateManager.translatef( 0.0f, 0.0f, -0.001f );
 | 
			
		||||
        GlStateManager.rotatef( 180f, 0f, 0f, 1f );
 | 
			
		||||
        GlStateManager.scalef( 0.95f, 0.95f, -0.95f );
 | 
			
		||||
        GlStateManager.translatef( -0.5f, -0.5f, 0.0f );
 | 
			
		||||
        RenderSystem.translatef( 0.0f, 0.0f, -0.001f );
 | 
			
		||||
        RenderSystem.rotatef( 180f, 0f, 0f, 1f );
 | 
			
		||||
        RenderSystem.scalef( 0.95f, 0.95f, -0.95f );
 | 
			
		||||
        RenderSystem.translatef( -0.5f, -0.5f, 0.0f );
 | 
			
		||||
 | 
			
		||||
        drawPrintout( stack );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.enableLighting();
 | 
			
		||||
        GlStateManager.disableBlend();
 | 
			
		||||
        RenderSystem.enableLighting();
 | 
			
		||||
        RenderSystem.disableBlend();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void drawPrintout( ItemStack stack )
 | 
			
		||||
@@ -107,8 +106,8 @@ public final class ItemPrintoutRenderer extends ItemMapLikeRenderer
 | 
			
		||||
 | 
			
		||||
        // Scale the printout to fit correctly.
 | 
			
		||||
        double scale = 1.0 / max;
 | 
			
		||||
        GlStateManager.scaled( scale, scale, scale );
 | 
			
		||||
        GlStateManager.translated( (max - width) / 2.0, (max - height) / 2.0, 0.0 );
 | 
			
		||||
        RenderSystem.scaled( scale, scale, scale );
 | 
			
		||||
        RenderSystem.translated( (max - width) / 2.0, (max - height) / 2.0, 0.0 );
 | 
			
		||||
 | 
			
		||||
        drawBorder( 0, 0, -0.01, 0, pages, book );
 | 
			
		||||
        drawText( X_TEXT_MARGIN, Y_TEXT_MARGIN, 0, ItemPrintout.getText( stack ), ItemPrintout.getColours( stack ) );
 | 
			
		||||
@@ -1,30 +1,26 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.RayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
 | 
			
		||||
import net.minecraftforge.client.event.DrawHighlightEvent;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import java.util.EnumSet;
 | 
			
		||||
 | 
			
		||||
@@ -40,15 +36,12 @@ public final class MonitorHighlightRenderer
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
    public static void drawHighlight( DrawBlockHighlightEvent event )
 | 
			
		||||
    public static void drawHighlight( DrawHighlightEvent.HighlightBlock event )
 | 
			
		||||
    {
 | 
			
		||||
        if( event.getTarget().getType() != RayTraceResult.Type.BLOCK || event.getInfo().getRenderViewEntity().isSneaking() )
 | 
			
		||||
        {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if( event.getInfo().getRenderViewEntity().isCrouching() ) return;
 | 
			
		||||
 | 
			
		||||
        World world = event.getInfo().getRenderViewEntity().getEntityWorld();
 | 
			
		||||
        BlockPos pos = ((BlockRayTraceResult) event.getTarget()).getPos();
 | 
			
		||||
        BlockPos pos = event.getTarget().getPos();
 | 
			
		||||
 | 
			
		||||
        TileEntity tile = world.getTileEntity( pos );
 | 
			
		||||
        if( !(tile instanceof TileMonitor) ) return;
 | 
			
		||||
@@ -65,50 +58,37 @@ public final class MonitorHighlightRenderer
 | 
			
		||||
        if( monitor.getYIndex() != 0 ) faces.remove( monitor.getDown().getOpposite() );
 | 
			
		||||
        if( monitor.getYIndex() != monitor.getHeight() - 1 ) faces.remove( monitor.getDown() );
 | 
			
		||||
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.blendFuncSeparate( GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO );
 | 
			
		||||
        GlStateManager.lineWidth( Math.max( 2.5F, (float) Minecraft.getInstance().mainWindow.getFramebufferWidth() / 1920.0F * 2.5F ) );
 | 
			
		||||
        GlStateManager.disableTexture();
 | 
			
		||||
        GlStateManager.depthMask( false );
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        IVertexBuilder buffer = Minecraft.getInstance().func_228019_au_().func_228487_b_().getBuffer( RenderType.lines() );
 | 
			
		||||
 | 
			
		||||
        Vec3d cameraPos = event.getInfo().getProjectedView();
 | 
			
		||||
        GlStateManager.translated( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() );
 | 
			
		||||
 | 
			
		||||
        Tessellator tessellator = Tessellator.getInstance();
 | 
			
		||||
        BufferBuilder buffer = tessellator.getBuffer();
 | 
			
		||||
        buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR );
 | 
			
		||||
        transformStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() );
 | 
			
		||||
 | 
			
		||||
        // I wish I could think of a better way to do this
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( WEST ) ) line( buffer, 0, 0, 0, UP );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( WEST ) ) line( buffer, 0, 0, 1, UP );
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( EAST ) ) line( buffer, 1, 0, 0, UP );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( EAST ) ) line( buffer, 1, 0, 1, UP );
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( DOWN ) ) line( buffer, 0, 0, 0, EAST );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( DOWN ) ) line( buffer, 0, 0, 1, EAST );
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( UP ) ) line( buffer, 0, 1, 0, EAST );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( UP ) ) line( buffer, 0, 1, 1, EAST );
 | 
			
		||||
        if( faces.contains( WEST ) || faces.contains( DOWN ) ) line( buffer, 0, 0, 0, SOUTH );
 | 
			
		||||
        if( faces.contains( EAST ) || faces.contains( DOWN ) ) line( buffer, 1, 0, 0, SOUTH );
 | 
			
		||||
        if( faces.contains( WEST ) || faces.contains( UP ) ) line( buffer, 0, 1, 0, SOUTH );
 | 
			
		||||
        if( faces.contains( EAST ) || faces.contains( UP ) ) line( buffer, 1, 1, 0, SOUTH );
 | 
			
		||||
        Matrix4f transform = transformStack.getLast().getPositionMatrix();
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( WEST ) ) line( buffer, transform, 0, 0, 0, UP );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( WEST ) ) line( buffer, transform, 0, 0, 1, UP );
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( EAST ) ) line( buffer, transform, 1, 0, 0, UP );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( EAST ) ) line( buffer, transform, 1, 0, 1, UP );
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( DOWN ) ) line( buffer, transform, 0, 0, 0, EAST );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( DOWN ) ) line( buffer, transform, 0, 0, 1, EAST );
 | 
			
		||||
        if( faces.contains( NORTH ) || faces.contains( UP ) ) line( buffer, transform, 0, 1, 0, EAST );
 | 
			
		||||
        if( faces.contains( SOUTH ) || faces.contains( UP ) ) line( buffer, transform, 0, 1, 1, EAST );
 | 
			
		||||
        if( faces.contains( WEST ) || faces.contains( DOWN ) ) line( buffer, transform, 0, 0, 0, SOUTH );
 | 
			
		||||
        if( faces.contains( EAST ) || faces.contains( DOWN ) ) line( buffer, transform, 1, 0, 0, SOUTH );
 | 
			
		||||
        if( faces.contains( WEST ) || faces.contains( UP ) ) line( buffer, transform, 0, 1, 0, SOUTH );
 | 
			
		||||
        if( faces.contains( EAST ) || faces.contains( UP ) ) line( buffer, transform, 1, 1, 0, SOUTH );
 | 
			
		||||
 | 
			
		||||
        tessellator.draw();
 | 
			
		||||
 | 
			
		||||
        GlStateManager.popMatrix();
 | 
			
		||||
        GlStateManager.depthMask( true );
 | 
			
		||||
        GlStateManager.enableTexture();
 | 
			
		||||
        GlStateManager.disableBlend();
 | 
			
		||||
        transformStack.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void line( BufferBuilder buffer, int x, int y, int z, Direction direction )
 | 
			
		||||
    private static void line( IVertexBuilder buffer, Matrix4f transform, float x, float y, float z, Direction direction )
 | 
			
		||||
    {
 | 
			
		||||
        double minX = x == 0 ? -EXPAND : 1 + EXPAND;
 | 
			
		||||
        double minY = y == 0 ? -EXPAND : 1 + EXPAND;
 | 
			
		||||
        double minZ = z == 0 ? -EXPAND : 1 + EXPAND;
 | 
			
		||||
        float minX = x == 0 ? -EXPAND : 1 + EXPAND;
 | 
			
		||||
        float minY = y == 0 ? -EXPAND : 1 + EXPAND;
 | 
			
		||||
        float minZ = z == 0 ? -EXPAND : 1 + EXPAND;
 | 
			
		||||
 | 
			
		||||
        buffer.pos( minX, minY, minZ ).color( 0, 0, 0, 0.4f ).endVertex();
 | 
			
		||||
        buffer.pos(
 | 
			
		||||
        buffer.pos( transform, minX, minY, minZ ).color( 0, 0, 0, 0.4f ).endVertex();
 | 
			
		||||
        buffer.pos( transform,
 | 
			
		||||
            minX + direction.getXOffset() * (1 + EXPAND * 2),
 | 
			
		||||
            minY + direction.getYOffset() * (1 + EXPAND * 2),
 | 
			
		||||
            minZ + direction.getZOffset() * (1 + EXPAND * 2)
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.platform.GlStateManager;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.BlockCable;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.CableModemVariant;
 | 
			
		||||
@@ -111,17 +111,17 @@ public class TileEntityCableRenderer extends TileEntityRenderer<TileCable>
 | 
			
		||||
     */
 | 
			
		||||
    private void preRenderDamagedBlocks()
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.disableLighting();
 | 
			
		||||
        RenderSystem.disableLighting();
 | 
			
		||||
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.blendFuncSeparate( GlStateManager.SourceFactor.DST_COLOR, GlStateManager.DestFactor.SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO );
 | 
			
		||||
        GlStateManager.enableBlend();
 | 
			
		||||
        GlStateManager.color4f( 1.0F, 1.0F, 1.0F, 0.5F );
 | 
			
		||||
        GlStateManager.polygonOffset( -3.0F, -3.0F );
 | 
			
		||||
        GlStateManager.enablePolygonOffset();
 | 
			
		||||
        GlStateManager.alphaFunc( 516, 0.1F );
 | 
			
		||||
        GlStateManager.enableAlphaTest();
 | 
			
		||||
        GlStateManager.pushMatrix();
 | 
			
		||||
        RenderSystem.enableBlend();
 | 
			
		||||
        RenderSystem.blendFuncSeparate( GlStateManager.SourceFactor.DST_COLOR, GlStateManager.DestFactor.SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO );
 | 
			
		||||
        RenderSystem.enableBlend();
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 0.5F );
 | 
			
		||||
        RenderSystem.polygonOffset( -3.0F, -3.0F );
 | 
			
		||||
        RenderSystem.enablePolygonOffset();
 | 
			
		||||
        RenderSystem.alphaFunc( 516, 0.1F );
 | 
			
		||||
        RenderSystem.enableAlphaTest();
 | 
			
		||||
        RenderSystem.pushMatrix();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -131,11 +131,11 @@ public class TileEntityCableRenderer extends TileEntityRenderer<TileCable>
 | 
			
		||||
     */
 | 
			
		||||
    private void postRenderDamagedBlocks()
 | 
			
		||||
    {
 | 
			
		||||
        GlStateManager.disableAlphaTest();
 | 
			
		||||
        GlStateManager.polygonOffset( 0.0F, 0.0F );
 | 
			
		||||
        GlStateManager.disablePolygonOffset();
 | 
			
		||||
        GlStateManager.disablePolygonOffset();
 | 
			
		||||
        GlStateManager.depthMask( true );
 | 
			
		||||
        GlStateManager.popMatrix();
 | 
			
		||||
        RenderSystem.disableAlphaTest();
 | 
			
		||||
        RenderSystem.polygonOffset( 0.0F, 0.0F );
 | 
			
		||||
        RenderSystem.disablePolygonOffset();
 | 
			
		||||
        RenderSystem.disablePolygonOffset();
 | 
			
		||||
        RenderSystem.depthMask( true );
 | 
			
		||||
        RenderSystem.popMatrix();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import com.google.common.net.InetAddresses;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaAPIFactory;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaAPI;
 | 
			
		||||
@@ -23,8 +22,6 @@ import java.io.BufferedReader;
 | 
			
		||||
import java.io.BufferedWriter;
 | 
			
		||||
import java.nio.channels.ReadableByteChannel;
 | 
			
		||||
import java.nio.channels.WritableByteChannel;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.api.lua.ArgumentHelper.getString;
 | 
			
		||||
@@ -94,13 +91,7 @@ public class FSAPI implements ILuaAPI
 | 
			
		||||
                m_env.addTrackingChange( TrackingField.FS_OPS );
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    String[] results = m_fileSystem.list( path );
 | 
			
		||||
                    Map<Object, Object> table = new HashMap<>();
 | 
			
		||||
                    for( int i = 0; i < results.length; i++ )
 | 
			
		||||
                    {
 | 
			
		||||
                        table.put( i + 1, results[i] );
 | 
			
		||||
                    }
 | 
			
		||||
                    return new Object[] { table };
 | 
			
		||||
                    return new Object[] { m_fileSystem.list( path ) };
 | 
			
		||||
                }
 | 
			
		||||
                catch( FileSystemException e )
 | 
			
		||||
                {
 | 
			
		||||
@@ -331,13 +322,7 @@ public class FSAPI implements ILuaAPI
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    m_env.addTrackingChange( TrackingField.FS_OPS );
 | 
			
		||||
                    String[] results = m_fileSystem.find( path );
 | 
			
		||||
                    Map<Object, Object> table = new HashMap<>();
 | 
			
		||||
                    for( int i = 0; i < results.length; i++ )
 | 
			
		||||
                    {
 | 
			
		||||
                        table.put( i + 1, results[i] );
 | 
			
		||||
                    }
 | 
			
		||||
                    return new Object[] { table };
 | 
			
		||||
                    return new Object[] { m_fileSystem.find( path ) };
 | 
			
		||||
                }
 | 
			
		||||
                catch( FileSystemException e )
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaAPI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
@@ -365,28 +364,16 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
 | 
			
		||||
            case 2:
 | 
			
		||||
            {
 | 
			
		||||
                // getMethods
 | 
			
		||||
                String[] methods = null;
 | 
			
		||||
                ComputerSide side = ComputerSide.valueOfInsensitive( getString( args, 0 ) );
 | 
			
		||||
                if( side != null )
 | 
			
		||||
                {
 | 
			
		||||
                    synchronized( m_peripherals )
 | 
			
		||||
                    {
 | 
			
		||||
                        PeripheralWrapper p = m_peripherals[side.ordinal()];
 | 
			
		||||
                        if( p != null )
 | 
			
		||||
                        {
 | 
			
		||||
                            methods = p.getMethods();
 | 
			
		||||
                        if( p != null ) return new Object[] { p.getMethods() };
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                }
 | 
			
		||||
                if( methods != null )
 | 
			
		||||
                {
 | 
			
		||||
                    Map<Object, Object> table = new HashMap<>();
 | 
			
		||||
                    for( int i = 0; i < methods.length; i++ )
 | 
			
		||||
                    {
 | 
			
		||||
                        table.put( i + 1, methods[i] );
 | 
			
		||||
                    }
 | 
			
		||||
                    return new Object[] { table };
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            case 3:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaAPI;
 | 
			
		||||
@@ -12,8 +11,6 @@ import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
import dan200.computercraft.core.computer.ComputerSide;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.api.lua.ArgumentHelper.*;
 | 
			
		||||
 | 
			
		||||
@@ -59,16 +56,8 @@ public class RedstoneAPI implements ILuaAPI
 | 
			
		||||
    {
 | 
			
		||||
        switch( method )
 | 
			
		||||
        {
 | 
			
		||||
            case 0:
 | 
			
		||||
            {
 | 
			
		||||
                // getSides
 | 
			
		||||
                Map<Object, Object> table = new HashMap<>();
 | 
			
		||||
                for( int i = 0; i < ComputerSide.NAMES.length; i++ )
 | 
			
		||||
                {
 | 
			
		||||
                    table.put( i + 1, ComputerSide.NAMES[i] );
 | 
			
		||||
                }
 | 
			
		||||
                return new Object[] { table };
 | 
			
		||||
            }
 | 
			
		||||
            case 0: // getSides
 | 
			
		||||
                return new Object[] { ComputerSide.NAMES };
 | 
			
		||||
            case 1:
 | 
			
		||||
            {
 | 
			
		||||
                // setOutput
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.core.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ArgumentHelper;
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user