Compare commits
152 Commits
v1.18.1-1.
...
v1.19.1-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c43d851e63 | ||
|
|
50fe7935a3 | ||
|
|
bd19fdf350 | ||
|
|
c3615d9c5b | ||
|
|
e2041f7438 | ||
|
|
d61202e2b8 | ||
|
|
6ce88a7dcf | ||
|
|
5d65b3e654 | ||
|
|
abf857f864 | ||
|
|
ebef3117f2 | ||
|
|
25a44bea6e | ||
|
|
b28c1ac8e0 | ||
|
|
69b211b4fb | ||
|
|
48147fa61c | ||
|
|
ba976f9a16 | ||
|
|
969feb4a1c | ||
|
|
4a273ae8e5 | ||
|
|
bd5de11ad5 | ||
|
|
5366fcb9c8 | ||
|
|
6335e77da6 | ||
|
|
4cfd0a2d1c | ||
|
|
be3a960273 | ||
|
|
f25a73b8f2 | ||
|
|
954254e7e4 | ||
|
|
e906f3ebc3 | ||
|
|
56f0e0674f | ||
|
|
4e438df9ad | ||
|
|
51c3a9d8af | ||
|
|
d967730085 | ||
|
|
d6afee8deb | ||
|
|
41bddcab9f | ||
|
|
b8d7695392 | ||
|
|
b7fa4102df | ||
|
|
92c613a7a2 | ||
|
|
d2f94f2653 | ||
|
|
718111787c | ||
|
|
bb0e449560 | ||
|
|
ee495b3359 | ||
|
|
d1e952770d | ||
|
|
2d30208631 | ||
|
|
03f50f9298 | ||
|
|
8fc7820a12 | ||
|
|
1a0e3fc2fa | ||
|
|
6d5b13dbbc | ||
|
|
f9f8233ef4 | ||
|
|
a2e3d9d9bd | ||
|
|
b7f698d6f7 | ||
|
|
93f3cd4a53 | ||
|
|
755f8eff93 | ||
|
|
a879efc3d0 | ||
|
|
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 | ||
|
|
70c5cbafec | ||
|
|
2c64186965 | ||
|
|
7731759c77 | ||
|
|
e6339b2847 | ||
|
|
31ba17d085 | ||
|
|
6353e8d930 | ||
|
|
78cce4981a | ||
|
|
97c953a9be | ||
|
|
52df7cb8a4 | ||
|
|
6735cfd12e | ||
|
|
bcc7dd6991 | ||
|
|
f994696161 | ||
|
|
4a4e8bb4b6 | ||
|
|
bd36185662 | ||
|
|
045c4fc88c | ||
|
|
e0fcc425c6 | ||
|
|
e01895d719 | ||
|
|
87b38f4249 | ||
|
|
60d1d1bb18 | ||
|
|
cdf8b77ffd | ||
|
|
e2ce52fe81 |
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/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -9,8 +9,8 @@ body:
|
||||
description: What version of Minecraft are you using?
|
||||
options:
|
||||
- 1.16.x
|
||||
- 1.17.x
|
||||
- 1.18.x
|
||||
- 1.19.x
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
|
||||
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/" \
|
||||
|
||||
133
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,133 @@
|
||||
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||
identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall
|
||||
community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||
any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email address,
|
||||
without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
"conduct AT squiddev DOT cc". All complaints will be reviewed and investigated
|
||||
promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of
|
||||
actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||
community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.1, available at
|
||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
Community Impact Guidelines were inspired by
|
||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||
[https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
@@ -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
|
||||
|
||||
@@ -35,7 +35,8 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fg.deobf("org.squiddev:cc-tweaked-${mc_version}:${cct_version}")
|
||||
compileOnly fg.deobf("org.squiddev:cc-tweaked-${mc_version}:${cct_version}:api")
|
||||
runtimeOnly fg.deobf("org.squiddev:cc-tweaked-${mc_version}:${cct_version}")
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
371
build.gradle
@@ -1,30 +1,19 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = "https://maven.minecraftforge.net" }
|
||||
maven { url = 'https://maven.parchmentmc.org' }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+'
|
||||
classpath "org.spongepowered:mixingradle:0.7.+"
|
||||
classpath 'org.parchmentmc:librarian:1.+'
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "checkstyle"
|
||||
id "jacoco"
|
||||
id "maven-publish"
|
||||
id "com.github.hierynomus.license" version "0.16.1"
|
||||
id "org.cadixdev.licenser" version "0.6.1"
|
||||
id "com.matthewprenger.cursegradle" version "1.4.0"
|
||||
id "com.github.breadmoirai.github-release" version "2.2.12"
|
||||
id "org.jetbrains.kotlin.jvm" version "1.6.0"
|
||||
id "com.modrinth.minotaur" version "1.2.1"
|
||||
id "org.jetbrains.kotlin.jvm" version "1.7.0"
|
||||
id "com.modrinth.minotaur" version "2.+"
|
||||
id "net.minecraftforge.gradle" version "5.1.+"
|
||||
id "org.spongepowered.mixin" version "0.7.+"
|
||||
id "org.parchmentmc.librarian.forgegradle" version "1.+"
|
||||
id "com.github.johnrengelman.shadow" version "7.1.2"
|
||||
}
|
||||
|
||||
apply plugin: 'net.minecraftforge.gradle'
|
||||
apply plugin: "org.spongepowered.mixin"
|
||||
apply plugin: 'org.parchmentmc.librarian.forgegradle'
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
version = mod_version
|
||||
|
||||
@@ -39,12 +28,7 @@ java {
|
||||
|
||||
withSourcesJar()
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
tasks.withType(JavaExec).configureEach {
|
||||
javaLauncher = javaToolchains.launcherFor {
|
||||
languageVersion = javaVersion
|
||||
}
|
||||
registerFeature("extraMods") { usingSourceSet(sourceSets.main) }
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -64,6 +48,7 @@ minecraft {
|
||||
|
||||
property 'forge.logging.markers', 'REGISTRIES'
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
forceExit = false
|
||||
|
||||
mods {
|
||||
computercraft {
|
||||
@@ -105,9 +90,10 @@ minecraft {
|
||||
}
|
||||
}
|
||||
|
||||
testServer {
|
||||
gameTestServer {
|
||||
workingDirectory project.file('test-files/server')
|
||||
parent runs.server
|
||||
|
||||
property("forge.logging.console.level", "info")
|
||||
|
||||
mods {
|
||||
cctest {
|
||||
@@ -123,8 +109,8 @@ minecraft {
|
||||
}
|
||||
}
|
||||
|
||||
// mappings channel: 'parchment', version: "${mapping_version}-${mc_version}"
|
||||
mappings channel: 'official', 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')
|
||||
@@ -134,6 +120,10 @@ mixin {
|
||||
add sourceSets.main, 'computercraft.mixins.refmap.json'
|
||||
}
|
||||
|
||||
reobf {
|
||||
shadowJar {}
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
@@ -143,7 +133,7 @@ repositories {
|
||||
}
|
||||
|
||||
configurations {
|
||||
shade
|
||||
shade { transitive = false }
|
||||
implementation.extendsFrom shade
|
||||
|
||||
cctJavadoc
|
||||
@@ -159,37 +149,43 @@ dependencies {
|
||||
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
||||
annotationProcessor 'org.spongepowered:mixin:0.8.4:processor'
|
||||
|
||||
compileOnly fg.deobf("mezz.jei:jei-1.18.1:9.1.0.47:api")
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-1.18.1:9.1.0.47")
|
||||
extraModsCompileOnly fg.deobf("mezz.jei:jei-1.19-forge-api:11.1.1.236")
|
||||
extraModsCompileOnly fg.deobf("mezz.jei:jei-1.19-common-api:11.1.1.236")
|
||||
extraModsRuntimeOnly fg.deobf("mezz.jei:jei-1.19-forge:11.1.1.236")
|
||||
|
||||
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'
|
||||
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
|
||||
testImplementation 'org.hamcrest:hamcrest:2.2'
|
||||
testImplementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0'
|
||||
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2'
|
||||
testImplementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0'
|
||||
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2'
|
||||
|
||||
testModImplementation sourceSets.main.output
|
||||
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.7'
|
||||
}
|
||||
|
||||
// Compile tasks
|
||||
|
||||
compileTestModJava {
|
||||
dependsOn(compileJava)
|
||||
}
|
||||
|
||||
javadoc {
|
||||
include "dan200/computercraft/api/**/*.java"
|
||||
}
|
||||
|
||||
task luaJavadoc(type: Javadoc) {
|
||||
def apiJar = tasks.register("apiJar", Jar.class) {
|
||||
archiveClassifier.set("api")
|
||||
from(sourceSets.main.output) {
|
||||
include "dan200/computercraft/api/**/*"
|
||||
}
|
||||
}
|
||||
assemble.dependsOn(apiJar)
|
||||
|
||||
def luaJavadoc = tasks.register("luaJavadoc", Javadoc.class) {
|
||||
description "Generates documentation for Java-side Lua functions."
|
||||
group "documentation"
|
||||
|
||||
@@ -207,6 +203,9 @@ task luaJavadoc(type: Javadoc) {
|
||||
}
|
||||
|
||||
jar {
|
||||
finalizedBy("reobfJar")
|
||||
|
||||
archiveClassifier.set("slim")
|
||||
manifest {
|
||||
attributes([
|
||||
"Specification-Title" : "computercraft",
|
||||
@@ -215,18 +214,29 @@ jar {
|
||||
"Implementation-Title" : "CC: Tweaked",
|
||||
"Implementation-Version" : "${mod_version}",
|
||||
"Implementation-Vendor" : "SquidDev",
|
||||
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
|
||||
,
|
||||
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
|
||||
"MixinConfigs" : "computercraft.mixins.json",
|
||||
])
|
||||
}
|
||||
|
||||
from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
|
||||
}
|
||||
|
||||
jar.finalizedBy('reobfJar')
|
||||
shadowJar {
|
||||
finalizedBy("reobfShadowJar")
|
||||
|
||||
[compileJava, compileTestJava, compileTestModJava].forEach {
|
||||
archiveClassifier.set("")
|
||||
configurations = [project.configurations.shade]
|
||||
relocate("org.squiddev.cobalt", "cc.tweaked.internal.cobalt")
|
||||
relocate("io.netty.handler.codec.http", "cc.tweaked.internal.netty")
|
||||
minimize()
|
||||
}
|
||||
|
||||
assemble.dependsOn("shadowJar")
|
||||
|
||||
[
|
||||
tasks.named("compileJava", JavaCompile.class),
|
||||
tasks.named("compileTestJava", JavaCompile.class),
|
||||
tasks.named("compileTestModJava", JavaCompile.class)
|
||||
].forEach {
|
||||
it.configure {
|
||||
options.compilerArgs << "-Xlint" << "-Xlint:-processing"
|
||||
}
|
||||
@@ -238,9 +248,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()
|
||||
@@ -267,17 +300,11 @@ sourcesJar {
|
||||
|
||||
// Web tasks
|
||||
|
||||
|
||||
import com.hierynomus.gradle.license.tasks.LicenseCheck
|
||||
import com.hierynomus.gradle.license.tasks.LicenseFormat
|
||||
import com.modrinth.minotaur.TaskModrinthUpload
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
List<String> mkCommand(String command) {
|
||||
return Os.isFamily(Os.FAMILY_WINDOWS) ? ["cmd", "/c", command] : ["sh", "-c", command]
|
||||
}
|
||||
|
||||
task rollup(type: Exec) {
|
||||
def rollup = tasks.register("rollup", Exec.class) {
|
||||
group = "build"
|
||||
description = "Bundles JS into rollup"
|
||||
|
||||
@@ -290,9 +317,10 @@ task rollup(type: Exec) {
|
||||
commandLine mkCommand('"node_modules/.bin/rollup" --config rollup.config.js')
|
||||
}
|
||||
|
||||
task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
||||
group = "build"
|
||||
description = "Bundles JS into rollup"
|
||||
def illuaminateDocs = tasks.register("illuaminateDocs", Exec.class) {
|
||||
group = "documentation"
|
||||
description = "Generates docs using Illuaminate"
|
||||
dependsOn(rollup, luaJavadoc)
|
||||
|
||||
inputs.files(fileTree("doc")).withPropertyName("docs")
|
||||
inputs.files(fileTree("src/main/resources/data/computercraft/lua/rom")).withPropertyName("lua rom")
|
||||
@@ -305,7 +333,26 @@ task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
||||
commandLine mkCommand('"bin/illuaminate" doc-gen')
|
||||
}
|
||||
|
||||
task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
|
||||
def jsxDocs = tasks.register("jsxDocs", Exec) {
|
||||
group = "documentation"
|
||||
description = "Post-processes documentation to statically render some dynamic content."
|
||||
dependsOn(illuaminateDocs)
|
||||
|
||||
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" -T --esm src/web/transform.tsx')
|
||||
}
|
||||
|
||||
def docWebsite = tasks.register("docWebsite", Copy.class) {
|
||||
group = "documentation"
|
||||
description = "Copy additional assets to the website directory."
|
||||
dependsOn(jsxDocs)
|
||||
|
||||
from('doc') {
|
||||
include 'logo.png'
|
||||
include 'images/**'
|
||||
@@ -313,7 +360,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
|
||||
@@ -333,114 +387,75 @@ jacocoTestReport {
|
||||
}
|
||||
}
|
||||
|
||||
check.dependsOn jacocoTestReport
|
||||
test.finalizedBy("jacocoTestReport")
|
||||
|
||||
license {
|
||||
mapping("java", "SLASHSTAR_STYLE")
|
||||
strictCheck true
|
||||
header = file('config/license/main.txt')
|
||||
lineEnding = '\n'
|
||||
newLine = false
|
||||
|
||||
ext.year = Calendar.getInstance().get(Calendar.YEAR)
|
||||
}
|
||||
properties {
|
||||
year = Calendar.getInstance().get(Calendar.YEAR)
|
||||
}
|
||||
|
||||
[licenseMain, licenseFormatMain].forEach {
|
||||
it.configure {
|
||||
include("**/*.java")
|
||||
exclude("dan200/computercraft/api/**")
|
||||
header file('config/license/main.txt')
|
||||
include("**/*.java") // We could apply to Kotlin, but for now let's not
|
||||
matching("dan200/computercraft/api/**") {
|
||||
header = file('config/license/api.txt')
|
||||
}
|
||||
}
|
||||
|
||||
[licenseTest, licenseFormatTest, licenseTestMod, licenseFormatTestMod].forEach {
|
||||
it.configure {
|
||||
include("**/*.java")
|
||||
header file('config/license/main.txt')
|
||||
}
|
||||
}
|
||||
|
||||
gradle.projectsEvaluated {
|
||||
tasks.withType(LicenseFormat) {
|
||||
outputs.upToDateWhen { false }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
task licenseAPI(type: LicenseCheck)
|
||||
task licenseFormatAPI(type: LicenseFormat)
|
||||
[licenseAPI, licenseFormatAPI].forEach {
|
||||
it.configure {
|
||||
source = sourceSets.main.java
|
||||
include("dan200/computercraft/api/**")
|
||||
header file('config/license/api.txt')
|
||||
}
|
||||
}
|
||||
|
||||
task setupServer(type: Copy) {
|
||||
group "test server"
|
||||
description "Sets up the environment for the test server."
|
||||
|
||||
from("src/testMod/server-files") {
|
||||
include "eula.txt"
|
||||
include "server.properties"
|
||||
}
|
||||
into "test-files/server"
|
||||
}
|
||||
|
||||
["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')
|
||||
|
||||
// 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.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")
|
||||
check.dependsOn("licenseCheck")
|
||||
|
||||
def testServerClassDumpDir = new File(buildDir, "jacocoClassDump/runTestServer")
|
||||
|
||||
def testServer = tasks.register("testServer", JavaExec.class) {
|
||||
group("In-game tests")
|
||||
description("Runs tests on a temporary Minecraft instance.")
|
||||
dependsOn("cleanTestServer")
|
||||
finalizedBy("jacocoTestServerReport")
|
||||
|
||||
// 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")
|
||||
dependsOn(exec.getDependsOn())
|
||||
exec.copyTo(it)
|
||||
setClasspath(exec.getClasspath())
|
||||
mainClass = exec.mainClass
|
||||
javaLauncher = exec.javaLauncher
|
||||
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.
|
||||
jacoco.applyTo(it)
|
||||
it.jacoco.setIncludes(["dan200.computercraft.*"])
|
||||
it.jacoco.setClassDumpDir(testServerClassDumpDir)
|
||||
outputs.dir(testServerClassDumpDir)
|
||||
// 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("jacocoTestServerReport", JacocoReport.class) {
|
||||
group("In-game tests")
|
||||
description("Generate coverage reports for testServer")
|
||||
dependsOn(testServer)
|
||||
|
||||
executionData(new File(buildDir, "jacoco/testServer.exec"))
|
||||
sourceDirectories.from(sourceSets.main.allJava.srcDirs)
|
||||
classDirectories.from(testServerClassDumpDir)
|
||||
|
||||
reports {
|
||||
xml.enabled true
|
||||
html.enabled true
|
||||
}
|
||||
}
|
||||
|
||||
check.dependsOn(testServer)
|
||||
|
||||
// Upload tasks
|
||||
|
||||
task checkRelease {
|
||||
def checkRelease = tasks.register("checkRelease") {
|
||||
group "upload"
|
||||
description "Verifies that everything is ready for a release"
|
||||
|
||||
@@ -478,9 +493,9 @@ task checkRelease {
|
||||
if (!ok) throw new IllegalStateException("Could not check release")
|
||||
}
|
||||
}
|
||||
check.dependsOn checkRelease
|
||||
check.dependsOn(checkRelease)
|
||||
|
||||
def isStable = true
|
||||
def isStable = false
|
||||
|
||||
curseforge {
|
||||
apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : ''
|
||||
@@ -488,36 +503,29 @@ curseforge {
|
||||
id = '282001'
|
||||
releaseType = isStable ? 'release' : 'alpha'
|
||||
changelog = "Release notes can be found on the GitHub repository (https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
|
||||
mainArtifact(shadowJar)
|
||||
|
||||
addGameVersion "${mc_version}"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('publishModrinth', TaskModrinthUpload.class).configure {
|
||||
dependsOn('assemble', 'reobfJar')
|
||||
onlyIf {
|
||||
project.hasProperty('modrinthApiKey')
|
||||
}
|
||||
|
||||
modrinth {
|
||||
token = project.hasProperty('modrinthApiKey') ? project.getProperty('modrinthApiKey') : ''
|
||||
projectId = 'gu7yAYhd'
|
||||
versionNumber = "${project.mc_version}-${project.mod_version}"
|
||||
uploadFile = jar
|
||||
versionType = isStable ? 'RELEASE' : 'ALPHA'
|
||||
addGameVersion(project.mc_version)
|
||||
versionName = "${project.mod_version}"
|
||||
versionType = isStable ? 'release' : 'alpha'
|
||||
uploadFile = shadowJar
|
||||
gameVersions = [project.mc_version]
|
||||
changelog = "Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
|
||||
addLoader('forge')
|
||||
}
|
||||
|
||||
tasks.withType(GenerateModuleMetadata) {
|
||||
// We can't generate metadata as that includes Forge as a dependency.
|
||||
enabled = false
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
maven(MavenPublication) {
|
||||
from components.java
|
||||
artifact(apiJar)
|
||||
fg.component(it)
|
||||
|
||||
pom {
|
||||
name = 'CC: Tweaked'
|
||||
@@ -536,11 +544,9 @@ publishing {
|
||||
licenses {
|
||||
license {
|
||||
name = 'ComputerCraft Public License, Version 1.0'
|
||||
url = 'https://github.com/cc-tweaked/CC-Tweaked/blob/mc-1.15.x/LICENSE'
|
||||
url = 'https://github.com/cc-tweaked/CC-Tweaked/blob/mc-1.16.x/LICENSE'
|
||||
}
|
||||
}
|
||||
|
||||
withXml { asNode().remove(asNode().get("dependencies")) }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -588,10 +594,11 @@ githubRelease {
|
||||
prerelease !isStable
|
||||
}
|
||||
|
||||
def uploadTasks = ["publish", "curseforge", "publishModrinth", "githubRelease"]
|
||||
uploadTasks.forEach { tasks.getByName(it).dependsOn checkRelease }
|
||||
def uploadTasks = ["publish", "curseforge", "modrinth", "githubRelease"]
|
||||
uploadTasks.forEach { tasks.named(it) { dependsOn(checkRelease) } }
|
||||
|
||||
task uploadAll(dependsOn: uploadTasks) {
|
||||
group "upload"
|
||||
description "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)"
|
||||
tasks.register("uploadAll") {
|
||||
group = "upload"
|
||||
description = "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)"
|
||||
dependsOn(uploadTasks)
|
||||
}
|
||||
|
||||
@@ -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>Middle button</td></tr>
|
||||
<tr><td align="right">3</td><td>Right 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.
|
||||
|
||||
90
doc/guides/gps_setup.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
module: [kind=guide] gps_setup
|
||||
---
|
||||
|
||||
# Setting up GPS
|
||||
The @{gps} API allows computers and turtles to find their current position using wireless modems.
|
||||
|
||||
In order to use GPS, you'll need to set up multiple *GPS hosts*. These are computers running the special `gps host`
|
||||
program, which tell other computers the host's position. Several hosts running together are known as a *GPS
|
||||
constellation*.
|
||||
|
||||
In order to give the best results, a GPS constellation needs at least four computers. More than four GPS hosts per
|
||||
constellation is redundant, but it does not cause problems.
|
||||
|
||||
## Building a GPS constellation
|
||||
{.big-image}
|
||||
|
||||
We are going to build our GPS constellation as shown in the image above. You will need 4 computers and either 4 wireless
|
||||
modems or 4 ender modems. Try not to mix ender and wireless modems together as you might get some odd behavior when your
|
||||
requesting computers are out of range.
|
||||
|
||||
:::tip Ender modems vs wireless modems
|
||||
Ender modems have a very large range, which makes them very useful for setting up GPS hosts. If you do this then you
|
||||
will likely only need one GPS constellation for the whole dimension (such as the Overworld or Nether).
|
||||
|
||||
If you do use wireless modems then you may find that you need multiple GPS constellations to cover your needs.
|
||||
|
||||
A computer needs a wireless or ender modem and to be in range of a GPS constellation that is in the same dimension as it
|
||||
to use the GPS API. The reason for this is that ComputerCraft mimics real-life GPS by making use of the distance
|
||||
parameter of @{modem_message|modem messages} and some maths.
|
||||
:::
|
||||
|
||||
Locate where you want to place your GPS constellation. You will need an area at least 6 blocks high, 6 blocks wide, and
|
||||
6 blocks deep (6x6x6). If you are using wireless modems then you may want to build your constellation as high as you can
|
||||
because high altitude boosts modem message range and thus the radius that your constellation covers.
|
||||
|
||||
The GPS constellation will only work when it is in a loaded chunk. If you want your constellation to always be
|
||||
accessible, you may want to permanently load the chunk using a vanilla or modded chunk loader. Make sure that your 6x6x6
|
||||
area fits in a single chunk to reduce the number of chunks that need to be kept loaded.
|
||||
|
||||
Let's get started building the constellation! Place your first computer in one of the corners of your 6x6x6. Remember
|
||||
which computer this is as other computers need to be placed relative to it. Place the second computer 4 blocks above the
|
||||
first. Go back to your first computer and place your third computer 5 blocks in front of your first computer, leaving 4
|
||||
blocks of air between them. Finally for the fourth computer, go back to your first computer and place it 5 blocks right
|
||||
of your first computer, leaving 4 blocks of air between them.
|
||||
|
||||
With all four computers placed within the 6x6x6, place one modem on top of each computer. You should have 4 modems and 4
|
||||
computers all within your 6x6x6 where each modem is attached to a computer and each computer has a modem.
|
||||
|
||||
Currently your GPS constellation will not work, that's because each host is not aware that it's a GPS host. We will fix
|
||||
this in the next section.
|
||||
|
||||
## Configuring the constellation
|
||||
Now that the structure of your constellation is built, we need to configure each host in it.
|
||||
|
||||
Go back to the first computer that you placed and create a startup file, by running `edit startup`.
|
||||
|
||||
Type the following code into the file:
|
||||
```lua
|
||||
shell.run("gps", "host", x, y, z)
|
||||
```
|
||||
|
||||
Escape from the computer GUI and then press <kbd>F3</kbd> to open Minecraft's debug screen and then look at the computer
|
||||
(without opening the GUI). On the right of the screen about halfway down you should see an entry labeled `Targeted
|
||||
Block`, the numbers correspond to the position of the block that you are looking at. Replace `x` with the first number,
|
||||
`y` with the second number, and `z` with the third number.
|
||||
|
||||
For example, if I had a computer at x = 59, y = 5, z = -150, then my <kbd>F3</kbd> debug screen entry would be `Target
|
||||
Block: 59, 5, -150` and I would change my startup file to this `shell.run("gps", "host", 59, 5, -150)`.
|
||||
|
||||
To hide Minecraft's debug screen, press <kbd>F3</kbd> again.
|
||||
|
||||
Create similar startup files for the other computers in your constellation, making sure to input the each computer's own
|
||||
coordinates.
|
||||
|
||||
:::caution Modem messages come from the computer's position, not the modem's
|
||||
Wireless modems transmit from the block that they are attached to *not* the block space that they occupy, the
|
||||
coordinates that you input into your GPS host should be the position of the computer and not the position of the modem.
|
||||
:::
|
||||
|
||||
Congratulations, your constellation is now fully set up! You can test it by placing another computer close by, placing a
|
||||
wireless modem on it, and running the `gps locate` program (or calling the @{gps.locate} function).
|
||||
|
||||
:::info Why use Minecraft's coordinates?
|
||||
CC doesn't care if you use Minecraft's coordinate system, so long as all of the GPS hosts with overlapping ranges use
|
||||
the same reference point (requesting computers will get confused if hosts have different reference points). However,
|
||||
using MC's coordinate system does provide a nice standard to adopt server-wide. It also is consistent with how command
|
||||
computers get their location, they use MC's command system to get their block which returns that in MC's coordinate
|
||||
system.
|
||||
:::
|
||||
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
|
||||
```
|
||||
|
||||
|
||||
BIN
doc/images/gps-constellation-example.png
Normal file
|
After Width: | Height: | Size: 331 KiB |
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,11 @@
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
kotlin.stdlib.default.dependency=false
|
||||
|
||||
# Mod properties
|
||||
mod_version=1.100.2
|
||||
mod_version=1.100.9
|
||||
|
||||
# Minecraft properties (update mods.toml when changing)
|
||||
mc_version=1.18.1
|
||||
mapping_version=2021.09.05
|
||||
forge_version=39.0.0
|
||||
mc_version=1.19.1
|
||||
mapping_version=1.18.2-2022.07.03
|
||||
forge_version=42.0.0
|
||||
# NO SERIOUSLY, UPDATE mods.toml WHEN CHANGING
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -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/
|
||||
|
||||
2097
package-lock.json
generated
12
package.json
@@ -4,16 +4,26 @@
|
||||
"description": "Website additions for tweaked.cc",
|
||||
"author": "SquidDev",
|
||||
"license": "BSD-3-Clause",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"preact": "^10.5.5",
|
||||
"tslib": "^2.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-typescript": "^8.2.5",
|
||||
"@rollup/plugin-url": "^6.1.0",
|
||||
"@rollup/plugin-url": "^7.0.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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
rootProject.name = "cc-tweaked-${mc_version}"
|
||||
17
settings.gradle.kts
Normal file
@@ -0,0 +1,17 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
maven("https://maven.minecraftforge.net")
|
||||
maven("https://maven.parchmentmc.org")
|
||||
}
|
||||
resolutionStrategy {
|
||||
eachPlugin {
|
||||
if (requested.id.id == "org.spongepowered.mixin") {
|
||||
useModule("org.spongepowered:mixingradle:${requested.version}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val mc_version: String by settings
|
||||
rootProject.name = "cc-tweaked-${mc_version}"
|
||||
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": []
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -13,8 +13,8 @@ import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
|
||||
import dan200.computercraft.shared.computer.core.ServerComputerRegistry;
|
||||
import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -81,7 +81,7 @@ public final class ComputerCraft
|
||||
public static final ServerComputerRegistry serverComputerRegistry = new ServerComputerRegistry();
|
||||
|
||||
// Logging
|
||||
public static final Logger log = LogManager.getLogger( MOD_ID );
|
||||
public static final Logger log = LoggerFactory.getLogger( MOD_ID );
|
||||
|
||||
public ComputerCraft()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -111,7 +115,7 @@ public final class ComputerCraftAPI
|
||||
}
|
||||
|
||||
/**
|
||||
* rers a peripheral provider to convert blocks into {@link IPeripheral} implementations.
|
||||
* Registers a peripheral provider to convert blocks into {@link IPeripheral} implementations.
|
||||
*
|
||||
* @param provider The peripheral provider to register.
|
||||
* @see IPeripheral
|
||||
@@ -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,57 @@
|
||||
/*
|
||||
* 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.client;
|
||||
|
||||
import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
public final class ComputerCraftAPIClient
|
||||
{
|
||||
private ComputerCraftAPIClient()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a {@link TurtleUpgradeModeller} for a class of turtle upgrades.
|
||||
*
|
||||
* This may be called at any point after registry creation, though it is recommended to call it within {@link FMLClientSetupEvent}.
|
||||
*
|
||||
* @param serialiser The turtle upgrade serialiser.
|
||||
* @param modeller The upgrade modeller.
|
||||
* @param <T> The type of the turtle upgrade.
|
||||
*/
|
||||
public static <T extends ITurtleUpgrade> void registerTurtleUpgradeModeller( @Nonnull TurtleUpgradeSerialiser<T> serialiser, @Nonnull TurtleUpgradeModeller<T> modeller )
|
||||
{
|
||||
getInstance().registerTurtleUpgradeModeller( serialiser, modeller );
|
||||
}
|
||||
|
||||
private static IComputerCraftAPIClient instance;
|
||||
|
||||
@Nonnull
|
||||
private static IComputerCraftAPIClient getInstance()
|
||||
{
|
||||
if( instance != null ) return instance;
|
||||
|
||||
try
|
||||
{
|
||||
return instance = (IComputerCraftAPIClient) Class.forName( "dan200.computercraft.client.ComputerCraftAPIClientImpl" )
|
||||
.getField( "INSTANCE" ).get( null );
|
||||
}
|
||||
catch( ReflectiveOperationException e )
|
||||
{
|
||||
throw new IllegalStateException( "Cannot find ComputerCraft API", e );
|
||||
}
|
||||
}
|
||||
|
||||
public interface IComputerCraftAPIClient
|
||||
{
|
||||
<T extends ITurtleUpgrade> void registerTurtleUpgradeModeller( @Nonnull TurtleUpgradeSerialiser<T> serialiser, @Nonnull TurtleUpgradeModeller<T> modeller );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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.client.turtle;
|
||||
|
||||
import dan200.computercraft.api.client.ComputerCraftAPIClient;
|
||||
import dan200.computercraft.api.client.TransformedModel;
|
||||
import dan200.computercraft.api.turtle.ITurtleAccess;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.api.turtle.TurtleSide;
|
||||
import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
|
||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Provides models for a {@link ITurtleUpgrade}.
|
||||
*
|
||||
* @param <T> The type of turtle upgrade this modeller applies to.
|
||||
* @see ComputerCraftAPIClient#registerTurtleUpgradeModeller(TurtleUpgradeSerialiser, TurtleUpgradeModeller) To register a modeller.
|
||||
*/
|
||||
public interface TurtleUpgradeModeller<T extends ITurtleUpgrade>
|
||||
{
|
||||
/**
|
||||
* Obtain the model to be used when rendering a turtle peripheral.
|
||||
*
|
||||
* When the current turtle is {@literal null}, this function should be constant for a given upgrade and side.
|
||||
*
|
||||
* @param upgrade The upgrade that you're getting the model for.
|
||||
* @param turtle Access to the turtle that the upgrade resides on. This will be null when getting item models!
|
||||
* @param side Which side of the turtle (left or right) the upgrade resides on.
|
||||
* @return The model that you wish to be used to render your upgrade.
|
||||
*/
|
||||
@Nonnull
|
||||
TransformedModel getModel( @Nonnull T upgrade, @Nullable ITurtleAccess turtle, @Nonnull TurtleSide side );
|
||||
|
||||
/**
|
||||
* A basic {@link TurtleUpgradeModeller} which renders using the upgrade's {@linkplain ITurtleUpgrade#getCraftingItem()
|
||||
* crafting item}.
|
||||
*
|
||||
* This uses appropriate transformations for "flat" items, namely those extending the {@literal minecraft:item/generated}
|
||||
* model type. It will not appear correct for 3D models with additional depth, such as blocks.
|
||||
*
|
||||
* @param <T> The type of the turtle upgrade.
|
||||
* @return The constructed modeller.
|
||||
*/
|
||||
@SuppressWarnings( "unchecked" )
|
||||
static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> flatItem()
|
||||
{
|
||||
return (TurtleUpgradeModeller<T>) TurtleUpgradeModellers.FLAT_ITEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a {@link TurtleUpgradeModeller} which has a single model for the left and right side.
|
||||
*
|
||||
* @param left The model to use on the left.
|
||||
* @param right The model to use on the right.
|
||||
* @param <T> The type of the turtle upgrade.
|
||||
* @return The constructed modeller.
|
||||
*/
|
||||
static <T extends ITurtleUpgrade> TurtleUpgradeModeller<T> sided( ModelResourceLocation left, ModelResourceLocation right )
|
||||
{
|
||||
return ( upgrade, turtle, side ) -> TransformedModel.of( side == TurtleSide.LEFT ? left : right );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.client.turtle;
|
||||
|
||||
import com.mojang.math.Matrix4f;
|
||||
import com.mojang.math.Transformation;
|
||||
import dan200.computercraft.api.client.TransformedModel;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.api.turtle.TurtleSide;
|
||||
|
||||
class TurtleUpgradeModellers
|
||||
{
|
||||
private static final Transformation leftTransform = getMatrixFor( -0.40625f );
|
||||
private static final Transformation rightTransform = getMatrixFor( 0.40625f );
|
||||
|
||||
private static Transformation getMatrixFor( float offset )
|
||||
{
|
||||
return new Transformation( new Matrix4f( new float[] {
|
||||
0.0f, 0.0f, -1.0f, 1.0f + offset,
|
||||
1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, -1.0f, 0.0f, 1.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f,
|
||||
} ) );
|
||||
}
|
||||
|
||||
static final TurtleUpgradeModeller<ITurtleUpgrade> FLAT_ITEM = ( upgrade, turtle, side ) ->
|
||||
TransformedModel.of( upgrade.getCraftingItem(), side == TurtleSide.LEFT ? leftTransform : rightTransform );
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||