Compare commits
100 Commits
v1.17.1-1.
...
v1.19-1.10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a913232e62 | ||
|
|
557765d8f0 | ||
|
|
1e044aed68 | ||
|
|
5382d34d29 | ||
|
|
cbbb34cdd4 | ||
|
|
8f7719a8dc | ||
|
|
ca58e39707 | ||
|
|
0aac966239 | ||
|
|
0e1e8dfa8c | ||
|
|
a1cbc1d803 | ||
|
|
0b6dc25607 | ||
|
|
b91809bfc7 | ||
|
|
178126725e | ||
|
|
cd76425877 | ||
|
|
4411756b06 | ||
|
|
1fd57a874f | ||
|
|
3f0704624e | ||
|
|
3b6cd783cb | ||
|
|
a07bba4ece | ||
|
|
ab22726883 | ||
|
|
2efad38f53 | ||
|
|
83a1af6526 | ||
|
|
8b89d88d04 | ||
|
|
36635662f1 | ||
|
|
bbc0afa111 | ||
|
|
34dc915d57 | ||
|
|
24ed0ca723 | ||
|
|
5052718428 | ||
|
|
431e4c9419 | ||
|
|
2639b84eb2 | ||
|
|
d631111610 | ||
|
|
c981c75b7c | ||
|
|
f05a539443 | ||
|
|
d8a7ab540a | ||
|
|
a7536ea4fa | ||
|
|
d9e75d7c47 | ||
|
|
78334c4cb1 | ||
|
|
f5f0c7990a | ||
|
|
87a1c1a525 | ||
|
|
be45b718b3 | ||
|
|
ad2d1d6a05 | ||
|
|
65a7370db1 | ||
|
|
03b0244084 | ||
|
|
6322e72110 | ||
|
|
7ad6132494 | ||
|
|
e2189535b8 | ||
|
|
79467499e6 | ||
|
|
074793090d | ||
|
|
cbbab26bf3 | ||
|
|
9cb7091ce7 | ||
|
|
e909e11e05 | ||
|
|
6239dbe9ca | ||
|
|
49601f0b7c | ||
|
|
caa412b7d2 | ||
|
|
9cb7a5bec7 | ||
|
|
118b89ea41 | ||
|
|
f2474bbfa2 | ||
|
|
159f90896e | ||
|
|
f108ba93af | ||
|
|
2a4f75ba15 | ||
|
|
ad228e94a3 | ||
|
|
42b98bce28 | ||
|
|
59e3608d2a | ||
|
|
fccca22d3f | ||
|
|
4bfdb65989 | ||
|
|
22e8b9b587 | ||
|
|
77a00b14ae | ||
|
|
78aa757549 | ||
|
|
1196568a7c | ||
|
|
48c4f397f9 | ||
|
|
8871f40ced | ||
|
|
aa62c1f206 | ||
|
|
fd32b06d6f | ||
|
|
739d6813c0 | ||
|
|
daf81b897a | ||
|
|
e865d96f7b | ||
|
|
79b1872cab | ||
|
|
41fa95bce4 | ||
|
|
2a92794da3 | ||
|
|
b3e009cca5 | ||
|
|
ba7598c689 | ||
|
|
7731759c77 | ||
|
|
e6339b2847 | ||
|
|
78cce4981a | ||
|
|
97c953a9be | ||
|
|
52df7cb8a4 | ||
|
|
6735cfd12e | ||
|
|
f994696161 | ||
|
|
9edce36efd | ||
|
|
79366bf2f5 | ||
|
|
2b901f2d5e | ||
|
|
901d8d4c3b | ||
|
|
2562642664 | ||
|
|
632db1cfa5 | ||
|
|
f6fcba7a39 | ||
|
|
7c373c6e06 | ||
|
|
57c5d19f95 | ||
|
|
23c17075be | ||
|
|
87988a705b | ||
|
|
179da1d8cf |
2
.gitattributes
vendored
@@ -1,5 +1,5 @@
|
||||
# Ignore changes in generated files
|
||||
src/generated/resources/data/** linguist-generated
|
||||
src/generated/** linguist-generated
|
||||
src/testMod/server-files/structures linguist-generated
|
||||
|
||||
* text=auto
|
||||
|
||||
2
.github/workflows/make-doc.sh
vendored
@@ -12,7 +12,7 @@ chmod 600 "$HOME/.ssh/key"
|
||||
|
||||
# And upload
|
||||
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
|
||||
"$GITHUB_WORKSPACE/build/docs/lua/" \
|
||||
"$GITHUB_WORKSPACE/build/docs/site/" \
|
||||
"$SSH_USER@$SSH_HOST:/$DEST"
|
||||
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
|
||||
"$GITHUB_WORKSPACE/build/docs/javadoc/" \
|
||||
|
||||
@@ -65,7 +65,7 @@ Gradle should be your entrypoint to building most documentation. There's two tas
|
||||
|
||||
- `./gradlew luaJavadoc` - Generate documentation stubs for Java methods.
|
||||
- `./gradlew docWebsite` - Generate the whole website (including Javascript pages). The resulting HTML is stored at
|
||||
`./build/docs/lua/`.
|
||||
`./build/docs/site/`.
|
||||
|
||||
#### Writing documentation
|
||||
illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as
|
||||
|
||||
172
build.gradle
@@ -5,7 +5,7 @@ buildscript {
|
||||
maven { url = 'https://maven.parchmentmc.org' }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.24'
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+'
|
||||
classpath "org.spongepowered:mixingradle:0.7.+"
|
||||
classpath 'org.parchmentmc:librarian:1.+'
|
||||
}
|
||||
@@ -31,7 +31,7 @@ version = mod_version
|
||||
group = "org.squiddev"
|
||||
archivesBaseName = "cc-tweaked-${mc_version}"
|
||||
|
||||
def javaVersion = JavaLanguageVersion.of(16)
|
||||
def javaVersion = JavaLanguageVersion.of(17)
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = javaVersion
|
||||
@@ -105,9 +105,8 @@ minecraft {
|
||||
}
|
||||
}
|
||||
|
||||
testServer {
|
||||
gameTestServer {
|
||||
workingDirectory project.file('test-files/server')
|
||||
parent runs.server
|
||||
|
||||
mods {
|
||||
cctest {
|
||||
@@ -123,7 +122,8 @@ minecraft {
|
||||
}
|
||||
}
|
||||
|
||||
mappings channel: 'parchment', version: "${mapping_version}-${mc_version}"
|
||||
// mappings channel: 'parchment', version: "${mapping_version}-${mc_version}"
|
||||
mappings channel: 'official', version: mc_version
|
||||
|
||||
accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg')
|
||||
accessTransformer file('src/testMod/resources/META-INF/accesstransformer.cfg')
|
||||
@@ -158,11 +158,11 @@ dependencies {
|
||||
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
||||
annotationProcessor 'org.spongepowered:mixin:0.8.4:processor'
|
||||
|
||||
compileOnly fg.deobf("mezz.jei:jei-1.17.1:8.0.0.14:api")
|
||||
compileOnly fg.deobf("mezz.jei:jei-1.18.2:9.4.1.116:api")
|
||||
// runtimeOnly fg.deobf("mezz.jei:jei-1.18.2:9.4.1.116")
|
||||
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-1.17.1:8.0.0.14")
|
||||
|
||||
shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT'
|
||||
shade 'org.squiddev:Cobalt:0.5.5'
|
||||
shade 'io.netty:netty-codec-http:4.1.76.Final'
|
||||
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0'
|
||||
@@ -172,9 +172,11 @@ dependencies {
|
||||
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2'
|
||||
|
||||
testModImplementation sourceSets.main.output
|
||||
testModExtra 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.21'
|
||||
testModExtra('org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0') {
|
||||
exclude group: "org.jetbrains", module: "annotations"
|
||||
}
|
||||
|
||||
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.5'
|
||||
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.6'
|
||||
}
|
||||
|
||||
// Compile tasks
|
||||
@@ -219,6 +221,8 @@ jar {
|
||||
])
|
||||
}
|
||||
|
||||
duplicatesStrategy(DuplicatesStrategy.WARN)
|
||||
|
||||
from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
|
||||
}
|
||||
|
||||
@@ -236,9 +240,32 @@ processResources {
|
||||
try {
|
||||
hash = ["git", "-C", projectDir, "rev-parse", "HEAD"].execute().text.trim()
|
||||
|
||||
def blacklist = ['GitHub', 'dan200', 'Daniel Ratcliffe']
|
||||
["git", "-C", projectDir, "log", "--format=tformat:%an%n%cn"].execute().text.split('\n').each {
|
||||
if (!blacklist.contains(it)) contributors.add(it)
|
||||
def blacklist = ['GitHub', 'Daniel Ratcliffe', 'Weblate']
|
||||
|
||||
// Extract all authors, commiters and co-authors from the git log.
|
||||
def authors = ["git", "-C", projectDir, "log", "--format=tformat:%an <%ae>%n%cn <%ce>%n%(trailers:key=Co-authored-by,valueonly)"]
|
||||
.execute().text.readLines().unique()
|
||||
|
||||
// We now pass this through git's mailmap to de-duplicate some authors.
|
||||
def remapAuthors = ["git", "check-mailmap", "--stdin"].execute()
|
||||
remapAuthors.withWriter { stdin ->
|
||||
if (stdin !instanceof BufferedWriter) stdin = new BufferedWriter(stdin)
|
||||
|
||||
authors.forEach {
|
||||
if (it == "") return
|
||||
if (!it.endsWith(">")) it += ">" // Some commits have broken Co-Authored-By lines!
|
||||
stdin.writeLine(it)
|
||||
}
|
||||
stdin.close()
|
||||
}
|
||||
|
||||
// And finally extract out the actual name.
|
||||
def emailRegex = ~/^([^<]+) <.+>$/
|
||||
remapAuthors.text.readLines().forEach {
|
||||
def matcher = it =~ emailRegex
|
||||
matcher.find()
|
||||
def name = matcher.group(1)
|
||||
if (!blacklist.contains(name)) contributors.add(name)
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace()
|
||||
@@ -290,7 +317,7 @@ task rollup(type: Exec) {
|
||||
|
||||
task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
||||
group = "build"
|
||||
description = "Bundles JS into rollup"
|
||||
description = "Generates docs using Illuaminate"
|
||||
|
||||
inputs.files(fileTree("doc")).withPropertyName("docs")
|
||||
inputs.files(fileTree("src/main/resources/data/computercraft/lua/rom")).withPropertyName("lua rom")
|
||||
@@ -303,7 +330,21 @@ task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
||||
commandLine mkCommand('"bin/illuaminate" doc-gen')
|
||||
}
|
||||
|
||||
task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
|
||||
task jsxDocs(type: Exec, dependsOn: [illuaminateDocs]) {
|
||||
group = "build"
|
||||
description = "Post-processes documentation to statically render some dynamic content."
|
||||
|
||||
inputs.files(fileTree("src/web")).withPropertyName("sources")
|
||||
inputs.file("src/generated/export/index.json").withPropertyName("export")
|
||||
inputs.file("package-lock.json").withPropertyName("package-lock.json")
|
||||
inputs.file("tsconfig.json").withPropertyName("Typescript config")
|
||||
inputs.files(fileTree("$buildDir/docs/lua"))
|
||||
outputs.dir("$buildDir/docs/site")
|
||||
|
||||
commandLine mkCommand('"node_modules/.bin/ts-node" --esm src/web/transform.tsx')
|
||||
}
|
||||
|
||||
task docWebsite(type: Copy, dependsOn: [jsxDocs]) {
|
||||
from('doc') {
|
||||
include 'logo.png'
|
||||
include 'images/**'
|
||||
@@ -311,7 +352,14 @@ task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
|
||||
from("$buildDir/rollup") {
|
||||
exclude 'index.js'
|
||||
}
|
||||
into "${project.docsDir}/lua"
|
||||
from("$buildDir/docs/lua") {
|
||||
exclude '**/*.html'
|
||||
}
|
||||
from("src/generated/export/items") {
|
||||
into("images/items")
|
||||
}
|
||||
|
||||
into "${project.docsDir}/site"
|
||||
}
|
||||
|
||||
// Check tasks
|
||||
@@ -372,69 +420,49 @@ task licenseFormatAPI(type: LicenseFormat)
|
||||
}
|
||||
}
|
||||
|
||||
task setupServer(type: Copy) {
|
||||
group "test server"
|
||||
description "Sets up the environment for the test server."
|
||||
tasks.register("testServer", JavaExec.class).configure {
|
||||
it.group('In-game tests')
|
||||
it.description("Runs tests on a temporary Minecraft instance.")
|
||||
it.dependsOn("prepareRunGameTestServer", "cleanTestServer", 'compileTestModJava')
|
||||
|
||||
from("src/testMod/server-files") {
|
||||
include "eula.txt"
|
||||
include "server.properties"
|
||||
}
|
||||
into "test-files/server"
|
||||
// Copy from runTestServer. We do it in this slightly odd way as runTestServer
|
||||
// isn't created until the task is configured (which is no good for us).
|
||||
JavaExec exec = tasks.getByName("runGameTestServer")
|
||||
exec.copyTo(it)
|
||||
it.setClasspath(exec.getClasspath())
|
||||
it.mainClass = exec.mainClass
|
||||
it.setArgs(exec.getArgs())
|
||||
|
||||
// Jacoco and modlauncher don't play well together as the classes loaded in-game don't
|
||||
// match up with those written to disk. We get Jacoco to dump all classes to disk, and
|
||||
// use that when generating the report.
|
||||
def coverageOut = new File(buildDir, "jacocoClassDump/testServer")
|
||||
jacoco.applyTo(it)
|
||||
it.jacoco.setIncludes(["dan200.computercraft.*"])
|
||||
it.jacoco.setClassDumpDir(coverageOut)
|
||||
it.outputs.dir(coverageOut)
|
||||
// Older versions of modlauncher don't include a protection domain (and thus no code
|
||||
// source). Jacoco skips such classes by default, so we need to explicitly include them.
|
||||
it.jacoco.setIncludeNoLocationClasses(true)
|
||||
}
|
||||
|
||||
["Client", "Server"].forEach { name ->
|
||||
tasks.register("test$name", JavaExec.class).configure {
|
||||
it.group('In-game tests')
|
||||
it.description("Runs tests on a temporary Minecraft instance.")
|
||||
it.dependsOn(setupServer, "prepareRunTest$name", "cleanTest$name", 'compileTestModJava')
|
||||
tasks.register("jacocoTestServerReport", JacocoReport.class).configure {
|
||||
it.group('In-game')
|
||||
it.description("Generate coverage reports for testServer")
|
||||
it.dependsOn("testServer")
|
||||
|
||||
// Copy from runTestServer. We do it in this slightly odd way as runTestServer
|
||||
// isn't created until the task is configured (which is no good for us).
|
||||
JavaExec exec = tasks.getByName("runTest$name")
|
||||
exec.copyTo(it)
|
||||
it.setClasspath(exec.getClasspath())
|
||||
it.mainClass = exec.mainClass
|
||||
it.setArgs(exec.getArgs())
|
||||
it.executionData(new File(buildDir, "jacoco/testServer.exec"))
|
||||
it.sourceDirectories.from(sourceSets.main.allJava.srcDirs)
|
||||
it.classDirectories.from(new File(buildDir, "jacocoClassDump/testServer"))
|
||||
|
||||
it.systemProperty('forge.logging.console.level', 'info')
|
||||
it.systemProperty('cctest.run', 'true')
|
||||
|
||||
// Jacoco and modlauncher don't play well together as the classes loaded in-game don't
|
||||
// match up with those written to disk. We get Jacoco to dump all classes to disk, and
|
||||
// use that when generating the report.
|
||||
def coverageOut = new File(buildDir, "jacocoClassDump/test$name")
|
||||
jacoco.applyTo(it)
|
||||
it.jacoco.setIncludes(["dan200.computercraft.*"])
|
||||
it.jacoco.setClassDumpDir(coverageOut)
|
||||
it.outputs.dir(coverageOut)
|
||||
// Older versions of modlauncher don't include a protection domain (and thus no code
|
||||
// source). Jacoco skips such classes by default, so we need to explicitly include them.
|
||||
it.jacoco.setIncludeNoLocationClasses(true)
|
||||
}
|
||||
|
||||
tasks.register("jacocoTest${name}Report", JacocoReport.class).configure {
|
||||
it.group('In-game')
|
||||
it.description("Generate coverage reports for test$name")
|
||||
it.dependsOn("test$name")
|
||||
|
||||
it.executionData(new File(buildDir, "jacoco/test${name}.exec"))
|
||||
it.sourceDirectories.from(sourceSets.main.allJava.srcDirs)
|
||||
it.classDirectories.from(new File(buildDir, "jacocoClassDump/test$name"))
|
||||
|
||||
it.reports {
|
||||
xml.enabled true
|
||||
html.enabled true
|
||||
}
|
||||
}
|
||||
|
||||
if (name != "Client" || project.findProperty('cc.tweaked.clientTests') == 'true') {
|
||||
// Don't run client tests unless explicitly opted into them. They're a bit of a faff
|
||||
// to run and pretty flakey.
|
||||
check.dependsOn("jacocoTest${name}Report")
|
||||
it.reports {
|
||||
xml.enabled true
|
||||
html.enabled true
|
||||
}
|
||||
}
|
||||
|
||||
check.dependsOn("jacocoTestServerReport")
|
||||
|
||||
|
||||
// Upload tasks
|
||||
|
||||
|
||||
@@ -83,7 +83,9 @@
|
||||
<module name="JavadocBlockTagLocation" />
|
||||
<module name="JavadocMethod"/>
|
||||
<module name="JavadocType"/>
|
||||
<module name="JavadocStyle" />
|
||||
<module name="JavadocStyle">
|
||||
<property name="checkHtml" value="false" />
|
||||
</module>
|
||||
<module name="NonEmptyAtclauseDescription" />
|
||||
<module name="SingleLineJavadoc" />
|
||||
<module name="SummaryJavadocCheck"/>
|
||||
|
||||
@@ -15,13 +15,11 @@ advanced turtles and pocket computers).
|
||||
Several mouse events (@{mouse_click}, @{mouse_up}, @{mouse_scroll}) contain a "mouse button" code. This takes a
|
||||
numerical value depending on which button on your mouse was last pressed when this event occurred.
|
||||
|
||||
<table class="pretty-table">
|
||||
<!-- Our markdown parser doesn't work on tables!? Guess I'll have to roll my own soonish :/. -->
|
||||
<tr><th>Button code</th><th>Mouse button</th></tr>
|
||||
<tr><td align="right">1</td><td>Left button</td></tr>
|
||||
<tr><td align="right">2</td><td>Right button</td></tr>
|
||||
<tr><td align="right">3</td><td>Middle button</td></tr>
|
||||
</table>
|
||||
| Button Code | Mouse Button |
|
||||
|------------:|---------------|
|
||||
| 1 | Left button |
|
||||
| 2 | Right button |
|
||||
| 3 | Middle button |
|
||||
|
||||
## Example
|
||||
Print the button and the coordinates whenever the mouse is clicked.
|
||||
|
||||
99
doc/guides/local_ips.md
Normal file
@@ -0,0 +1,99 @@
|
||||
---
|
||||
module: [kind=guide] local_ips
|
||||
---
|
||||
|
||||
# Allowing access to local IPs
|
||||
By default, ComputerCraft blocks access to local IP addresses for security. This means you can't normally access any
|
||||
HTTP server running on your computer. However, this may be useful for testing programs without having a remote
|
||||
server. You can unblock these IPs in the ComputerCraft config.
|
||||
|
||||
- [Minecraft 1.13 and later, CC:T 1.87.0 and later](#cc-1.87.0)
|
||||
- [Minecraft 1.13 and later, CC:T 1.86.2 and earlier](#cc-1.86.2)
|
||||
- [Minecraft 1.12.2 and earlier](#mc-1.12)
|
||||
|
||||
## Minecraft 1.13 and later, CC:T 1.87.0 and later {#cc-1.87.0}
|
||||
The configuration file can be located at `serverconfig/computercraft-server.toml` inside the world folder on either
|
||||
single-player or multiplayer. Look for lines that look like this:
|
||||
|
||||
```toml
|
||||
#A list of rules which control behaviour of the "http" API for specific domains or IPs.
|
||||
#Each rule is an item with a 'host' to match against, and a series of properties. The host may be a domain name ("pastebin.com"),
|
||||
#wildcard ("*.pastebin.com") or CIDR notation ("127.0.0.0/8"). If no rules, the domain is blocked.
|
||||
[[http.rules]]
|
||||
host = "$private"
|
||||
action = "deny"
|
||||
```
|
||||
|
||||
On 1.95.0 and later, this will be a single entry with `host = "$private"`. On earlier versions, this will be a number of
|
||||
`[[http.rules]]` with various IP addresses. You will want to remove all of the `[[http.rules]]` entires that have
|
||||
`action = "deny"`. Then save the file and relaunch Minecraft (Server).
|
||||
|
||||
Here's what it should look like after removing:
|
||||
|
||||
```toml
|
||||
#A list of rules which control behaviour of the "http" API for specific domains or IPs.
|
||||
#Each rule is an item with a 'host' to match against, and a series of properties. The host may be a domain name ("pastebin.com"),
|
||||
#wildcard ("*.pastebin.com") or CIDR notation ("127.0.0.0/8"). If no rules, the domain is blocked.
|
||||
[[http.rules]]
|
||||
#The maximum size (in bytes) that a computer can send or receive in one websocket packet.
|
||||
max_websocket_message = 131072
|
||||
host = "*"
|
||||
#The maximum size (in bytes) that a computer can upload in a single request. This includes headers and POST text.
|
||||
max_upload = 4194304
|
||||
action = "allow"
|
||||
#The maximum size (in bytes) that a computer can download in a single request. Note that responses may receive more data than allowed, but this data will not be returned to the client.
|
||||
max_download = 16777216
|
||||
#The period of time (in milliseconds) to wait before a HTTP request times out. Set to 0 for unlimited.
|
||||
timeout = 30000
|
||||
```
|
||||
|
||||
## Minecraft 1.13 and later, CC:T 1.86.2 and earlier {#cc-1.86.2}
|
||||
The configuration file for singleplayer is at `.minecraft/config/computercraft-common.toml`. Look for lines that look
|
||||
like this:
|
||||
|
||||
```toml
|
||||
#A list of wildcards for domains or IP ranges that cannot be accessed through the "http" API on Computers.
|
||||
#If this is empty then all whitelisted domains will be accessible. Example: "*.github.com" will block access to all subdomains of github.com.
|
||||
#You can use domain names ("pastebin.com"), wilcards ("*.pastebin.com") or CIDR notation ("127.0.0.0/8").
|
||||
blacklist = ["127.0.0.0/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "fd00::/8"]
|
||||
```
|
||||
|
||||
Remove everything inside the array, leaving the last line as `blacklist = []`. Then save the file and relaunch Minecraft.
|
||||
|
||||
Here's what it should look like after removing:
|
||||
|
||||
```toml
|
||||
#A list of wildcards for domains or IP ranges that cannot be accessed through the "http" API on Computers.
|
||||
#If this is empty then all whitelisted domains will be accessible. Example: "*.github.com" will block access to all subdomains of github.com.
|
||||
#You can use domain names ("pastebin.com"), wilcards ("*.pastebin.com") or CIDR notation ("127.0.0.0/8").
|
||||
blacklist = []
|
||||
```
|
||||
|
||||
## Minecraft 1.12.2 and earlier {#mc-1.12}
|
||||
On singleplayer, the configuration file is located at `.minecraft\config\ComputerCraft.cfg`. On multiplayer, the
|
||||
configuration file is located at `<server folder>\config\ComputerCraft.cfg`. Look for lines that look like this:
|
||||
|
||||
```ini
|
||||
# A list of wildcards for domains or IP ranges that cannot be accessed through the "http" API on Computers.
|
||||
# If this is empty then all explicitly allowed domains will be accessible. Example: "*.github.com" will block access to all subdomains of github.com.
|
||||
# You can use domain names ("pastebin.com"), wildcards ("*.pastebin.com") or CIDR notation ("127.0.0.0/8").
|
||||
S:blocked_domains <
|
||||
127.0.0.0/8
|
||||
10.0.0.0/8
|
||||
172.16.0.0/12
|
||||
192.168.0.0/16
|
||||
fd00::/8
|
||||
>
|
||||
```
|
||||
|
||||
Delete everything between the `<>`, leaving the last line as `S:blocked_domains = <>`. Then save the file and relaunch
|
||||
Minecraft (Server).
|
||||
|
||||
Here's what it should look like after removing:
|
||||
|
||||
```ini
|
||||
# A list of wildcards for domains or IP ranges that cannot be accessed through the "http" API on Computers.
|
||||
# If this is empty then all explicitly allowed domains will be accessible. Example: "*.github.com" will block access to all subdomains of github.com.
|
||||
# You can use domain names ("pastebin.com"), wildcards ("*.pastebin.com") or CIDR notation ("127.0.0.0/8").
|
||||
S:blocked_domains <>
|
||||
```
|
||||
@@ -125,7 +125,7 @@ different.
|
||||
First, we require the dfpwm module and call @{cc.audio.dfpwm.make_decoder} to construct a new decoder. This decoder
|
||||
accepts blocks of DFPWM data and converts it to a list of 8-bit amplitudes, which we can then play with our speaker.
|
||||
|
||||
As mentioned to above, @{speaker.playAudio} accepts at most 128×1024 samples in one go. DFPMW uses a single bit for each
|
||||
As mentioned above, @{speaker.playAudio} accepts at most 128×1024 samples in one go. DFPMW uses a single bit for each
|
||||
sample, which means we want to process our audio in chunks of 16×1024 bytes (16KiB). In order to do this, we use
|
||||
@{io.lines}, which provides a nice way to loop over chunks of a file. You can of course just use @{fs.open} and
|
||||
@{fs.BinaryReadHandle.read} if you prefer.
|
||||
@@ -136,22 +136,22 @@ You can mix together samples from different streams by adding their amplitudes,
|
||||
samples, etc...
|
||||
|
||||
Let's put together a small demonstration here. We're going to add a small delay effect to the song above, so that you
|
||||
hear a faint echo about a second later.
|
||||
hear a faint echo a second and a half later.
|
||||
|
||||
In order to do this, we'll follow a format similar to the previous example, decoding the audio and then playing it.
|
||||
However, we'll also add some new logic between those two steps, which loops over every sample in our chunk of audio, and
|
||||
adds the sample from one second ago to it.
|
||||
adds the sample from 1.5 seconds ago to it.
|
||||
|
||||
For this, we'll need to keep track of the last 48k samples - exactly one seconds worth of audio. We can do this using a
|
||||
For this, we'll need to keep track of the last 72k samples - exactly 1.5 seconds worth of audio. We can do this using a
|
||||
[Ring Buffer], which helps makes things a little more efficient.
|
||||
|
||||
```lua {data-peripheral=speaker}
|
||||
local dfpwm = require("cc.audio.dfpwm")
|
||||
local speaker = peripheral.find("speaker")
|
||||
|
||||
-- Speakers play at 48kHz, so one second is 48k samples. We first fill our buffer
|
||||
-- Speakers play at 48kHz, so 1.5 seconds is 72k samples. We first fill our buffer
|
||||
-- with 0s, as there's nothing to echo at the start of the track!
|
||||
local samples_i, samples_n = 1, 48000
|
||||
local samples_i, samples_n = 1, 48000 * 1.5
|
||||
local samples = {}
|
||||
for i = 1, samples_n do samples[i] = 0 end
|
||||
|
||||
@@ -162,7 +162,7 @@ for chunk in io.lines("data/example.dfpwm", 16 * 1024) do
|
||||
for i = 1, #buffer do
|
||||
local original_value = buffer[i]
|
||||
|
||||
-- Replace this sample with its current amplitude plus the amplitude from one second ago.
|
||||
-- Replace this sample with its current amplitude plus the amplitude from 1.5 seconds ago.
|
||||
-- We scale both to ensure the resulting value is still between -128 and 127.
|
||||
buffer[i] = original_value * 0.6 + samples[samples_i] * 0.4
|
||||
|
||||
@@ -175,6 +175,11 @@ for chunk in io.lines("data/example.dfpwm", 16 * 1024) do
|
||||
while not speaker.playAudio(buffer) do
|
||||
os.pullEvent("speaker_audio_empty")
|
||||
end
|
||||
|
||||
-- The audio processing above can be quite slow and preparing the first batch of audio
|
||||
-- may timeout the computer. We sleep to avoid this.
|
||||
-- There's definitely better ways of handling this - this is just an example!
|
||||
sleep(0.05)
|
||||
end
|
||||
```
|
||||
|
||||
|
||||
95
doc/reference/feature_compat.md
Normal file
@@ -0,0 +1,95 @@
|
||||
---
|
||||
module: [kind=reference] feature_compat
|
||||
---
|
||||
|
||||
# Lua 5.2/5.3 features in CC: Tweaked
|
||||
CC: Tweaked is based off of the Cobalt Lua runtime, which uses Lua 5.1. However, Cobalt and CC:T implement additional features from Lua 5.2 and 5.3 (as well as some deprecated 5.0 features) that are not available in base 5.1. This page lists all of the compatibility for these newer versions.
|
||||
|
||||
## Lua 5.2
|
||||
| Feature | Supported? | Notes |
|
||||
|---------------------------------------------------------------|------------|-------------------------------------------------------------------|
|
||||
| `goto`/labels | ❌ | |
|
||||
| `_ENV` | 🔶 | The `_ENV` global points to `getfenv()`, but it cannot be set. |
|
||||
| `\z` escape | ✔ | |
|
||||
| `\xNN` escape | ✔ | |
|
||||
| Hex literal fractional/exponent parts | ✔ | |
|
||||
| Empty statements | ❌ | |
|
||||
| `__len` metamethod | ✔ | |
|
||||
| `__ipairs` metamethod | ❌ | |
|
||||
| `__pairs` metamethod | ✔ | |
|
||||
| `bit32` library | ✔ | |
|
||||
| `collectgarbage` isrunning, generational, incremental options | ❌ | `collectgarbage` does not exist in CC:T. |
|
||||
| New `load` syntax | ✔ | |
|
||||
| `loadfile` mode parameter | ✔ | Supports both 5.1 and 5.2+ syntax. |
|
||||
| Removed `loadstring` | 🔶 | Only if `disable_lua51_features` is enabled in the configuration. |
|
||||
| Removed `getfenv`, `setfenv` | 🔶 | Only if `disable_lua51_features` is enabled in the configuration. |
|
||||
| `rawlen` function | ✔ | |
|
||||
| Negative index to `select` | ✔ | |
|
||||
| Removed `unpack` | 🔶 | Only if `disable_lua51_features` is enabled in the configuration. |
|
||||
| Arguments to `xpcall` | ❌ | |
|
||||
| Second return value from `coroutine.running` | ❌ | |
|
||||
| Removed `module` | ✔ | |
|
||||
| `package.loaders` -> `package.searchers` | ❌ | |
|
||||
| Second argument to loader functions | ✔ | |
|
||||
| `package.config` | ✔ | |
|
||||
| `package.searchpath` | ✔ | |
|
||||
| Removed `package.seeall` | ✔ | |
|
||||
| `string.dump` on functions with upvalues (blanks them out) | ✔ | |
|
||||
| `string.rep` separator | ❌ | |
|
||||
| `%g` match group | ❌ | |
|
||||
| Removal of `%z` match group | ❌ | |
|
||||
| Removed `table.maxn` | 🔶 | Only if `disable_lua51_features` is enabled in the configuration. |
|
||||
| `table.pack`/`table.unpack` | ✔ | |
|
||||
| `math.log` base argument | ✔ | |
|
||||
| Removed `math.log10` | 🔶 | Only if `disable_lua51_features` is enabled in the configuration. |
|
||||
| `*L` mode to `file:read` | ✔ | |
|
||||
| `os.execute` exit type + return value | ❌ | `os.execute` does not exist in CC:T. |
|
||||
| `os.exit` close argument | ❌ | `os.exit` does not exist in CC:T. |
|
||||
| `istailcall` field in `debug.getinfo` | ❌ | |
|
||||
| `nparams` field in `debug.getinfo` | ✔ | |
|
||||
| `isvararg` field in `debug.getinfo` | ✔ | |
|
||||
| `debug.getlocal` negative indices for varargs | ❌ | |
|
||||
| `debug.getuservalue`/`debug.setuservalue` | ❌ | Userdata are rarely used in CC:T, so this is not necessary. |
|
||||
| `debug.upvalueid` | ✔ | |
|
||||
| `debug.upvaluejoin` | ✔ | |
|
||||
| Tail call hooks | ❌ | |
|
||||
| `=` prefix for chunks | ✔ | |
|
||||
| Yield across C boundary | ✔ | |
|
||||
| Removal of ambiguity error | ❌ | |
|
||||
| Identifiers may no longer use locale-dependent letters | ✔ | |
|
||||
| Ephemeron tables | ❌ | |
|
||||
| Identical functions may be reused | ❌ | |
|
||||
| Generational garbage collector | ❌ | Cobalt uses the built-in Java garbage collector. |
|
||||
|
||||
## Lua 5.3
|
||||
| Feature | Supported? | Notes |
|
||||
|---------------------------------------------------------------------------------------|------------|---------------------------|
|
||||
| Integer subtype | ❌ | |
|
||||
| Bitwise operators/floor division | ❌ | |
|
||||
| `\u{XXX}` escape sequence | ✔ | |
|
||||
| `utf8` library | ✔ | |
|
||||
| removed `__ipairs` metamethod | ✔ | |
|
||||
| `coroutine.isyieldable` | ❌ | |
|
||||
| `string.dump` strip argument | ✔ | |
|
||||
| `string.pack`/`string.unpack`/`string.packsize` | ✔ | |
|
||||
| `table.move` | ❌ | |
|
||||
| `math.atan2` -> `math.atan` | ❌ | |
|
||||
| Removed `math.frexp`, `math.ldexp`, `math.pow`, `math.cosh`, `math.sinh`, `math.tanh` | ❌ | |
|
||||
| `math.maxinteger`/`math.mininteger` | ❌ | |
|
||||
| `math.tointeger` | ❌ | |
|
||||
| `math.type` | ❌ | |
|
||||
| `math.ult` | ❌ | |
|
||||
| Removed `bit32` library | ❌ | |
|
||||
| Remove `*` from `file:read` modes | ✔ | |
|
||||
| Metamethods respected in `table.*`, `ipairs` | 🔶 | Only `__lt` is respected. |
|
||||
|
||||
## Lua 5.0
|
||||
| Feature | Supported? | Notes |
|
||||
|----------------------------------|------------|--------------------------------------------------|
|
||||
| `arg` table | 🔶 | Only set in the shell - not used in functions. |
|
||||
| `string.gfind` | ✔ | Equal to `string.gmatch`. |
|
||||
| `table.getn` | ✔ | Equal to `#tbl`. |
|
||||
| `table.setn` | ❌ | |
|
||||
| `math.mod` | ✔ | Equal to `math.fmod`. |
|
||||
| `table.foreach`/`table.foreachi` | ✔ | |
|
||||
| `gcinfo` | ❌ | Cobalt uses the built-in Java garbage collector. |
|
||||
@@ -1,6 +1,4 @@
|
||||
--- The FS API allows you to manipulate files and the filesystem.
|
||||
--
|
||||
-- @module fs
|
||||
--- @module fs
|
||||
|
||||
--- Returns true if a path is mounted to the parent filesystem.
|
||||
--
|
||||
|
||||
@@ -62,7 +62,7 @@ function print(...) end
|
||||
-- @usage printError("Something went wrong!")
|
||||
function printError(...) end
|
||||
|
||||
--[[- Reads user input from the terminal, automatically handling arrow keys,
|
||||
--[[- Reads user input from the terminal. This automatically handles arrow keys,
|
||||
pasting, character replacement, history scrollback, auto-completion, and
|
||||
default values.
|
||||
|
||||
@@ -110,10 +110,15 @@ the prompt.
|
||||
]]
|
||||
function read(replaceChar, history, completeFn, default) end
|
||||
|
||||
--- The ComputerCraft and Minecraft version of the current computer environment.
|
||||
--- Stores the current ComputerCraft and Minecraft versions.
|
||||
--
|
||||
-- Outside of Minecraft (for instance, in an emulator) @{_HOST} will contain the
|
||||
-- emulator's version instead.
|
||||
--
|
||||
-- For example, `ComputerCraft 1.93.0 (Minecraft 1.15.2)`.
|
||||
-- @usage _HOST
|
||||
-- @usage Print the current computer's environment.
|
||||
--
|
||||
-- print(_HOST)
|
||||
-- @since 1.76
|
||||
_HOST = _HOST
|
||||
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
--- The http library allows communicating with web servers, sending and
|
||||
-- receiving data from them.
|
||||
--- Make HTTP requests, sending and receiving data to a remote web server.
|
||||
--
|
||||
-- @module http
|
||||
-- @since 1.1
|
||||
-- @see local_ips To allow accessing servers running on your local network.
|
||||
|
||||
--- Asynchronously make a HTTP request to the given url.
|
||||
--
|
||||
-- This returns immediately, a [`http_success`](#http-success-event) or
|
||||
-- [`http_failure`](#http-failure-event) will be queued once the request has
|
||||
-- completed.
|
||||
-- This returns immediately, a @{http_success} or @{http_failure} will be queued
|
||||
-- once the request has completed.
|
||||
--
|
||||
-- @tparam string url The url to request
|
||||
-- @tparam[opt] string body An optional string containing the body of the
|
||||
@@ -112,9 +111,8 @@ function post(...) end
|
||||
|
||||
--- Asynchronously determine whether a URL can be requested.
|
||||
--
|
||||
-- If this returns `true`, one should also listen for [`http_check`
|
||||
-- events](#http-check-event) which will container further information about
|
||||
-- whether the URL is allowed or not.
|
||||
-- If this returns `true`, one should also listen for @{http_check} which will
|
||||
-- container further information about whether the URL is allowed or not.
|
||||
--
|
||||
-- @tparam string url The URL to check.
|
||||
-- @treturn true When this url is not invalid. This does not imply that it is
|
||||
@@ -128,9 +126,8 @@ function checkURLAsync(url) end
|
||||
|
||||
--- Determine whether a URL can be requested.
|
||||
--
|
||||
-- If this returns `true`, one should also listen for [`http_check`
|
||||
-- events](#http-check-event) which will container further information about
|
||||
-- whether the URL is allowed or not.
|
||||
-- If this returns `true`, one should also listen for @{http_check} which will
|
||||
-- container further information about whether the URL is allowed or not.
|
||||
--
|
||||
-- @tparam string url The URL to check.
|
||||
-- @treturn true When this url is valid and can be requested via @{http.request}.
|
||||
@@ -168,9 +165,8 @@ function websocket(url, headers) end
|
||||
|
||||
--- Asynchronously open a websocket.
|
||||
--
|
||||
-- This returns immediately, a [`websocket_success`](#websocket-success-event)
|
||||
-- or [`websocket_failure`](#websocket-failure-event) will be queued once the
|
||||
-- request has completed.
|
||||
-- This returns immediately, a @{websocket_success} or @{websocket_failure}
|
||||
-- will be queued once the request has completed.
|
||||
--
|
||||
-- @tparam string url The websocket url to connect to. This should have the
|
||||
-- `ws://` or `wss://` protocol.
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
|
||||
# Mod properties
|
||||
mod_version=1.100.4
|
||||
mod_version=1.100.6
|
||||
|
||||
# Minecraft properties (update mods.toml when changing)
|
||||
mc_version=1.17.1
|
||||
mapping_version=2021.09.05
|
||||
forge_version=37.0.85
|
||||
mc_version=1.19
|
||||
mapping_version=2022.03.13
|
||||
forge_version=41.0.16
|
||||
# NO SERIOUSLY, UPDATE mods.toml WHEN CHANGING
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
; -*- mode: Lisp;-*-
|
||||
|
||||
(sources
|
||||
/doc/events/
|
||||
/doc/guides/
|
||||
/doc/stub/
|
||||
/doc/
|
||||
/build/docs/luaJavadoc/
|
||||
/src/main/resources/*/computercraft/lua/bios.lua
|
||||
/src/main/resources/*/computercraft/lua/rom/
|
||||
@@ -29,7 +27,8 @@
|
||||
(peripheral Peripherals)
|
||||
(generic_peripheral "Generic Peripherals")
|
||||
(event Events)
|
||||
(guide Guides))
|
||||
(guide Guides)
|
||||
(reference Reference))
|
||||
|
||||
(library-path
|
||||
/doc/stub/
|
||||
|
||||
1719
package-lock.json
generated
10
package.json
@@ -4,6 +4,7 @@
|
||||
"description": "Website additions for tweaked.cc",
|
||||
"author": "SquidDev",
|
||||
"license": "BSD-3-Clause",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"preact": "^10.5.5",
|
||||
"tslib": "^2.0.3"
|
||||
@@ -11,9 +12,18 @@
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-typescript": "^8.2.5",
|
||||
"@rollup/plugin-url": "^6.1.0",
|
||||
"@types/glob": "^7.2.0",
|
||||
"@types/react-dom": "^18.0.5",
|
||||
"glob": "^8.0.3",
|
||||
"react": "^18.1.0",
|
||||
"react-dom": "^18.1.0",
|
||||
"rehype": "^12.0.1",
|
||||
"rehype-highlight": "^5.0.2",
|
||||
"rehype-react": "^7.1.1",
|
||||
"requirejs": "^2.3.6",
|
||||
"rollup": "^2.33.1",
|
||||
"rollup-plugin-terser": "^7.0.2",
|
||||
"ts-node": "^10.8.0",
|
||||
"typescript": "^4.0.5"
|
||||
}
|
||||
}
|
||||
|
||||
760
src/generated/export/index.json
generated
Normal file
@@ -0,0 +1,760 @@
|
||||
{
|
||||
"itemNames": {
|
||||
"computercraft:cable": "Networking Cable",
|
||||
"computercraft:computer_advanced": "Advanced Computer",
|
||||
"computercraft:computer_command": "Command Computer",
|
||||
"computercraft:computer_normal": "Computer",
|
||||
"computercraft:disk": "Floppy Disk",
|
||||
"computercraft:disk_drive": "Disk Drive",
|
||||
"computercraft:monitor_advanced": "Advanced Monitor",
|
||||
"computercraft:monitor_normal": "Monitor",
|
||||
"computercraft:pocket_computer_advanced": "Advanced Pocket Computer",
|
||||
"computercraft:pocket_computer_normal": "Pocket Computer",
|
||||
"computercraft:printed_book": "Printed Book",
|
||||
"computercraft:printed_page": "Printed Page",
|
||||
"computercraft:printed_pages": "Printed Pages",
|
||||
"computercraft:printer": "Printer",
|
||||
"computercraft:speaker": "Speaker",
|
||||
"computercraft:treasure_disk": "Floppy Disk",
|
||||
"computercraft:turtle_advanced": "Advanced Turtle",
|
||||
"computercraft:turtle_normal": "Turtle",
|
||||
"computercraft:wired_modem": "Wired Modem",
|
||||
"computercraft:wired_modem_full": "Wired Modem",
|
||||
"computercraft:wireless_modem_advanced": "Ender Modem",
|
||||
"computercraft:wireless_modem_normal": "Wireless Modem",
|
||||
"minecraft:black_dye": "Black Dye",
|
||||
"minecraft:blue_dye": "Blue Dye",
|
||||
"minecraft:brown_dye": "Brown Dye",
|
||||
"minecraft:chest": "Chest",
|
||||
"minecraft:command_block": "Command Block",
|
||||
"minecraft:cyan_dye": "Cyan Dye",
|
||||
"minecraft:ender_eye": "Eye of Ender",
|
||||
"minecraft:ender_pearl": "Ender Pearl",
|
||||
"minecraft:glass_pane": "Glass Pane",
|
||||
"minecraft:gold_block": "Block of Gold",
|
||||
"minecraft:gold_ingot": "Gold Ingot",
|
||||
"minecraft:golden_apple": "Golden Apple",
|
||||
"minecraft:gray_dye": "Gray Dye",
|
||||
"minecraft:green_dye": "Green Dye",
|
||||
"minecraft:iron_ingot": "Iron Ingot",
|
||||
"minecraft:leather": "Leather",
|
||||
"minecraft:light_blue_dye": "Light Blue Dye",
|
||||
"minecraft:light_gray_dye": "Light Gray Dye",
|
||||
"minecraft:lime_dye": "Lime Dye",
|
||||
"minecraft:magenta_dye": "Magenta Dye",
|
||||
"minecraft:note_block": "Note Block",
|
||||
"minecraft:orange_dye": "Orange Dye",
|
||||
"minecraft:pink_dye": "Pink Dye",
|
||||
"minecraft:purple_dye": "Purple Dye",
|
||||
"minecraft:red_dye": "Red Dye",
|
||||
"minecraft:redstone": "Redstone Dust",
|
||||
"minecraft:stone": "Stone",
|
||||
"minecraft:string": "String",
|
||||
"minecraft:white_dye": "White Dye",
|
||||
"minecraft:yellow_dye": "Yellow Dye"
|
||||
},
|
||||
"recipes": {
|
||||
"computercraft:cable": {
|
||||
"inputs": [
|
||||
null,
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
null
|
||||
],
|
||||
"output": "computercraft:cable",
|
||||
"count": 6
|
||||
},
|
||||
"computercraft:computer_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:computer_advanced_upgrade": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:computer_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:computer_command": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:command_block"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_command",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:computer_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:disk_drive": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:disk_drive",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:monitor_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:monitor_advanced",
|
||||
"count": 4
|
||||
},
|
||||
"computercraft:monitor_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:monitor_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:pocket_computer_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:golden_apple"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:pocket_computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:pocket_computer_advanced_upgrade": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:pocket_computer_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:pocket_computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:pocket_computer_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:golden_apple"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:pocket_computer_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:printed_book": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:leather"
|
||||
],
|
||||
[
|
||||
"computercraft:printed_page"
|
||||
],
|
||||
[
|
||||
"minecraft:string"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:printed_book",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:printed_pages": {
|
||||
"inputs": [
|
||||
[
|
||||
"computercraft:printed_page"
|
||||
],
|
||||
[
|
||||
"computercraft:printed_page"
|
||||
],
|
||||
[
|
||||
"minecraft:string"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:printed_pages",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:printer": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:black_dye",
|
||||
"minecraft:blue_dye",
|
||||
"minecraft:brown_dye",
|
||||
"minecraft:cyan_dye",
|
||||
"minecraft:gray_dye",
|
||||
"minecraft:green_dye",
|
||||
"minecraft:light_blue_dye",
|
||||
"minecraft:light_gray_dye",
|
||||
"minecraft:lime_dye",
|
||||
"minecraft:magenta_dye",
|
||||
"minecraft:orange_dye",
|
||||
"minecraft:pink_dye",
|
||||
"minecraft:purple_dye",
|
||||
"minecraft:red_dye",
|
||||
"minecraft:white_dye",
|
||||
"minecraft:yellow_dye"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:printer",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:speaker": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:note_block"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:speaker",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:turtle_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:computer_advanced"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:chest"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:turtle_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:turtle_advanced_upgrade": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:turtle_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:gold_block"
|
||||
],
|
||||
null
|
||||
],
|
||||
"output": "computercraft:turtle_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:turtle_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:computer_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:chest"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:turtle_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wired_modem": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:wired_modem",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wired_modem_full_from": {
|
||||
"inputs": [
|
||||
[
|
||||
"computercraft:wired_modem"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:wired_modem_full",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wired_modem_full_to": {
|
||||
"inputs": [
|
||||
[
|
||||
"computercraft:wired_modem_full"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:wired_modem",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wireless_modem_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:ender_eye"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:wireless_modem_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wireless_modem_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:ender_pearl"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:wireless_modem_normal",
|
||||
"count": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
src/generated/export/items/computercraft/cable.png
generated
Normal file
|
After Width: | Height: | Size: 375 B |
BIN
src/generated/export/items/computercraft/computer_advanced.png
generated
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
src/generated/export/items/computercraft/computer_command.png
generated
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
src/generated/export/items/computercraft/computer_normal.png
generated
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/generated/export/items/computercraft/disk.png
generated
Normal file
|
After Width: | Height: | Size: 189 B |
BIN
src/generated/export/items/computercraft/disk_drive.png
generated
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/generated/export/items/computercraft/monitor_advanced.png
generated
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
src/generated/export/items/computercraft/monitor_normal.png
generated
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/generated/export/items/computercraft/pocket_computer_advanced.png
generated
Normal file
|
After Width: | Height: | Size: 158 B |
BIN
src/generated/export/items/computercraft/pocket_computer_normal.png
generated
Normal file
|
After Width: | Height: | Size: 158 B |
BIN
src/generated/export/items/computercraft/printed_book.png
generated
Normal file
|
After Width: | Height: | Size: 287 B |
BIN
src/generated/export/items/computercraft/printed_page.png
generated
Normal file
|
After Width: | Height: | Size: 208 B |
BIN
src/generated/export/items/computercraft/printed_pages.png
generated
Normal file
|
After Width: | Height: | Size: 259 B |
BIN
src/generated/export/items/computercraft/printer.png
generated
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/generated/export/items/computercraft/speaker.png
generated
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/generated/export/items/computercraft/treasure_disk.png
generated
Normal file
|
After Width: | Height: | Size: 189 B |
BIN
src/generated/export/items/computercraft/turtle_advanced.png
generated
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/generated/export/items/computercraft/turtle_normal.png
generated
Normal file
|
After Width: | Height: | Size: 977 B |
BIN
src/generated/export/items/computercraft/wired_modem.png
generated
Normal file
|
After Width: | Height: | Size: 593 B |
BIN
src/generated/export/items/computercraft/wired_modem_full.png
generated
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/generated/export/items/computercraft/wireless_modem_advanced.png
generated
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/generated/export/items/computercraft/wireless_modem_normal.png
generated
Normal file
|
After Width: | Height: | Size: 620 B |
BIN
src/generated/export/items/minecraft/black_dye.png
generated
Normal file
|
After Width: | Height: | Size: 218 B |
BIN
src/generated/export/items/minecraft/blue_dye.png
generated
Normal file
|
After Width: | Height: | Size: 228 B |
BIN
src/generated/export/items/minecraft/brown_dye.png
generated
Normal file
|
After Width: | Height: | Size: 218 B |
BIN
src/generated/export/items/minecraft/chest.png
generated
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/generated/export/items/minecraft/command_block.png
generated
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/generated/export/items/minecraft/cyan_dye.png
generated
Normal file
|
After Width: | Height: | Size: 243 B |
BIN
src/generated/export/items/minecraft/ender_eye.png
generated
Normal file
|
After Width: | Height: | Size: 278 B |
BIN
src/generated/export/items/minecraft/ender_pearl.png
generated
Normal file
|
After Width: | Height: | Size: 266 B |
BIN
src/generated/export/items/minecraft/glass_pane.png
generated
Normal file
|
After Width: | Height: | Size: 186 B |
BIN
src/generated/export/items/minecraft/gold_block.png
generated
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/generated/export/items/minecraft/gold_ingot.png
generated
Normal file
|
After Width: | Height: | Size: 240 B |
BIN
src/generated/export/items/minecraft/golden_apple.png
generated
Normal file
|
After Width: | Height: | Size: 257 B |
BIN
src/generated/export/items/minecraft/gray_dye.png
generated
Normal file
|
After Width: | Height: | Size: 229 B |
BIN
src/generated/export/items/minecraft/green_dye.png
generated
Normal file
|
After Width: | Height: | Size: 236 B |
BIN
src/generated/export/items/minecraft/iron_ingot.png
generated
Normal file
|
After Width: | Height: | Size: 240 B |
BIN
src/generated/export/items/minecraft/leather.png
generated
Normal file
|
After Width: | Height: | Size: 242 B |
BIN
src/generated/export/items/minecraft/light_blue_dye.png
generated
Normal file
|
After Width: | Height: | Size: 224 B |
BIN
src/generated/export/items/minecraft/light_gray_dye.png
generated
Normal file
|
After Width: | Height: | Size: 229 B |
BIN
src/generated/export/items/minecraft/lime_dye.png
generated
Normal file
|
After Width: | Height: | Size: 221 B |
BIN
src/generated/export/items/minecraft/magenta_dye.png
generated
Normal file
|
After Width: | Height: | Size: 220 B |
BIN
src/generated/export/items/minecraft/note_block.png
generated
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/generated/export/items/minecraft/orange_dye.png
generated
Normal file
|
After Width: | Height: | Size: 232 B |
BIN
src/generated/export/items/minecraft/pink_dye.png
generated
Normal file
|
After Width: | Height: | Size: 220 B |
BIN
src/generated/export/items/minecraft/purple_dye.png
generated
Normal file
|
After Width: | Height: | Size: 220 B |
BIN
src/generated/export/items/minecraft/red_dye.png
generated
Normal file
|
After Width: | Height: | Size: 233 B |
BIN
src/generated/export/items/minecraft/redstone.png
generated
Normal file
|
After Width: | Height: | Size: 236 B |
BIN
src/generated/export/items/minecraft/stone.png
generated
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/generated/export/items/minecraft/string.png
generated
Normal file
|
After Width: | Height: | Size: 193 B |
BIN
src/generated/export/items/minecraft/white_dye.png
generated
Normal file
|
After Width: | Height: | Size: 245 B |
BIN
src/generated/export/items/minecraft/yellow_dye.png
generated
Normal file
|
After Width: | Height: | Size: 235 B |
@@ -22,8 +22,7 @@
|
||||
"cable": "true"
|
||||
}
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "wired_modem",
|
||||
@@ -49,8 +48,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -29,8 +29,7 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -29,8 +29,7 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -29,8 +29,7 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -29,8 +29,7 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -29,8 +29,7 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -15,8 +15,7 @@
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
],
|
||||
"functions": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
package dan200.computercraft;
|
||||
|
||||
import dan200.computercraft.api.ComputerCraftAPI.IComputerCraftAPI;
|
||||
import dan200.computercraft.api.detail.IDetailProvider;
|
||||
import dan200.computercraft.api.filesystem.IMount;
|
||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||
import dan200.computercraft.api.lua.GenericSource;
|
||||
@@ -24,13 +25,13 @@ import dan200.computercraft.shared.BundledRedstone;
|
||||
import dan200.computercraft.shared.MediaProviders;
|
||||
import dan200.computercraft.shared.Peripherals;
|
||||
import dan200.computercraft.shared.peripheral.generic.GenericPeripheralProvider;
|
||||
import dan200.computercraft.shared.peripheral.generic.data.DetailProviders;
|
||||
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
|
||||
import dan200.computercraft.shared.util.IDAssigner;
|
||||
import dan200.computercraft.shared.wired.WiredNode;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.packs.resources.ReloadableResourceManager;
|
||||
import net.minecraft.server.packs.resources.ResourceManager;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
@@ -38,7 +39,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.fml.ModList;
|
||||
import net.minecraftforge.fmllegacy.server.ServerLifecycleHooks;
|
||||
import net.minecraftforge.server.ServerLifecycleHooks;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.io.File;
|
||||
@@ -59,10 +60,12 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
|
||||
|
||||
public static InputStream getResourceFile( String domain, String subPath )
|
||||
{
|
||||
ReloadableResourceManager manager = (ReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getResourceManager();
|
||||
var manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
|
||||
var resource = manager.getResource( new ResourceLocation( domain, subPath ) ).orElse( null );
|
||||
if( resource == null ) return null;
|
||||
try
|
||||
{
|
||||
return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
|
||||
return resource.open();
|
||||
}
|
||||
catch( IOException ignored )
|
||||
{
|
||||
@@ -156,6 +159,12 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
|
||||
ApiFactories.register( factory );
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void registerDetailProvider( @Nonnull Class<T> type, @Nonnull IDetailProvider<T> provider )
|
||||
{
|
||||
DetailProviders.registerProvider( type, provider );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element )
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
*/
|
||||
package dan200.computercraft.api;
|
||||
|
||||
import dan200.computercraft.api.detail.BlockReference;
|
||||
import dan200.computercraft.api.detail.IDetailProvider;
|
||||
import dan200.computercraft.api.filesystem.IMount;
|
||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||
import dan200.computercraft.api.lua.GenericSource;
|
||||
@@ -20,10 +22,12 @@ import dan200.computercraft.api.peripheral.IPeripheralProvider;
|
||||
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
@@ -196,6 +200,20 @@ public final class ComputerCraftAPI
|
||||
getInstance().registerAPIFactory( factory );
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a detail provider to provide additional details for blocks, fluids and items when inspected by methods
|
||||
* such as {@code turtle.getItemDetail()} or {@code turtle.inspect()}.
|
||||
*
|
||||
* @param type The type of object that this provider can provide details for. Should be {@link BlockReference},
|
||||
* {@link FluidStack} or {@link ItemStack}.
|
||||
* @param provider The detail provider to register.
|
||||
* @param <T> The type of object that this provider can provide details for.
|
||||
*/
|
||||
public static <T> void registerDetailProvider( @Nonnull Class<T> type, @Nonnull IDetailProvider<T> provider )
|
||||
{
|
||||
getInstance().registerDetailProvider( type, provider );
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new wired node for a given wired element.
|
||||
*
|
||||
@@ -272,6 +290,8 @@ public final class ComputerCraftAPI
|
||||
|
||||
void registerAPIFactory( @Nonnull ILuaAPIFactory factory );
|
||||
|
||||
<T> void registerDetailProvider( @Nonnull Class<T> type, @Nonnull IDetailProvider<T> provider );
|
||||
|
||||
@Nonnull
|
||||
IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element );
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import dan200.computercraft.ComputerCraft;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.tags.ItemTags;
|
||||
import net.minecraft.tags.Tag;
|
||||
import net.minecraft.tags.TagKey;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
|
||||
@@ -20,47 +20,47 @@ public class ComputerCraftTags
|
||||
{
|
||||
public static class Items
|
||||
{
|
||||
public static final Tag.Named<Item> COMPUTER = make( "computer" );
|
||||
public static final Tag.Named<Item> TURTLE = make( "turtle" );
|
||||
public static final Tag.Named<Item> WIRED_MODEM = make( "wired_modem" );
|
||||
public static final Tag.Named<Item> MONITOR = make( "monitor" );
|
||||
public static final TagKey<Item> COMPUTER = make( "computer" );
|
||||
public static final TagKey<Item> TURTLE = make( "turtle" );
|
||||
public static final TagKey<Item> WIRED_MODEM = make( "wired_modem" );
|
||||
public static final TagKey<Item> MONITOR = make( "monitor" );
|
||||
|
||||
private static Tag.Named<Item> make( String name )
|
||||
private static TagKey<Item> make( String name )
|
||||
{
|
||||
return ItemTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() );
|
||||
return ItemTags.create( new ResourceLocation( ComputerCraft.MOD_ID, name ) );
|
||||
}
|
||||
}
|
||||
|
||||
public static class Blocks
|
||||
{
|
||||
public static final Tag.Named<Block> COMPUTER = make( "computer" );
|
||||
public static final Tag.Named<Block> TURTLE = make( "turtle" );
|
||||
public static final Tag.Named<Block> WIRED_MODEM = make( "wired_modem" );
|
||||
public static final Tag.Named<Block> MONITOR = make( "monitor" );
|
||||
public static final TagKey<Block> COMPUTER = make( "computer" );
|
||||
public static final TagKey<Block> TURTLE = make( "turtle" );
|
||||
public static final TagKey<Block> WIRED_MODEM = make( "wired_modem" );
|
||||
public static final TagKey<Block> MONITOR = make( "monitor" );
|
||||
|
||||
/**
|
||||
* Blocks which can be broken by any turtle tool.
|
||||
*/
|
||||
public static final Tag.Named<Block> TURTLE_ALWAYS_BREAKABLE = make( "turtle_always_breakable" );
|
||||
public static final TagKey<Block> TURTLE_ALWAYS_BREAKABLE = make( "turtle_always_breakable" );
|
||||
|
||||
/**
|
||||
* Blocks which can be broken by the default shovel tool.
|
||||
*/
|
||||
public static final Tag.Named<Block> TURTLE_SHOVEL_BREAKABLE = make( "turtle_shovel_harvestable" );
|
||||
public static final TagKey<Block> TURTLE_SHOVEL_BREAKABLE = make( "turtle_shovel_harvestable" );
|
||||
|
||||
/**
|
||||
* Blocks which can be broken with the default sword tool.
|
||||
*/
|
||||
public static final Tag.Named<Block> TURTLE_SWORD_BREAKABLE = make( "turtle_sword_harvestable" );
|
||||
public static final TagKey<Block> TURTLE_SWORD_BREAKABLE = make( "turtle_sword_harvestable" );
|
||||
|
||||
/**
|
||||
* Blocks which can be broken with the default hoe tool.
|
||||
*/
|
||||
public static final Tag.Named<Block> TURTLE_HOE_BREAKABLE = make( "turtle_hoe_harvestable" );
|
||||
public static final TagKey<Block> TURTLE_HOE_BREAKABLE = make( "turtle_hoe_harvestable" );
|
||||
|
||||
private static Tag.Named<Block> make( String name )
|
||||
private static TagKey<Block> make( String name )
|
||||
{
|
||||
return BlockTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() );
|
||||
return BlockTags.create( new ResourceLocation( ComputerCraft.MOD_ID, name ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* This file is part of the public ComputerCraft API - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. 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.detail;
|
||||
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* An item detail provider for {@link ItemStack}'s whose {@link Item} has a specific type.
|
||||
*
|
||||
* @param <T> The type the stack's item must have.
|
||||
*/
|
||||
public abstract class BasicItemDetailProvider<T> implements IDetailProvider<ItemStack>
|
||||
{
|
||||
private final Class<T> itemType;
|
||||
private final String namespace;
|
||||
|
||||
/**
|
||||
* Create a new item detail provider. Meta will be inserted into a new sub-map named as per {@code namespace}.
|
||||
*
|
||||
* @param itemType The type the stack's item must have.
|
||||
* @param namespace The namespace to use for this provider.
|
||||
*/
|
||||
public BasicItemDetailProvider( String namespace, @Nonnull Class<T> itemType )
|
||||
{
|
||||
Objects.requireNonNull( itemType );
|
||||
this.itemType = itemType;
|
||||
this.namespace = namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new item detail provider. Meta will be inserted directly into the results.
|
||||
*
|
||||
* @param itemType The type the stack's item must have.
|
||||
*/
|
||||
public BasicItemDetailProvider( @Nonnull Class<T> itemType )
|
||||
{
|
||||
this( null, itemType );
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide additional details for the given {@link Item} and {@link ItemStack}. This method is called by
|
||||
* {@code turtle.getItemDetail()}. New properties should be added to the given {@link Map}, {@code data}.
|
||||
*
|
||||
* This method is always called on the server thread, so it is safe to interact with the world here, but you should
|
||||
* take care to avoid long blocking operations as this will stall the server and other computers.
|
||||
*
|
||||
* @param data The full details to be returned for this item stack. New properties should be added to this map.
|
||||
* @param stack The item stack to provide details for.
|
||||
* @param item The item to provide details for.
|
||||
*/
|
||||
public abstract void provideDetails( @Nonnull Map<? super String, Object> data, @Nonnull ItemStack stack,
|
||||
@Nonnull T item );
|
||||
|
||||
@Override
|
||||
public void provideDetails( @Nonnull Map<? super String, Object> data, @Nonnull ItemStack stack )
|
||||
{
|
||||
Item item = stack.getItem();
|
||||
if( !itemType.isInstance( item ) ) return;
|
||||
|
||||
// If `namespace` is specified, insert into a new data map instead of the existing one.
|
||||
Map<? super String, Object> child = namespace == null ? data : new HashMap<>();
|
||||
|
||||
provideDetails( child, stack, itemType.cast( item ) );
|
||||
|
||||
if( namespace != null )
|
||||
{
|
||||
data.put( namespace, child );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* This file is part of the public ComputerCraft API - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. 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.detail;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* A reference to a block in the world, used by block detail providers.
|
||||
*
|
||||
* @param level The level the block exists in.
|
||||
* @param pos The position of the block.
|
||||
* @param state The block state at this position.
|
||||
* @param blockEntity The block entity at this position, if it exists.
|
||||
*/
|
||||
public record BlockReference(
|
||||
@Nonnull Level level,
|
||||
@Nonnull BlockPos pos,
|
||||
@Nonnull BlockState state,
|
||||
@Nullable BlockEntity blockEntity
|
||||
)
|
||||
{
|
||||
public BlockReference( Level level, BlockPos pos )
|
||||
{
|
||||
this( level, pos, level.getBlockState( pos ), level.getBlockEntity( pos ) );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* This file is part of the public ComputerCraft API - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. 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.detail;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* This interface is used to provide details about a block, fluid, or item.
|
||||
*
|
||||
* @param <T> The type of object that this provider can provide details for.
|
||||
* @see dan200.computercraft.api.ComputerCraftAPI#registerDetailProvider(Class, IDetailProvider)
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface IDetailProvider<T>
|
||||
{
|
||||
/**
|
||||
* Provide additional details for the given object. This method is called by functions such as
|
||||
* {@code turtle.getItemDetail()} and {@code turtle.inspect()}. New properties should be added to the given
|
||||
* {@link Map}, {@code data}.
|
||||
*
|
||||
* This method is always called on the server thread, so it is safe to interact with the world here, but you should
|
||||
* take care to avoid long blocking operations as this will stall the server and other computers.
|
||||
*
|
||||
* @param data The full details to be returned. New properties should be added to this map.
|
||||
* @param object The object to provide details for.
|
||||
*/
|
||||
void provideDetails( @Nonnull Map<? super String, Object> data, @Nonnull T object );
|
||||
}
|
||||
@@ -188,8 +188,8 @@ public interface IArguments
|
||||
*
|
||||
* Classes implementing this interface may choose to implement a more optimised version which does not copy the
|
||||
* table, instead returning a wrapper version, making it more efficient. However, the caller must guarantee that
|
||||
* they do not access off the computer thread (and so should not be used with main-thread functions) or once the
|
||||
* function call has finished (for instance, in callbacks).
|
||||
* they do not access the table the computer thread (and so should not be used with main-thread functions) or once
|
||||
* the initial call has finished (for instance, in a callback to {@link MethodResult#pullEvent}).
|
||||
*
|
||||
* @param index The argument number.
|
||||
* @return The argument's value.
|
||||
@@ -448,7 +448,10 @@ public interface IArguments
|
||||
* This is called when the current function finishes, before any main thread tasks have run.
|
||||
*
|
||||
* Called when the current function returns, and so some values are no longer guaranteed to be safe to access.
|
||||
*
|
||||
* @deprecated This method was an internal implementation detail and is no longer used.
|
||||
*/
|
||||
@Deprecated
|
||||
default void releaseImmediate()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -5,12 +5,10 @@
|
||||
*/
|
||||
package dan200.computercraft.api.lua;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* An implementation of {@link IArguments} which wraps an array of {@link Object}.
|
||||
@@ -19,7 +17,6 @@ public final class ObjectArguments implements IArguments
|
||||
{
|
||||
private static final IArguments EMPTY = new ObjectArguments();
|
||||
|
||||
private boolean released = false;
|
||||
private final List<Object> args;
|
||||
|
||||
@Deprecated
|
||||
@@ -67,34 +64,4 @@ public final class ObjectArguments implements IArguments
|
||||
{
|
||||
return args.toArray();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public LuaTable<?, ?> getTableUnsafe( int index ) throws LuaException
|
||||
{
|
||||
if( released )
|
||||
{
|
||||
throw new IllegalStateException( "Cannot use getTableUnsafe after IArguments has been released" );
|
||||
}
|
||||
|
||||
return IArguments.super.getTableUnsafe( index );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public Optional<LuaTable<?, ?>> optTableUnsafe( int index ) throws LuaException
|
||||
{
|
||||
if( released )
|
||||
{
|
||||
throw new IllegalStateException( "Cannot use optTableUnsafe after IArguments has been released" );
|
||||
}
|
||||
|
||||
return IArguments.super.optTableUnsafe( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void releaseImmediate()
|
||||
{
|
||||
released = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,6 @@ public abstract class PocketUpgradeDataProvider extends UpgradeDataProvider<IPoc
|
||||
{
|
||||
public PocketUpgradeDataProvider( @Nonnull DataGenerator generator )
|
||||
{
|
||||
super( generator, "Pocket Computer Upgrades", "computercraft/pocket_upgrades", PocketUpgradeSerialiser.TYPE );
|
||||
super( generator, "Pocket Computer Upgrades", "computercraft/pocket_upgrades", PocketUpgradeSerialiser.registry() );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,15 +5,18 @@
|
||||
*/
|
||||
package dan200.computercraft.api.pocket;
|
||||
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.upgrades.IUpgradeBase;
|
||||
import dan200.computercraft.api.upgrades.UpgradeSerialiser;
|
||||
import dan200.computercraft.internal.upgrades.SerialiserWithCraftingItem;
|
||||
import dan200.computercraft.internal.upgrades.SimpleSerialiser;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.crafting.SimpleRecipeSerializer;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistryEntry;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
import net.minecraftforge.registries.RegistryManager;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
@@ -33,19 +36,23 @@ import java.util.function.Function;
|
||||
public interface PocketUpgradeSerialiser<T extends IPocketUpgrade> extends UpgradeSerialiser<T, PocketUpgradeSerialiser<?>>
|
||||
{
|
||||
/**
|
||||
* A {@link Class} representing an abstract {@link PocketUpgradeSerialiser}. This is largely intended for use with
|
||||
* Forge Registry methods/classes, such as {@link DeferredRegister} and {@link RegistryManager#getRegistry(Class)}.
|
||||
* The ID for the associated registry.
|
||||
*
|
||||
* This is largely intended for use with Forge Registry methods/classes, such as {@link DeferredRegister} and
|
||||
* {@link RegistryManager#getRegistry(ResourceKey)}.
|
||||
*
|
||||
* @see #registry()
|
||||
*/
|
||||
@SuppressWarnings( "unchecked" )
|
||||
Class<PocketUpgradeSerialiser<?>> TYPE = (Class<PocketUpgradeSerialiser<?>>) (Class<?>) PocketUpgradeSerialiser.class;
|
||||
ResourceKey<Registry<PocketUpgradeSerialiser<?>>> REGISTRY_ID = ResourceKey.createRegistryKey( new ResourceLocation( ComputerCraft.MOD_ID, "pocket_upgrade_serialiser" ) );
|
||||
|
||||
/**
|
||||
* A convenient base class to inherit to implement {@link PocketUpgradeSerialiser}.
|
||||
*
|
||||
* @param <T> The type of the upgrade created by this serialiser.
|
||||
* The associated registry.
|
||||
* @return The registry for pocket upgrade serialisers.
|
||||
* @see #REGISTRY_ID
|
||||
*/
|
||||
abstract class Base<T extends IPocketUpgrade> extends ForgeRegistryEntry<PocketUpgradeSerialiser<?>> implements PocketUpgradeSerialiser<T>
|
||||
static IForgeRegistry<PocketUpgradeSerialiser<?>> registry()
|
||||
{
|
||||
return RegistryManager.ACTIVE.getRegistry( REGISTRY_ID );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,11 +10,12 @@ import dan200.computercraft.api.ComputerCraftTags;
|
||||
import dan200.computercraft.api.upgrades.UpgradeDataProvider;
|
||||
import net.minecraft.data.DataGenerator;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.tags.Tag;
|
||||
import net.minecraft.tags.TagKey;
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraftforge.forge.event.lifecycle.GatherDataEvent;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.function.Consumer;
|
||||
@@ -34,7 +35,7 @@ public abstract class TurtleUpgradeDataProvider extends UpgradeDataProvider<ITur
|
||||
|
||||
public TurtleUpgradeDataProvider( DataGenerator generator )
|
||||
{
|
||||
super( generator, "Turtle Upgrades", "computercraft/turtle_upgrades", TurtleUpgradeSerialiser.TYPE );
|
||||
super( generator, "Turtle Upgrades", "computercraft/turtle_upgrades", TurtleUpgradeSerialiser.registry() );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,7 +43,7 @@ public abstract class TurtleUpgradeDataProvider extends UpgradeDataProvider<ITur
|
||||
*
|
||||
* @param id The ID of this tool.
|
||||
* @param item The item used for tool actions. Note, this doesn't inherit all properties of the tool, you may need
|
||||
* to specify {@link ToolBuilder#damageMultiplier(float)} and {@link ToolBuilder#breakable(Tag.Named)}.
|
||||
* to specify {@link ToolBuilder#damageMultiplier(float)} and {@link ToolBuilder#breakable(TagKey)}.
|
||||
* @return A tool builder,
|
||||
*/
|
||||
@Nonnull
|
||||
@@ -64,7 +65,7 @@ public abstract class TurtleUpgradeDataProvider extends UpgradeDataProvider<ITur
|
||||
private String adjective;
|
||||
private Item craftingItem;
|
||||
private Float damageMultiplier = null;
|
||||
private Tag.Named<Block> breakable;
|
||||
private TagKey<Block> breakable;
|
||||
|
||||
ToolBuilder( ResourceLocation id, TurtleUpgradeSerialiser<?> serialiser, Item toolItem )
|
||||
{
|
||||
@@ -123,7 +124,7 @@ public abstract class TurtleUpgradeDataProvider extends UpgradeDataProvider<ITur
|
||||
* @return The tool builder, for further use.
|
||||
* @see ComputerCraftTags.Blocks
|
||||
*/
|
||||
public ToolBuilder breakable( @Nonnull Tag.Named<Block> breakable )
|
||||
public ToolBuilder breakable( @Nonnull TagKey<Block> breakable )
|
||||
{
|
||||
this.breakable = breakable;
|
||||
return this;
|
||||
@@ -137,11 +138,11 @@ public abstract class TurtleUpgradeDataProvider extends UpgradeDataProvider<ITur
|
||||
public void add( @Nonnull Consumer<Upgrade<TurtleUpgradeSerialiser<?>>> add )
|
||||
{
|
||||
add.accept( new Upgrade<>( id, serialiser, s -> {
|
||||
s.addProperty( "item", toolItem.getRegistryName().toString() );
|
||||
s.addProperty( "item", ForgeRegistries.ITEMS.getKey( toolItem ).toString() );
|
||||
if( adjective != null ) s.addProperty( "adjective", adjective );
|
||||
if( craftingItem != null ) s.addProperty( "craftItem", craftingItem.getRegistryName().toString() );
|
||||
if( craftingItem != null ) s.addProperty( "craftItem", ForgeRegistries.ITEMS.getKey( craftingItem ).toString() );
|
||||
if( damageMultiplier != null ) s.addProperty( "damageMultiplier", damageMultiplier );
|
||||
if( breakable != null ) s.addProperty( "breakable", breakable.getName().toString() );
|
||||
if( breakable != null ) s.addProperty( "breakable", breakable.location().toString() );
|
||||
} ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,16 +5,18 @@
|
||||
*/
|
||||
package dan200.computercraft.api.turtle;
|
||||
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.upgrades.IUpgradeBase;
|
||||
import dan200.computercraft.api.upgrades.UpgradeSerialiser;
|
||||
import dan200.computercraft.internal.upgrades.SerialiserWithCraftingItem;
|
||||
import dan200.computercraft.internal.upgrades.SimpleSerialiser;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.crafting.RecipeSerializer;
|
||||
import net.minecraft.world.item.crafting.SimpleRecipeSerializer;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistryEntry;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
import net.minecraftforge.registries.RegistryManager;
|
||||
|
||||
@@ -61,19 +63,22 @@ import java.util.function.Function;
|
||||
public interface TurtleUpgradeSerialiser<T extends ITurtleUpgrade> extends UpgradeSerialiser<T, TurtleUpgradeSerialiser<?>>
|
||||
{
|
||||
/**
|
||||
* A {@link Class} representing an abstract {@link TurtleUpgradeSerialiser}. This is largely intended for use with
|
||||
* Forge Registry methods/classes, such as {@link DeferredRegister} and {@link RegistryManager#getRegistry(Class)}.
|
||||
* The ID for the associated registry.
|
||||
*
|
||||
* This is largely intended for use with Forge Registry methods/classes, such as {@link DeferredRegister} and
|
||||
* {@link RegistryManager#getRegistry(ResourceKey)}.
|
||||
* @see #registry()
|
||||
*/
|
||||
@SuppressWarnings( "unchecked" )
|
||||
Class<TurtleUpgradeSerialiser<?>> TYPE = (Class<TurtleUpgradeSerialiser<?>>) (Class<?>) TurtleUpgradeSerialiser.class;
|
||||
ResourceKey<Registry<TurtleUpgradeSerialiser<?>>> REGISTRY_ID = ResourceKey.createRegistryKey( new ResourceLocation( ComputerCraft.MOD_ID, "turtle_upgrade_serialiser" ) );
|
||||
|
||||
/**
|
||||
* A convenient base class to inherit to implement {@link TurtleUpgradeSerialiser}.
|
||||
*
|
||||
* @param <T> The type of the upgrade created by this serialiser.
|
||||
* The associated registry.
|
||||
* @return The registry for pocket upgrade serialisers.
|
||||
* @see #REGISTRY_ID
|
||||
*/
|
||||
abstract class Base<T extends ITurtleUpgrade> extends ForgeRegistryEntry<TurtleUpgradeSerialiser<?>> implements TurtleUpgradeSerialiser<T>
|
||||
static IForgeRegistry<TurtleUpgradeSerialiser<?>> registry()
|
||||
{
|
||||
return RegistryManager.ACTIVE.getRegistry( REGISTRY_ID );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,12 +12,13 @@ import com.google.gson.JsonParseException;
|
||||
import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
|
||||
import dan200.computercraft.internal.upgrades.SerialiserWithCraftingItem;
|
||||
import dan200.computercraft.internal.upgrades.SimpleSerialiser;
|
||||
import net.minecraft.data.CachedOutput;
|
||||
import net.minecraft.data.DataGenerator;
|
||||
import net.minecraft.data.DataProvider;
|
||||
import net.minecraft.data.HashCache;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraftforge.registries.RegistryManager;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@@ -43,16 +44,16 @@ public abstract class UpgradeDataProvider<T extends IUpgradeBase, R extends Upgr
|
||||
private final DataGenerator generator;
|
||||
private final String name;
|
||||
private final String folder;
|
||||
private final Class<R> klass;
|
||||
private final IForgeRegistry<R> registry;
|
||||
|
||||
private List<T> upgrades;
|
||||
|
||||
protected UpgradeDataProvider( @Nonnull DataGenerator generator, @Nonnull String name, @Nonnull String folder, @Nonnull Class<R> klass )
|
||||
protected UpgradeDataProvider( @Nonnull DataGenerator generator, @Nonnull String name, @Nonnull String folder, @Nonnull IForgeRegistry<R> registry )
|
||||
{
|
||||
this.generator = generator;
|
||||
this.name = name;
|
||||
this.folder = folder;
|
||||
this.klass = klass;
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -90,7 +91,7 @@ public abstract class UpgradeDataProvider<T extends IUpgradeBase, R extends Upgr
|
||||
}
|
||||
|
||||
return new Upgrade<>( id, serialiser, s ->
|
||||
s.addProperty( "item", Objects.requireNonNull( item.getRegistryName(), "Item is not registered" ).toString() )
|
||||
s.addProperty( "item", Objects.requireNonNull( ForgeRegistries.ITEMS.getKey( item ), "Item is not registered" ).toString() )
|
||||
);
|
||||
}
|
||||
|
||||
@@ -109,7 +110,7 @@ public abstract class UpgradeDataProvider<T extends IUpgradeBase, R extends Upgr
|
||||
protected abstract void addUpgrades( @Nonnull Consumer<Upgrade<R>> addUpgrade );
|
||||
|
||||
@Override
|
||||
public final void run( @Nonnull HashCache cache ) throws IOException
|
||||
public final void run( @Nonnull CachedOutput cache ) throws IOException
|
||||
{
|
||||
Path base = generator.getOutputFolder().resolve( "data" );
|
||||
|
||||
@@ -119,12 +120,12 @@ public abstract class UpgradeDataProvider<T extends IUpgradeBase, R extends Upgr
|
||||
if( !seen.add( upgrade.id() ) ) throw new IllegalStateException( "Duplicate upgrade " + upgrade.id() );
|
||||
|
||||
var json = new JsonObject();
|
||||
json.addProperty( "type", Objects.requireNonNull( upgrade.serialiser().getRegistryName(), "Serialiser has not been registered" ).toString() );
|
||||
json.addProperty( "type", Objects.requireNonNull( registry.getKey( upgrade.serialiser() ), "Serialiser has not been registered" ).toString() );
|
||||
upgrade.serialise().accept( json );
|
||||
|
||||
try
|
||||
{
|
||||
DataProvider.save( GSON, cache, json, base.resolve( upgrade.id().getNamespace() + "/" + folder + "/" + upgrade.id().getPath() + ".json" ) );
|
||||
DataProvider.saveStable( cache, json, base.resolve( upgrade.id().getNamespace() + "/" + folder + "/" + upgrade.id().getPath() + ".json" ) );
|
||||
}
|
||||
catch( IOException e )
|
||||
{
|
||||
@@ -155,8 +156,8 @@ public abstract class UpgradeDataProvider<T extends IUpgradeBase, R extends Upgr
|
||||
@Nonnull
|
||||
public final R existingSerialiser( @Nonnull ResourceLocation id )
|
||||
{
|
||||
var result = RegistryManager.ACTIVE.getRegistry( klass ).getValue( id );
|
||||
if( result == null ) throw new IllegalArgumentException( "No such serialiser " + klass );
|
||||
var result = registry.getValue( id );
|
||||
if( result == null ) throw new IllegalArgumentException( "No such serialiser " + registry );
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ import dan200.computercraft.api.pocket.PocketUpgradeSerialiser;
|
||||
import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraftforge.registries.IForgeRegistryEntry;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
@@ -25,7 +24,7 @@ import javax.annotation.Nonnull;
|
||||
* @see TurtleUpgradeSerialiser
|
||||
* @see PocketUpgradeSerialiser
|
||||
*/
|
||||
public interface UpgradeSerialiser<T extends IUpgradeBase, R extends UpgradeSerialiser<?, R>> extends IForgeRegistryEntry<R>
|
||||
public interface UpgradeSerialiser<T extends IUpgradeBase, R extends UpgradeSerialiser<?, R>>
|
||||
{
|
||||
/**
|
||||
* Read this upgrade from a JSON file in a datapack.
|
||||
|
||||
@@ -30,7 +30,7 @@ import net.minecraft.world.item.Item;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.client.event.ColorHandlerEvent;
|
||||
import net.minecraftforge.client.event.ModelRegistryEvent;
|
||||
import net.minecraftforge.client.model.ModelLoader;
|
||||
import net.minecraftforge.client.model.ForgeModelBakery;
|
||||
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
@@ -74,7 +74,7 @@ public final class ClientRegistry
|
||||
ModelLoaderRegistry.registerLoader( new ResourceLocation( ComputerCraft.MOD_ID, "turtle" ), TurtleModelLoader.INSTANCE );
|
||||
for( String model : EXTRA_MODELS )
|
||||
{
|
||||
ModelLoader.addSpecialModel( new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, model ), "inventory" ) );
|
||||
ForgeModelBakery.addSpecialModel( new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, model ), "inventory" ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,8 +123,6 @@ public final class ClientRegistry
|
||||
@SubscribeEvent
|
||||
public static void setupClient( FMLClientSetupEvent event )
|
||||
{
|
||||
registerContainers();
|
||||
|
||||
// While turtles themselves are not transparent, their upgrades may be.
|
||||
ItemBlockRenderTypes.setRenderLayer( Registry.ModBlocks.TURTLE_NORMAL.get(), RenderType.translucent() );
|
||||
ItemBlockRenderTypes.setRenderLayer( Registry.ModBlocks.TURTLE_ADVANCED.get(), RenderType.translucent() );
|
||||
@@ -139,14 +137,18 @@ public final class ClientRegistry
|
||||
BlockEntityRenderers.register( Registry.ModBlockEntities.TURTLE_NORMAL.get(), TileEntityTurtleRenderer::new );
|
||||
BlockEntityRenderers.register( Registry.ModBlockEntities.TURTLE_ADVANCED.get(), TileEntityTurtleRenderer::new );
|
||||
|
||||
registerItemProperty( "state",
|
||||
( stack, world, player, random ) -> ItemPocketComputer.getState( stack ).ordinal(),
|
||||
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
|
||||
);
|
||||
registerItemProperty( "coloured",
|
||||
( stack, world, player, random ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0,
|
||||
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
|
||||
);
|
||||
event.enqueueWork( () -> {
|
||||
registerContainers();
|
||||
|
||||
registerItemProperty( "state",
|
||||
( stack, world, player, random ) -> ItemPocketComputer.getState( stack ).ordinal(),
|
||||
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
|
||||
);
|
||||
registerItemProperty( "coloured",
|
||||
( stack, world, player, random ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0,
|
||||
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
|
||||
);
|
||||
} );
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
|
||||
@@ -20,7 +20,6 @@ import dan200.computercraft.shared.network.server.ContinueUploadMessage;
|
||||
import dan200.computercraft.shared.network.server.UploadFileMessage;
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
@@ -37,9 +36,9 @@ import java.util.List;
|
||||
|
||||
public abstract class ComputerScreenBase<T extends ContainerComputerBase> extends AbstractContainerScreen<T>
|
||||
{
|
||||
private static final Component OK = new TranslatableComponent( "gui.ok" );
|
||||
private static final Component CANCEL = new TranslatableComponent( "gui.cancel" );
|
||||
private static final Component OVERWRITE = new TranslatableComponent( "gui.computercraft.upload.overwrite_button" );
|
||||
private static final Component OK = Component.translatable( "gui.ok" );
|
||||
private static final Component CANCEL = Component.translatable( "gui.cancel" );
|
||||
private static final Component OVERWRITE = Component.translatable( "gui.computercraft.upload.overwrite_button" );
|
||||
|
||||
protected WidgetTerminal terminal;
|
||||
protected final ClientComputer computer;
|
||||
@@ -58,7 +57,7 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
protected abstract WidgetTerminal createTerminal();
|
||||
|
||||
@Override
|
||||
protected final void init()
|
||||
protected void init()
|
||||
{
|
||||
super.init();
|
||||
minecraft.keyboardHandler.setSendRepeatsToGui( true );
|
||||
@@ -69,21 +68,21 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void removed()
|
||||
public void removed()
|
||||
{
|
||||
super.removed();
|
||||
minecraft.keyboardHandler.setSendRepeatsToGui( false );
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void containerTick()
|
||||
public void containerTick()
|
||||
{
|
||||
super.containerTick();
|
||||
terminal.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean keyPressed( int key, int scancode, int modifiers )
|
||||
public boolean keyPressed( int key, int scancode, int modifiers )
|
||||
{
|
||||
// Forward the tab key to the terminal, rather than moving between controls.
|
||||
if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminal )
|
||||
@@ -96,7 +95,7 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
|
||||
|
||||
@Override
|
||||
public final void render( @Nonnull PoseStack stack, int mouseX, int mouseY, float partialTicks )
|
||||
public void render( @Nonnull PoseStack stack, int mouseX, int mouseY, float partialTicks )
|
||||
{
|
||||
renderBackground( stack );
|
||||
super.render( stack, mouseX, mouseY, partialTicks );
|
||||
@@ -114,7 +113,7 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY )
|
||||
public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY )
|
||||
{
|
||||
return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY ))
|
||||
|| super.mouseDragged( x, y, button, deltaX, deltaY );
|
||||
@@ -158,7 +157,7 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
String name = file.getFileName().toString();
|
||||
if( name.length() > UploadFileMessage.MAX_FILE_NAME )
|
||||
{
|
||||
alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.name_too_long" ) );
|
||||
alert( UploadResult.FAILED_TITLE, Component.translatable( "gui.computercraft.upload.failed.name_too_long" ) );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -169,7 +168,7 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
byte[] digest = FileUpload.getDigest( buffer );
|
||||
if( digest == null )
|
||||
{
|
||||
alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.corrupted" ) );
|
||||
alert( UploadResult.FAILED_TITLE, Component.translatable( "gui.computercraft.upload.failed.corrupted" ) );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -178,13 +177,13 @@ public abstract class ComputerScreenBase<T extends ContainerComputerBase> extend
|
||||
catch( IOException e )
|
||||
{
|
||||
ComputerCraft.log.error( "Failed uploading files", e );
|
||||
alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.generic", "Cannot compute checksum" ) );
|
||||
alert( UploadResult.FAILED_TITLE, Component.translatable( "gui.computercraft.upload.failed.generic", "Cannot compute checksum" ) );
|
||||
}
|
||||
}
|
||||
|
||||
if( toUpload.size() > UploadFileMessage.MAX_FILES )
|
||||
{
|
||||
alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.too_many_files" ) );
|
||||
alert( UploadResult.FAILED_TITLE, Component.translatable( "gui.computercraft.upload.failed.too_many_files" ) );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,288 +0,0 @@
|
||||
/*
|
||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
||||
* Send enquiries to dratcliffe@gmail.com
|
||||
*/
|
||||
package dan200.computercraft.client.gui;
|
||||
|
||||
import com.mojang.blaze3d.vertex.Tesselator;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import com.mojang.math.Matrix4f;
|
||||
import dan200.computercraft.client.FrameInfo;
|
||||
import dan200.computercraft.client.render.RenderTypes;
|
||||
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.renderer.MultiBufferSource;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static dan200.computercraft.client.render.RenderTypes.FULL_BRIGHT_LIGHTMAP;
|
||||
|
||||
/**
|
||||
* Handles rendering fixed width text and computer terminals.
|
||||
*
|
||||
* This class has several modes of usage:
|
||||
* <ul>
|
||||
* <li>{@link #drawString}: Drawing basic text without a terminal (such as for printouts). Unlike the other methods,
|
||||
* this accepts a lightmap coordinate as, unlike terminals, printed pages render fullbright.</li>
|
||||
* <li>{@link #drawTerminalWithoutCursor}/{@link #drawCursor}: Draw a terminal without a cursor and then draw the cursor
|
||||
* separately. This is used by the monitor renderer to render the terminal to a VBO and draw the cursor dynamically.
|
||||
* </li>
|
||||
* <li>{@link #drawTerminal}: Draw a terminal with a cursor. This is used by the various computer GUIs to render the
|
||||
* whole term.</li>
|
||||
* <li>{@link #drawBlocker}: When rendering a terminal using {@link RenderTypes#TERMINAL_WITHOUT_DEPTH} you need to
|
||||
* render an additional "depth blocker" on top of the monitor.</li>
|
||||
* </ul>
|
||||
*/
|
||||
public final class FixedWidthFontRenderer
|
||||
{
|
||||
public static final ResourceLocation FONT = new ResourceLocation( "computercraft", "textures/gui/term_font.png" );
|
||||
|
||||
public static final int FONT_HEIGHT = 9;
|
||||
public static final int FONT_WIDTH = 6;
|
||||
public static final float WIDTH = 256.0f;
|
||||
|
||||
public static final float BACKGROUND_START = (WIDTH - 6.0f) / WIDTH;
|
||||
public static final float BACKGROUND_END = (WIDTH - 4.0f) / WIDTH;
|
||||
|
||||
private FixedWidthFontRenderer()
|
||||
{
|
||||
}
|
||||
|
||||
public static float toGreyscale( double[] rgb )
|
||||
{
|
||||
return (float) ((rgb[0] + rgb[1] + rgb[2]) / 3);
|
||||
}
|
||||
|
||||
public static int getColour( char c, Colour def )
|
||||
{
|
||||
return 15 - Terminal.getColour( c, def );
|
||||
}
|
||||
|
||||
private static void drawChar( Matrix4f transform, VertexConsumer buffer, float x, float y, int index, float r, float g, float b, int light )
|
||||
{
|
||||
// Short circuit to avoid the common case - the texture should be blank here after all.
|
||||
if( index == '\0' || index == ' ' ) return;
|
||||
|
||||
int column = index % 16;
|
||||
int row = index / 16;
|
||||
|
||||
int xStart = 1 + column * (FONT_WIDTH + 2);
|
||||
int yStart = 1 + row * (FONT_HEIGHT + 2);
|
||||
|
||||
buffer.vertex( transform, x, y, 0f ).color( r, g, b, 1.0f ).uv( xStart / WIDTH, yStart / WIDTH ).uv2( light ).endVertex();
|
||||
buffer.vertex( transform, x, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).uv( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).uv2( light ).endVertex();
|
||||
buffer.vertex( transform, x + FONT_WIDTH, y, 0f ).color( r, g, b, 1.0f ).uv( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ).uv2( light ).endVertex();
|
||||
buffer.vertex( transform, x + FONT_WIDTH, y, 0f ).color( r, g, b, 1.0f ).uv( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ).uv2( light ).endVertex();
|
||||
buffer.vertex( transform, x, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).uv( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).uv2( light ).endVertex();
|
||||
buffer.vertex( transform, x + FONT_WIDTH, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).uv( (xStart + FONT_WIDTH) / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).uv2( light ).endVertex();
|
||||
}
|
||||
|
||||
private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, float r, float g, float b )
|
||||
{
|
||||
buffer.vertex( transform, x, y, 0 ).color( r, g, b, 1.0f ).uv( BACKGROUND_START, BACKGROUND_START ).endVertex();
|
||||
buffer.vertex( transform, x, y + height, 0 ).color( r, g, b, 1.0f ).uv( BACKGROUND_START, BACKGROUND_END ).endVertex();
|
||||
buffer.vertex( transform, x + width, y, 0 ).color( r, g, b, 1.0f ).uv( BACKGROUND_END, BACKGROUND_START ).endVertex();
|
||||
buffer.vertex( transform, x + width, y, 0 ).color( r, g, b, 1.0f ).uv( BACKGROUND_END, BACKGROUND_START ).endVertex();
|
||||
buffer.vertex( transform, x, y + height, 0 ).color( r, g, b, 1.0f ).uv( BACKGROUND_START, BACKGROUND_END ).endVertex();
|
||||
buffer.vertex( transform, x + width, y + height, 0 ).color( r, g, b, 1.0f ).uv( BACKGROUND_END, BACKGROUND_END ).endVertex();
|
||||
}
|
||||
|
||||
private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, Palette palette, boolean greyscale, char colourIndex )
|
||||
{
|
||||
double[] colour = palette.getColour( getColour( colourIndex, Colour.BLACK ) );
|
||||
float r, g, b;
|
||||
if( greyscale )
|
||||
{
|
||||
r = g = b = toGreyscale( colour );
|
||||
}
|
||||
else
|
||||
{
|
||||
r = (float) colour[0];
|
||||
g = (float) colour[1];
|
||||
b = (float) colour[2];
|
||||
}
|
||||
|
||||
drawQuad( transform, buffer, x, y, width, height, r, g, b );
|
||||
}
|
||||
|
||||
private static void drawBackground(
|
||||
@Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y,
|
||||
@Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale,
|
||||
float leftMarginSize, float rightMarginSize, float height
|
||||
)
|
||||
{
|
||||
if( leftMarginSize > 0 )
|
||||
{
|
||||
drawQuad( transform, renderer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ) );
|
||||
}
|
||||
|
||||
if( rightMarginSize > 0 )
|
||||
{
|
||||
drawQuad( transform, renderer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, greyscale, backgroundColour.charAt( backgroundColour.length() - 1 ) );
|
||||
}
|
||||
|
||||
// Batch together runs of identical background cells.
|
||||
int blockStart = 0;
|
||||
char blockColour = '\0';
|
||||
for( int i = 0; i < backgroundColour.length(); i++ )
|
||||
{
|
||||
char colourIndex = backgroundColour.charAt( i );
|
||||
if( colourIndex == blockColour ) continue;
|
||||
|
||||
if( blockColour != '\0' )
|
||||
{
|
||||
drawQuad( transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour );
|
||||
}
|
||||
|
||||
blockColour = colourIndex;
|
||||
blockStart = i;
|
||||
}
|
||||
|
||||
if( blockColour != '\0' )
|
||||
{
|
||||
drawQuad( transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, greyscale, blockColour );
|
||||
}
|
||||
}
|
||||
|
||||
public static void drawString(
|
||||
@Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y,
|
||||
@Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour,
|
||||
@Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize, int light
|
||||
)
|
||||
{
|
||||
if( backgroundColour != null )
|
||||
{
|
||||
drawBackground( transform, renderer, x, y, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT );
|
||||
}
|
||||
|
||||
for( int i = 0; i < text.length(); i++ )
|
||||
{
|
||||
double[] colour = palette.getColour( getColour( textColour.charAt( i ), Colour.BLACK ) );
|
||||
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 = text.charAt( i );
|
||||
if( index > 255 ) index = '?';
|
||||
drawChar( transform, renderer, x + i * FONT_WIDTH, y, index, r, g, b, light );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void drawTerminalWithoutCursor(
|
||||
@Nonnull Matrix4f transform, @Nonnull VertexConsumer 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, FULL_BRIGHT_LIGHTMAP
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public static void drawCursor(
|
||||
@Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y,
|
||||
@Nonnull Terminal terminal, boolean greyscale
|
||||
)
|
||||
{
|
||||
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() )
|
||||
{
|
||||
double[] colour = palette.getColour( 15 - terminal.getTextColour() );
|
||||
float r, g, b;
|
||||
if( greyscale )
|
||||
{
|
||||
r = g = b = toGreyscale( colour );
|
||||
}
|
||||
else
|
||||
{
|
||||
r = (float) colour[0];
|
||||
g = (float) colour[1];
|
||||
b = (float) colour[2];
|
||||
}
|
||||
|
||||
drawChar( transform, buffer, x + cursorX * FONT_WIDTH, y + cursorY * FONT_HEIGHT, '_', r, g, b, FULL_BRIGHT_LIGHTMAP );
|
||||
}
|
||||
}
|
||||
|
||||
public static void drawTerminal(
|
||||
@Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y,
|
||||
@Nonnull Terminal terminal, boolean greyscale,
|
||||
float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
|
||||
)
|
||||
{
|
||||
drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
|
||||
drawCursor( transform, buffer, x, y, terminal, greyscale );
|
||||
}
|
||||
|
||||
public static void drawTerminal(
|
||||
@Nonnull Matrix4f transform, float x, float y, @Nonnull Terminal terminal, boolean greyscale,
|
||||
float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
|
||||
)
|
||||
{
|
||||
MultiBufferSource.BufferSource renderer = MultiBufferSource.immediate( Tesselator.getInstance().getBuilder() );
|
||||
VertexConsumer buffer = renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH );
|
||||
drawTerminal( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
|
||||
renderer.endBatch();
|
||||
}
|
||||
|
||||
public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull MultiBufferSource renderer, float x, float y, float width, float height )
|
||||
{
|
||||
Colour colour = Colour.BLACK;
|
||||
drawQuad( transform, renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() );
|
||||
}
|
||||
|
||||
public static void drawEmptyTerminal( @Nonnull Matrix4f transform, float x, float y, float width, float height )
|
||||
{
|
||||
MultiBufferSource.BufferSource renderer = MultiBufferSource.immediate( Tesselator.getInstance().getBuilder() );
|
||||
drawEmptyTerminal( transform, renderer, x, y, width, height );
|
||||
renderer.endBatch();
|
||||
}
|
||||
|
||||
public static void drawBlocker( @Nonnull Matrix4f transform, @Nonnull MultiBufferSource renderer, float x, float y, float width, float height )
|
||||
{
|
||||
Colour colour = Colour.BLACK;
|
||||
drawQuad( transform, renderer.getBuffer( RenderTypes.TERMINAL_BLOCKER ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() );
|
||||
}
|
||||
}
|
||||