1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-10-16 06:27:39 +00:00

Compare commits

..

5 Commits

Author SHA1 Message Date
Jonathan Coates
1da86d6f75 Don't run CI on 1.12 2022-05-07 16:56:00 +01:00
Jonathan Coates
53a23f8d3d Use a simpler getRenderBoundingBox method for cables
Our cable has a rather complex getCollisionBoundingBox implementation,
which (combined with computing the actual block state) ends up taking an
awful lot of time.

This shaves 9% off each frame. I don't miss 1.12 one bit.
2022-05-07 16:50:48 +01:00
Jonathan Coates
550f63b1cb Rethink how computer timeouts are handled
Previously we would compute the current timeout flags every 128
instructions of the Lua machine. While computing these flags is
_relatively_ cheap (just get the current time), it still all adds up.

Instead we now set the timeout flags from the computer monitor/watchdog
thread. This does mean that the monitor thread needs to wake up more
often[^1] _if the queue is full_, otherwise we can sleep for 100ms as
before.

This does mean that pausing is a little less accurate (can technically
take up 2*period instead). This isn't great, but in practice it seems
fine - I've not noticed any playability issues.

This offers a small (but measurable!) boost to computer performance.

[^1]: We currently sleep for scaledPeriod, but we could choose to do less.
2022-05-07 16:50:40 +01:00
Jonathan Coates
416e87852e Bump Cobalt version 2022-05-07 16:50:07 +01:00
Jonathan Coates
7940687df2 Get this building in the year of our lord 2022
- Force the license check to use 2020
 - Tell Proguard to ignore some annotations
2022-05-07 16:49:07 +01:00
1676 changed files with 41814 additions and 47756 deletions

View File

@@ -16,3 +16,7 @@ indent_size = 2
[*.yml]
indent_size = 2
[*.properties]
insert_final_newline = false

15
.gitattributes vendored
View File

@@ -1,15 +0,0 @@
# Ignore changes in generated files
src/generated/resources/data/** linguist-generated
src/test/server-files/structures linguist-generated
* text=auto
*.gradle eol=lf diff=java
*.java eol=lf diff=java
*.kt eol=lf diff=java
*.lua eol=lf
*.md eol=lf diff=markdown
*.txt eol=lf
*.png binary
*.jar binary

15
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,15 @@
---
name: Bug report
about: Report some misbehaviour in the mod
labels: bug
---
<!--
## Before reporting
- Search for the bug on the issue tracker. Make sure to look at closed issues too!
-->
## Useful information to include:
- Minecraft version
- CC: Tweaked version
- Detailed reproduction steps: sometimes I can spot a bug pretty easily, but often it's much more obscure. The more information I have to help reproduce it, the quicker it'll get fixed.

View File

@@ -1,33 +0,0 @@
name: Bug report
description: Report some misbehaviour in the mod
labels: [ bug ]
body:
- type: dropdown
id: mc-version
attributes:
label: Minecraft Version
description: What version of Minecraft are you using?
options:
- 1.15.x
- 1.16.x
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: "What version of CC: Tweaked are you using?"
placeholder: "e.g. 1.96.0"
validations:
required: true
- type: textarea
id: details
attributes:
label: Details
description: |
Description of the bug. Please include the following:
- Logs: These will be located in the `logs/` directory of your Minecraft
instance. Please upload them as a gist or directly into this editor.
- Detailed reproduction steps: sometimes I can spot a bug pretty easily,
but often it's much more obscure. The more information I have to help
reproduce it, the quicker it'll get fixed.

View File

@@ -1,17 +0,0 @@
{
"problemMatcher": [
{
"owner": "checkstyle",
"pattern": [
{
"regexp": "^([a-z]+) ([\\w./-]+):(\\d+):(\\d+): (.*)$",
"severity": 1,
"file": 2,
"line": 3,
"column": 4,
"message": 5
}
]
}
]
}

View File

@@ -1,18 +0,0 @@
{
"problemMatcher": [
{
"owner": "illuaminate",
"severity": "warning",
"pattern": [
{
"regexp": "^([\\w./-]+):\\[(\\d+):(\\d+)\\-(?:\\d+):(?:\\d+)\\]: (.*) \\[([a-z:-]+)\\]$",
"file": 1,
"line": 2,
"column": 3,
"message": 4,
"code": 5
}
]
}
]
}

View File

@@ -1,15 +0,0 @@
{
"problemMatcher": [
{
"owner": "junit",
"pattern": [
{
"regexp": "^## ([\\w./-]+):(\\d+): (.*)$",
"file": 1,
"line": 2,
"message": 3
}
]
}
]
}

View File

@@ -1,61 +0,0 @@
name: Build
on: [push, pull_request]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Java 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: Cache gradle dependencies
uses: actions/cache@v2
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('gradle.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Disable Gradle daemon
run: |
mkdir -p ~/.gradle
echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties
- name: Build with Gradle
run: |
./gradlew assemble || ./gradlew assemble
./gradlew downloadAssets || ./gradlew downloadAssets
./gradlew build
- name: Upload Jar
uses: actions/upload-artifact@v2
with:
name: CC-Tweaked
path: build/libs
- name: Upload Coverage
uses: codecov/codecov-action@v1
- name: Parse test reports
run: ./tools/parse-reports.py
if: ${{ failure() }}
- name: Cache pre-commit
uses: actions/cache@v2
with:
path: ~/.cache/pre-commit
key: ${{ runner.os }}-pre-commit-${{ hashFiles('config/pre-commit/config.yml') }}
restore-keys: |
${{ runner.os }}-pre-commit-
- name: Run linters
run: |
pip install pre-commit
pre-commit run --config config/pre-commit/config.yml --show-diff-on-failure --all --color=always

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env bash
set -eu
DEST="${GITHUB_REF#refs/*/}"
echo "Uploading docs to https://tweaked.cc/$DEST"
# Setup ssh key
mkdir -p "$HOME/.ssh/"
echo "$SSH_KEY" > "$HOME/.ssh/key"
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/" \
"$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST"
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
"$GITHUB_WORKSPACE/build/docs/javadoc/" \
"$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST/javadoc"

View File

@@ -1,50 +0,0 @@
name: Build documentation
on:
push:
branches:
- mc-1.16.x
jobs:
make_doc:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Java 8
uses: actions/setup-java@v1
with:
java-version: 8
- name: Cache gradle dependencies
uses: actions/cache@v2
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('gradle.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup illuaminate
run: |
test -d bin || mkdir bin
test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/linux-x86-64/illuaminate
chmod +x bin/illuaminate
- name: Setup node
run: npm ci
- name: Build with Gradle
run: ./gradlew compileJava --no-daemon || ./gradlew compileJava --no-daemon
- name: Generate documentation
run: ./gradlew docWebsite javadoc --no-daemon
- name: Upload documentation
run: .github/workflows/make-doc.sh 2> /dev/null
env:
SSH_KEY: ${{ secrets.SSH_KEY }}
SSH_USER: ${{ secrets.SSH_USER }}
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PORT: ${{ secrets.SSH_PORT }}

14
.gitignore vendored
View File

@@ -3,8 +3,8 @@
/logs
/build
/out
/doc/out/
/node_modules
/doc/**/*.html
/doc/index.json
# Runtime directories
/run
@@ -18,12 +18,8 @@
.gradle
*.DS_Store
/.classpath
/.project
/.settings
/.vscode
.classpath
.project
.settings/
bin/
*.launch
/src/generated/resources/.cache
/src/web/mount/*.d.ts

View File

@@ -1,22 +0,0 @@
image:
file: config/gitpod/Dockerfile
ports:
- port: 25565
onOpen: notify
vscode:
extensions:
- eamodio.gitlens
- github.vscode-pull-request-github
- ms-azuretools.vscode-docker
- redhat.java
- richardwillis.vscode-gradle
- vscjava.vscode-java-debug
- vscode.github
tasks:
- name: Setup pre-commit hool
init: pre-commit install --config config/pre-commit/config.yml --allow-missing-config
- name: Install npm packages
init: npm ci

View File

@@ -8,31 +8,18 @@ If you've any other questions, [just ask the community][community] or [open an i
If you have a bug, suggestion, or other feedback, the best thing to do is [file an issue][new-issue]. When doing so,
do use the issue templates - they provide a useful hint on what information to provide.
## Translations
Translations are managed through [Weblate], an online interface for managing language strings. This is synced
automatically with GitHub, so please don't submit PRs adding/changing translations!
## Developing
In order to develop CC: Tweaked, you'll need to download the source code and then run it. This is a pretty simple
process. When building on Windows, Use `gradlew.bat` instead of `./gradlew`.
process.
- **Clone the repository:** `git clone https://github.com/SquidDev-CC/CC-Tweaked.git && cd CC-Tweaked`
- **Setup Forge:** `./gradlew build`
- **Setup Forge:** `./gradlew setupDecompWorkspace`
- **Run Minecraft:** `./gradlew runClient` (or run the `GradleStart` class from your IDE).
- **Optionally:** For small PRs (especially those only touching Lua code), it may be easier to use GitPod, which
provides a pre-configured environment: [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-2b2b2b?logo=gitpod)](https://gitpod.io/#https://github.com/SquidDev-CC/CC-Tweaked/)
Do note you will need to download the mod after compiling to test.
If you want to run CC:T in a normal Minecraft instance, run `./gradlew build` and copy the `.jar` from `build/libs`.
These commands may take a few minutes to run the first time, as the environment is set up, but should be much faster
afterwards.
The following sections describe the more niche sections of CC: Tweaked's build system. Some bits of these are
quite-complex, and (dare I say) over-engineered, so you may wish to ignore them. Well tested/documented PRs are always
preferred (and I'd definitely recommend setting up the tooling if you're doing serious development work), but for
small changes it can be a lot.
### Code linters
CC: Tweaked uses a couple of "linters" on its source code, to enforce a consistent style across the project. While these
are run whenever you submit a PR, it's often useful to run this before committing.
@@ -40,75 +27,10 @@ are run whenever you submit a PR, it's often useful to run this before committin
- **[Checkstyle]:** Checks Java code to ensure it is consistently formatted. This can be run with `./gradlew build` or
`./gradle check`.
- **[illuaminate]:** Checks Lua code for semantic and styleistic issues. See [the usage section][illuaminate-usage] for
how to download and run it. You may need to generate the Java documentation stubs (see "Documentation" below) for all
lints to pass.
### Documentation
When writing documentation for [CC: Tweaked's documentation website][docs], it may be useful to build the documentation
and preview it yourself before submitting a PR.
Building all documentation is, sadly, a multi-stage process (though this is largely hidden by Gradle). First we need to
convert Java doc-comments into Lua ones, we also generate some Javascript to embed. All of this is then finally fed into
illuaminate, which spits out our HTML.
#### Setting up the tooling
For various reasons, getting the environment set up to build documentation can be pretty complex. I'd quite like to
automate this via Docker and/or nix in the future, but this needs to be done manually for now.
This tooling is only needed if you need to build the whole website. If you just want to generate the Lua stubs, you can
skp this section.
- Install Node/npm and install our Node packages with `npm ci`.
- Install [illuaminate][illuaminate-usage] as described above.
#### Building documentation
Gradle should be your entrypoint to building most documentation. There's two tasks which are of interest:
- `./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/`.
#### Writing documentation
illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as
[ldoc][ldoc]. Documentation comments are written in Markdown,
Our markdown engine does _not_ support GitHub flavoured markdown, and so does not support all the features one might
expect (such as tables). It is very much recommended that you build and preview the docs locally first.
### Testing
Thankfully running tests is much simpler than running the documentation generator! `./gradlew check` will run the
entire test suite (and some additional bits of verification).
Before we get into writing tests, it's worth mentioning the various test suites that CC: Tweaked has:
- "Core" Java (`./src/test/java`): These test core bits of the mod which don't require any Minecraft interaction.
This includes the `@LuaFunction` system, file system code, etc...
These tests are run by `./gradlew test`.
- CraftOS (`./src/test/resources/test-rom/`): These tests are written in Lua, and ensure the Lua environment, libraries
and programs work as expected. These are (generally) written to be able to be run on emulators too, to provide some
sort of compliance test.
These tests are run by the '"Core" Java' test suite, and so are also run with `./gradlew test`.
- In-game (`./src/test/java/dan200/computercraft/ingame/`): These tests are run on an actual Minecraft server, using
[the same system Mojang do][mc-test]. The aim of these is to test in-game behaviour of blocks and peripherals.
These are run by `./gradlew testInGame`.
## CraftOS tests
CraftOS's tests are written using a test system called "mcfly", heavily inspired by [busted] (and thus RSpec). Groups of
tests go inside `describe` blocks, and a single test goes inside `it`.
Assertions are generally written using `expect` (inspired by Hamcrest and the like). For instance, `expect(foo):eq("bar")`
asserts that your variable `foo` is equal to the expected value `"bar"`.
how to download and run it.
[new-issue]: https://github.com/SquidDev-CC/CC-Tweaked/issues/new/choose "Create a new issue"
[community]: README.md#Community "Get in touch with the community."
[checkstyle]: https://checkstyle.org/
[illuaminate]: https://github.com/SquidDev/illuaminate/ "Illuaminate on GitHub"
[illuaminate-usage]: https://github.com/SquidDev/illuaminate/blob/master/README.md#usage "Installing Illuaminate"
[weblate]: https://i18n.tweaked.cc/projects/cc-tweaked/minecraft/ "CC: Tweaked weblate instance"
[docs]: https://tweaked.cc/ "CC: Tweaked documentation"
[ldoc]: http://stevedonovan.github.io/ldoc/ "ldoc, a Lua documentation generator."
[mc-test]: https://www.youtube.com/watch?v=vXaWOJTCYNg
[busted]: https://github.com/Olivine-Labs/busted "busted: Elegant Lua unit testing."
[illuaminate]: https://github.com/SquidDev/illuaminate/
[illuaminate-usage]: https://github.com/SquidDev/illuaminate/blob/master/README.md#usage

14
LICENSE
View File

@@ -19,14 +19,14 @@ Mod: The mod code designated by the present license, in source form, binary
form, as obtained standalone, as part of a wider distribution or resulting from
the compilation of the original or modified sources.
Dependency: Code required for the mod to work properly. This includes
Dependency: Code required for the mod to work properly. This includes
dependencies required to compile the code as well as any file or modification
that is explicitly or implicitly required for the mod to be working.
1. Scope
--------
The present license is granted to any user of the mod. As a prerequisite,
The present license is granted to any user of the mod. As a prerequisite,
a user must own a legally acquired copy of Minecraft
2. Liability
@@ -41,13 +41,13 @@ or misuse of this mod fall on the user.
3. Play rights
--------------
The user is allowed to install this mod on a Minecraft client or server and to play
The user is allowed to install this mod on a Minecraft client or server and to play
without restriction.
4. Modification rights
----------------------
The user has the right to decompile the source code, look at either the
The user has the right to decompile the source code, look at either the
decompiled version or the original source code, and to modify it.
5. Distribution of original or modified copy rights
@@ -61,10 +61,10 @@ include:
- patch to its source or binary files
- any copy of a portion of its binary source files
The user is allowed to redistribute this mod partially, in totality, or
The user is allowed to redistribute this mod partially, in totality, or
included in a distribution.
When distributing binary files, the user must provide means to obtain its
When distributing binary files, the user must provide means to obtain its
entire set of sources or modified sources at no cost.
All distributions of this mod must remain licensed under the CCPL.
@@ -92,7 +92,7 @@ must be made available at no cost and remain licensed under the CCPL.
---------------
If you choose to contribute code or assets to be included in this mod, you
agree that, if added to to the main repository at
agree that, if added to to the main repository at
https://github.com/dan200/ComputerCraft, your contributions will be covered by
this license, and that Daniel Ratcliffe will retain the right to re-license the
mod, including your contributions, in part or in whole, under other licenses.

View File

@@ -50,23 +50,20 @@ I'd generally recommend you don't contact me directly (email, DM, etc...) unless
report exploits). You'll get a far quicker response if you ask the whole community!
## Using
CC: Tweaked is hosted on my maven repo, and so is relatively simple to depend on. You may wish to add a soft (or hard)
dependency in your `mods.toml` file, with the appropriate version bounds, to ensure that API functionality you depend
on is present.
If you want to depend on CC: Tweaked, we have a maven repo. However, you should be wary that some functionality is only
exposed by CC:T's API and not vanilla ComputerCraft. If you wish to support all variations of ComputerCraft, I recommend
using [cc.crzd.me's maven](https://cc.crzd.me/maven/) instead.
```groovy
repositories {
dependencies {
maven { url 'https://squiddev.cc/maven/' }
}
dependencies {
implementation fg.deobf("org.squiddev:cc-tweaked-${mc_version}:${cct_version}")
implementation "org.squiddev:cc-tweaked-${mc_version}:${cct_version}"
}
```
You should also be careful to only use classes within the `dan200.computercraft.api` package. Non-API classes are
subject to change at any point. If you depend on functionality outside the API, file an issue, and we can look into
exposing more features.
We bundle the API sources with the jar, so documentation should be easily viewable within your editor. Alternatively,
the generated documentation [can be browsed online](https://tweaked.cc/javadoc/).

View File

@@ -1,157 +1,81 @@
// For those who want the bleeding edge
buildscript {
repositories {
mavenCentral()
jcenter()
maven {
name = "forge"
url = "https://maven.minecraftforge.net"
url = "https://files.minecraftforge.net/maven"
}
}
dependencies {
classpath 'com.google.code.gson:gson:2.8.1'
classpath 'net.minecraftforge.gradle:ForgeGradle:5.0.6'
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta1'
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
}
}
plugins {
id "checkstyle"
id "jacoco"
id "maven-publish"
id "com.github.hierynomus.license" version "0.16.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.3.72"
id "com.modrinth.minotaur" version "1.2.1"
id "com.github.hierynomus.license" version "0.15.0"
id "com.matthewprenger.cursegradle" version "1.3.0"
id "com.github.breadmoirai.github-release" version "2.2.4"
}
apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'org.ajoberstar.grgit'
apply plugin: 'maven-publish'
apply plugin: 'maven'
version = mod_version
group = "org.squiddev"
archivesBaseName = "cc-tweaked-${mc_version}"
def javaVersion = JavaLanguageVersion.of(8)
java {
toolchain {
languageVersion = javaVersion
}
withSourcesJar()
withJavadocJar()
}
// Tragically java.toolchain.languageVersion doesn't apply to ForgeGradle's
// tasks, so we force all launchers to use the right Java version.
tasks.withType(JavaCompile).configureEach {
javaCompiler = javaToolchains.compilerFor {
languageVersion = javaVersion
}
}
tasks.withType(JavaExec).configureEach {
javaLauncher = javaToolchains.launcherFor {
languageVersion = javaVersion
}
}
minecraft {
runs {
client {
workingDirectory project.file('run')
property 'forge.logging.markers', 'REGISTRIES'
property 'forge.logging.console.level', 'debug'
version = "${mc_version}-${forge_version}"
runDir = "run"
replace '${version}', mod_version
mods {
computercraft {
source sourceSets.main
}
}
}
server {
workingDirectory project.file("run/server")
property 'forge.logging.markers', 'REGISTRIES'
property 'forge.logging.console.level', 'debug'
arg "--nogui"
mods {
computercraft {
source sourceSets.main
}
}
}
data {
workingDirectory project.file('run')
property 'forge.logging.markers', 'REGISTRIES'
property 'forge.logging.console.level', 'debug'
args '--mod', 'computercraft', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
mods {
computercraft {
source sourceSets.main
}
}
}
testServer {
workingDirectory project.file('test-files/server')
parent runs.server
mods {
cctest {
source sourceSets.test
}
}
}
}
mappings channel: 'official', version: project.mc_version
accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg')
}
sourceSets {
main.resources {
srcDir 'src/generated/resources'
}
mappings = mappings_version
makeObfSourceJar = false
}
repositories {
mavenCentral()
maven {
name "SquidDev"
url "https://squiddev.cc/maven"
}
ivy {
name "Charset"
artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]"
}
}
configurations {
shade
compile.extendsFrom shade
cctJavadoc
deployerJars
}
dependencies {
checkstyle "com.puppycrawl.tools:checkstyle:8.25"
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
deobfProvided "CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.554"
deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
deobfProvided "mezz.jei:jei_1.12.2:4.15.0.269:api"
deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3:api")
compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.15.2:6.0.0.9")
runtime "mezz.jei:jei_1.12.2:4.15.0.269"
runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3")
shade 'org.squiddev:Cobalt:0.5.5'
shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
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.3.72'
testImplementation 'org.jetbrains.kotlin:kotlin-reflect:1.3.72'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8'
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.0'
deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
}
// Compile tasks
@@ -160,32 +84,15 @@ javadoc {
include "dan200/computercraft/api/**/*.java"
}
task luaJavadoc(type: Javadoc) {
description "Generates documentation for Java-side Lua functions."
group "documentation"
source = sourceSets.main.allJava
destinationDir = file("${project.docsDir}/luaJavadoc")
classpath = sourceSets.main.compileClasspath
options.docletpath = configurations.cctJavadoc.files as List
options.doclet = "cc.tweaked.javadoc.LuaDoclet"
options.noTimestamp = false
javadocTool = javaToolchains.javadocToolFor {
languageVersion = JavaLanguageVersion.of(11)
}
}
jar {
dependsOn javadoc
manifest {
attributes(["Specification-Title": "computercraft",
"Specification-Vendor": "SquidDev",
"Specification-Version": "1",
"Implementation-Title": "CC: Tweaked",
"Implementation-Version": "${mod_version}",
"Implementation-Vendor" :"SquidDev",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")])
attributes('FMLAT': 'computercraft_at.cfg')
}
from (sourceSets.main.allSource) {
include "dan200/computercraft/api/**/*.java"
}
from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
@@ -193,10 +100,67 @@ jar {
[compileJava, compileTestJava].forEach {
it.configure {
options.compilerArgs << "-Xlint" << "-Xlint:-processing"
options.compilerArgs << "-Xlint" << "-Xlint:-processing" << "-Werror"
}
}
import java.nio.charset.StandardCharsets
import java.nio.file.*
import java.util.zip.*
import com.google.gson.GsonBuilder
import com.google.gson.JsonElement
import com.hierynomus.gradle.license.tasks.LicenseCheck
import com.hierynomus.gradle.license.tasks.LicenseFormat
import org.ajoberstar.grgit.Grgit
import proguard.gradle.ProGuardTask
task proguard(type: ProGuardTask, dependsOn: jar) {
description "Removes unused shadowed classes from the jar"
group "compact"
injars jar.archivePath
outjars "${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar"
// Add the main runtime jar and all non-shadowed dependencies
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
doFirst {
sourceSets.main.compileClasspath
.filter { !it.name.contains("Cobalt") }
.each { libraryjars it }
}
// We want to avoid as much obfuscation as possible. We're only doing this to shrink code size.
dontobfuscate; dontoptimize; keepattributes; keepparameternames
// Tell ProGuard to shut up
dontwarn 'org.checkerframework.**'
// Proguard will remove directories by default, but that breaks JarMount.
keepdirectories 'assets/computercraft/lua**'
// Preserve ComputerCraft classes - we only want to strip shadowed files.
keep 'class dan200.computercraft.** { *; }'
}
task proguardMove(dependsOn: proguard) {
description "Replace the original jar with the minified version"
group "compact"
doLast {
Files.move(
file("${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar").toPath(),
file(jar.archivePath).toPath(),
StandardCopyOption.REPLACE_EXISTING
)
}
}
reobfJar.dependsOn proguardMove
processResources {
inputs.property "version", mod_version
inputs.property "mcversion", mc_version
@@ -204,21 +168,21 @@ processResources {
def hash = 'none'
Set<String> contributors = []
try {
hash = ["git", "-C", projectDir, "rev-parse", "HEAD"].execute().text.trim()
def grgit = Grgit.open(dir: '.')
hash = grgit.head().id
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)
grgit.log().each {
if (!blacklist.contains(it.author.name)) contributors.add(it.author.name)
if (!blacklist.contains(it.committer.name)) contributors.add(it.committer.name)
}
} catch(Exception e) {
e.printStackTrace()
}
} catch(Exception ignored) { }
inputs.property "commithash", hash
duplicatesStrategy = DuplicatesStrategy.INCLUDE
from(sourceSets.main.resources.srcDirs) {
include 'META-INF/mods.toml'
include 'data/computercraft/lua/rom/help/credits.txt'
include 'mcmod.info'
include 'assets/computercraft/lua/rom/help/credits.txt'
expand 'version': mod_version,
'mcversion': mc_version,
@@ -226,66 +190,53 @@ processResources {
}
from(sourceSets.main.resources.srcDirs) {
exclude 'META-INF/mods.toml'
exclude 'data/computercraft/lua/rom/help/credits.txt'
exclude 'mcmod.info'
exclude 'assets/computercraft/lua/rom/help/credits.txt'
}
}
sourcesJar {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
task compressJson(dependsOn: extractAnnotationsJar) {
group "compact"
description "Minifies all JSON files, stripping whitespace"
def jarPath = file(jar.archivePath)
def tempPath = File.createTempFile("input", ".jar", temporaryDir)
tempPath.deleteOnExit()
def gson = new GsonBuilder().create()
doLast {
// Copy over all files in the current jar to the new one, running json files from GSON. As pretty printing
// is turned off, they should be minified.
new ZipFile(jarPath).withCloseable { inJar ->
tempPath.getParentFile().mkdirs()
new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(tempPath))).withCloseable { outJar ->
inJar.entries().each { entry ->
if(entry.directory) {
outJar.putNextEntry(entry)
} else if(!entry.name.endsWith(".json")) {
outJar.putNextEntry(entry)
inJar.getInputStream(entry).withCloseable { outJar << it }
} else {
ZipEntry newEntry = new ZipEntry(entry.name)
newEntry.setTime(entry.time)
outJar.putNextEntry(newEntry)
def element = inJar.getInputStream(entry).withCloseable { gson.fromJson(it.newReader("UTF8"), JsonElement.class) }
outJar.write(gson.toJson(element).getBytes(StandardCharsets.UTF_8))
}
}
}
}
// And replace the original jar again
Files.move(tempPath.toPath(), jarPath.toPath(), StandardCopyOption.REPLACE_EXISTING)
}
}
// Web tasks
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) {
group = "build"
description = "Bundles JS into rollup"
inputs.files(fileTree("src/web")).withPropertyName("sources")
inputs.file("package-lock.json").withPropertyName("package-lock.json")
inputs.file("tsconfig.json").withPropertyName("Typescript config")
inputs.file("rollup.config.js").withPropertyName("Rollup config")
outputs.file("$buildDir/rollup/index.js").withPropertyName("output")
commandLine mkCommand('"node_modules/.bin/rollup" --config rollup.config.js')
}
task minifyWeb(type: Exec, dependsOn: rollup) {
group = "build"
description = "Bundles JS into rollup"
inputs.file("$buildDir/rollup/index.js").withPropertyName("sources")
inputs.file("package-lock.json").withPropertyName("package-lock.json")
outputs.file("$buildDir/rollup/index.min.js").withPropertyName("output")
commandLine mkCommand('"node_modules/.bin/terser"' + " -o '$buildDir/rollup/index.min.js' '$buildDir/rollup/index.js'")
}
task illuaminateDocs(type: Exec, dependsOn: [minifyWeb, luaJavadoc]) {
group = "build"
description = "Bundles JS into rollup"
inputs.files(fileTree("doc")).withPropertyName("docs")
inputs.files(fileTree("src/main/resources/data/computercraft/lua/rom")).withPropertyName("lua rom")
inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp")
inputs.dir("$buildDir/docs/luaJavadoc")
inputs.file("$buildDir/rollup/index.min.js").withPropertyName("scripts")
inputs.file("src/web/styles.css").withPropertyName("styles")
outputs.dir("$buildDir/docs/lua")
commandLine mkCommand('"bin/illuaminate" doc-gen')
}
task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
from 'doc/logo.png'
into "${project.docsDir}/lua"
}
assemble.dependsOn compressJson
// Check tasks
@@ -297,7 +248,6 @@ test {
}
jacocoTestReport {
dependsOn('test')
reports {
xml.enabled true
html.enabled true
@@ -306,29 +256,25 @@ jacocoTestReport {
check.dependsOn jacocoTestReport
import com.hierynomus.gradle.license.tasks.LicenseCheck
import com.hierynomus.gradle.license.tasks.LicenseFormat
license {
mapping("java", "SLASHSTAR_STYLE")
strictCheck true
ext.year = Calendar.getInstance().get(Calendar.YEAR)
ext.year = 2020
}
[licenseMain, licenseFormatMain].forEach {
it.configure {
include("**/*.java")
exclude("dan200/computercraft/api/**")
header file('config/license/main.txt')
header rootProject.file('config/license/main.txt')
}
}
[licenseTest, licenseFormatTest].forEach {
it.configure {
include("**/*.java")
header file('config/license/main.txt')
header rootProject.file('config/license/main.txt')
}
}
@@ -345,71 +291,10 @@ task licenseFormatAPI(type: LicenseFormat);
it.configure {
source = sourceSets.main.java
include("dan200/computercraft/api/**")
header file('config/license/api.txt')
header rootProject.file('config/license/api.txt')
}
}
task setupServer(type: Copy) {
group "test server"
description "Sets up the environment for the test server."
from("src/test/server-files") {
include "eula.txt"
include "server.properties"
}
into "test-files/server"
}
tasks.register('testInGame', JavaExec.class).configure {
it.group('test server')
it.description("Runs tests on a temporary Minecraft server.")
it.dependsOn(setupServer, 'prepareRunTestServer', 'cleanTestInGame')
// 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('runTestServer')
it.setWorkingDir(exec.getWorkingDir())
it.setSystemProperties(exec.getSystemProperties())
it.setBootstrapClasspath(exec.getBootstrapClasspath())
it.setClasspath(exec.getClasspath())
it.setMain(exec.getMain())
it.setEnvironment(exec.getEnvironment())
it.setArgs(exec.getArgs())
it.setJvmArgs(exec.getJvmArgs())
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/testInGame')
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('jacocoTestInGameReport', JacocoReport.class).configure {
it.group('test server')
it.description('Generate coverage reports for in-game tests (testInGame)')
it.dependsOn('testInGame')
it.executionData(new File(buildDir, 'jacoco/testInGame.exec'))
it.sourceDirectories.from(sourceSets.main.allJava.srcDirs)
it.classDirectories.from(new File(buildDir, 'jacocoClassDump/testInGame'))
it.reports {
xml.enabled true
html.enabled true
}
}
check.dependsOn('jacocoTestInGameReport')
// Upload tasks
task checkRelease {
@@ -417,31 +302,31 @@ task checkRelease {
description "Verifies that everything is ready for a release"
inputs.property "version", mod_version
inputs.file("src/main/resources/data/computercraft/lua/rom/help/changelog.md")
inputs.file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.md")
inputs.file("src/main/resources/assets/computercraft/lua/rom/help/changelog.txt")
inputs.file("src/main/resources/assets/computercraft/lua/rom/help/whatsnew.txt")
doLast {
def ok = true
// Check we're targetting the current version
def whatsnew = new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md").readLines()
def whatsnew = new File("src/main/resources/assets/computercraft/lua/rom/help/whatsnew.txt").readLines()
if (whatsnew[0] != "New features in CC: Tweaked $mod_version") {
ok = false
project.logger.error("Expected `whatsnew.md' to target $mod_version.")
project.logger.error("Expected `whatsnew.txt' to target $mod_version.")
}
// Check "read more" exists and trim it
def idx = whatsnew.findIndexOf { it == 'Type "help changelog" to see the full version history.' }
if (idx == -1) {
ok = false
project.logger.error("Must mention the changelog in whatsnew.md")
project.logger.error("Must mention the changelog in whatsnew.txt")
} else {
whatsnew = whatsnew.getAt(0 ..< idx)
}
// Check whatsnew and changelog match.
def versionChangelog = "# " + whatsnew.join("\n")
def changelog = new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/changelog.md").getText()
def changelog = new File("src/main/resources/assets/computercraft/lua/rom/help/changelog.txt").getText()
if (!changelog.startsWith(versionChangelog)) {
ok = false
project.logger.error("whatsnew and changelog are not in sync")
@@ -465,66 +350,53 @@ curseforge {
}
}
import com.modrinth.minotaur.TaskModrinthUpload
tasks.register('publishModrinth', TaskModrinthUpload.class).configure {
dependsOn('assemble', 'reobfJar')
onlyIf {
project.hasProperty('modrinthApiKey')
}
token = project.hasProperty('modrinthApiKey') ? project.getProperty('modrinthApiKey') : ''
projectId = 'gu7yAYhd'
versionNumber = "${project.mc_version}-${project.mod_version}"
uploadFile = jar
addGameVersion(project.mc_version)
changelog = "Release notes can be found on the [GitHub repository](https://github.com/SquidDev-CC/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) {
mavenJava(MavenPublication) {
from components.java
artifact sourceJar
}
}
}
pom {
name = 'CC: Tweaked'
description = 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.'
url = 'https://github.com/SquidDev-CC/CC-Tweaked'
uploadArchives {
repositories {
if(project.hasProperty('mavenUploadUrl')) {
mavenDeployer {
configuration = configurations.deployerJars
scm {
url = 'https://github.com/SquidDev-CC/CC-Tweaked.git'
repository(url: project.property('mavenUploadUrl')) {
authentication(
userName: project.property('mavenUploadUser'),
privateKey: project.property('mavenUploadKey'))
}
issueManagement {
system = 'github'
url = 'https://github.com/SquidDev-CC/CC-Tweaked/issues'
}
pom.project {
name 'CC: Tweaked'
packaging 'jar'
description 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.'
url 'https://github.com/SquidDev-CC/CC-Tweaked'
licenses {
license {
name = 'ComputerCraft Public License, Version 1.0'
url = 'https://github.com/SquidDev-CC/CC-Tweaked/blob/mc-1.15.x/LICENSE'
scm {
url 'https://github.com/SquidDev-CC/CC-Tweaked.git'
}
issueManagement {
system 'github'
url 'https://github.com/SquidDev-CC/CC-Tweaked/issues'
}
licenses {
license {
name 'ComputerCraft Public License, Version 1.0'
url 'https://github.com/SquidDev-CC/CC-Tweaked/blob/master/LICENSE'
distribution 'repo'
}
}
}
withXml { asNode().remove(asNode().get("dependencies")) }
}
}
}
repositories {
if (project.hasProperty("mavenUser")) {
maven {
name = "SquidDev"
url = "https://squiddev.cc/maven"
credentials {
username = project.property("mavenUser") as String
password = project.property("mavenPass") as String
pom.whenConfigured { pom ->
pom.dependencies.clear()
}
}
}
@@ -535,30 +407,28 @@ githubRelease {
token project.hasProperty('githubApiKey') ? project.githubApiKey : ''
owner 'SquidDev-CC'
repo 'CC-Tweaked'
targetCommitish.set(project.provider({
try {
return ["git", "-C", projectDir, "rev-parse", "--abbrev-ref", "HEAD"].execute().text.trim()
} catch (Exception e) {
e.printStackTrace()
}
return "master"
}))
try {
targetCommitish = Grgit.open(dir: '.').branch.current().name
} catch(Exception ignored) { }
tagName "v${mc_version}-${mod_version}"
releaseName "[${mc_version}] ${mod_version}"
body.set(project.provider({
"## " + new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md")
body {
"## " + new File("src/main/resources/assets/computercraft/lua/rom/help/whatsnew.txt")
.readLines()
.takeWhile { it != 'Type "help changelog" to see the full version history.' }
.join("\n").trim()
}))
}
prerelease false
}
def uploadTasks = ["publish", "curseforge", "publishModrinth", "githubRelease"]
def uploadTasks = ["uploadArchives", "curseforge", "githubRelease"]
uploadTasks.forEach { tasks.getByName(it).dependsOn checkRelease }
task uploadAll(dependsOn: uploadTasks) {
group "upload"
description "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)"
description "Uploads to all repositories (Maven, Curse, GitHub release)"
}
runClient.outputs.upToDateWhen { false }
runServer.outputs.upToDateWhen { false }

View File

@@ -7,11 +7,7 @@
<property name="charset" value="UTF-8" />
<module name="SuppressionFilter">
<property name="file" value="${config_loc}/suppressions.xml" />
</module>
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="render_old"/>
<property name="file" value="config/checkstyle/suppressions.xml" />
</module>
<module name="TreeWalker">
@@ -97,19 +93,28 @@
<module name="LambdaParameterName" />
<module name="LocalFinalVariableName" />
<module name="LocalVariableName" />
<module name="MemberName" />
<!-- Allow an optional m_ on private members -->
<module name="MemberName">
<property name="applyToPrivate" value="false" />
<property name="applyToPackage" value="false" />
</module>
<module name="MemberName">
<property name="format" value="^(m_)?[a-z][a-zA-Z0-9]*$" />
<property name="applyToPrivate" value="true" />
<property name="applyToPackage" value="true" />
</module>
<module name="MethodName" />
<module name="MethodTypeParameterName" />
<module name="PackageName">
<property name="format" value="^dan200\.computercraft(\.[a-z][a-z0-9]*)*" />
<property name="format" value="^dan200\.computercraf(\.[a-z][a-z0-9]*)*" />
</module>
<module name="ParameterName" />
<module name="StaticVariableName">
<property name="format" value="^[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z_]+)?$" />
<property name="format" value="^[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z]+)?$" />
<property name="applyToPrivate" value="false" />
</module>
<module name="StaticVariableName">
<property name="format" value="^(s_)?[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z_]+)?$" />
<property name="format" value="^(s_)?[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z]+)?$" />
<property name="applyToPrivate" value="true" />
</module>
<module name="TypeName" />
@@ -151,7 +156,7 @@
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true" />
<property name="ignoreEnhancedForColon" value="false" />
<property name="tokens" value="ASSIGN,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,EQUAL,GE,GT,LAMBDA,LAND,LCURLY,LE,LITERAL_RETURN,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND" />
<property name="tokens" value="ASSIGN,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,DO_WHILE,EQUAL,GE,GT,LAMBDA,LAND,LCURLY,LE,LITERAL_RETURN,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND" />
</module>
</module>

View File

@@ -7,6 +7,6 @@
<suppress checks="StaticVariableName" files=".*[\\/]ComputerCraft.java" />
<suppress checks="StaticVariableName" files=".*[\\/]ComputerCraftAPI.java" />
<!-- The commands API is documented in Lua. -->
<suppress checks="SummaryJavadocCheck" files=".*[\\/]CommandAPI.java" />
<!-- Do not check for missing package Javadoc. -->
<suppress checks="JavadocStyle" files=".*[\\/]package-info.java" />
</suppressions>

View File

@@ -1,8 +0,0 @@
FROM gitpod/workspace-base
USER gitpod
RUN sudo apt-get -q update \
&& sudo apt-get install -yq openjdk-8-jdk openjdk-16-jdk python3-pip npm \
&& sudo pip3 install pre-commit \
&& sudo update-java-alternatives --set java-1.8.0-openjdk-amd64

View File

@@ -2488,4 +2488,4 @@
</option>
</inspection_tool>
</profile>
</component>
</component>

View File

@@ -58,4 +58,4 @@
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</code_scheme>

View File

@@ -1,55 +0,0 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-merge-conflict
# Quick syntax checkers
- id: check-xml
- id: check-yaml
- id: check-toml
- id: check-json
exclude: "tsconfig\\.json$"
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.3.5
hooks:
- id: editorconfig-checker
args: ['-disable-indentation']
exclude: "^(.*\\.(bat)|LICENSE)$"
- repo: local
hooks:
- id: checkstyle
name: Check Java codestyle
files: ".*\\.java$"
language: system
entry: ./gradlew checkstyleMain checkstyleTest
pass_filenames: false
require_serial: true
- id: license
name: Check Java license headers
files: ".*\\.java$"
language: system
entry: ./gradlew licenseFormat
pass_filenames: false
require_serial: true
- id: illuaminate
name: Check Lua code
files: ".*\\.(lua|java|md)"
language: script
entry: config/pre-commit/illuaminate-lint.sh
pass_filenames: false
require_serial: true
exclude: |
(?x)^(
src/generated|
src/test/resources/test-rom/data/json-parsing/|
src/test/server-files/|
config/idea/
)

View File

@@ -1,16 +0,0 @@
#!/usr/bin/env sh
set -e
test -d bin || mkdir bin
test -f bin/illuaminate || curl -s -obin/illuaminate https://squiddev.cc/illuaminate/linux-x86-64/illuaminate
chmod +x bin/illuaminate
if [ -n ${GITHUB_ACTIONS+x} ]; then
# Register a problem matcher (see https://github.com/actions/toolkit/blob/master/docs/problem-matchers.md)
# for illuaminate.
echo "::add-matcher::.github/matchers/illuaminate.json"
trap 'echo "::remove-matcher owner=illuaminate::"' EXIT
fi
./gradlew luaJavadoc
bin/illuaminate lint

View File

@@ -1,21 +0,0 @@
---
module: [kind=event] alarm
see: os.setAlarm To start an alarm.
---
The @{timer} event is fired when an alarm started with @{os.setAlarm} completes.
## Return Values
1. @{string}: The event name.
2. @{number}: The ID of the alarm that finished.
## Example
Starts a timer and then prints its ID:
```lua
local alarmID = os.setAlarm(os.time() + 0.05)
local event, id
repeat
event, id = os.pullEvent("alarm")
until id == alarmID
print("Alarm with ID " .. id .. " was fired")
```

View File

@@ -1,24 +0,0 @@
---
module: [kind=event] char
see: key To listen to any key press.
---
The @{char} event is fired when a character is _typed_ on the keyboard.
The @{char} event is different to a key press. Sometimes multiple key presses may result in one character being
typed (for instance, on some European keyboards). Similarly, some keys (e.g. <kbd>Ctrl</kbd>) do not have any
corresponding character. The @{key} should be used if you want to listen to key presses themselves.
## Return values
1. @{string}: The event name.
2. @{string}: The string representing the character that was pressed.
## Example
Prints each character the user presses:
```lua
while true do
local event, character = os.pullEvent("char")
print(character .. " was pressed.")
end
```

View File

@@ -1,18 +0,0 @@
---
module: [kind=event] computer_command
---
The @{computer_command} event is fired when the `/computercraft queue` command is run for the current computer.
## Return Values
1. @{string}: The event name.
... @{string}: The arguments passed to the command.
## Example
Prints the contents of messages sent:
```lua
while true do
local event = {os.pullEvent("computer_command")}
print("Received message:", table.unpack(event, 2))
end
```

View File

@@ -1,19 +0,0 @@
---
module: [kind=event] disk
see: disk_eject For the event sent when a disk is removed.
---
The @{disk} event is fired when a disk is inserted into an adjacent or networked disk drive.
## Return Values
1. @{string}: The event name.
2. @{string}: The side of the disk drive that had a disk inserted.
## Example
Prints a message when a disk is inserted:
```lua
while true do
local event, side = os.pullEvent("disk")
print("Inserted a disk on side " .. side)
end
```

View File

@@ -1,19 +0,0 @@
---
module: [kind=event] disk_eject
see: disk For the event sent when a disk is inserted.
---
The @{disk_eject} event is fired when a disk is removed from an adjacent or networked disk drive.
## Return Values
1. @{string}: The event name.
2. @{string}: The side of the disk drive that had a disk removed.
## Example
Prints a message when a disk is removed:
```lua
while true do
local event, side = os.pullEvent("disk_eject")
print("Removed a disk on side " .. side)
end
```

View File

@@ -1,14 +0,0 @@
---
module: [kind=event] http_check
see: http.checkURLAsync To check a URL asynchronously.
---
The @{http_check} event is fired when a URL check finishes.
This event is normally handled inside @{http.checkURL}, but it can still be seen when using @{http.checkURLAsync}.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL requested to be checked.
3. @{boolean}: Whether the check succeeded.
4. @{string|nil}: If the check failed, a reason explaining why the check failed.

View File

@@ -1,39 +0,0 @@
---
module: [kind=event] http_failure
see: http.request To send an HTTP request.
---
The @{http_failure} event is fired when an HTTP request fails.
This event is normally handled inside @{http.get} and @{http.post}, but it can still be seen when using @{http.request}.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL of the site requested.
3. @{string}: An error describing the failure.
4. @{http.Response|nil}: A response handle if the connection succeeded, but the server's response indicated failure.
## Example
Prints an error why the website cannot be contacted:
```lua
local myURL = "https://does.not.exist.tweaked.cc"
http.request(myURL)
local event, url, err
repeat
event, url, err = os.pullEvent("http_failure")
until url == myURL
print("The URL " .. url .. " could not be reached: " .. err)
```
Prints the contents of a webpage that does not exist:
```lua
local myURL = "https://tweaked.cc/this/does/not/exist"
http.request(myURL)
local event, url, err, handle
repeat
event, url, err, handle = os.pullEvent("http_failure")
until url == myURL
print("The URL " .. url .. " could not be reached: " .. err)
print(handle.getResponseCode())
handle.close()
```

View File

@@ -1,27 +0,0 @@
---
module: [kind=event] http_success
see: http.request To make an HTTP request.
---
The @{http_success} event is fired when an HTTP request returns successfully.
This event is normally handled inside @{http.get} and @{http.post}, but it can still be seen when using @{http.request}.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL of the site requested.
3. @{http.Response}: The handle for the response text.
## Example
Prints the content of a website (this may fail if the request fails):
```lua
local myURL = "https://tweaked.cc/"
http.request(myURL)
local event, url, handle
repeat
event, url, handle = os.pullEvent("http_success")
until url == myURL
print("Contents of " .. url .. ":")
print(handle.readAll())
handle.close()
```

View File

@@ -1,26 +0,0 @@
---
module: [kind=event] key
---
This event is fired when any key is pressed while the terminal is focused.
This event returns a numerical "key code" (for instance, <kbd>F1</kbd> is 290). This value may vary between versions and
so it is recommended to use the constants in the @{keys} API rather than hard coding numeric values.
If the button pressed represented a printable character, then the @{key} event will be followed immediately by a @{char}
event. If you are consuming text input, use a @{char} event instead!
## Return values
1. @{string}: The event name.
2. @{number}: The numerical key value of the key pressed.
3. @{boolean}: Whether the key event was generated while holding the key (@{true}), rather than pressing it the first time (@{false}).
## Example
Prints each key when the user presses it, and if the key is being held.
```lua
while true do
local event, key, is_held = os.pullEvent("key")
print(("%s held=%s"):format(keys.getName(key), is_held))
end
```

View File

@@ -1,24 +0,0 @@
---
module: [kind=event] key_up
see: keys For a lookup table of the given keys.
---
Fired whenever a key is released (or the terminal is closed while a key was being pressed).
This event returns a numerical "key code" (for instance, <kbd>F1</kbd> is 290). This value may vary between versions and
so it is recommended to use the constants in the @{keys} API rather than hard coding numeric values.
## Return values
1. @{string}: The event name.
2. @{number}: The numerical key value of the key pressed.
## Example
Prints each key released on the keyboard whenever a @{key_up} event is fired.
```lua
while true do
local event, key = os.pullEvent("key_up")
local name = keys.getName(key) or "unknown key"
print(name .. " was released.")
end
```

View File

@@ -1,22 +0,0 @@
---
module: [kind=event] modem_message
---
The @{modem_message} event is fired when a message is received on an open channel on any modem.
## Return Values
1. @{string}: The event name.
2. @{string}: The side of the modem that received the message.
3. @{number}: The channel that the message was sent on.
4. @{number}: The reply channel set by the sender.
5. @{any}: The message as sent by the sender.
6. @{number}: The distance between the sender and the receiver, in blocks (decimal).
## Example
Prints a message when one is sent:
```lua
while true do
local event, side, channel, replyChannel, message, distance = os.pullEvent("modem_message")
print(("Message received on side %s on channel %d (reply to %d) from %f blocks away with message %s"):format(side, channel, replyChannel, distance, tostring(message)))
end
```

View File

@@ -1,18 +0,0 @@
---
module: [kind=event] monitor_resize
---
The @{monitor_resize} event is fired when an adjacent or networked monitor's size is changed.
## Return Values
1. @{string}: The event name.
2. @{string}: The side or network ID of the monitor that resized.
## Example
Prints a message when a monitor is resized:
```lua
while true do
local event, side = os.pullEvent("monitor_resize")
print("The monitor on side " .. side .. " was resized.")
end
```

View File

@@ -1,20 +0,0 @@
---
module: [kind=event] monitor_touch
---
The @{monitor_touch} event is fired when an adjacent or networked Advanced Monitor is right-clicked.
## Return Values
1. @{string}: The event name.
2. @{string}: The side or network ID of the monitor that was touched.
3. @{number}: The X coordinate of the touch, in characters.
4. @{number}: The Y coordinate of the touch, in characters.
## Example
Prints a message when a monitor is touched:
```lua
while true do
local event, side, x, y = os.pullEvent("monitor_touch")
print("The monitor on side " .. side .. " was touched at (" .. x .. ", " .. y .. ")")
end
```

View File

@@ -1,34 +0,0 @@
---
module: [kind=event] mouse_click
---
This event is fired when the terminal is clicked with a mouse. This event is only fired on advanced computers (including
advanced turtles and pocket computers).
## Return values
1. @{string}: The event name.
2. @{number}: The mouse button that was clicked.
3. @{number}: The X-coordinate of the click.
4. @{number}: The Y-coordinate of the click.
## Mouse buttons
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>
## Example
Print the button and the coordinates whenever the mouse is clicked.
```lua
while true do
local event, button, x, y = os.pullEvent("mouse_click")
print(("The mouse button %s was pressed at %d, %d"):format(button, x, y))
end
```

View File

@@ -1,22 +0,0 @@
---
module: [kind=event] mouse_drag
see: mouse_click For when a mouse button is initially pressed.
---
This event is fired every time the mouse is moved while a mouse button is being held.
## Return values
1. @{string}: The event name.
2. @{number}: The [mouse button](mouse_click.html#Mouse_buttons) that is being pressed.
3. @{number}: The X-coordinate of the mouse.
4. @{number}: The Y-coordinate of the mouse.
## Example
Print the button and the coordinates whenever the mouse is dragged.
```lua
while true do
local event, button, x, y = os.pullEvent("mouse_drag")
print(("The mouse button %s was dragged at %d, %d"):format(button, x, y))
end
```

View File

@@ -1,21 +0,0 @@
---
module: [kind=event] mouse_scroll
---
This event is fired when a mouse wheel is scrolled in the terminal.
## Return values
1. @{string}: The event name.
2. @{number}: The direction of the scroll. (-1 = up, 1 = down)
3. @{number}: The X-coordinate of the mouse when scrolling.
4. @{number}: The Y-coordinate of the mouse when scrolling.
## Example
Prints the direction of each scroll, and the position of the mouse at the time.
```lua
while true do
local event, dir, x, y = os.pullEvent("mouse_scroll")
print(("The mouse was scrolled in direction %s at %d, %d"):format(dir, x, y))
end
```

View File

@@ -1,21 +0,0 @@
---
module: [kind=event] mouse_up
---
This event is fired when a mouse button is released or a held mouse leaves the computer's terminal.
## Return values
1. @{string}: The event name.
2. @{number}: The [mouse button](mouse_click.html#Mouse_buttons) that was released.
3. @{number}: The X-coordinate of the mouse.
4. @{number}: The Y-coordinate of the mouse.
## Example
Prints the coordinates and button number whenever the mouse is released.
```lua
while true do
local event, button, x, y = os.pullEvent("mouse_up")
print(("The mouse button %s was released at %d, %d"):format(button, x, y))
end
```

View File

@@ -1,18 +0,0 @@
---
module: [kind=event] paste
---
The @{paste} event is fired when text is pasted into the computer through Ctrl-V (or ⌘V on Mac).
## Return values
1. @{string}: The event name.
2. @{string} The text that was pasted.
## Example
Prints pasted text:
```lua
while true do
local event, text = os.pullEvent("paste")
print('"' .. text .. '" was pasted')
end
```

View File

@@ -1,19 +0,0 @@
---
module: [kind=event] peripheral
see: peripheral_detach For the event fired when a peripheral is detached.
---
The @{peripheral} event is fired when a peripheral is attached on a side or to a modem.
## Return Values
1. @{string}: The event name.
2. @{string}: The side the peripheral was attached to.
## Example
Prints a message when a peripheral is attached:
```lua
while true do
local event, side = os.pullEvent("peripheral")
print("A peripheral was attached on side " .. side)
end
```

View File

@@ -1,19 +0,0 @@
---
module: [kind=event] peripheral_detach
see: peripheral For the event fired when a peripheral is attached.
---
The @{peripheral_detach} event is fired when a peripheral is detached from a side or from a modem.
## Return Values
1. @{string}: The event name.
2. @{string}: The side the peripheral was detached from.
## Example
Prints a message when a peripheral is detached:
```lua
while true do
local event, side = os.pullEvent("peripheral_detach")
print("A peripheral was detached on side " .. side)
end
```

View File

@@ -1,30 +0,0 @@
---
module: [kind=event] rednet_message
see: modem_message For raw modem messages sent outside of Rednet.
see: rednet.receive To wait for a Rednet message with an optional timeout and protocol filter.
---
The @{rednet_message} event is fired when a message is sent over Rednet.
This event is usually handled by @{rednet.receive}, but it can also be pulled manually.
@{rednet_message} events are sent by @{rednet.run} in the top-level coroutine in response to @{modem_message} events. A @{rednet_message} event is always preceded by a @{modem_message} event. They are generated inside CraftOS rather than being sent by the ComputerCraft machine.
## Return Values
1. @{string}: The event name.
2. @{number}: The ID of the sending computer.
3. @{any}: The message sent.
4. @{string|nil}: The protocol of the message, if provided.
## Example
Prints a message when one is sent:
```lua
while true do
local event, sender, message, protocol = os.pullEvent("rednet_message")
if protocol ~= nil then
print("Received message from " .. sender .. " with protocol " .. protocol .. " and message " .. tostring(message))
else
print("Received message from " .. sender .. " with message " .. tostring(message))
end
end
```

View File

@@ -1,14 +0,0 @@
---
module: [kind=event] redstone
---
The @{redstone} event is fired whenever any redstone inputs on the computer change.
## Example
Prints a message when a redstone input changes:
```lua
while true do
os.pullEvent("redstone")
print("A redstone input has changed!")
end
```

View File

@@ -1,28 +0,0 @@
---
module: [kind=event] task_complete
see: commands.execAsync To run a command which fires a task_complete event.
---
The @{task_complete} event is fired when an asynchronous task completes. This is usually handled inside the function call that queued the task; however, functions such as @{commands.execAsync} return immediately so the user can wait for completion.
## Return Values
1. @{string}: The event name.
2. @{number}: The ID of the task that completed.
3. @{boolean}: Whether the command succeeded.
4. @{string}: If the command failed, an error message explaining the failure. (This is not present if the command succeeded.)
...: Any parameters returned from the command.
## Example
Prints the results of an asynchronous command:
```lua
local taskID = commands.execAsync("say Hello")
local event
repeat
event = {os.pullEvent("task_complete")}
until event[2] == taskID
if event[3] == true then
print("Task " .. event[2] .. " succeeded:", table.unpack(event, 4))
else
print("Task " .. event[2] .. " failed: " .. event[4])
end
```

View File

@@ -1,15 +0,0 @@
---
module: [kind=event] term_resize
---
The @{term_resize} event is fired when the main terminal is resized, mainly when a new tab is opened or closed in @{multishell}.
## Example
Prints :
```lua
while true do
os.pullEvent("term_resize")
local w, h = term.getSize()
print("The term was resized to (" .. w .. ", " .. h .. ")")
end
```

View File

@@ -1,25 +0,0 @@
---
module: [kind=event] terminate
---
The @{terminate} event is fired when <kbd>Ctrl-T</kbd> is held down.
This event is normally handled by @{os.pullEvent}, and will not be returned. However, @{os.pullEventRaw} will return this event when fired.
@{terminate} will be sent even when a filter is provided to @{os.pullEventRaw}. When using @{os.pullEventRaw} with a filter, make sure to check that the event is not @{terminate}.
## Example
Prints a message when Ctrl-T is held:
```lua
while true do
local event = os.pullEventRaw("terminate")
if event == "terminate" then print("Terminate requested!") end
end
```
Exits when Ctrl-T is held:
```lua
while true do
os.pullEvent()
end
```

View File

@@ -1,21 +0,0 @@
---
module: [kind=event] timer
see: os.startTimer To start a timer.
---
The @{timer} event is fired when a timer started with @{os.startTimer} completes.
## Return Values
1. @{string}: The event name.
2. @{number}: The ID of the timer that finished.
## Example
Starts a timer and then prints its ID:
```lua
local timerID = os.startTimer(2)
local event, id
repeat
event, id = os.pullEvent("timer")
until id == timerID
print("Timer with ID " .. id .. " was fired")
```

View File

@@ -1,14 +0,0 @@
---
module: [kind=event] turtle_inventory
---
The @{turtle_inventory} event is fired when a turtle's inventory is changed.
## Example
Prints a message when the inventory is changed:
```lua
while true do
os.pullEvent("turtle_inventory")
print("The inventory was changed.")
end
```

View File

@@ -1,21 +0,0 @@
---
module: [kind=event] websocket_closed
---
The @{websocket_closed} event is fired when an open WebSocket connection is closed.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL of the WebSocket that was closed.
## Example
Prints a message when a WebSocket is closed (this may take a minute):
```lua
local myURL = "wss://example.tweaked.cc/echo"
local ws = http.websocket(myURL)
local event, url
repeat
event, url = os.pullEvent("websocket_closed")
until url == myURL
print("The WebSocket at " .. url .. " was closed.")
```

View File

@@ -1,25 +0,0 @@
---
module: [kind=event] websocket_failure
see: http.websocketAsync To send an HTTP request.
---
The @{websocket_failure} event is fired when a WebSocket connection request fails.
This event is normally handled inside @{http.websocket}, but it can still be seen when using @{http.websocketAsync}.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL of the site requested.
3. @{string}: An error describing the failure.
## Example
Prints an error why the website cannot be contacted:
```lua
local myURL = "wss://example.tweaked.cc/not-a-websocket"
http.websocketAsync(myURL)
local event, url, err
repeat
event, url, err = os.pullEvent("websocket_failure")
until url == myURL
print("The URL " .. url .. " could not be reached: " .. err)
```

View File

@@ -1,26 +0,0 @@
---
module: [kind=event] websocket_message
---
The @{websocket_message} event is fired when a message is received on an open WebSocket connection.
This event is normally handled by @{http.Websocket.receive}, but it can also be pulled manually.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL of the WebSocket.
3. @{string}: The contents of the message.
## Example
Prints a message sent by a WebSocket:
```lua
local myURL = "wss://example.tweaked.cc/echo"
local ws = http.websocket(myURL)
ws.send("Hello!")
local event, url, message
repeat
event, url, message = os.pullEvent("websocket_message")
until url == myURL
print("Received message from " .. url .. " with contents " .. message)
ws.close()
```

View File

@@ -1,28 +0,0 @@
---
module: [kind=event] websocket_success
see: http.websocketAsync To open a WebSocket asynchronously.
---
The @{websocket_success} event is fired when a WebSocket connection request returns successfully.
This event is normally handled inside @{http.websocket}, but it can still be seen when using @{http.websocketAsync}.
## Return Values
1. @{string}: The event name.
2. @{string}: The URL of the site.
3. @{http.Websocket}: The handle for the WebSocket.
## Example
Prints the content of a website (this may fail if the request fails):
```lua
local myURL = "wss://example.tweaked.cc/echo"
http.websocketAsync(myURL)
local event, url, handle
repeat
event, url, handle = os.pullEvent("websocket_success")
until url == myURL
print("Connected to " .. url)
handle.send("Hello!")
print(handle.receive())
handle.close()
```

View File

@@ -1 +0,0 @@
<meta name="theme-color" content="#c8d87c">

77
doc/stub/commands.lua Normal file
View File

@@ -0,0 +1,77 @@
--- Execute a specific command.
--
-- @tparam string command The command to execute.
-- @treturn boolean Whether the command executed successfully.
-- @treturn { string... } The output of this command, as a list of lines.
-- @treturn number|nil The number of "affected" objects, or `nil` if the command
-- failed. The definition of this varies from command to command.
-- @usage Set the block above the command computer to stone.
--
-- commands.exec("setblock ~ ~1 ~ minecraft:stone")
function exec(command) end
--- Asynchronously execute a command.
--
-- Unlike @{exec}, this will immediately return, instead of waiting for the
-- command to execute. This allows you to run multiple commands at the same
-- time.
--
-- When this command has finished executing, it will queue a `task_complete`
-- event containing the result of executing this command (what @{exec} would
-- return).
--
-- @tparam string command The command to execute.
-- @treturn number The "task id". When this command has been executed, it will
-- queue a `task_complete` event with a matching id.
-- @usage Asynchronously sets the block above the computer to stone.
--
-- commands.execAsync("~ ~1 ~ minecraft:stone")
-- @see parallel One may also use the parallel API to run multiple commands at
-- once.
function execAsync(commad) end
--- List all available commands which the computer has permission to execute.
--
-- @treturn { string... } A list of all available commands
function list() end
--- Get the position of the current command computer.
--
-- @treturn number This computer's x position.
-- @treturn number This computer's y position.
-- @treturn number This computer's z position.
-- @see gps.locate To get the position of a non-command computer.
function getBlockPosition() end
--- Get some basic information about a block.
--
-- The returned table contains the current name, metadata and block state (as
-- with @{turtle.inspect}). If there is a tile entity for that block, its NBT
-- will also be returned.
--
-- @tparam number x The x position of the block to query.
-- @tparam number y The y position of the block to query.
-- @tparam number z The z position of the block to query.
-- @treturn table The given block's information.
-- @throws If the coordinates are not within the world, or are not currently
-- loaded.
function getBlockInfo(x, y, z) end
--- Get information about a range of blocks.
--
-- This returns the same information as @{getBlockInfo}, just for multiple
-- blocks at once.
--
-- Blocks are traversed by ascending y level, followed by z and x - the returned
-- table may be indexed using `x + z*width + y*depth*depth`.
--
-- @tparam number min_x The start x coordinate of the range to query.
-- @tparam number min_y The start y coordinate of the range to query.
-- @tparam number min_z The start z coordinate of the range to query.
-- @tparam number max_x The end x coordinate of the range to query.
-- @tparam number max_y The end y coordinate of the range to query.
-- @tparam number max_z The end z coordinate of the range to query.
-- @treturn { table... } A list of information about each block.
-- @throws If the coordinates are not within the world.
-- @throws If trying to get information about more than 4096 blocks.
function getBlockInfos(min_x, min_y, min_z, max_x, max_y, max_z) end

View File

@@ -2,6 +2,23 @@
--
-- @module fs
function list(path) end
function combine(base, child) end
function getName(path) end
function getSize(path) end
function exists(path) end
function isDir(path) end
function isReadOnly(path) end
function makeDir(path) end
function move(from, to) end
function copy(from, to) end
function delete(path) end
function open(path, mode) end
function getDrive(path) end
function getFreeSpace(path) end
function find(pattern) end
function getDir(path) end
--- Returns true if a path is mounted to the parent filesystem.
--
-- The root filesystem "/" is considered a mount, along with disk folders and
@@ -14,21 +31,54 @@
-- @see getDrive
function isDriveRoot(path) end
--[[- Provides completion for a file or directory name, suitable for use with
@{_G.read}.
--- Get the capacity of the drive at the given path.
--
-- This may be used in conjunction with @{getFreeSpace} to determine what
-- percentage of this drive has been used.
--
-- @tparam string path The path of the drive to get.
-- @treturn number This drive's capacity. This will be 0 for "read-only" drives,
-- such as the ROM or treasure disks.
function getCapacity(path) end
When a directory is a possible candidate for completion, two entries are
included - one with a trailing slash (indicating that entries within this
directory exist) and one without it (meaning this entry is an immediate
completion candidate). `include_dirs` can be set to @{false} to only include
those with a trailing slash.
--- Get attributes about a specific file or folder.
--
-- The returned attributes table contains information about the size of the
-- file, whether it is a directory, and when it was created and last modified.
--
-- The creation and modification times are given as the number of milliseconds
-- since the UNIX epoch. This may be given to @{os.date} in order to convert it
-- to more usable form.
--
-- @tparam string path The path to get attributes for.
-- @treturn { size = number, isDir = boolean, created = number, modified = number }
-- The resulting attributes.
-- @throws If the path does not exist.
-- @see getSize If you only care about the file's size.
-- @see isDir If you only care whether a path is a directory or not.
function attributes(path) end
@tparam string path The path to complete.
@tparam string location The location where paths are resolved from.
@tparam[opt] boolean include_files When @{false}, only directories will be
included in the returned list.
@tparam[opt] boolean include_dirs When @{false}, "raw" directories will not be
included in the returned list.
@treturn { string... } A list of possible completion candidates.
]]
function complete(path, location, include_files, include_dirs) end
-- Defined in bios.lua
function complete(sPath, sLocation, bIncludeFiles, bIncludeDirs) end
--- A file handle which can be read from.
--
-- @type ReadHandle
-- @see fs.open
local ReadHandle = {}
function ReadHandle.read(count) end
function ReadHandle.readAll() end
function ReadHandle.readLine(with_trailing) end
function ReadHandle.seek(whence, offset) end
function ReadHandle.close() end
--- A file handle which can be written to.
--
-- @type WriteHandle
-- @see fs.open
local WriteHandle = {}
function WriteHandle.write(text) end
function WriteHandle.writeLine(text) end
function WriteHandle.flush(text) end
function WriteHandle.seek(whence, offset) end
function WriteHandle.close() end

View File

@@ -1,125 +0,0 @@
--[[-
Functions in the global environment, defined in `bios.lua`. This does not
include standard Lua functions.
@module _G
]]
--[[- Pauses execution for the specified number of seconds.
As it waits for a fixed amount of world ticks, `time` will automatically be
rounded up to the nearest multiple of 0.05 seconds. If you are using coroutines
or the @{parallel|parallel API}, it will only pause execution of the current
thread, not the whole program.
**Note** Because sleep internally uses timers, it is a function that yields.
This means that you can use it to prevent "Too long without yielding" errors,
however, as the minimum sleep time is 0.05 seconds, it will slow your program
down.
**Warning** Internally, this function queues and waits for a timer event (using
@{os.startTimer}), however it does not listen for any other events. This means
that any event that occurs while sleeping will be entirely discarded. If you
need to receive events while sleeping, consider using @{os.startTimer|timers},
or the @{parallel|parallel API}.
@tparam number time The number of seconds to sleep for, rounded up to the
nearest multiple of 0.05.
@see os.startTimer
@usage Sleep for three seconds.
print("Sleeping for three seconds")
sleep(3)
print("Done!")
]]
function sleep(time) end
--- Writes a line of text to the screen without a newline at the end, wrapping
-- text if necessary.
--
-- @tparam string text The text to write to the string
-- @treturn number The number of lines written
-- @see print A wrapper around write that adds a newline and accepts multiple arguments
-- @usage write("Hello, world")
function write(text) end
--- Prints the specified values to the screen separated by spaces, wrapping if
-- necessary. After printing, the cursor is moved to the next line.
--
-- @param ... The values to print on the screen
-- @treturn number The number of lines written
-- @usage print("Hello, world!")
function print(...) end
--- Prints the specified values to the screen in red, separated by spaces,
-- wrapping if necessary. After printing, the cursor is moved to the next line.
--
-- @param ... The values to print on the screen
-- @usage printError("Something went wrong!")
function printError(...) end
--[[- Reads user input from the terminal, automatically handling arrow keys,
pasting, character replacement, history scrollback, auto-completion, and
default values.
@tparam[opt] string replaceChar A character to replace each typed character with.
This can be used for hiding passwords, for example.
@tparam[opt] table history A table holding history items that can be scrolled
back to with the up/down arrow keys. The oldest item is at index 1, while the
newest item is at the highest index.
@tparam[opt] function(partial: string):({ string... }|nil) completeFn A function
to be used for completion. This function should take the partial text typed so
far, and returns a list of possible completion options.
@tparam[opt] string default Default text which should already be entered into
the prompt.
@treturn string The text typed in.
@see cc.completion For functions to help with completion.
@usage Read an string and echo it back to the user
write("> ")
local msg = read()
print(msg)
@usage Prompt a user for a password.
while true do
write("Password> ")
local pwd = read("*")
if pwd == "let me in" then break end
print("Incorrect password, try again.")
end
print("Logged in!")
@usage A complete example with completion, history and a default value.
local completion = require "cc.completion"
local history = { "potato", "orange", "apple" }
local choices = { "apple", "orange", "banana", "strawberry" }
write("> ")
local msg = read(nil, history, function(text) return completion.choice(text, choices) end, "app")
print(msg)
]]
function read(replaceChar, history, completeFn, default) end
--- The ComputerCraft and Minecraft version of the current computer environment.
--
-- For example, `ComputerCraft 1.93.0 (Minecraft 1.15.2)`.
-- @usage _HOST
_HOST = _HOST
--[[- The default computer settings as defined in the ComputerCraft
configuration.
This is a comma-separated list of settings pairs defined by the mod
configuration or server owner. By default, it is empty.
An example value to disable autocompletion:
shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false
@usage _CC_DEFAULT_SETTINGS
]]
_CC_DEFAULT_SETTINGS = _CC_DEFAULT_SETTINGS

View File

@@ -1,6 +1,8 @@
--- The http library allows communicating with web servers, sending and
-- receiving data from them.
--
-- #### `http_check` event
--
-- @module http
--- Asynchronously make a HTTP request to the given url.
@@ -58,10 +60,10 @@ function request(...) end
-- @treturn string A message detailing why the request failed.
-- @treturn Response|nil The failing http response, if available.
--
-- @usage Make a request to [example.tweaked.cc](https://example.tweaked.cc),
-- @usage Make a request to [example.computercraft.cc](https://example.computercraft.cc),
-- and print the returned page.
-- ```lua
-- local request = http.get("https://example.tweaked.cc")
-- local request = http.get("https://example.computercraft.cc")
-- print(request.readAll())
-- -- => HTTP is working!
-- request.close()
@@ -91,6 +93,47 @@ function get(...) end
-- @treturn Response|nil The failing http response, if available.
function post(...) end
--- A http response. This acts very much like a @{fs.ReadHandle|file}, though
-- provides some http specific methods.
--
-- #### `http_success` event
-- #### `http_failure` event
--
-- @type Response
-- @see http.request On how to make a http request.
local Response = {}
--- Returns the response code and response message returned by the server
--
-- @treturn number The response code (i.e. 200)
-- @treturn string The response message (i.e. "OK")
function Response.getResponseCode() end
--- Get a table containing the response's headers, in a format similar to that
-- required by @{http.request}. If multiple headers are sent with the same
-- name, they will be combined with a comma.
--
-- @treturn { [string]=string } The response's headers.
-- Make a request to [example.computercraft.cc](https://example.computercraft.cc),
-- and print the returned headers.
-- ```lua
-- local request = http.get("https://example.computercraft.cc")
-- print(textutils.serialize(request.getResponseHeaders()))
-- -- => {
-- -- [ "Content-Type" ] = "text/plain; charset=utf8",
-- -- [ "content-length" ] = 17,
-- -- ...
-- -- }
-- request.close()
-- ```
function Response.getResponseHeaders() end
function Response.read(count) end
function Response.readAll() end
function Response.readLine(with_trailing) end
function Response.seek(whence, offset) end
function Response.close() end
--- Asynchronously determine whether a URL can be requested.
--
-- If this returns `true`, one should also listen for [`http_check`
@@ -123,7 +166,7 @@ function checkURLAsync(url) end
--
-- @usage
-- ```lua
-- print(http.checkURL("https://example.tweaked.cc/"))
-- print(http.checkURL("https://example.computercraft.cc/"))
-- -- => true
-- print(http.checkURL("http://localhost/"))
-- -- => false Domain not permitted
@@ -155,3 +198,32 @@ function websocket(url, headers) end
-- @tparam[opt] { [string] = string } headers Additional headers to send as part
-- of the initial websocket connection.
function websocketAsync(url, headers) end
--- A websocket, which can be used to send an receive messages with a web
-- server.
--
-- @type Websocket
-- @see http.websocket On how to open a websocket.
local Websocket = {}
--- Send a websocket message to the connected server.
--
-- @tparam string message The message to send.
-- @tparam[opt] boolean binary Whether this message should be treated as a
-- binary string, rather than encoded text.
-- @throws If the websocket has been closed.
function Websocket.send(message, binary) end
--- Wait for a message from the server.
--
-- @tparam[opt] number timeout The number of seconds to wait if no message is
-- received.
-- @treturn[1] string The received message.
-- @treturn boolean If this was a binary message.
-- @treturn[2] nil If the websocket was closed while waiting, or if we timed out.
-- @throws If the websocket has been closed.
function Websocket.receive(timeout) end
--- Close this websocket. This will terminate the connection, meaning messages
-- can no longer be sent or received along it.
function Websocket.close() end

View File

@@ -1,125 +1,24 @@
function queueEvent(event, ...) end
function startTimer(delay) end
function setAlarm(time) end
function shutdown() end
function reboot() end
function getComputerID() end
computerID = getComputerID
function setComputerLabel(label) end
function getComputerLabel() end
computerLabel = getComputerLabel
function clock() end
function time(timezone) end
function day(timezone) end
function cancelTimer(id) end
function cancelAlarm(id) end
function epoch(timezone) end
function date(format, time) end
-- Defined in bios.lua
--[[- Loads the given API into the global environment.
**Warning** This function is deprecated. Use of this function will pollute the
global table, use @{require} instead.
This function loads and executes the file at the given path, and all global
variables and functions exported by it will by available through the use of
`myAPI.<function name>`, where `myAPI` is the base name of the API file.
@tparam string path The path of the API to load.
@treturn boolean Whether or not the API was successfully loaded.
@deprecated Use @{require}.
]]
function loadAPI(path) end
--- Unloads an API which was loaded by @{os.loadAPI}.
--
-- This effectively removes the specified table from `_G`.
--
-- @tparam string name The name of the API to unload.
-- @deprecated Use @{require}.
function unloadAPI(name) end
--[[- Pause execution of the current thread and waits for any events matching
`filter`.
This function @{coroutine.yield|yields} the current process and waits for it
to be resumed with a vararg list where the first element matches `filter`.
If no `filter` is supplied, this will match all events.
Unlike @{os.pullEventRaw}, it will stop the application upon a "terminate"
event, printing the error "Terminated".
@tparam[opt] string filter Event to filter for.
@treturn string event The name of the event that fired.
@treturn any param... Optional additional parameters of the event.
@usage Listen for `mouse_click` events.
while true do
local event, button, x, y = os.pullEvent("mouse_click")
print("Button", button, "was clicked at", x, ",", y)
end
@usage Listen for multiple events.
while true do
local eventData = {os.pullEvent()}
local event = eventData[1]
if event == "mouse_click" then
print("Button", eventData[2], "was clicked at", eventData[3], ",", eventData[4])
elseif event == "key" then
print("Key code", eventData[2], "was pressed")
end
end
@see os.pullEventRaw To pull the terminate event.
]]
function pullEvent(filter) end
--[[- Pause execution of the current thread and waits for events, including the
`terminate` event.
This behaves almost the same as @{os.pullEvent}, except it allows you to handle
the `terminate` event yourself - the program will not stop execution when
<kbd>Ctrl+T</kbd> is pressed.
@tparam[opt] string filter Event to filter for.
@treturn string event The name of the event that fired.
@treturn any param... Optional additional parameters of the event.
@usage Listen for `terminate` events.
while true do
local event = os.pullEventRaw()
if event == "terminate" then
print("Caught terminate event!")
end
end
@see os.pullEvent To pull events normally.
]]
function pullEventRaw(filter) end
--- Pauses execution for the specified number of seconds, alias of @{_G.sleep}.
--
-- @tparam number time The number of seconds to sleep for, rounded up to the
-- nearest multiple of 0.05.
function sleep(time) end
--- Get the current CraftOS version (for example, `CraftOS 1.8`).
--
-- This is defined by `bios.lua`. For the current version of CC:Tweaked, this
-- should return `CraftOS 1.8`.
--
-- @treturn string The current CraftOS version.
-- @usage os.version()
function version() end
--[[- Run the program at the given path with the specified environment and
arguments.
This function does not resolve program names like the shell does. This means
that, for example, `os.run("edit")` will not work. As well as this, it does not
provide access to the @{shell} API in the environment. For this behaviour, use
@{shell.run} instead.
If the program cannot be found, or failed to run, it will print the error and
return `false`. If you want to handle this more gracefully, use an alternative
such as @{loadfile}.
@tparam table env The environment to run the program with.
@tparam string path The exact path of the program to run.
@param ... The arguments to pass to the program.
@treturn boolean Whether or not the program ran successfully.
@usage Run the default shell from within your program:
os.run({}, "/rom/programs/shell.lua")
@see shell.run
@see loadfile
]]
function run(env, path, ...) end

28
doc/stub/pocket.lua Normal file
View File

@@ -0,0 +1,28 @@
--[[-
Control the current pocket computer, adding or removing upgrades.
This API is only available on pocket computers. As such, you may use its
presence to determine what kind of computer you are using:
```lua
if pocket then
print("On a pocket computer")
else
print("On something else")
end
```
]]
--- Search the player's inventory for another upgrade, replacing the existing
-- one with that item if found.
--
-- This inventory search starts from the player's currently selected slot,
-- allowing you to prioritise upgrades.
--
-- @throws If an upgrade cannot be found.
function equipBack() end
--- Remove the pocket computer's current upgrade.
--
-- @throws If this pocket computer does not currently have an upgrade.
function unequipBack() end

120
doc/stub/redstone.lua Normal file
View File

@@ -0,0 +1,120 @@
--[[- Interact with redstone attached to this computer.
The @{redstone} library exposes three "types" of redstone control:
- Binary input/output (@{setOutput}/@{getInput}): These simply check if a
redstone wire has any input or output. A signal strength of 1 and 15 are
treated the same.
- Analogue input/output (@{setAnalogueOutput}/@{getAnalogueInput}): These
work with the actual signal strength of the redstone wired, from 0 to 15.
- Bundled cables (@{setBundledOutput}/@{getBundledInput}): These interact with
"bundled" cables, such as those from Project:Red. These allow you to send
16 separate on/off signals. Each channel corresponds to a colour, with the
first being @{colors.white} and the last @{colors.black}.
Whenever a redstone input changes, a `redstone` event will be fired. This may
be used in or
This module may also be referred to as `rs`. For example, one may call
`rs.getSides()` instead of @{redstone.getSides}.
@module redstone
@usage Toggle the redstone signal above the computer every 0.5 seconds.
while true do
redstone.setOutput("top", not redstone.getOutput("top"))
sleep(0.5)
end
@usage Mimic a redstone comparator in [subtraction mode][comparator].
while true do
local rear = rs.getAnalogueInput("back")
local sides = math.max(rs.getAnalogueInput("left"), rs.getAnalogueInput("right"))
rs.setAnalogueOutput("front", math.max(rear - sides, 0))
os.pullEvent("redstone") -- Wait for a change to inputs.
end
[comparator]: https://minecraft.gamepedia.com/Redstone_Comparator#Subtract_signal_strength "Redstone Comparator on the Minecraft wiki."
]]
--- Returns a table containing the six sides of the computer. Namely, "top",
-- "bottom", "left", "right", "front" and "back".
--
-- @treturn { string... } A table of valid sides.
function getSides() end
--- Turn the redstone signal of a specific side on or off.
--
-- @tparam string side The side to set.
-- @tparam boolean on Whether the redstone signal should be on or off. When on,
-- a signal strength of 15 is emitted.
function setOutput(side, on) end
--- Get the current redstone output of a specific side.
--
-- @tparam string side The side to get.
-- @treturn boolean Whether the redstone output is on or off.
-- @see setOutput
function getOutput(side) end
--- Get the current redstone input of a specific side.
--
-- @tparam string side The side to get.
-- @treturn boolean Whether the redstone input is on or off.
function getInput(side) end
--- Set the redstone signal strength for a specific side.
--
-- @tparam string side The side to set.
-- @tparam number value The signal strength, between 0 and 15.
-- @throws If `value` is not between 0 and 15.
function setAnalogOutput(side, value) end
setAnalogueOutput = setAnalogOutput
--- Get the redstone output signal strength for a specific side.
--
-- @tparam string side The side to get.
-- @treturn number The output signal strength, between 0 and 15.
-- @see setAnalogueOutput
function getAnalogOutput(sid) end
getAnalogueOutput = getAnalogOutput
--- Get the redstone input signal strength for a specific side.
--
-- @tparam string side The side to get.
-- @treturn number The input signal strength, between 0 and 15.
function getAnalogInput(side) end
getAnalogueInput = getAnalogInput
--- Set the bundled cable output for a specific side.
--
-- @tparam string side The side to set.
-- @tparam number The colour bitmask to set.
-- @see colors.subtract For removing a colour from the bitmask.
-- @see colors.combine For adding a colour to the bitmask.
function setBundledOutput(side, output) end
--- Get the bundled cable output for a specific side.
--
-- @tparam string side The side to get.
-- @treturn number The bundled cable's output.
function getBundledOutput(side) end
--- Get the bundled cable input for a specific side.
--
-- @tparam string side The side to get.
-- @treturn number The bundled cable's input.
-- @see testBundledInput To determine if a specific colour is set.
function getBundledInput(side) end
--- Determine if a specific combination of colours are on for the given side.
--
-- @tparam string side The side to test.
-- @tparam number mask The mask to test.
-- @see getBundledInput
-- @see colors.combine For adding a colour to the bitmask.
-- @usage Check if @{colors.white} and @{colors.black} are on for above the
-- computer.
--
-- print(redstone.testBundledInput("top", colors.combine(colors.white, colors.black)))
function testBundledInput(side, mask) end

52
doc/stub/term.lua Normal file
View File

@@ -0,0 +1,52 @@
function write(text) end
function scroll(lines) end
function setCursorPos(x, y) end
function setCursorBlink(blink) end
function getCursorPos() end
function getSize() end
function clear() end
function clearLine() end
function setTextColour(colour) end
setTextColor = setTextColour
function setBackgroundColour(colour) end
setBackgroundColor = setBackgroundColour
function isColour() end
isColor = isColour
function getTextColour() end
getTextColor = getTextColor
function getBackgroundColour() end
getBackgroundColor = getBackgroundColour
function blit(text, text_colours, background_colours) end
function setPaletteColour(colour, ...) end
setPaletteColor = setPaletteColour
function getPaletteColour(colour, ...) end
getPaletteColor = getPaletteColour
function nativePaletteColour(colour) end
nativePaletteColor = nativePaletteColour
--- @type Redirect
local Redirect = {}
Redirect.write = write
Redirect.scroll = scroll
Redirect.setCursorPos = setCursorPos
Redirect.setCursorBlink = setCursorBlink
Redirect.getCursorPos = getCursorPos
Redirect.getSize = getSize
Redirect.clear = clear
Redirect.clearLine = clearLine
Redirect.setTextColour = setTextColour
Redirect.setTextColor = setTextColor
Redirect.setBackgroundColour = setBackgroundColour
Redirect.setBackgroundColor = setBackgroundColor
Redirect.isColour = isColour
Redirect.isColor = isColor
Redirect.getTextColour = getTextColour
Redirect.getTextColor = getTextColor
Redirect.getBackgroundColour = getBackgroundColour
Redirect.getBackgroundColor = getBackgroundColor
Redirect.blit = blit
Redirect.setPaletteColour = setPaletteColour
Redirect.setPaletteColor = setPaletteColor
Redirect.getPaletteColour = getPaletteColour
Redirect.getPaletteColor = getPaletteColor

View File

@@ -1,13 +1,230 @@
--[[- Craft a recipe based on the turtle's inventory.
--- Move the turtle forward one block.
-- @treturn boolean Whether the turtle could successfully move.
-- @treturn string|nil The reason the turtle could not move.
function forward() end
The turtle's inventory should set up like a crafting grid. For instance, to
craft sticks, slots 1 and 5 should contain sticks. _All_ other slots should be
empty, including those outside the crafting "grid".
--- Move the turtle backwards one block.
-- @treturn boolean Whether the turtle could successfully move.
-- @treturn string|nil The reason the turtle could not move.
function back() end
--- Move the turtle up one block.
-- @treturn boolean Whether the turtle could successfully move.
-- @treturn string|nil The reason the turtle could not move.
function up() end
--- Move the turtle down one block.
-- @treturn boolean Whether the turtle could successfully move.
-- @treturn string|nil The reason the turtle could not move.
function down() end
--- Rotate the turtle 90 degress to the left.
function turnLeft() end
--- Rotate the turtle 90 degress to the right.
function turnRight() end
--- Attempt to break the block in front of the turtle.
--
-- This requires a turtle tool capable of breaking the block. Diamond pickaxes
-- (mining turtles) can break any vanilla block, but other tools (such as axes)
-- are more limited.
--
-- @tparam[opt] "left"|"right" side The specific tool to use.
-- @treturn boolean Whether a block was broken.
-- @treturn string|nil The reason no block was broken.
function dig(side) end
--- Attempt to break the block above the turtle. See @{dig} for full details.
--
-- @tparam[opt] "left"|"right" side The specific tool to use.
-- @treturn boolean Whether a block was broken.
-- @treturn string|nil The reason no block was broken.
function digUp(side) end
--- Attempt to break the block below the turtle. See @{dig} for full details.
--
-- @tparam[opt] "left"|"right" side The specific tool to use.
-- @treturn boolean Whether a block was broken.
-- @treturn string|nil The reason no block was broken.
function digDown(side) end
--- Attack the entity in front of the turtle.
--
-- @tparam[opt] "left"|"right" side The specific tool to use.
-- @treturn boolean Whether an entity was attacked.
-- @treturn string|nil The reason nothing was attacked.
function attack(side) end
--- Attack the entity above the turtle.
--
-- @tparam[opt] "left"|"right" side The specific tool to use.
-- @treturn boolean Whether an entity was attacked.
-- @treturn string|nil The reason nothing was attacked.
function attackUp(side) end
--- Attack the entity below the turtle.
--
-- @tparam[opt] "left"|"right" side The specific tool to use.
-- @treturn boolean Whether an entity was attacked.
-- @treturn string|nil The reason nothing was attacked.
function attackDown(side) end
--- Place a block or item into the world in front of the turtle.
--
-- @treturn boolean Whether the block could be placed.
-- @treturn string|nil The reason the block was not placed.
function place() end
--- Place a block or item into the world above the turtle.
--
-- @treturn boolean Whether the block could be placed.
-- @treturn string|nil The reason the block was not placed.
function placeUp() end
--- Place a block or item into the world below the turtle.
--
-- @treturn boolean Whether the block could be placed.
-- @treturn string|nil The reason the block was not placed.
function placeDown() end
--- Drop the currently selected stack into the inventory in front of the turtle,
-- or as an item into the world if there is no inventory.
--
-- @tparam[opt] number count The number of items to drop. If not given, the
-- entire stack will be dropped.
-- @treturn boolean Whether items were dropped.
-- @treturn string|nil The reason the no items were dropped.
-- @see select
function drop(count) end
--- Drop the currently selected stack into the inventory above the turtle, or as
-- an item into the world if there is no inventory.
--
-- @tparam[opt] number count The number of items to drop. If not given, the
-- entire stack will be dropped.
-- @treturn boolean Whether items were dropped.
-- @treturn string|nil The reason the no items were dropped.
-- @see select
function dropUp(count) end
--- Drop the currently selected stack into the inventory below the turtle, or as
-- an item into the world if there is no inventory.
--
-- @tparam[opt] number count The number of items to drop. If not given, the
-- entire stack will be dropped.
-- @treturn boolean Whether items were dropped.
-- @treturn string|nil The reason the no items were dropped.
-- @see select
function dropDown(count) end
--- Suck an item from the inventory in front of the turtle, or from an item
-- floating in the world.
--
-- This will pull items into the first acceptable slot, starting at the
-- @{select|currently selected} one.
--
-- @tparam[opt] number count The number of items to suck. If not given, up to a
-- stack of items will be picked up.
-- @treturn boolean Whether items were picked up.
-- @treturn string|nil The reason the no items were picked up.
function suck(count) end
--- Suck an item from the inventory above the turtle, or from an item floating
-- in the world.
--
-- @tparam[opt] number count The number of items to suck. If not given, up to a
-- stack of items will be picked up.
-- @treturn boolean Whether items were picked up.
-- @treturn string|nil The reason the no items were picked up.
function suckUp(count) end
--- Suck an item from the inventory below the turtle, or from an item floating
-- in the world.
--
-- @tparam[opt] number count The number of items to suck. If not given, up to a
-- stack of items will be picked up.
-- @treturn boolean Whether items were picked up.
-- @treturn string|nil The reason the no items were picked up.
function suckDown(count) end
--- Check if there is a solid block in front of the turtle. In this case, solid
-- refers to any non-air or liquid block.
--
-- @treturn boolean If there is a solid block in front.
function detect() end
--- Check if there is a solid block above the turtle.
--
-- @treturn boolean If there is a solid block above.
function detectUp() end
--- Check if there is a solid block below the turtle.
--
-- @treturn boolean If there is a solid block below.
function detectDown() end
function compare() end
function compareUp() end
function compareDown() end
function inspect() end
function inspectUp() end
function inspectDown() end
--- Change the currently selected slot.
--
-- The selected slot is determines what slot actions like @{drop} or
-- @{getItemCount} act on.
--
-- @tparam number slot The slot to select.
-- @see getSelectedSlot
function select(slot) end
--- Get the currently selected slot.
--
-- @treturn number The current slot.
-- @see select
function getSelectedSlot() end
--- Get the number of items in the given slot.
--
-- @tparam[opt] number slot The slot we wish to check. Defaults to the @{turtle.select|selected slot}.
-- @treturn number The number of items in this slot.
function getItemCount(slot) end
--- Get the remaining number of items which may be stored in this stack.
--
-- For instance, if a slot contains 13 blocks of dirt, it has room for another 51.
--
-- @tparam[opt] number slot The slot we wish to check. Defaults to the @{turtle.select|selected slot}.
-- @treturn number The space left in this slot.
function getItemSpace(slot) end
--- Get detailed information about the items in the given slot.
--
-- @tparam[opt] number slot The slot to get information about. Defaults to the @{turtle.select|selected slot}.
-- @treturn nil|table Information about the given slot, or @{nil} if it is empty.
-- @usage Print the current slot, assuming it contains 13 dirt.
--
-- print(textutils.serialize(turtle.getItemDetail()))
-- -- => {
-- -- name = "minecraft:dirt",
-- -- damage = 0,
-- -- count = 13,
-- -- }
function getItemDetail(slot) end
function getFuelLevel() end
function refuel(count) end
function compareTo(slot) end
function transferTo(slot, count) end
function getFuelLimit() end
function equipLeft() end
function equipRight() end
@tparam[opt=64] number limit The maximum number of crafting steps to run.
@throws When limit is less than 1 or greater than 64.
@treturn[1] true If crafting succeeds.
@treturn[2] false If crafting fails.
@treturn string A string describing why crafting failed.
]]
function craft(limit) end

186
doc/styles.css Normal file
View File

@@ -0,0 +1,186 @@
/* Basic reset on elements */
h1, h2, h3, h4, p, table, div, body {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* Make the page a little more airy */
body {
margin: 20px auto;
max-width: 1200px;
padding: 0 10px;
line-height: 1.6;
color: #222;
background: #fff;
}
/* Try to use system default fonts. */
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans",
"Droid Sans", "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
code, pre, .parameter, .type, .definition-name, .reference-code {
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
}
/* Some definitions of basic tags */
code {
color: #c7254e;
background-color: #f9f2f4;
}
p {
margin: 0.9em 0;
}
h1 {
font-size: 1.5em;
font-weight: lighter;
border-bottom: solid 1px #aaa;
}
h2, h3, h4 { margin: 1.4em 0 0.3em;}
h2 { font-size: 1.25em; }
h3 { font-size: 1.15em; font-weight: bold; }
h4 { font-size: 1.06em; }
a, a:visited, a:active { font-weight: bold; color: #004080; text-decoration: none; }
a:hover { text-decoration: underline; }
blockquote { margin-left: 3em; }
/* Stop sublists from having initial vertical space */
ul ul { margin-top: 0px; }
ol ul { margin-top: 0px; }
ol ol { margin-top: 0px; }
ul ol { margin-top: 0px; }
/* Make the target distinct; helps when we're navigating to a function */
a:target + * { background-color: #FFFF99; }
/* Allow linking to any subsection */
a[name]::before { content: "#"; }
/* Layout */
#main {
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
min-height: calc(100vh - 100px);
}
#main > nav {
flex-basis: 30%;
min-width: 150px;
max-width: 250px;
background-color: #f0f0f0;
}
nav h1, nav ul { padding: 0em 10px; }
nav h2 {
background-color:#e7e7e7;
font-size: 1.1em;
color:#000000;
padding: 5px 10px;
}
nav ul {
list-style-type: none;
margin: 0;
}
#content {
flex-shrink: 1;
flex-basis: 80%;
padding: 0px 10px;
}
footer {
text-align: right;
font-size: 0.8em;
}
/* The definition lists at the top of each page */
table.definition-list {
border-collapse: collapse;
width: 100%;
}
table.definition-list td, table.definition-list th {
border: 1px solid #cccccc;
padding: 5px;
}
table.definition-list th {
background-color: #f0f0f0;
min-width: 200px;
white-space: nowrap;
text-align: right;
}
table.definition-list td { width: 100%; }
dl.definition dt {
border-top: 1px solid #ccc;
padding-top: 1em;
display: flex;
}
dl.definition dt .definition-name {
padding: 0 0.1em;
margin: 0 0.1em;
flex-grow: 1;
}
dl.definition dd {
padding-bottom: 1em;
margin: 10px 0 0 20px;
}
dl.definition h3 {
font-size: .95em;
}
/* Links to source-code */
.source-link { font-size: 0.8em; }
.source-link::before { content: '[' }
.source-link::after { content: ']' }
a.source-link, a.source-link:visited, a.source-link:active { color: #505050; }
/* Method definitions */
span.parameter:after { content:":"; padding-left: 0.3em; }
.optional { text-decoration: underline dotted; }
/** Fancy colour display. */
.colour-ref {
display: inline-block;
width: 0.8em;
height: 0.8em;
margin: 0.1em 0.1em 0.3em 0.1em; /* Terrrible hack to force vertical alignment. */
border: solid 1px black;
box-sizing: border-box;
vertical-align: middle;
}
/* styles for prettification of source */
.highlight .comment { color: #558817; }
.highlight .constant { color: #a8660d; }
.highlight .escape { color: #844631; }
.highlight .keyword { color: #aa5050; font-weight: bold; }
.highlight .library { color: #0e7c6b; }
.highlight .marker { color: #512b1e; background: #fedc56; font-weight: bold; }
.highlight .string { color: #8080ff; }
.highlight .literal-kw { color: #8080ff; }
.highlight .number { color: #f8660d; }
.highlight .operator { color: #2239a8; font-weight: bold; }
.highlight .preprocessor, pre .prepro { color: #a33243; }
.highlight .global { color: #800080; }
.highlight .user-keyword { color: #800080; }
.highlight .prompt { color: #558817; }
.highlight .url { color: #272fc2; text-decoration: underline; }

View File

@@ -1,6 +1,7 @@
# Mod properties
mod_version=1.97.1
mod_version=1.89.2
# Minecraft properties (update mods.toml when changing)
mc_version=1.15.2
forge_version=31.1.41
# Minecraft properties
mc_version=1.12.2
forge_version=14.23.4.2749
mappings_version=snapshot_20180724

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip

53
gradlew vendored
View File

@@ -1,21 +1,5 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
@@ -44,7 +28,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
@@ -82,7 +66,6 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -126,11 +109,10 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
@@ -156,19 +138,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
i=$((i+1))
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
@@ -177,9 +159,14 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

43
gradlew.bat vendored
View File

@@ -1,19 +1,3 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -29,18 +13,15 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -54,7 +35,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -64,14 +45,28 @@ echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell

View File

@@ -2,44 +2,26 @@
(sources
/doc/stub/
/doc/events/
/build/docs/luaJavadoc/
/src/main/resources/*/computercraft/lua/bios.lua
/src/main/resources/*/computercraft/lua/rom/
/src/test/resources/test-rom
/src/web/mount)
/src/test/resources/test-rom)
(doc
(destination build/docs/lua)
(title "CC: Tweaked")
(index doc/index.md)
(site
(title "CC: Tweaked")
(logo src/main/resources/pack.png)
(url https://tweaked.cc/)
(source-link https://github.com/SquidDev-CC/CC-Tweaked/blob/${commit}/${path}#L${line})
(styles src/web/styles.css)
(scripts build/rollup/index.js)
(head doc/head.html))
(module-kinds
(peripheral Peripherals)
(generic_peripheral "Generic Peripherals")
(event Events))
(source-link https://github.com/SquidDev-CC/CC-Tweaked/blob/${commit}/${path}#L${line})
(library-path
/doc/stub/
/build/docs/luaJavadoc/
/src/main/resources/*/computercraft/lua/rom/apis/
/src/main/resources/*/computercraft/lua/rom/apis/command/
/src/main/resources/*/computercraft/lua/rom/apis/turtle/
/src/main/resources/*/computercraft/lua/rom/apis
/src/main/resources/*/computercraft/lua/rom/apis/command
/src/main/resources/*/computercraft/lua/rom/apis/turtle
/src/main/resources/*/computercraft/lua/rom/modules/main/
/src/main/resources/*/computercraft/lua/rom/modules/command/
/src/main/resources/*/computercraft/lua/rom/modules/turtle/))
/src/main/resources/*/computercraft/lua/rom/modules/main
/src/main/resources/*/computercraft/lua/rom/modules/command
/src/main/resources/*/computercraft/lua/rom/modules/turtle))
(at /
(linters
@@ -63,7 +45,7 @@
;; colours imports from colors, and we don't handle that right now.
;; keys is entirely dynamic, so we skip it.
(dynamic-modules colours keys _G)
(dynamic-modules colours keys)
(globals
:max
@@ -82,31 +64,32 @@
(lint (allow-toplevel-global true)))
;; Silence some variable warnings in documentation stubs.
(at (/doc/stub/ /build/docs/luaJavadoc/)
(at /doc/stub
(linters -var:unused-global)
(lint (allow-toplevel-global true)))
;; Suppress warnings for currently undocumented modules.
(at
(; Lua APIs
(/doc/stub/fs.lua
/doc/stub/http.lua
/doc/stub/os.lua
/doc/stub/term.lua
/doc/stub/turtle.lua
/src/main/resources/*/computercraft/lua/rom/apis/io.lua
/src/main/resources/*/computercraft/lua/rom/apis/window.lua)
(linters -doc:undocumented -doc:undocumented-arg -doc:undocumented-return))
(linters -doc:undocumented -doc:undocumented-arg))
;; Suppress warnings for various APIs using its own deprecated members.
;; These currently rely on unknown references.
(at
(/src/main/resources/*/computercraft/lua/bios.lua
/src/main/resources/*/computercraft/lua/rom/apis/turtle/turtle.lua)
(linters -var:deprecated))
(/src/main/resources/*/computercraft/lua/rom/apis/textutils.lua
/src/main/resources/*/computercraft/lua/rom/modules/main/cc/completion.lua
/src/main/resources/*/computercraft/lua/rom/modules/main/cc/shell/completion.lua
/src/main/resources/*/computercraft/lua/rom/programs/shell.lua)
(linters -doc:unresolved-reference))
(at /src/test/resources/test-rom
; We should still be able to test deprecated members.
(linters -var:deprecated)
(lint
(globals
:max sleep write
cct_test describe expect howlci fail it pending stub)))
(at /src/web/mount/expr_template.lua (lint (globals :max __expr__)))

172
package-lock.json generated
View File

@@ -1,172 +0,0 @@
{
"name": "tweaked.cc",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@rollup/plugin-typescript": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz",
"integrity": "sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ==",
"dev": true,
"requires": {
"@rollup/pluginutils": "^3.1.0",
"resolve": "^1.17.0"
}
},
"@rollup/pluginutils": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
"integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
"dev": true,
"requires": {
"@types/estree": "0.0.39",
"estree-walker": "^1.0.1",
"picomatch": "^2.2.2"
}
},
"@types/estree": {
"version": "0.0.39",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
"dev": true
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"estree-walker": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
"integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
"dev": true
},
"fsevents": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
"dev": true,
"optional": true
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"is-core-module": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
"integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
"preact": {
"version": "10.5.5",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.5.5.tgz",
"integrity": "sha512-5ONLNH1SXMzzbQoExZX4TELemNt+TEDb622xXFNfZngjjM9qtrzseJt+EfiUu4TZ6EJ95X5sE1ES4yqHFSIdhg=="
},
"requirejs": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz",
"integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==",
"dev": true
},
"resolve": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
"integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
"dev": true,
"requires": {
"is-core-module": "^2.0.0",
"path-parse": "^1.0.6"
}
},
"rollup": {
"version": "2.33.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.33.1.tgz",
"integrity": "sha512-uY4O/IoL9oNW8MMcbA5hcOaz6tZTMIh7qJHx/tzIJm+n1wLoY38BLn6fuy7DhR57oNFLMbDQtDeJoFURt5933w==",
"dev": true,
"requires": {
"fsevents": "~2.1.2"
}
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true
},
"source-map-support": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"terser": {
"version": "5.3.8",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz",
"integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==",
"dev": true,
"requires": {
"commander": "^2.20.0",
"source-map": "~0.7.2",
"source-map-support": "~0.5.19"
}
},
"tslib": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
},
"typescript": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz",
"integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==",
"dev": true
}
}
}

View File

@@ -1,18 +0,0 @@
{
"name": "tweaked.cc",
"version": "1.0.0",
"description": "Website additions for tweaked.cc",
"author": "SquidDev",
"license": "BSD-3-Clause",
"dependencies": {
"preact": "^10.5.5",
"tslib": "^2.0.3"
},
"devDependencies": {
"@rollup/plugin-typescript": "^6.1.0",
"requirejs": "^2.3.6",
"rollup": "^2.33.1",
"terser": "^5.3.8",
"typescript": "^4.0.5"
}
}

View File

@@ -1,55 +0,0 @@
import { readFileSync, promises as fs } from "fs";
import path from "path";
import typescript from "@rollup/plugin-typescript";
const input = "src/web";
const requirejs = readFileSync("node_modules/requirejs/require.js");
export default {
input: [`${input}/index.tsx`],
output: {
file: "build/rollup/index.js",
// We bundle requirejs (and config) into the header. It's rather gross
// but also works reasonably well.
banner: `${requirejs}\nrequire.config({ paths: { copycat: "https://copy-cat.squiddev.cc" } });`,
format: "amd",
preferConst: true,
amd: {
define: "require",
}
},
context: "window",
external: ["copycat/embed"],
plugins: [
typescript(),
{
name: "cc-tweaked",
async options(options) {
// Generate .d.ts files for all /mount files. This is the worst way to do it,
// but we need to run before the TS pass.
const template = "declare const contents : string;\nexport default contents;\n";
const files = await fs.readdir(`${input}/mount`);
await Promise.all(files
.filter(x => path.extname(x) !== ".ts")
.map(async file => {
const path = `${input}/mount/${file}.d.ts`;
const contents = await fs.readFile(path, { encoding: "utf-8" }).catch(() => "");
if (contents !== template) await fs.writeFile(path, template);
})
);
return options;
},
async transform(code, file) {
// Allow loading files in /mount.
const ext = path.extname(file);
return ext != '.tsx' && ext != '.ts' && path.dirname(file) === path.resolve(`${input}/mount`)
? `export default ${JSON.stringify(code)};\n`
: null;
},
}
],
};

View File

@@ -1,49 +0,0 @@
{
"variants": {
"facing=north,state=off": {
"model": "computercraft:block/computer_advanced_off"
},
"facing=south,state=off": {
"model": "computercraft:block/computer_advanced_off",
"y": 180
},
"facing=west,state=off": {
"model": "computercraft:block/computer_advanced_off",
"y": 270
},
"facing=east,state=off": {
"model": "computercraft:block/computer_advanced_off",
"y": 90
},
"facing=north,state=on": {
"model": "computercraft:block/computer_advanced_on"
},
"facing=south,state=on": {
"model": "computercraft:block/computer_advanced_on",
"y": 180
},
"facing=west,state=on": {
"model": "computercraft:block/computer_advanced_on",
"y": 270
},
"facing=east,state=on": {
"model": "computercraft:block/computer_advanced_on",
"y": 90
},
"facing=north,state=blinking": {
"model": "computercraft:block/computer_advanced_blinking"
},
"facing=south,state=blinking": {
"model": "computercraft:block/computer_advanced_blinking",
"y": 180
},
"facing=west,state=blinking": {
"model": "computercraft:block/computer_advanced_blinking",
"y": 270
},
"facing=east,state=blinking": {
"model": "computercraft:block/computer_advanced_blinking",
"y": 90
}
}
}

View File

@@ -1,49 +0,0 @@
{
"variants": {
"facing=north,state=off": {
"model": "computercraft:block/computer_command_off"
},
"facing=south,state=off": {
"model": "computercraft:block/computer_command_off",
"y": 180
},
"facing=west,state=off": {
"model": "computercraft:block/computer_command_off",
"y": 270
},
"facing=east,state=off": {
"model": "computercraft:block/computer_command_off",
"y": 90
},
"facing=north,state=on": {
"model": "computercraft:block/computer_command_on"
},
"facing=south,state=on": {
"model": "computercraft:block/computer_command_on",
"y": 180
},
"facing=west,state=on": {
"model": "computercraft:block/computer_command_on",
"y": 270
},
"facing=east,state=on": {
"model": "computercraft:block/computer_command_on",
"y": 90
},
"facing=north,state=blinking": {
"model": "computercraft:block/computer_command_blinking"
},
"facing=south,state=blinking": {
"model": "computercraft:block/computer_command_blinking",
"y": 180
},
"facing=west,state=blinking": {
"model": "computercraft:block/computer_command_blinking",
"y": 270
},
"facing=east,state=blinking": {
"model": "computercraft:block/computer_command_blinking",
"y": 90
}
}
}

View File

@@ -1,49 +0,0 @@
{
"variants": {
"facing=north,state=off": {
"model": "computercraft:block/computer_normal_off"
},
"facing=south,state=off": {
"model": "computercraft:block/computer_normal_off",
"y": 180
},
"facing=west,state=off": {
"model": "computercraft:block/computer_normal_off",
"y": 270
},
"facing=east,state=off": {
"model": "computercraft:block/computer_normal_off",
"y": 90
},
"facing=north,state=on": {
"model": "computercraft:block/computer_normal_on"
},
"facing=south,state=on": {
"model": "computercraft:block/computer_normal_on",
"y": 180
},
"facing=west,state=on": {
"model": "computercraft:block/computer_normal_on",
"y": 270
},
"facing=east,state=on": {
"model": "computercraft:block/computer_normal_on",
"y": 90
},
"facing=north,state=blinking": {
"model": "computercraft:block/computer_normal_blinking"
},
"facing=south,state=blinking": {
"model": "computercraft:block/computer_normal_blinking",
"y": 180
},
"facing=west,state=blinking": {
"model": "computercraft:block/computer_normal_blinking",
"y": 270
},
"facing=east,state=blinking": {
"model": "computercraft:block/computer_normal_blinking",
"y": 90
}
}
}

View File

@@ -1,852 +0,0 @@
{
"variants": {
"facing=north,orientation=down,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 90
},
"facing=south,orientation=down,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 270
},
"facing=south,orientation=up,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=none": {
"model": "computercraft:block/monitor_advanced",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=none": {
"model": "computercraft:block/monitor_advanced"
},
"facing=south,orientation=north,state=none": {
"model": "computercraft:block/monitor_advanced",
"y": 180
},
"facing=west,orientation=north,state=none": {
"model": "computercraft:block/monitor_advanced",
"y": 270
},
"facing=east,orientation=north,state=none": {
"model": "computercraft:block/monitor_advanced",
"y": 90
},
"facing=north,orientation=down,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 90
},
"facing=south,orientation=down,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 270
},
"facing=south,orientation=up,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=l": {
"model": "computercraft:block/monitor_advanced_l"
},
"facing=south,orientation=north,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"y": 180
},
"facing=west,orientation=north,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"y": 270
},
"facing=east,orientation=north,state=l": {
"model": "computercraft:block/monitor_advanced_l",
"y": 90
},
"facing=north,orientation=down,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 90
},
"facing=south,orientation=down,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 270
},
"facing=south,orientation=up,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=r": {
"model": "computercraft:block/monitor_advanced_r"
},
"facing=south,orientation=north,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"y": 180
},
"facing=west,orientation=north,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"y": 270
},
"facing=east,orientation=north,state=r": {
"model": "computercraft:block/monitor_advanced_r",
"y": 90
},
"facing=north,orientation=down,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 90
},
"facing=south,orientation=down,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 270
},
"facing=south,orientation=up,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lr": {
"model": "computercraft:block/monitor_advanced_lr"
},
"facing=south,orientation=north,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"y": 180
},
"facing=west,orientation=north,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"y": 270
},
"facing=east,orientation=north,state=lr": {
"model": "computercraft:block/monitor_advanced_lr",
"y": 90
},
"facing=north,orientation=down,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 90
},
"facing=south,orientation=down,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 270
},
"facing=south,orientation=up,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=u": {
"model": "computercraft:block/monitor_advanced_u"
},
"facing=south,orientation=north,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"y": 180
},
"facing=west,orientation=north,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"y": 270
},
"facing=east,orientation=north,state=u": {
"model": "computercraft:block/monitor_advanced_u",
"y": 90
},
"facing=north,orientation=down,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 90
},
"facing=south,orientation=down,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 270
},
"facing=south,orientation=up,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=d": {
"model": "computercraft:block/monitor_advanced_d"
},
"facing=south,orientation=north,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"y": 180
},
"facing=west,orientation=north,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"y": 270
},
"facing=east,orientation=north,state=d": {
"model": "computercraft:block/monitor_advanced_d",
"y": 90
},
"facing=north,orientation=down,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 90
},
"facing=south,orientation=down,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 270
},
"facing=south,orientation=up,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=ud": {
"model": "computercraft:block/monitor_advanced_ud"
},
"facing=south,orientation=north,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"y": 180
},
"facing=west,orientation=north,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"y": 270
},
"facing=east,orientation=north,state=ud": {
"model": "computercraft:block/monitor_advanced_ud",
"y": 90
},
"facing=north,orientation=down,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 90
},
"facing=south,orientation=down,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 270
},
"facing=south,orientation=up,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=rd": {
"model": "computercraft:block/monitor_advanced_rd"
},
"facing=south,orientation=north,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"y": 180
},
"facing=west,orientation=north,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"y": 270
},
"facing=east,orientation=north,state=rd": {
"model": "computercraft:block/monitor_advanced_rd",
"y": 90
},
"facing=north,orientation=down,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 90
},
"facing=south,orientation=down,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 270
},
"facing=south,orientation=up,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=ld": {
"model": "computercraft:block/monitor_advanced_ld"
},
"facing=south,orientation=north,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"y": 180
},
"facing=west,orientation=north,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"y": 270
},
"facing=east,orientation=north,state=ld": {
"model": "computercraft:block/monitor_advanced_ld",
"y": 90
},
"facing=north,orientation=down,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 90
},
"facing=south,orientation=down,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 270
},
"facing=south,orientation=up,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=ru": {
"model": "computercraft:block/monitor_advanced_ru"
},
"facing=south,orientation=north,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"y": 180
},
"facing=west,orientation=north,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"y": 270
},
"facing=east,orientation=north,state=ru": {
"model": "computercraft:block/monitor_advanced_ru",
"y": 90
},
"facing=north,orientation=down,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 90
},
"facing=south,orientation=down,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 270
},
"facing=south,orientation=up,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lu": {
"model": "computercraft:block/monitor_advanced_lu"
},
"facing=south,orientation=north,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"y": 180
},
"facing=west,orientation=north,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"y": 270
},
"facing=east,orientation=north,state=lu": {
"model": "computercraft:block/monitor_advanced_lu",
"y": 90
},
"facing=north,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 90
},
"facing=south,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 270
},
"facing=south,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd"
},
"facing=south,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"y": 180
},
"facing=west,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"y": 270
},
"facing=east,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_advanced_lrd",
"y": 90
},
"facing=north,orientation=down,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 90
},
"facing=south,orientation=down,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 270
},
"facing=south,orientation=up,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=rud": {
"model": "computercraft:block/monitor_advanced_rud"
},
"facing=south,orientation=north,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"y": 180
},
"facing=west,orientation=north,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"y": 270
},
"facing=east,orientation=north,state=rud": {
"model": "computercraft:block/monitor_advanced_rud",
"y": 90
},
"facing=north,orientation=down,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 90
},
"facing=south,orientation=down,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 270
},
"facing=south,orientation=up,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lud": {
"model": "computercraft:block/monitor_advanced_lud"
},
"facing=south,orientation=north,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"y": 180
},
"facing=west,orientation=north,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"y": 270
},
"facing=east,orientation=north,state=lud": {
"model": "computercraft:block/monitor_advanced_lud",
"y": 90
},
"facing=north,orientation=down,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 90
},
"facing=south,orientation=down,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 270
},
"facing=south,orientation=up,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lru": {
"model": "computercraft:block/monitor_advanced_lru"
},
"facing=south,orientation=north,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"y": 180
},
"facing=west,orientation=north,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"y": 270
},
"facing=east,orientation=north,state=lru": {
"model": "computercraft:block/monitor_advanced_lru",
"y": 90
},
"facing=north,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 90
},
"facing=south,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 270
},
"facing=south,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud"
},
"facing=south,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"y": 180
},
"facing=west,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"y": 270
},
"facing=east,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_advanced_lrud",
"y": 90
}
}
}

View File

@@ -1,852 +0,0 @@
{
"variants": {
"facing=north,orientation=down,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 90
},
"facing=south,orientation=down,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 270
},
"facing=south,orientation=up,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=none": {
"model": "computercraft:block/monitor_normal",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=none": {
"model": "computercraft:block/monitor_normal"
},
"facing=south,orientation=north,state=none": {
"model": "computercraft:block/monitor_normal",
"y": 180
},
"facing=west,orientation=north,state=none": {
"model": "computercraft:block/monitor_normal",
"y": 270
},
"facing=east,orientation=north,state=none": {
"model": "computercraft:block/monitor_normal",
"y": 90
},
"facing=north,orientation=down,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 90
},
"facing=south,orientation=down,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 270
},
"facing=south,orientation=up,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=l": {
"model": "computercraft:block/monitor_normal_l",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=l": {
"model": "computercraft:block/monitor_normal_l"
},
"facing=south,orientation=north,state=l": {
"model": "computercraft:block/monitor_normal_l",
"y": 180
},
"facing=west,orientation=north,state=l": {
"model": "computercraft:block/monitor_normal_l",
"y": 270
},
"facing=east,orientation=north,state=l": {
"model": "computercraft:block/monitor_normal_l",
"y": 90
},
"facing=north,orientation=down,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 90
},
"facing=south,orientation=down,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 270
},
"facing=south,orientation=up,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=r": {
"model": "computercraft:block/monitor_normal_r",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=r": {
"model": "computercraft:block/monitor_normal_r"
},
"facing=south,orientation=north,state=r": {
"model": "computercraft:block/monitor_normal_r",
"y": 180
},
"facing=west,orientation=north,state=r": {
"model": "computercraft:block/monitor_normal_r",
"y": 270
},
"facing=east,orientation=north,state=r": {
"model": "computercraft:block/monitor_normal_r",
"y": 90
},
"facing=north,orientation=down,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 90
},
"facing=south,orientation=down,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 270
},
"facing=south,orientation=up,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lr": {
"model": "computercraft:block/monitor_normal_lr"
},
"facing=south,orientation=north,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"y": 180
},
"facing=west,orientation=north,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"y": 270
},
"facing=east,orientation=north,state=lr": {
"model": "computercraft:block/monitor_normal_lr",
"y": 90
},
"facing=north,orientation=down,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 90
},
"facing=south,orientation=down,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 270
},
"facing=south,orientation=up,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=u": {
"model": "computercraft:block/monitor_normal_u",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=u": {
"model": "computercraft:block/monitor_normal_u"
},
"facing=south,orientation=north,state=u": {
"model": "computercraft:block/monitor_normal_u",
"y": 180
},
"facing=west,orientation=north,state=u": {
"model": "computercraft:block/monitor_normal_u",
"y": 270
},
"facing=east,orientation=north,state=u": {
"model": "computercraft:block/monitor_normal_u",
"y": 90
},
"facing=north,orientation=down,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 90
},
"facing=south,orientation=down,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 270
},
"facing=south,orientation=up,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=d": {
"model": "computercraft:block/monitor_normal_d",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=d": {
"model": "computercraft:block/monitor_normal_d"
},
"facing=south,orientation=north,state=d": {
"model": "computercraft:block/monitor_normal_d",
"y": 180
},
"facing=west,orientation=north,state=d": {
"model": "computercraft:block/monitor_normal_d",
"y": 270
},
"facing=east,orientation=north,state=d": {
"model": "computercraft:block/monitor_normal_d",
"y": 90
},
"facing=north,orientation=down,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 90
},
"facing=south,orientation=down,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 270
},
"facing=south,orientation=up,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=ud": {
"model": "computercraft:block/monitor_normal_ud"
},
"facing=south,orientation=north,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"y": 180
},
"facing=west,orientation=north,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"y": 270
},
"facing=east,orientation=north,state=ud": {
"model": "computercraft:block/monitor_normal_ud",
"y": 90
},
"facing=north,orientation=down,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 90
},
"facing=south,orientation=down,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 270
},
"facing=south,orientation=up,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=rd": {
"model": "computercraft:block/monitor_normal_rd"
},
"facing=south,orientation=north,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"y": 180
},
"facing=west,orientation=north,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"y": 270
},
"facing=east,orientation=north,state=rd": {
"model": "computercraft:block/monitor_normal_rd",
"y": 90
},
"facing=north,orientation=down,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 90
},
"facing=south,orientation=down,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 270
},
"facing=south,orientation=up,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=ld": {
"model": "computercraft:block/monitor_normal_ld"
},
"facing=south,orientation=north,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"y": 180
},
"facing=west,orientation=north,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"y": 270
},
"facing=east,orientation=north,state=ld": {
"model": "computercraft:block/monitor_normal_ld",
"y": 90
},
"facing=north,orientation=down,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 90
},
"facing=south,orientation=down,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 270
},
"facing=south,orientation=up,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=ru": {
"model": "computercraft:block/monitor_normal_ru"
},
"facing=south,orientation=north,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"y": 180
},
"facing=west,orientation=north,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"y": 270
},
"facing=east,orientation=north,state=ru": {
"model": "computercraft:block/monitor_normal_ru",
"y": 90
},
"facing=north,orientation=down,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 90
},
"facing=south,orientation=down,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 270
},
"facing=south,orientation=up,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lu": {
"model": "computercraft:block/monitor_normal_lu"
},
"facing=south,orientation=north,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"y": 180
},
"facing=west,orientation=north,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"y": 270
},
"facing=east,orientation=north,state=lu": {
"model": "computercraft:block/monitor_normal_lu",
"y": 90
},
"facing=north,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 90
},
"facing=south,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 270
},
"facing=south,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd"
},
"facing=south,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"y": 180
},
"facing=west,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"y": 270
},
"facing=east,orientation=north,state=lrd": {
"model": "computercraft:block/monitor_normal_lrd",
"y": 90
},
"facing=north,orientation=down,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 90
},
"facing=south,orientation=down,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 270
},
"facing=south,orientation=up,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=rud": {
"model": "computercraft:block/monitor_normal_rud"
},
"facing=south,orientation=north,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"y": 180
},
"facing=west,orientation=north,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"y": 270
},
"facing=east,orientation=north,state=rud": {
"model": "computercraft:block/monitor_normal_rud",
"y": 90
},
"facing=north,orientation=down,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 90
},
"facing=south,orientation=down,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 270
},
"facing=south,orientation=up,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lud": {
"model": "computercraft:block/monitor_normal_lud"
},
"facing=south,orientation=north,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"y": 180
},
"facing=west,orientation=north,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"y": 270
},
"facing=east,orientation=north,state=lud": {
"model": "computercraft:block/monitor_normal_lud",
"y": 90
},
"facing=north,orientation=down,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 90
},
"facing=south,orientation=down,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 270
},
"facing=south,orientation=up,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lru": {
"model": "computercraft:block/monitor_normal_lru"
},
"facing=south,orientation=north,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"y": 180
},
"facing=west,orientation=north,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"y": 270
},
"facing=east,orientation=north,state=lru": {
"model": "computercraft:block/monitor_normal_lru",
"y": 90
},
"facing=north,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 90
},
"facing=south,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 90,
"y": 180
},
"facing=west,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 90,
"y": 270
},
"facing=east,orientation=down,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 90,
"y": 90
},
"facing=north,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 270
},
"facing=south,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 270,
"y": 180
},
"facing=west,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 270,
"y": 270
},
"facing=east,orientation=up,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"x": 270,
"y": 90
},
"facing=north,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud"
},
"facing=south,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"y": 180
},
"facing=west,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"y": 270
},
"facing=east,orientation=north,state=lrud": {
"model": "computercraft:block/monitor_normal_lrud",
"y": 90
}
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_advanced_top",
"side": "computercraft:block/computer_advanced_side",
"front": "computercraft:block/computer_advanced_front_blink"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_advanced_top",
"side": "computercraft:block/computer_advanced_side",
"front": "computercraft:block/computer_advanced_front"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_advanced_top",
"side": "computercraft:block/computer_advanced_side",
"front": "computercraft:block/computer_advanced_front_on"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_command_top",
"side": "computercraft:block/computer_command_side",
"front": "computercraft:block/computer_command_front_blink"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_command_top",
"side": "computercraft:block/computer_command_side",
"front": "computercraft:block/computer_command_front"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_command_top",
"side": "computercraft:block/computer_command_side",
"front": "computercraft:block/computer_command_front_on"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_normal_top",
"side": "computercraft:block/computer_normal_side",
"front": "computercraft:block/computer_normal_front_blink"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_normal_top",
"side": "computercraft:block/computer_normal_side",
"front": "computercraft:block/computer_normal_front"
}
}

View File

@@ -1,8 +0,0 @@
{
"parent": "block/orientable",
"textures": {
"top": "computercraft:block/computer_normal_top",
"side": "computercraft:block/computer_normal_side",
"front": "computercraft:block/computer_normal_front_on"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_16",
"side": "computercraft:block/monitor_advanced_4",
"top": "computercraft:block/monitor_advanced_0",
"back": "computercraft:block/monitor_advanced_32"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_20",
"side": "computercraft:block/monitor_advanced_7",
"top": "computercraft:block/monitor_advanced_0",
"back": "computercraft:block/monitor_advanced_36"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_19",
"side": "computercraft:block/monitor_advanced_4",
"top": "computercraft:block/monitor_advanced_1",
"back": "computercraft:block/monitor_advanced_33"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_31",
"side": "computercraft:block/monitor_advanced_7",
"top": "computercraft:block/monitor_advanced_1",
"back": "computercraft:block/monitor_advanced_45"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_18",
"side": "computercraft:block/monitor_advanced_4",
"top": "computercraft:block/monitor_advanced_2",
"back": "computercraft:block/monitor_advanced_34"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_30",
"side": "computercraft:block/monitor_advanced_7",
"top": "computercraft:block/monitor_advanced_2",
"back": "computercraft:block/monitor_advanced_46"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_24",
"side": "computercraft:block/monitor_advanced_5",
"top": "computercraft:block/monitor_advanced_2",
"back": "computercraft:block/monitor_advanced_40"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_27",
"side": "computercraft:block/monitor_advanced_6",
"top": "computercraft:block/monitor_advanced_2",
"back": "computercraft:block/monitor_advanced_43"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_25",
"side": "computercraft:block/monitor_advanced_5",
"top": "computercraft:block/monitor_advanced_1",
"back": "computercraft:block/monitor_advanced_39"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_28",
"side": "computercraft:block/monitor_advanced_6",
"top": "computercraft:block/monitor_advanced_1",
"back": "computercraft:block/monitor_advanced_42"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_17",
"side": "computercraft:block/monitor_advanced_4",
"top": "computercraft:block/monitor_advanced_3",
"back": "computercraft:block/monitor_advanced_35"
}
}

View File

@@ -1,9 +0,0 @@
{
"parent": "computercraft:block/monitor_base",
"textures": {
"front": "computercraft:block/monitor_advanced_29",
"side": "computercraft:block/monitor_advanced_7",
"top": "computercraft:block/monitor_advanced_3",
"back": "computercraft:block/monitor_advanced_47"
}
}

Some files were not shown because too many files have changed in this diff Show More