Merge branch 'mc-1.18.x' into mc-1.19.x
2
.gitattributes
vendored
@ -1,5 +1,5 @@
|
||||
# Ignore changes in generated files
|
||||
src/generated/resources/data/** linguist-generated
|
||||
src/generated/** linguist-generated
|
||||
src/testMod/server-files/structures linguist-generated
|
||||
|
||||
* text=auto
|
||||
|
2
.github/workflows/make-doc.sh
vendored
@ -12,7 +12,7 @@ chmod 600 "$HOME/.ssh/key"
|
||||
|
||||
# And upload
|
||||
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
|
||||
"$GITHUB_WORKSPACE/build/docs/lua/" \
|
||||
"$GITHUB_WORKSPACE/build/docs/site/" \
|
||||
"$SSH_USER@$SSH_HOST:/$DEST"
|
||||
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
|
||||
"$GITHUB_WORKSPACE/build/docs/javadoc/" \
|
||||
|
@ -65,7 +65,7 @@ Gradle should be your entrypoint to building most documentation. There's two tas
|
||||
|
||||
- `./gradlew luaJavadoc` - Generate documentation stubs for Java methods.
|
||||
- `./gradlew docWebsite` - Generate the whole website (including Javascript pages). The resulting HTML is stored at
|
||||
`./build/docs/lua/`.
|
||||
`./build/docs/site/`.
|
||||
|
||||
#### Writing documentation
|
||||
illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as
|
||||
|
29
build.gradle
@ -176,7 +176,7 @@ dependencies {
|
||||
exclude group: "org.jetbrains", module: "annotations"
|
||||
}
|
||||
|
||||
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.5'
|
||||
cctJavadoc 'cc.tweaked:cct-javadoc:1.4.6'
|
||||
}
|
||||
|
||||
// Compile tasks
|
||||
@ -317,7 +317,7 @@ task rollup(type: Exec) {
|
||||
|
||||
task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
||||
group = "build"
|
||||
description = "Bundles JS into rollup"
|
||||
description = "Generates docs using Illuaminate"
|
||||
|
||||
inputs.files(fileTree("doc")).withPropertyName("docs")
|
||||
inputs.files(fileTree("src/main/resources/data/computercraft/lua/rom")).withPropertyName("lua rom")
|
||||
@ -330,7 +330,21 @@ task illuaminateDocs(type: Exec, dependsOn: [rollup, luaJavadoc]) {
|
||||
commandLine mkCommand('"bin/illuaminate" doc-gen')
|
||||
}
|
||||
|
||||
task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
|
||||
task jsxDocs(type: Exec, dependsOn: [illuaminateDocs]) {
|
||||
group = "build"
|
||||
description = "Post-processes documentation to statically render some dynamic content."
|
||||
|
||||
inputs.files(fileTree("src/web")).withPropertyName("sources")
|
||||
inputs.file("src/generated/export/index.json").withPropertyName("export")
|
||||
inputs.file("package-lock.json").withPropertyName("package-lock.json")
|
||||
inputs.file("tsconfig.json").withPropertyName("Typescript config")
|
||||
inputs.files(fileTree("$buildDir/docs/lua"))
|
||||
outputs.dir("$buildDir/docs/site")
|
||||
|
||||
commandLine mkCommand('"node_modules/.bin/ts-node" --esm src/web/transform.tsx')
|
||||
}
|
||||
|
||||
task docWebsite(type: Copy, dependsOn: [jsxDocs]) {
|
||||
from('doc') {
|
||||
include 'logo.png'
|
||||
include 'images/**'
|
||||
@ -338,7 +352,14 @@ task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) {
|
||||
from("$buildDir/rollup") {
|
||||
exclude 'index.js'
|
||||
}
|
||||
into "${project.docsDir}/lua"
|
||||
from("$buildDir/docs/lua") {
|
||||
exclude '**/*.html'
|
||||
}
|
||||
from("src/generated/export/items") {
|
||||
into("images/items")
|
||||
}
|
||||
|
||||
into "${project.docsDir}/site"
|
||||
}
|
||||
|
||||
// Check tasks
|
||||
|
@ -83,7 +83,9 @@
|
||||
<module name="JavadocBlockTagLocation" />
|
||||
<module name="JavadocMethod"/>
|
||||
<module name="JavadocType"/>
|
||||
<module name="JavadocStyle" />
|
||||
<module name="JavadocStyle">
|
||||
<property name="checkHtml" value="false" />
|
||||
</module>
|
||||
<module name="NonEmptyAtclauseDescription" />
|
||||
<module name="SingleLineJavadoc" />
|
||||
<module name="SummaryJavadocCheck"/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
|
||||
# Mod properties
|
||||
mod_version=1.100.5
|
||||
mod_version=1.100.6
|
||||
|
||||
# Minecraft properties (update mods.toml when changing)
|
||||
mc_version=1.19
|
||||
|
1719
package-lock.json
generated
10
package.json
@ -4,6 +4,7 @@
|
||||
"description": "Website additions for tweaked.cc",
|
||||
"author": "SquidDev",
|
||||
"license": "BSD-3-Clause",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"preact": "^10.5.5",
|
||||
"tslib": "^2.0.3"
|
||||
@ -11,9 +12,18 @@
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-typescript": "^8.2.5",
|
||||
"@rollup/plugin-url": "^6.1.0",
|
||||
"@types/glob": "^7.2.0",
|
||||
"@types/react-dom": "^18.0.5",
|
||||
"glob": "^8.0.3",
|
||||
"react": "^18.1.0",
|
||||
"react-dom": "^18.1.0",
|
||||
"rehype": "^12.0.1",
|
||||
"rehype-highlight": "^5.0.2",
|
||||
"rehype-react": "^7.1.1",
|
||||
"requirejs": "^2.3.6",
|
||||
"rollup": "^2.33.1",
|
||||
"rollup-plugin-terser": "^7.0.2",
|
||||
"ts-node": "^10.8.0",
|
||||
"typescript": "^4.0.5"
|
||||
}
|
||||
}
|
||||
|
760
src/generated/export/index.json
generated
Normal file
@ -0,0 +1,760 @@
|
||||
{
|
||||
"itemNames": {
|
||||
"computercraft:cable": "Networking Cable",
|
||||
"computercraft:computer_advanced": "Advanced Computer",
|
||||
"computercraft:computer_command": "Command Computer",
|
||||
"computercraft:computer_normal": "Computer",
|
||||
"computercraft:disk": "Floppy Disk",
|
||||
"computercraft:disk_drive": "Disk Drive",
|
||||
"computercraft:monitor_advanced": "Advanced Monitor",
|
||||
"computercraft:monitor_normal": "Monitor",
|
||||
"computercraft:pocket_computer_advanced": "Advanced Pocket Computer",
|
||||
"computercraft:pocket_computer_normal": "Pocket Computer",
|
||||
"computercraft:printed_book": "Printed Book",
|
||||
"computercraft:printed_page": "Printed Page",
|
||||
"computercraft:printed_pages": "Printed Pages",
|
||||
"computercraft:printer": "Printer",
|
||||
"computercraft:speaker": "Speaker",
|
||||
"computercraft:treasure_disk": "Floppy Disk",
|
||||
"computercraft:turtle_advanced": "Advanced Turtle",
|
||||
"computercraft:turtle_normal": "Turtle",
|
||||
"computercraft:wired_modem": "Wired Modem",
|
||||
"computercraft:wired_modem_full": "Wired Modem",
|
||||
"computercraft:wireless_modem_advanced": "Ender Modem",
|
||||
"computercraft:wireless_modem_normal": "Wireless Modem",
|
||||
"minecraft:black_dye": "Black Dye",
|
||||
"minecraft:blue_dye": "Blue Dye",
|
||||
"minecraft:brown_dye": "Brown Dye",
|
||||
"minecraft:chest": "Chest",
|
||||
"minecraft:command_block": "Command Block",
|
||||
"minecraft:cyan_dye": "Cyan Dye",
|
||||
"minecraft:ender_eye": "Eye of Ender",
|
||||
"minecraft:ender_pearl": "Ender Pearl",
|
||||
"minecraft:glass_pane": "Glass Pane",
|
||||
"minecraft:gold_block": "Block of Gold",
|
||||
"minecraft:gold_ingot": "Gold Ingot",
|
||||
"minecraft:golden_apple": "Golden Apple",
|
||||
"minecraft:gray_dye": "Gray Dye",
|
||||
"minecraft:green_dye": "Green Dye",
|
||||
"minecraft:iron_ingot": "Iron Ingot",
|
||||
"minecraft:leather": "Leather",
|
||||
"minecraft:light_blue_dye": "Light Blue Dye",
|
||||
"minecraft:light_gray_dye": "Light Gray Dye",
|
||||
"minecraft:lime_dye": "Lime Dye",
|
||||
"minecraft:magenta_dye": "Magenta Dye",
|
||||
"minecraft:note_block": "Note Block",
|
||||
"minecraft:orange_dye": "Orange Dye",
|
||||
"minecraft:pink_dye": "Pink Dye",
|
||||
"minecraft:purple_dye": "Purple Dye",
|
||||
"minecraft:red_dye": "Red Dye",
|
||||
"minecraft:redstone": "Redstone Dust",
|
||||
"minecraft:stone": "Stone",
|
||||
"minecraft:string": "String",
|
||||
"minecraft:white_dye": "White Dye",
|
||||
"minecraft:yellow_dye": "Yellow Dye"
|
||||
},
|
||||
"recipes": {
|
||||
"computercraft:cable": {
|
||||
"inputs": [
|
||||
null,
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
null
|
||||
],
|
||||
"output": "computercraft:cable",
|
||||
"count": 6
|
||||
},
|
||||
"computercraft:computer_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:computer_advanced_upgrade": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:computer_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:computer_command": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:command_block"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_command",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:computer_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:computer_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:disk_drive": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:disk_drive",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:monitor_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:monitor_advanced",
|
||||
"count": 4
|
||||
},
|
||||
"computercraft:monitor_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:monitor_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:pocket_computer_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:golden_apple"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:pocket_computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:pocket_computer_advanced_upgrade": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:pocket_computer_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:pocket_computer_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:pocket_computer_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:golden_apple"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:glass_pane"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:pocket_computer_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:printed_book": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:leather"
|
||||
],
|
||||
[
|
||||
"computercraft:printed_page"
|
||||
],
|
||||
[
|
||||
"minecraft:string"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:printed_book",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:printed_pages": {
|
||||
"inputs": [
|
||||
[
|
||||
"computercraft:printed_page"
|
||||
],
|
||||
[
|
||||
"computercraft:printed_page"
|
||||
],
|
||||
[
|
||||
"minecraft:string"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:printed_pages",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:printer": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:black_dye",
|
||||
"minecraft:blue_dye",
|
||||
"minecraft:brown_dye",
|
||||
"minecraft:cyan_dye",
|
||||
"minecraft:gray_dye",
|
||||
"minecraft:green_dye",
|
||||
"minecraft:light_blue_dye",
|
||||
"minecraft:light_gray_dye",
|
||||
"minecraft:lime_dye",
|
||||
"minecraft:magenta_dye",
|
||||
"minecraft:orange_dye",
|
||||
"minecraft:pink_dye",
|
||||
"minecraft:purple_dye",
|
||||
"minecraft:red_dye",
|
||||
"minecraft:white_dye",
|
||||
"minecraft:yellow_dye"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:printer",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:speaker": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:note_block"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:speaker",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:turtle_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:computer_advanced"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:chest"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:turtle_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:turtle_advanced_upgrade": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:turtle_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
null,
|
||||
[
|
||||
"minecraft:gold_block"
|
||||
],
|
||||
null
|
||||
],
|
||||
"output": "computercraft:turtle_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:turtle_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"computercraft:computer_normal"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:chest"
|
||||
],
|
||||
[
|
||||
"minecraft:iron_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:turtle_normal",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wired_modem": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:redstone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:wired_modem",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wired_modem_full_from": {
|
||||
"inputs": [
|
||||
[
|
||||
"computercraft:wired_modem"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:wired_modem_full",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wired_modem_full_to": {
|
||||
"inputs": [
|
||||
[
|
||||
"computercraft:wired_modem_full"
|
||||
],
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
],
|
||||
"output": "computercraft:wired_modem",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wireless_modem_advanced": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:ender_eye"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
],
|
||||
[
|
||||
"minecraft:gold_ingot"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:wireless_modem_advanced",
|
||||
"count": 1
|
||||
},
|
||||
"computercraft:wireless_modem_normal": {
|
||||
"inputs": [
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:ender_pearl"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
],
|
||||
[
|
||||
"minecraft:stone"
|
||||
]
|
||||
],
|
||||
"output": "computercraft:wireless_modem_normal",
|
||||
"count": 1
|
||||
}
|
||||
}
|
||||
}
|
BIN
src/generated/export/items/computercraft/cable.png
generated
Normal file
After Width: | Height: | Size: 375 B |
BIN
src/generated/export/items/computercraft/computer_advanced.png
generated
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
src/generated/export/items/computercraft/computer_command.png
generated
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
src/generated/export/items/computercraft/computer_normal.png
generated
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/generated/export/items/computercraft/disk.png
generated
Normal file
After Width: | Height: | Size: 189 B |
BIN
src/generated/export/items/computercraft/disk_drive.png
generated
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/generated/export/items/computercraft/monitor_advanced.png
generated
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
src/generated/export/items/computercraft/monitor_normal.png
generated
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/generated/export/items/computercraft/pocket_computer_advanced.png
generated
Normal file
After Width: | Height: | Size: 158 B |
BIN
src/generated/export/items/computercraft/pocket_computer_normal.png
generated
Normal file
After Width: | Height: | Size: 158 B |
BIN
src/generated/export/items/computercraft/printed_book.png
generated
Normal file
After Width: | Height: | Size: 287 B |
BIN
src/generated/export/items/computercraft/printed_page.png
generated
Normal file
After Width: | Height: | Size: 208 B |
BIN
src/generated/export/items/computercraft/printed_pages.png
generated
Normal file
After Width: | Height: | Size: 259 B |
BIN
src/generated/export/items/computercraft/printer.png
generated
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/generated/export/items/computercraft/speaker.png
generated
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
src/generated/export/items/computercraft/treasure_disk.png
generated
Normal file
After Width: | Height: | Size: 189 B |
BIN
src/generated/export/items/computercraft/turtle_advanced.png
generated
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/generated/export/items/computercraft/turtle_normal.png
generated
Normal file
After Width: | Height: | Size: 977 B |
BIN
src/generated/export/items/computercraft/wired_modem.png
generated
Normal file
After Width: | Height: | Size: 593 B |
BIN
src/generated/export/items/computercraft/wired_modem_full.png
generated
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/generated/export/items/computercraft/wireless_modem_advanced.png
generated
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/generated/export/items/computercraft/wireless_modem_normal.png
generated
Normal file
After Width: | Height: | Size: 620 B |
BIN
src/generated/export/items/minecraft/black_dye.png
generated
Normal file
After Width: | Height: | Size: 218 B |
BIN
src/generated/export/items/minecraft/blue_dye.png
generated
Normal file
After Width: | Height: | Size: 228 B |
BIN
src/generated/export/items/minecraft/brown_dye.png
generated
Normal file
After Width: | Height: | Size: 218 B |
BIN
src/generated/export/items/minecraft/chest.png
generated
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/generated/export/items/minecraft/command_block.png
generated
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/generated/export/items/minecraft/cyan_dye.png
generated
Normal file
After Width: | Height: | Size: 243 B |
BIN
src/generated/export/items/minecraft/ender_eye.png
generated
Normal file
After Width: | Height: | Size: 278 B |
BIN
src/generated/export/items/minecraft/ender_pearl.png
generated
Normal file
After Width: | Height: | Size: 266 B |
BIN
src/generated/export/items/minecraft/glass_pane.png
generated
Normal file
After Width: | Height: | Size: 186 B |
BIN
src/generated/export/items/minecraft/gold_block.png
generated
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/generated/export/items/minecraft/gold_ingot.png
generated
Normal file
After Width: | Height: | Size: 240 B |
BIN
src/generated/export/items/minecraft/golden_apple.png
generated
Normal file
After Width: | Height: | Size: 257 B |
BIN
src/generated/export/items/minecraft/gray_dye.png
generated
Normal file
After Width: | Height: | Size: 229 B |
BIN
src/generated/export/items/minecraft/green_dye.png
generated
Normal file
After Width: | Height: | Size: 236 B |
BIN
src/generated/export/items/minecraft/iron_ingot.png
generated
Normal file
After Width: | Height: | Size: 240 B |
BIN
src/generated/export/items/minecraft/leather.png
generated
Normal file
After Width: | Height: | Size: 242 B |
BIN
src/generated/export/items/minecraft/light_blue_dye.png
generated
Normal file
After Width: | Height: | Size: 224 B |
BIN
src/generated/export/items/minecraft/light_gray_dye.png
generated
Normal file
After Width: | Height: | Size: 229 B |
BIN
src/generated/export/items/minecraft/lime_dye.png
generated
Normal file
After Width: | Height: | Size: 221 B |
BIN
src/generated/export/items/minecraft/magenta_dye.png
generated
Normal file
After Width: | Height: | Size: 220 B |
BIN
src/generated/export/items/minecraft/note_block.png
generated
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/generated/export/items/minecraft/orange_dye.png
generated
Normal file
After Width: | Height: | Size: 232 B |
BIN
src/generated/export/items/minecraft/pink_dye.png
generated
Normal file
After Width: | Height: | Size: 220 B |
BIN
src/generated/export/items/minecraft/purple_dye.png
generated
Normal file
After Width: | Height: | Size: 220 B |
BIN
src/generated/export/items/minecraft/red_dye.png
generated
Normal file
After Width: | Height: | Size: 233 B |
BIN
src/generated/export/items/minecraft/redstone.png
generated
Normal file
After Width: | Height: | Size: 236 B |
BIN
src/generated/export/items/minecraft/stone.png
generated
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/generated/export/items/minecraft/string.png
generated
Normal file
After Width: | Height: | Size: 193 B |
BIN
src/generated/export/items/minecraft/white_dye.png
generated
Normal file
After Width: | Height: | Size: 245 B |
BIN
src/generated/export/items/minecraft/yellow_dye.png
generated
Normal file
After Width: | Height: | Size: 235 B |
@ -77,7 +77,7 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Computer
|
||||
{
|
||||
// Draw a border around the terminal
|
||||
ComputerBorderRenderer.render(
|
||||
ComputerBorderRenderer.getTexture( family ), terminal.x, terminal.y, getBlitOffset(),
|
||||
stack.last().pose(), ComputerBorderRenderer.getTexture( family ), terminal.x, terminal.y, getBlitOffset(),
|
||||
FULL_BRIGHT_LIGHTMAP, terminal.getWidth(), terminal.getHeight()
|
||||
);
|
||||
ComputerSidebar.renderBackground( stack, leftPos, topPos + sidebarYOffset );
|
||||
|
@ -23,13 +23,6 @@ public class ComputerBorderRenderer
|
||||
public static final ResourceLocation BACKGROUND_COMMAND = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_command.png" );
|
||||
public static final ResourceLocation BACKGROUND_COLOUR = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_colour.png" );
|
||||
|
||||
private static final Matrix4f IDENTITY = new Matrix4f();
|
||||
|
||||
static
|
||||
{
|
||||
IDENTITY.setIdentity();
|
||||
}
|
||||
|
||||
/**
|
||||
* The margin between the terminal and its border.
|
||||
*/
|
||||
@ -91,10 +84,10 @@ public class ComputerBorderRenderer
|
||||
return RenderType.text( location );
|
||||
}
|
||||
|
||||
public static void render( ResourceLocation location, int x, int y, int z, int light, int width, int height )
|
||||
public static void render( Matrix4f transform, ResourceLocation location, int x, int y, int z, int light, int width, int height )
|
||||
{
|
||||
MultiBufferSource.BufferSource source = MultiBufferSource.immediate( Tesselator.getInstance().getBuilder() );
|
||||
render( IDENTITY, source.getBuffer( getRenderType( location ) ), x, y, z, light, width, height, false, 1, 1, 1 );
|
||||
render( transform, source.getBuffer( getRenderType( location ) ), x, y, z, light, width, height, false, 1, 1, 1 );
|
||||
source.endBatch();
|
||||
}
|
||||
|
||||
|
@ -324,9 +324,9 @@ public class Terminal
|
||||
TextBuffer textColour = this.textColour[y];
|
||||
TextBuffer backColour = backgroundColour[y];
|
||||
|
||||
for( int x = 0; x < width; x++ ) buffer.writeByte( text.charAt( x ) & 0xFF );
|
||||
for( int x = 0; x < width; x++ )
|
||||
{
|
||||
buffer.writeByte( text.charAt( x ) & 0xFF );
|
||||
buffer.writeByte( getColour(
|
||||
backColour.charAt( x ), Colour.BLACK ) << 4 |
|
||||
getColour( textColour.charAt( x ), Colour.WHITE )
|
||||
@ -353,10 +353,9 @@ public class Terminal
|
||||
TextBuffer textColour = this.textColour[y];
|
||||
TextBuffer backColour = backgroundColour[y];
|
||||
|
||||
for( int x = 0; x < width; x++ ) text.setChar( x, (char) (buffer.readByte() & 0xFF) );
|
||||
for( int x = 0; x < width; x++ )
|
||||
{
|
||||
text.setChar( x, (char) (buffer.readByte() & 0xFF) );
|
||||
|
||||
byte colour = buffer.readByte();
|
||||
backColour.setChar( x, base16.charAt( (colour >> 4) & 0xF ) );
|
||||
textColour.setChar( x, base16.charAt( colour & 0xF ) );
|
||||
|
@ -19,9 +19,17 @@ import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public abstract class TileGeneric extends BlockEntity
|
||||
{
|
||||
/**
|
||||
* Is this block enqueued to be updated next tick? This should only be read/written by the tick scheduler.
|
||||
*
|
||||
* @see dan200.computercraft.shared.util.TickScheduler
|
||||
*/
|
||||
public final AtomicBoolean scheduled = new AtomicBoolean();
|
||||
|
||||
public TileGeneric( BlockEntityType<? extends TileGeneric> type, BlockPos pos, BlockState state )
|
||||
{
|
||||
super( type, pos, state );
|
||||
|
@ -426,6 +426,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
label = copy.label;
|
||||
on = copy.on;
|
||||
startOn = copy.startOn;
|
||||
lockCode = copy.lockCode;
|
||||
updateBlock();
|
||||
}
|
||||
copy.instanceID = -1;
|
||||
|
@ -23,7 +23,6 @@ import net.minecraftforge.network.PacketDistributor;
|
||||
import net.minecraftforge.network.simple.SimpleChannel;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public final class NetworkHandler
|
||||
{
|
||||
@ -112,10 +111,4 @@ public final class NetworkHandler
|
||||
} )
|
||||
.add();
|
||||
}
|
||||
|
||||
@SuppressWarnings( "unchecked" )
|
||||
private static <T> Class<T> getType( Supplier<T> supplier )
|
||||
{
|
||||
return (Class<T>) supplier.get().getClass();
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,11 @@ import java.util.Optional;
|
||||
* When a disk is inserted, a {@code disk} event is fired, with the side peripheral is on. Likewise, when the disk is
|
||||
* detached, a {@code disk_eject} event is fired.
|
||||
*
|
||||
* ## Recipe
|
||||
* <div class="recipe-container">
|
||||
* <mc-recipe recipe="computercraft:disk_drive"></mc-recipe>
|
||||
* </div>
|
||||
*
|
||||
* @cc.module drive
|
||||
*/
|
||||
public class DiskDrivePeripheral implements IPeripheral
|
||||
|
@ -75,6 +75,15 @@ import java.util.Set;
|
||||
*
|
||||
* print("Received a reply: " .. tostring(message))
|
||||
* }</pre>
|
||||
*
|
||||
* ## Recipes
|
||||
* <div class="recipe-container">
|
||||
* <mc-recipe recipe="computercraft:wireless_modem_normal"></mc-recipe>
|
||||
* <mc-recipe recipe="computercraft:wireless_modem_advanced"></mc-recipe>
|
||||
* <mc-recipe recipe="computercraft:wired_modem"></mc-recipe>
|
||||
* <mc-recipe recipe="computercraft:cable"></mc-recipe>
|
||||
* <mc-recipe recipe="computercraft:wired_modem_full_from"></mc-recipe>
|
||||
* </div>
|
||||
*/
|
||||
public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPacketReceiver
|
||||
{
|
||||
|
@ -257,7 +257,7 @@ public class TileCable extends TileGeneric
|
||||
@Override
|
||||
public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit )
|
||||
{
|
||||
if( player.isCrouching() ) return InteractionResult.PASS;
|
||||
if( player.isCrouching() || !player.mayBuild() ) return InteractionResult.PASS;
|
||||
if( !canAttachPeripheral() ) return InteractionResult.FAIL;
|
||||
|
||||
if( getLevel().isClientSide ) return InteractionResult.SUCCESS;
|
||||
|
@ -199,6 +199,7 @@ public class TileWiredModemFull extends TileGeneric
|
||||
@Override
|
||||
public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit )
|
||||
{
|
||||
if( player.isCrouching() || !player.mayBuild() ) return InteractionResult.PASS;
|
||||
if( getLevel().isClientSide ) return InteractionResult.SUCCESS;
|
||||
|
||||
// On server, we interacted if a peripheral was found
|
||||
|
@ -25,6 +25,12 @@ import javax.annotation.Nullable;
|
||||
*
|
||||
* Like computers, monitors come in both normal (no colour) and advanced (colour) varieties.
|
||||
*
|
||||
* ## Recipes
|
||||
* <div class="recipe-container">
|
||||
* <mc-recipe recipe="computercraft:monitor_normal"></mc-recipe>
|
||||
* <mc-recipe recipe="computercraft:monitor_advanced"></mc-recipe>
|
||||
* </div>
|
||||
*
|
||||
* @cc.module monitor
|
||||
* @cc.usage Write "Hello, world!" to an adjacent monitor:
|
||||
*
|
||||
|
@ -18,6 +18,11 @@ import java.util.Optional;
|
||||
/**
|
||||
* The printer peripheral allows pages and books to be printed.
|
||||
*
|
||||
* ## Recipe
|
||||
* <div class="recipe-container">
|
||||
* <mc-recipe recipe="computercraft:printer"></mc-recipe>
|
||||
* </div>
|
||||
*
|
||||
* @cc.module printer
|
||||
*/
|
||||
public class PrinterPeripheral implements IPeripheral
|
||||
|
@ -42,6 +42,11 @@ import static dan200.computercraft.api.lua.LuaValues.checkFinite;
|
||||
* - {@link #playSound} plays any built-in Minecraft sound, such as block sounds or mob noises.
|
||||
* - {@link #playAudio} can play arbitrary audio.
|
||||
*
|
||||
* ## Recipe
|
||||
* <div class="recipe-container">
|
||||
* <mc-recipe recipe="computercraft:speaker"></mc-recipe>
|
||||
* </div>
|
||||
*
|
||||
* @cc.module speaker
|
||||
* @cc.since 1.80pr1
|
||||
*/
|
||||
|
@ -5,21 +5,18 @@
|
||||
*/
|
||||
package dan200.computercraft.shared.util;
|
||||
|
||||
import com.google.common.collect.MapMaker;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.shared.common.TileGeneric;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedDeque;
|
||||
|
||||
/**
|
||||
* A thread-safe version of {@link LevelAccessor#scheduleTick(BlockPos, Block, int)}.
|
||||
@ -33,16 +30,12 @@ public final class TickScheduler
|
||||
{
|
||||
}
|
||||
|
||||
private static final Set<BlockEntity> toTick = Collections.newSetFromMap(
|
||||
new MapMaker()
|
||||
.weakKeys()
|
||||
.makeMap()
|
||||
);
|
||||
private static final Queue<TileGeneric> toTick = new ConcurrentLinkedDeque<>();
|
||||
|
||||
public static void schedule( TileGeneric tile )
|
||||
{
|
||||
Level world = tile.getLevel();
|
||||
if( world != null && !world.isClientSide ) toTick.add( tile );
|
||||
if( world != null && !world.isClientSide && !tile.scheduled.getAndSet( true ) ) toTick.add( tile );
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@ -50,11 +43,11 @@ public final class TickScheduler
|
||||
{
|
||||
if( event.phase != TickEvent.Phase.START ) return;
|
||||
|
||||
Iterator<BlockEntity> iterator = toTick.iterator();
|
||||
while( iterator.hasNext() )
|
||||
TileGeneric tile;
|
||||
while( (tile = toTick.poll()) != null )
|
||||
{
|
||||
BlockEntity tile = iterator.next();
|
||||
iterator.remove();
|
||||
tile.scheduled.set( false );
|
||||
if( tile.isRemoved() ) continue;
|
||||
|
||||
Level world = tile.getLevel();
|
||||
BlockPos pos = tile.getBlockPos();
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"itemGroup.computercraft": "ComputerCraft",
|
||||
"block.computercraft.computer_normal": "Computer",
|
||||
"block.computercraft.computer_advanced": "Avanceret Computer",
|
||||
"block.computercraft.computer_command": "Kommandocomputer",
|
||||
@ -41,23 +42,22 @@
|
||||
"gui.computercraft.tooltip.computer_id": "Computer-ID: %s",
|
||||
"gui.computercraft.tooltip.disk_id": "Disk-ID: %s",
|
||||
"gui.computercraft.tooltip.turn_on": "Tænd denne computer",
|
||||
"gui.computercraft.tooltip.turn_on.key": "Hold Ctrl+R nede",
|
||||
"gui.computercraft.tooltip.turn_off": "Sluk denne computer",
|
||||
"gui.computercraft.tooltip.terminate.key": "Hold Ctrl+T nede",
|
||||
"gui.computercraft.tooltip.turn_off.key": "Hold Ctrl+S nede",
|
||||
"gui.computercraft.tooltip.terminate": "Stop den igangværende kode",
|
||||
"gui.computercraft.tooltip.turn_on.key": "Hold Ctrl+R nede",
|
||||
"gui.computercraft.upload.overwrite_button": "Overskriv",
|
||||
"gui.computercraft.upload.overwrite.detail": "Følgende filer vil blive overskrevet ved upload. Fortsæt?%s",
|
||||
"gui.computercraft.tooltip.terminate.key": "Hold Ctrl+T nede",
|
||||
"gui.computercraft.upload.success": "Upload Lykkedes",
|
||||
"gui.computercraft.upload.overwrite": "Filer ville blive overskrevet",
|
||||
"gui.computercraft.upload.success.msg": "%d filer uploadet.",
|
||||
"gui.computercraft.upload.failed": "Upload Fejlede",
|
||||
"gui.computercraft.upload.failed.out_of_space": "Ikke nok plads på computeren til disse filer.",
|
||||
"gui.computercraft.upload.failed.computer_off": "Du skal tænde computeren, før du kan uploade filer.",
|
||||
"gui.computercraft.upload.failed.too_much": "Dine filer er for store til at blive uploadet.",
|
||||
"gui.computercraft.upload.failed.overwrite_dir": "Kan ikke uploade %s, da der allerede er en mappe med det samme navn.",
|
||||
"gui.computercraft.upload.success.msg": "%d filer uploadet.",
|
||||
"gui.computercraft.upload.failed": "Upload Fejlede",
|
||||
"gui.computercraft.upload.failed.name_too_long": "Filnavne er for lange til at blive uploadet.",
|
||||
"gui.computercraft.upload.failed.too_many_files": "Kan ikke uploade så mange filer.",
|
||||
"gui.computercraft.pocket_computer_overlay": "Lommecomputer åben. Tryk ESC for at lukke.",
|
||||
"itemGroup.computercraft": "ComputerCraft"
|
||||
"gui.computercraft.upload.failed.overwrite_dir": "Kan ikke uploade %s, da der allerede er en mappe med det samme navn.",
|
||||
"gui.computercraft.upload.overwrite": "Filer ville blive overskrevet",
|
||||
"gui.computercraft.upload.overwrite.detail": "Følgende filer vil blive overskrevet ved upload. Fortsæt?%s",
|
||||
"gui.computercraft.upload.overwrite_button": "Overskriv",
|
||||
"gui.computercraft.pocket_computer_overlay": "Lommecomputer åben. Tryk ESC for at lukke."
|
||||
}
|
||||
|
135
src/main/resources/assets/computercraft/lang/uk_ua.json
Normal file
@ -0,0 +1,135 @@
|
||||
{
|
||||
"itemGroup.computercraft": "ComputerCraft",
|
||||
"block.computercraft.computer_normal": "Комп'ютер",
|
||||
"block.computercraft.computer_advanced": "Просунутий комп'ютер",
|
||||
"block.computercraft.computer_command": "Командний комп'ютер",
|
||||
"block.computercraft.disk_drive": "Дисковод",
|
||||
"block.computercraft.printer": "Принтер",
|
||||
"block.computercraft.speaker": "Колонка",
|
||||
"block.computercraft.monitor_normal": "Монітор",
|
||||
"block.computercraft.monitor_advanced": "Просунутий Монітор",
|
||||
"block.computercraft.wireless_modem_normal": "Бездротовий модем",
|
||||
"block.computercraft.wireless_modem_advanced": "Ендер модем",
|
||||
"block.computercraft.wired_modem": "Дротовий модем",
|
||||
"block.computercraft.cable": "Мережевий кабель",
|
||||
"block.computercraft.wired_modem_full": "Дротовий модем",
|
||||
"block.computercraft.turtle_normal": "Черепашка",
|
||||
"block.computercraft.turtle_normal.upgraded": "%s Черепашка",
|
||||
"block.computercraft.turtle_normal.upgraded_twice": "%s %s Черепашка",
|
||||
"block.computercraft.turtle_advanced": "Просунута Черепашка",
|
||||
"block.computercraft.turtle_advanced.upgraded": "Просунута %s Черепашка",
|
||||
"block.computercraft.turtle_advanced.upgraded_twice": "Просунута %s %s Черепашка",
|
||||
"item.computercraft.disk": "Дискета",
|
||||
"item.computercraft.treasure_disk": "Дискета",
|
||||
"item.computercraft.printed_page": "Надрукована сторінка",
|
||||
"item.computercraft.printed_pages": "Надруковані сторінки",
|
||||
"item.computercraft.printed_book": "Надрукована книжка",
|
||||
"item.computercraft.pocket_computer_normal": "Кишеньковий комп'ютер",
|
||||
"item.computercraft.pocket_computer_normal.upgraded": "%s Кишеньковий комп'ютер",
|
||||
"item.computercraft.pocket_computer_advanced": "Просунутий Кишеньковий комп'ютер",
|
||||
"item.computercraft.pocket_computer_advanced.upgraded": "Просунутий %s Кишеньковий комп'ютер",
|
||||
"upgrade.minecraft.diamond_sword.adjective": "Бойова",
|
||||
"upgrade.minecraft.diamond_shovel.adjective": "Копаюча",
|
||||
"upgrade.minecraft.diamond_pickaxe.adjective": "Добувна",
|
||||
"upgrade.minecraft.diamond_axe.adjective": "Рубляча",
|
||||
"upgrade.minecraft.diamond_hoe.adjective": "Обробна",
|
||||
"upgrade.minecraft.crafting_table.adjective": "Вміла",
|
||||
"upgrade.computercraft.wireless_modem_normal.adjective": "Бездротовий",
|
||||
"upgrade.computercraft.wireless_modem_advanced.adjective": "Ендер",
|
||||
"upgrade.computercraft.speaker.adjective": "Шумливий",
|
||||
"chat.computercraft.wired_modem.peripheral_connected": "Периферійний пристрій \\\"%s\\\" підключено до мережі",
|
||||
"chat.computercraft.wired_modem.peripheral_disconnected": "Периферійний пристрій \\\"%s\\\" відключено від мережі",
|
||||
"commands.computercraft.synopsis": "Різні команди для керування комп'ютерами.",
|
||||
"commands.computercraft.desc": "Команда /computercraft надає різні Налагоджувальні та Адміністративні інструменти для управління та взаємодії з комп'ютерами.",
|
||||
"commands.computercraft.help.synopsis": "Надає допомогу для конкретних команд",
|
||||
"commands.computercraft.help.desc": "Показує це повідомлення довідки",
|
||||
"commands.computercraft.help.no_children": "%s не має підкоманд",
|
||||
"commands.computercraft.help.no_command": "Немає такої команди '%s'",
|
||||
"commands.computercraft.dump.synopsis": "Відобразити стан комп'ютерів.",
|
||||
"commands.computercraft.dump.desc": "Відображає стан усіх комп'ютерів або конкретної інформації про один комп'ютер. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").",
|
||||
"commands.computercraft.dump.action": "Переглянути інформацію про цей комп'ютер",
|
||||
"commands.computercraft.dump.open_path": "Переглянути файли цього комп'ютера",
|
||||
"commands.computercraft.shutdown.synopsis": "Віддалено завершити роботу комп'ютерів.",
|
||||
"commands.computercraft.shutdown.desc": "Завершити роботу перерахованих комп'ютерів або всі, якщо жодного не вказано. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").",
|
||||
"commands.computercraft.shutdown.done": "У %s/%s комп'ютерів завершено роботу",
|
||||
"commands.computercraft.turn_on.synopsis": "Увімкнути комп'ютери віддалено.",
|
||||
"commands.computercraft.turn_on.desc": "Увімкнути перелічені комп'ютери. Ви можете вказати ідентифікатор екземпляра комп'ютера (наприклад 123), ідентифікатор комп'ютера (наприклад #123) або позначку (наприклад, \"@My Computer\").",
|
||||
"commands.computercraft.turn_on.done": "%s/%s комп'ютерів увімкнено",
|
||||
"commands.computercraft.tp.synopsis": "Телепортувати до конкретного комп'ютера.",
|
||||
"commands.computercraft.tp.desc": "Телепортувати до розташування комп'ютера. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).",
|
||||
"commands.computercraft.tp.action": "Телепортувати до цього комп'ютера",
|
||||
"commands.computercraft.tp.not_player": "Не можна відкрити термінал для не-гравця",
|
||||
"commands.computercraft.tp.not_there": "Не можна визначити у світі розташування комп'ютер",
|
||||
"commands.computercraft.view.synopsis": "Переглянути термінал комп'ютера.",
|
||||
"commands.computercraft.view.desc": "Відкрити термінал комп'ютера, який дозволяє віддалено керувати комп'ютером. Це не надає доступу до інвентарів черепашок. Ви можете вказати або ідентифікатор екземпляра комп'ютера (наприклад, 123) або ідентифікатор комп'ютера (наприклад, #123).",
|
||||
"commands.computercraft.view.action": "Переглянути цей комп'ютер",
|
||||
"commands.computercraft.view.not_player": "Не можна відкрити термінал для не-гравця",
|
||||
"commands.computercraft.track.synopsis": "Відстеження середовища виконання комп'ютерів.",
|
||||
"commands.computercraft.track.desc": "Відстежує, як довго комп'ютери виконують, а також те, як багато вони обробляють події. Ця інформація представляється аналогічно /forge track і може бути корисною для діагностики лага.",
|
||||
"commands.computercraft.track.start.synopsis": "Почати відстеження всіх комп'ютерів",
|
||||
"commands.computercraft.track.start.desc": "Почати відстеження всіх середовищ виконання комп'ютера та кількість подій. Це скасує результати та попередні запуски.",
|
||||
"commands.computercraft.track.start.stop": "Запустити %s, щоб зупинити відстеження та переглянути результати",
|
||||
"commands.computercraft.track.stop.synopsis": "Припинити відстеження всіх комп'ютерів",
|
||||
"commands.computercraft.track.stop.desc": "Припинити відстеження всіх подій комп'ютера та середовищ виконання",
|
||||
"commands.computercraft.track.stop.action": "Натисніть, щоб припинити відстеження",
|
||||
"commands.computercraft.track.stop.not_enabled": "На даний момент немає комп'ютерів, що відстежують.",
|
||||
"commands.computercraft.track.dump.synopsis": "Вивести останні результати відстеження",
|
||||
"commands.computercraft.track.dump.desc": "Вивести останні результати відстеження комп'ютера.",
|
||||
"commands.computercraft.track.dump.no_timings": "Немає доступних розкладів",
|
||||
"commands.computercraft.track.dump.computer": "Комп'ютер",
|
||||
"commands.computercraft.reload.synopsis": "Перезавантажити файл конфігурації ComputerCraft'a",
|
||||
"commands.computercraft.reload.desc": "Перезавантажує файл конфігурації ComputerCraft'a",
|
||||
"commands.computercraft.reload.done": "Конфігурація перезавантажена",
|
||||
"commands.computercraft.queue.synopsis": "Надіслати подію computer_command до Командного комп'ютера",
|
||||
"commands.computercraft.queue.desc": "Надіслати подію computer_command до Командного комп'ютера через додаткові аргументи. В основному це призначено для Картоделів, діє як зручніша для користувача комп'ютерна версія /trigger. Будь-який гравець зможе запустити команду, яка, ймовірно, буде зроблена через події клацання текстового компонента.",
|
||||
"commands.computercraft.generic.no_position": "<немає позиції>",
|
||||
"commands.computercraft.generic.position": "%s, %s, %s",
|
||||
"commands.computercraft.generic.yes": "Y",
|
||||
"commands.computercraft.generic.no": "N",
|
||||
"commands.computercraft.generic.exception": "Необроблений виняток (%s)",
|
||||
"commands.computercraft.generic.additional_rows": "%d додаткових рядків …",
|
||||
"argument.computercraft.computer.no_matching": "Немає відповідних комп'ютерів з '%s'",
|
||||
"argument.computercraft.computer.many_matching": "Декілька комп'ютерів відповідають з '%s' (екземпляри %s)",
|
||||
"argument.computercraft.tracking_field.no_field": "Невідоме поле '%s'",
|
||||
"argument.computercraft.argument_expected": "Очікується аргумент",
|
||||
"tracking_field.computercraft.tasks.name": "Завдання",
|
||||
"tracking_field.computercraft.total.name": "Загальний час",
|
||||
"tracking_field.computercraft.average.name": "Середній час",
|
||||
"tracking_field.computercraft.max.name": "Максимальний час",
|
||||
"tracking_field.computercraft.server_count.name": "Число серверних завдань",
|
||||
"tracking_field.computercraft.server_time.name": "Час серверних завдань",
|
||||
"tracking_field.computercraft.peripheral.name": "Виклики периферійних пристроїв",
|
||||
"tracking_field.computercraft.fs.name": "Операції з файловою системою",
|
||||
"tracking_field.computercraft.turtle.name": "Операції з черепашкою",
|
||||
"tracking_field.computercraft.http.name": "HTTP запити",
|
||||
"tracking_field.computercraft.http_upload.name": "HTTP завантаження",
|
||||
"tracking_field.computercraft.http_download.name": "HTTP завантаження",
|
||||
"tracking_field.computercraft.websocket_incoming.name": "Вхідний Websocket",
|
||||
"tracking_field.computercraft.websocket_outgoing.name": "Вихідний Websocket",
|
||||
"tracking_field.computercraft.coroutines_created.name": "Співпрограма створена",
|
||||
"tracking_field.computercraft.coroutines_dead.name": "Співпрограма видалена",
|
||||
"gui.computercraft.tooltip.copy": "Скопійовано в Буфер обміну",
|
||||
"gui.computercraft.tooltip.computer_id": "Ідентифікатор комп'ютера: %s",
|
||||
"gui.computercraft.tooltip.disk_id": "Ідентифікатор диска: %s",
|
||||
"gui.computercraft.tooltip.turn_on": "Увімкнути цей комп'ютер",
|
||||
"gui.computercraft.tooltip.turn_on.key": "Утримуй Ctrl+R",
|
||||
"gui.computercraft.tooltip.turn_off": "Вимкнути цей комп'ютер",
|
||||
"gui.computercraft.tooltip.turn_off.key": "Утримуй Ctrl+S",
|
||||
"gui.computercraft.tooltip.terminate": "Припинити поточний запущений код",
|
||||
"gui.computercraft.tooltip.terminate.key": "Утримуй Ctrl+T",
|
||||
"gui.computercraft.upload.success": "Завантаження успішне",
|
||||
"gui.computercraft.upload.success.msg": "%d файлів завантажено.",
|
||||
"gui.computercraft.upload.failed": "Завантаження не вдалося",
|
||||
"gui.computercraft.upload.failed.out_of_space": "Недостатньо місця в комп'ютері для цих файлів.",
|
||||
"gui.computercraft.upload.failed.computer_off": "Ви повинні увімкнути комп'ютер перед завантаженням файлів.",
|
||||
"gui.computercraft.upload.failed.too_much": "Твої файли надто великі для завантаження.",
|
||||
"gui.computercraft.upload.failed.name_too_long": "Назви файлів занадто довгі для завантаження.",
|
||||
"gui.computercraft.upload.failed.too_many_files": "Неможливо завантажити стільки файлів.",
|
||||
"gui.computercraft.upload.failed.overwrite_dir": "Не можна завантажити %s, оскільки папка з такою самою назвою вже існує.",
|
||||
"gui.computercraft.upload.failed.generic": "Завантаження файлів не вдалося (%s)",
|
||||
"gui.computercraft.upload.failed.corrupted": "Файли пошкоджені під час завантаження. Спробуй знову.",
|
||||
"gui.computercraft.upload.overwrite": "Файли будуть перезаписані",
|
||||
"gui.computercraft.upload.overwrite.detail": "При завантаженні файли будуть перезаписані. Продовжити?%s",
|
||||
"gui.computercraft.upload.overwrite_button": "Перезаписати",
|
||||
"gui.computercraft.pocket_computer_overlay": "Кишеньковий комп'ютер відкритий. Натисніть ESC, щоб закрити."
|
||||
}
|
@ -1,3 +1,19 @@
|
||||
# New features in CC: Tweaked 1.100.6
|
||||
|
||||
* Various documentation improvements (MCJack123, FayneAldan).
|
||||
* Allow CC's blocks to be rotated when used in structure blocks (Seniorendi).
|
||||
* Several performance improvements to computer execution.
|
||||
* Add parse_empty_array option to textutils.unserialiseJSON (@ChickChicky).
|
||||
* Add an API to allow other mods to provide extra item/block details (Lemmmy).
|
||||
* All blocks with GUIs can now be "locked" (via a command or NBT editing tools) like vanilla inventories. Players can only interact with them with a specific named item.
|
||||
|
||||
Several bug fixes:
|
||||
* Fix printouts being rendered with an offset in item frames (coolsa).
|
||||
* Reduce position latency when playing audio with a noisy pocket computer.
|
||||
* Fix total counts in /computercraft turn-on/shutdown commands.
|
||||
* Fix "Run" command not working in the editor when run from a subdirectory (Wojbie).
|
||||
* Pocket computers correctly preserve their on state.
|
||||
|
||||
# New features in CC: Tweaked 1.100.5
|
||||
|
||||
* Generic peripherals now use capabilities on the given side if one isn't provided on the internal side.
|
||||
|
@ -1,10 +1,17 @@
|
||||
New features in CC: Tweaked 1.100.5
|
||||
New features in CC: Tweaked 1.100.6
|
||||
|
||||
* Generic peripherals now use capabilities on the given side if one isn't provided on the internal side.
|
||||
* Improve performance of monitor rendering.
|
||||
* Various documentation improvements (MCJack123, FayneAldan).
|
||||
* Allow CC's blocks to be rotated when used in structure blocks (Seniorendi).
|
||||
* Several performance improvements to computer execution.
|
||||
* Add parse_empty_array option to textutils.unserialiseJSON (@ChickChicky).
|
||||
* Add an API to allow other mods to provide extra item/block details (Lemmmy).
|
||||
* All blocks with GUIs can now be "locked" (via a command or NBT editing tools) like vanilla inventories. Players can only interact with them with a specific named item.
|
||||
|
||||
Several bug fixes:
|
||||
* Various documentation fixes (bclindner, Hasaabitt)
|
||||
* Speaker sounds are now correctly positioned on the centre of the speaker block.
|
||||
* Fix printouts being rendered with an offset in item frames (coolsa).
|
||||
* Reduce position latency when playing audio with a noisy pocket computer.
|
||||
* Fix total counts in /computercraft turn-on/shutdown commands.
|
||||
* Fix "Run" command not working in the editor when run from a subdirectory (Wojbie).
|
||||
* Pocket computers correctly preserve their on state.
|
||||
|
||||
Type "help changelog" to see the full version history.
|
||||
|
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
||||
* Send enquiries to dratcliffe@gmail.com
|
||||
*/
|
||||
package dan200.computercraft.client.sound;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.ByteBufAllocator;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class DfpwmStreamTest
|
||||
{
|
||||
@Test
|
||||
public void testDecodesBytes()
|
||||
{
|
||||
DfpwmStream stream = new DfpwmStream();
|
||||
|
||||
ByteBuf input = ByteBufAllocator.DEFAULT.buffer();
|
||||
input.writeBytes( new byte[] { 43, -31, 33, 44, 30, -16, -85, 23, -3, -55, 46, -70, 68, -67, 74, -96, -68, 16, 94, -87, -5, 87, 11, -16, 19, 92, 85, -71, 126, 5, -84, 64, 17, -6, 85, -11, -1, -87, -12, 1, 85, -56, 33, -80, 82, 104, -93, 17, 126, 23, 91, -30, 37, -32, 117, -72, -58, 11, -76, 19, -108, 86, -65, -10, -1, -68, -25, 10, -46, 85, 124, -54, 15, -24, 43, -94, 117, 63, -36, 15, -6, 88, 87, -26, -83, 106, 41, 13, -28, -113, -10, -66, 119, -87, -113, 68, -55, 40, -107, 62, 20, 72, 3, -96, 114, -87, -2, 39, -104, 30, 20, 42, 84, 24, 47, 64, 43, 61, -35, 95, -65, 42, 61, 42, -50, 4, -9, 81 } );
|
||||
stream.push( input );
|
||||
|
||||
ByteBuffer buffer = stream.read( 1024 + 1 );
|
||||
assertEquals( 1024, buffer.remaining(), "Must have read 1024 bytes" );
|
||||
|
||||
byte[] decoded = new byte[] { 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, -1, -2, -2, -1, 0, 1, 0, -1, -3, -5, -5, -5, -7, -9, -11, -11, -9, -9, -9, -9, -10, -12, -12, -10, -8, -6, -6, -8, -10, -12, -14, -16, -18, -17, -15, -12, -9, -6, -3, -2, -2, -2, -2, -2, -2, 0, 3, 6, 7, 7, 7, 4, 1, 1, 1, 1, 3, 5, 7, 9, 12, 15, 15, 12, 12, 12, 9, 9, 11, 12, 12, 14, 16, 17, 17, 17, 14, 11, 11, 11, 10, 12, 14, 14, 13, 13, 10, 9, 9, 7, 5, 4, 4, 4, 4, 4, 6, 8, 10, 10, 10, 10, 10, 10, 10, 9, 8, 8, 8, 7, 6, 4, 2, 0, 0, 0, 0, 0, -1, -1, 0, 1, 3, 3, 3, 3, 2, 0, -2, -2, -2, -3, -5, -7, -7, -5, -3, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 9, 8, 7, 6, 4, 2, 0, 0, 2, 4, 6, 8, 10, 10, 8, 7, 7, 5, 3, 1, -1, 0, 2, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 9, 9, 9, 9, 9, 8, 7, 6, 5, 3, 1, 1, 3, 3, 3, 3, 3, 3, 2, 1, 0, -1, -3, -3, -3, -3, -2, -3, -4, -4, -3, -4, -5, -6, -6, -5, -5, -4, -3, -2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 20, 17, 16, 16, 15, 15, 15, 15, 13, 13, 13, 13, 14, 15, 16, 18, 18, 16, 14, 12, 10, 8, 5, 5, 5, 4, 4, 4, 4, 4, 4, 2, 0, -2, -2, -2, -4, -4, -2, 0, 0, -2, -4, -6, -6, -6, -8, -10, -12, -14, -16, -15, -13, -12, -11, -11, -11, -11, -13, -13, -13, -13, -13, -14, -16, -18, -18, -18, -18, -16, -16, -16, -14, -13, -14, -15, -15, -14, -14, -12, -11, -12, -13, -13, -12, -13, -14, -15, -15, -13, -11, -9, -7, -5, -5, -5, -3, -1, -1, -1, -1, -3, -5, -5, -3, -3, -3, -1, -1, -1, -1, -3, -3, -3, -4, -6, -6, -4, -2, 0, 0, 0, 0, -2, -2, -2, -3, -5, -7, -9, -11, -13, -13, -11, -9, -7, -6, -6, -6, -6, -4, -2, -2, -4, -6, -8, -7, -5, -3, -2, -2, -2, -2, 0, 0, -2, -4, -4, -2, 0, 2, 2, 1, 1, -1, -3, -5, -7, -10, -10, -10, -10, -8, -7, -7, -5, -3, -2, -4, -4, -4, -6, -8, -10, -12, -12, -12, -12, -12, -14, -13, -13, -13, -11, -11, -11, -11, -11, -11, -11, -9, -7, -5, -3, -1, -1, -1, -1, -1, 1, 1, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 22, 19, 18, 20, 22, 24, 23, 22, 24, 26, 28, 27, 24, 23, 25, 28, 28, 28, 27, 26, 26, 23, 20, 17, 14, 14, 14, 11, 11, 11, 11, 13, 15, 16, 16, 16, 15, 15, 14, 14, 12, 10, 9, 11, 13, 15, 17, 17, 14, 13, 13, 12, 12, 10, 9, 11, 13, 15, 17, 19, 19, 16, 13, 10, 7, 4, 1, 1, 2, 2, 4, 7, 10, 13, 13, 13, 12, 12, 12, 9, 6, 6, 6, 3, 0, 0, 0, 0, 2, 3, 3, 3, 3, 5, 7, 7, 7, 9, 11, 13, 15, 18, 18, 15, 12, 9, 8, 10, 13, 13, 13, 15, 18, 21, 24, 27, 27, 23, 19, 15, 11, 10, 9, 9, 12, 16, 19, 22, 23, 19, 14, 13, 16, 16, 15, 15, 14, 17, 20, 20, 19, 19, 18, 17, 14, 13, 15, 15, 12, 11, 13, 16, 19, 19, 18, 20, 20, 19, 18, 18, 17, 17, 16, 16, 16, 15, 17, 17, 16, 16, 13, 12, 12, 11, 11, 9, 9, 9, 9, 11, 11, 9, 7, 5, 3, 1, 1, 1, -1, -1, 1, 3, 5, 7, 9, 11, 12, 9, 6, 6, 6, 6, 8, 8, 7, 9, 11, 13, 13, 12, 14, 16, 18, 20, 20, 20, 22, 24, 26, 25, 25, 27, 29, 28, 27, 26, 23, 22, 22, 21, 21, 20, 22, 24, 26, 28, 27, 24, 21, 21, 21, 18, 17, 17, 14, 11, 11, 11, 10, 10, 7, 6, 6, 4, 3, 5, 5, 3, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, 0, 1, 2, 3, 4, 3, 1, -1, -3, -3, -3, -3, -2, -3, -4, -6, -8, -10, -10, -10, -12, -12, -12, -12, -10, -10, -11, -12, -14, -16, -18, -20, -22, -24, -26, -28, -27, -27, -26, -26, -25, -25, -27, -26, -24, -22, -22, -22, -22, -24, -24, -24, -24, -23, -23, -22, -22, -21, -20, -19, -17, -15, -13, -11, -9, -7, -7, -9, -9, -9, -11, -13, -15, -17, -16, -14, -13, -15, -14, -14, -14, -12, -10, -8, -7, -9, -11, -13, -15, -14, -14, -13, -13, -15, -17, -19, -18, -18, -17, -17, -16, -16, -18, -20, -22, -21, -21, -21, -21, -21, -20, -21, -22, -24, -24, -22, -22, -24, -26, -25, -23, -21, -19, -18, -17, -17, -19, -21, -23, -25, -27, -29, -31, -30, -29, -28, -26, -25, -24, -24, -23, -23, -25, -24, -24, -24, -22, -20, -18, -18, -20, -20, -20, -20, -18, -16, -16, -16, -14, -12, -10, -8, -6, -4, -4, -4, -4, -4, -2, 0, 2, 4, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 4, 5, 6, 5, 3, 1, 1, 1, 1, 1, 1, 1, 0, -1, -1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, -1, -2, -3, -4, -4, -2, 0, 0, 0, 1, 3, 5, 7, 7, 5, 3, 3, 3, 3, 3 };
|
||||
for( int i = 0; i < 1024; i++ )
|
||||
{
|
||||
assertEquals( (byte) (decoded[i] ^ 0x80), buffer.get(), "Bad element at " + i );
|
||||
}
|
||||
|
||||
assertEquals( 0, buffer.remaining(), "Must have read all bytes" );
|
||||
}
|
||||
}
|
154
src/testMod/java/dan200/computercraft/export/Exporter.java
Normal file
@ -0,0 +1,154 @@
|
||||
/*
|
||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
||||
* Send enquiries to dratcliffe@gmail.com
|
||||
*/
|
||||
package dan200.computercraft.export;
|
||||
|
||||
import com.google.common.io.MoreFiles;
|
||||
import com.google.common.io.RecursiveDeleteOption;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.ingame.mod.TestMod;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.core.NonNullList;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.crafting.*;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.client.event.ClientChatEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Provides a {@literal /ccexport <path>} command which exports icons and recipes for all ComputerCraft items.
|
||||
*/
|
||||
@Mod.EventBusSubscriber( modid = TestMod.MOD_ID, value = Dist.CLIENT )
|
||||
public class Exporter
|
||||
{
|
||||
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onClientCommands( ClientChatEvent event )
|
||||
{
|
||||
String prefix = "/ccexport";
|
||||
if( !event.getMessage().startsWith( prefix ) ) return;
|
||||
event.setCanceled( true );
|
||||
|
||||
Path output = new File( event.getMessage().substring( prefix.length() ).trim() ).getAbsoluteFile().toPath();
|
||||
if( !Files.isDirectory( output ) )
|
||||
{
|
||||
Minecraft.getInstance().gui.getChat().addMessage( Component.literal( "Output path does not exist" ) );
|
||||
return;
|
||||
}
|
||||
|
||||
RenderSystem.assertOnRenderThread();
|
||||
try( ImageRenderer renderer = new ImageRenderer() )
|
||||
{
|
||||
export( output, renderer );
|
||||
}
|
||||
catch( IOException e )
|
||||
{
|
||||
throw new UncheckedIOException( e );
|
||||
}
|
||||
|
||||
Minecraft.getInstance().gui.getChat().addMessage( Component.literal( "Export finished!" ) );
|
||||
}
|
||||
|
||||
private static void export( Path root, ImageRenderer renderer ) throws IOException
|
||||
{
|
||||
JsonDump dump = new JsonDump();
|
||||
|
||||
Set<Item> items = new HashSet<>();
|
||||
|
||||
// First find all CC items
|
||||
for( Item item : ForgeRegistries.ITEMS )
|
||||
{
|
||||
if( ForgeRegistries.ITEMS.getKey( item ).getNamespace().equals( ComputerCraft.MOD_ID ) ) items.add( item );
|
||||
}
|
||||
|
||||
// Now find all CC recipes.
|
||||
for( CraftingRecipe recipe : Minecraft.getInstance().level.getRecipeManager().getAllRecipesFor( RecipeType.CRAFTING ) )
|
||||
{
|
||||
ItemStack result = recipe.getResultItem();
|
||||
if( !ForgeRegistries.ITEMS.getKey( result.getItem() ).getNamespace().equals( ComputerCraft.MOD_ID ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if( result.hasTag() )
|
||||
{
|
||||
ComputerCraft.log.warn( "Skipping recipe {} as it has NBT", recipe.getId() );
|
||||
continue;
|
||||
}
|
||||
|
||||
if( recipe instanceof ShapedRecipe shaped )
|
||||
{
|
||||
JsonDump.Recipe converted = new JsonDump.Recipe( result );
|
||||
|
||||
for( int x = 0; x < shaped.getWidth(); x++ )
|
||||
{
|
||||
for( int y = 0; y < shaped.getHeight(); y++ )
|
||||
{
|
||||
Ingredient ingredient = shaped.getIngredients().get( x + y * shaped.getWidth() );
|
||||
if( ingredient.isEmpty() ) continue;
|
||||
|
||||
converted.setInput( x + y * 3, ingredient, items );
|
||||
}
|
||||
}
|
||||
|
||||
dump.recipes.put( recipe.getId().toString(), converted );
|
||||
}
|
||||
else if( recipe instanceof ShapelessRecipe shapeless )
|
||||
{
|
||||
JsonDump.Recipe converted = new JsonDump.Recipe( result );
|
||||
|
||||
NonNullList<Ingredient> ingredients = shapeless.getIngredients();
|
||||
for( int i = 0; i < ingredients.size(); i++ )
|
||||
{
|
||||
converted.setInput( i, ingredients.get( i ), items );
|
||||
}
|
||||
|
||||
dump.recipes.put( recipe.getId().toString(), converted );
|
||||
}
|
||||
else
|
||||
{
|
||||
ComputerCraft.log.info( "Don't know how to handle recipe {}", recipe );
|
||||
}
|
||||
}
|
||||
|
||||
Path itemDir = root.resolve( "items" );
|
||||
if( Files.exists( itemDir ) ) MoreFiles.deleteRecursively( itemDir, RecursiveDeleteOption.ALLOW_INSECURE );
|
||||
|
||||
renderer.setupState();
|
||||
for( Item item : items )
|
||||
{
|
||||
ItemStack stack = new ItemStack( item );
|
||||
ResourceLocation location = ForgeRegistries.ITEMS.getKey( item );
|
||||
|
||||
dump.itemNames.put( location.toString(), stack.getHoverName().getString() );
|
||||
renderer.captureRender( itemDir.resolve( location.getNamespace() ).resolve( location.getPath() + ".png" ),
|
||||
() -> Minecraft.getInstance().getItemRenderer().renderAndDecorateFakeItem( stack, 0, 0 )
|
||||
);
|
||||
}
|
||||
renderer.clearState();
|
||||
|
||||
try( Writer writer = Files.newBufferedWriter( root.resolve( "index.json" ) ) )
|
||||
{
|
||||
GSON.toJson( dump, writer );
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
||||
* Send enquiries to dratcliffe@gmail.com
|
||||
*/
|
||||
package dan200.computercraft.export;
|
||||
|
||||
import com.mojang.blaze3d.pipeline.TextureTarget;
|
||||
import com.mojang.blaze3d.platform.NativeImage;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.math.Matrix4f;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.FogRenderer;
|
||||
import org.lwjgl.opengl.GL12;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* Utilities for saving OpenGL output to an image rather than displaying it on the screen.
|
||||
*/
|
||||
public class ImageRenderer implements AutoCloseable
|
||||
{
|
||||
public static final int WIDTH = 64;
|
||||
public static final int HEIGHT = 64;
|
||||
|
||||
private final TextureTarget framebuffer = new TextureTarget( WIDTH, HEIGHT, true, Minecraft.ON_OSX );
|
||||
private final NativeImage image = new NativeImage( WIDTH, HEIGHT, Minecraft.ON_OSX );
|
||||
|
||||
private Matrix4f projectionMatrix;
|
||||
|
||||
public ImageRenderer()
|
||||
{
|
||||
framebuffer.setClearColor( 0, 0, 0, 0 );
|
||||
framebuffer.clear( Minecraft.ON_OSX );
|
||||
}
|
||||
|
||||
public void setupState()
|
||||
{
|
||||
projectionMatrix = RenderSystem.getProjectionMatrix();
|
||||
RenderSystem.setProjectionMatrix( Matrix4f.orthographic( 0, 16, 0, 16, 1000, 3000 ) );
|
||||
|
||||
var transform = RenderSystem.getModelViewStack();
|
||||
transform.setIdentity();
|
||||
transform.translate( 0.0f, 0.0f, -2000.0f );
|
||||
|
||||
FogRenderer.setupNoFog();
|
||||
}
|
||||
|
||||
public void clearState()
|
||||
{
|
||||
RenderSystem.setProjectionMatrix( projectionMatrix );
|
||||
RenderSystem.getModelViewStack().popPose();
|
||||
}
|
||||
|
||||
public void captureRender( Path output, Runnable render ) throws IOException
|
||||
{
|
||||
Files.createDirectories( output.getParent() );
|
||||
|
||||
framebuffer.bindWrite( true );
|
||||
RenderSystem.clear( GL12.GL_COLOR_BUFFER_BIT | GL12.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX );
|
||||
render.run();
|
||||
framebuffer.unbindWrite();
|
||||
|
||||
framebuffer.bindRead();
|
||||
image.downloadTexture( 0, false );
|
||||
image.flipY();
|
||||
framebuffer.unbindRead();
|
||||
|
||||
image.writeToFile( output );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close()
|
||||
{
|
||||
image.close();
|
||||
framebuffer.destroyBuffers();
|
||||
}
|
||||
}
|
66
src/testMod/java/dan200/computercraft/export/JsonDump.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
|
||||
* Send enquiries to dratcliffe@gmail.com
|
||||
*/
|
||||
package dan200.computercraft.export;
|
||||
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.item.crafting.Ingredient;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class JsonDump
|
||||
{
|
||||
public Map<String, String> itemNames = new TreeMap<>();
|
||||
public Map<String, Recipe> recipes = new TreeMap<>();
|
||||
|
||||
public static class Recipe
|
||||
{
|
||||
public final String[][] inputs = new String[9][];
|
||||
public String output;
|
||||
public int count;
|
||||
|
||||
public Recipe( ItemStack output )
|
||||
{
|
||||
this.output = ForgeRegistries.ITEMS.getKey( output.getItem() ).toString();
|
||||
count = output.getCount();
|
||||
}
|
||||
|
||||
public void setInput( int pos, Ingredient ingredient, Set<Item> trackedItems )
|
||||
{
|
||||
if( ingredient.isEmpty() ) return;
|
||||
|
||||
ItemStack[] items = ingredient.getItems();
|
||||
|
||||
// First try to simplify some tags to something easier.
|
||||
for( ItemStack stack : items )
|
||||
{
|
||||
Item item = stack.getItem();
|
||||
if( !canonicalItem.contains( item ) ) continue;
|
||||
|
||||
trackedItems.add( item );
|
||||
inputs[pos] = new String[] { ForgeRegistries.ITEMS.getKey( item ).toString() };
|
||||
return;
|
||||
}
|
||||
|
||||
String[] itemIds = new String[items.length];
|
||||
for( int i = 0; i < items.length; i++ )
|
||||
{
|
||||
Item item = items[i].getItem();
|
||||
trackedItems.add( item );
|
||||
itemIds[i] = ForgeRegistries.ITEMS.getKey( item ).toString();
|
||||
}
|
||||
Arrays.sort( itemIds );
|
||||
|
||||
inputs[pos] = itemIds;
|
||||
}
|
||||
|
||||
private static final Set<Item> canonicalItem = new HashSet<>( Arrays.asList(
|
||||
Items.GLASS_PANE, Items.STONE, Items.CHEST
|
||||
) );
|
||||
}
|
||||
}
|
46
src/web/components/Recipe.tsx
Normal file
@ -0,0 +1,46 @@
|
||||
import type { FunctionComponent } from "react";
|
||||
import { createElement as h } from "react";
|
||||
import useExport from "./WithExport.js";
|
||||
|
||||
const Item: FunctionComponent<{ item: string }> = ({ item }) => {
|
||||
const data = useExport();
|
||||
const itemName = data.itemNames[item];
|
||||
|
||||
return <img
|
||||
src={`/images/items/${item.replace(":", "/")}.png`}
|
||||
alt={itemName}
|
||||
title={itemName}
|
||||
className="recipe-icon"
|
||||
/>
|
||||
};
|
||||
|
||||
const EmptyItem: FunctionComponent = () => <span className="recipe-icon " />;
|
||||
|
||||
const Arrow: FunctionComponent<JSX.IntrinsicElements["svg"]> = (props) => <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45.513 45.512" {...props}>
|
||||
<g>
|
||||
<path d="M44.275,19.739L30.211,5.675c-0.909-0.909-2.275-1.18-3.463-0.687c-1.188,0.493-1.959,1.654-1.956,2.938l0.015,5.903
|
||||
l-21.64,0.054C1.414,13.887-0.004,15.312,0,17.065l0.028,11.522c0.002,0.842,0.338,1.648,0.935,2.242s1.405,0.927,2.247,0.925
|
||||
l21.64-0.054l0.014,5.899c0.004,1.286,0.781,2.442,1.971,2.931c1.189,0.487,2.557,0.21,3.46-0.703L44.29,25.694
|
||||
C45.926,24.043,45.92,21.381,44.275,19.739z" fill="var(--recipe-hover)" />
|
||||
</g>
|
||||
</svg>;
|
||||
|
||||
const Recipe: FunctionComponent<{ recipe: string }> = ({ recipe }) => {
|
||||
const data = useExport();
|
||||
const recipeInfo = data.recipes[recipe];
|
||||
if (!recipeInfo) throw Error("Cannot find recipe for " + recipe);
|
||||
|
||||
return <div className="recipe">
|
||||
<strong className="recipe-title">{data.itemNames[recipeInfo.output]}</strong>
|
||||
<div className="recipe-inputs">
|
||||
{recipeInfo.inputs.map((items, i) => <div className="recipe-item recipe-input" key={i}>{items ? <Item item={items[0]} /> : <EmptyItem />}</div>)}
|
||||
</div>
|
||||
<Arrow className="recipe-arrow" />
|
||||
<div className="recipe-item recipe-output">
|
||||
<Item item={recipeInfo.output} />
|
||||
{recipeInfo.count > 1 && <span className="recipe-count">{recipeInfo.count}</span>}
|
||||
</div>
|
||||
</div>
|
||||
};
|
||||
|
||||
export default Recipe;
|
23
src/web/components/WithExport.tsx
Normal file
@ -0,0 +1,23 @@
|
||||
import { createElement as h, useContext, createContext, FunctionComponent, ReactNode } from "react";
|
||||
|
||||
export type DataExport = {
|
||||
readonly itemNames: Record<string, string>,
|
||||
readonly recipes: Record<string, Recipe>,
|
||||
};
|
||||
|
||||
export type Recipe = {
|
||||
readonly inputs: Array<Array<string>>,
|
||||
readonly output: string,
|
||||
readonly count: number,
|
||||
};
|
||||
|
||||
const DataExport = createContext<DataExport>({
|
||||
itemNames: {},
|
||||
recipes: {},
|
||||
});
|
||||
|
||||
export const useExport = () => useContext(DataExport);
|
||||
export default useExport;
|
||||
|
||||
export const WithExport: FunctionComponent<{ data: DataExport, children: ReactNode }> =
|
||||
({ data, children }) => <DataExport.Provider value={data}> {children}</DataExport.Provider >;
|
25
src/web/components/support.tsx
Normal file
@ -0,0 +1,25 @@
|
||||
import type { FunctionComponent } from "react";
|
||||
|
||||
/**
|
||||
* Wrap a component and ensure that no children are passed to it.
|
||||
*
|
||||
* Our custom tags *must* be explicitly closed, as <foo /> will be parsed as
|
||||
* <foo>(rest of the document)</foo>. This ensures you've not forgotten to do
|
||||
* that.
|
||||
*
|
||||
* @param component The component to wrap
|
||||
* @returns A new functional component identical to the previous one
|
||||
*/
|
||||
export const noChildren = function <T>(component: FunctionComponent<T>): FunctionComponent<T> {
|
||||
// I hope that our few remaining friends
|
||||
// Give up on trying to save us
|
||||
|
||||
const name = component.displayName ?? component.name;
|
||||
const wrapped: FunctionComponent<T> = props => {
|
||||
if ((props as any).children) throw Error("Unexpected children in " + name);
|
||||
|
||||
return component(props);
|
||||
};
|
||||
wrapped.displayName = name;
|
||||
return wrapped;
|
||||
}
|
@ -9,8 +9,6 @@ import exampleNft from "./mount/example.nft";
|
||||
import exampleAudioLicense from "./mount/example.dfpwm.LICENSE";
|
||||
import exampleAudioUrl from "./mount/example.dfpwm";
|
||||
|
||||
import "./prism.js";
|
||||
|
||||
const defaultFiles: { [filename: string]: string } = {
|
||||
".settings": settingsFile,
|
||||
"startup.lua": startupFile,
|
||||
|
@ -12,7 +12,8 @@ table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table td, table th {
|
||||
table td,
|
||||
table th {
|
||||
border: 1px solid #cccccc;
|
||||
padding: 2px 4px;
|
||||
}
|
||||
@ -38,7 +39,7 @@ pre.highlight {
|
||||
position: fixed;
|
||||
z-index: 200;
|
||||
top: 0px;
|
||||
top: 0px;;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
/* Behold, the most cursed CSS! copy-cat's resizing algorithm is a weird, in
|
||||
@ -78,7 +79,9 @@ pre.highlight {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.titlebar-close:hover { background: #cc4c4c; }
|
||||
.titlebar-close:hover {
|
||||
background: #cc4c4c;
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.computer-container {
|
||||
@ -86,6 +89,89 @@ pre.highlight {
|
||||
height: calc(179px + 40px);
|
||||
}
|
||||
|
||||
.titlebar { height: 20px; }
|
||||
.titlebar-close { font-size: 7px; }
|
||||
.titlebar {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.titlebar-close {
|
||||
font-size: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
:root {
|
||||
--recipe-bg: #ddd;
|
||||
--recipe-fg: #bbb;
|
||||
--recipe-hover: #aaa;
|
||||
|
||||
--recipe-padding: 4px;
|
||||
--recipe-size: 32px;
|
||||
}
|
||||
|
||||
.recipe-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 1em 0;
|
||||
gap: 1em;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.recipe {
|
||||
display: inline-grid;
|
||||
padding: var(--recipe-padding);
|
||||
|
||||
background: var(--recipe-bg);
|
||||
column-gap: var(--recipe-padding);
|
||||
row-gap: var(--recipe-padding);
|
||||
grid-template-rows: auto auto;
|
||||
grid-template-columns: max-content 1fr max-content;
|
||||
}
|
||||
|
||||
.recipe-title {
|
||||
color: #222; /* Same as --foreground in light theme. Ugly, but too lazy to style in dark for now. */
|
||||
grid-column-start: span 3;
|
||||
}
|
||||
|
||||
.recipe-inputs {
|
||||
display: inline-grid;
|
||||
column-gap: var(--recipe-padding);
|
||||
row-gap: var(--recipe-padding);
|
||||
align-items: center;
|
||||
grid-template-rows: 1fr 1fr 1fr;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.recipe-item {
|
||||
padding: var(--recipe-padding);
|
||||
background-color: var(--recipe-fg);
|
||||
}
|
||||
|
||||
.recipe-item:hover {
|
||||
background-color: var(--recipe-hover);
|
||||
}
|
||||
|
||||
.recipe-icon {
|
||||
display: block;
|
||||
width: var(--recipe-size);
|
||||
height: var(--recipe-size);
|
||||
max-width: 10vw;
|
||||
max-height: 10vw;
|
||||
}
|
||||
|
||||
.recipe-arrow {
|
||||
width: var(--recipe-size);
|
||||
max-width: 10vw;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.recipe-output {
|
||||
align-self: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.recipe-count {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: var(--recipe-padding);
|
||||
color: #fff;
|
||||
text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000
|
||||
}
|
||||
|
53
src/web/transform.tsx
Normal file
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Find all HTML files generated by illuaminate and pipe them through a remark.
|
||||
*
|
||||
* This performs compile-time syntax highlighting and expands our custom
|
||||
* components using React SSR.
|
||||
*
|
||||
* Yes, this would be so much nicer with next.js.
|
||||
*/
|
||||
import * as fs from "fs/promises";
|
||||
import globModule from "glob";
|
||||
import * as path from "path";
|
||||
import { createElement, createElement as h, Fragment } from 'react';
|
||||
import { renderToStaticMarkup } from "react-dom/server";
|
||||
import rehypeHighlight from "rehype-highlight";
|
||||
import rehypeParse from 'rehype-parse';
|
||||
import rehypeReact from 'rehype-react';
|
||||
import { unified } from 'unified';
|
||||
import { promisify } from "util";
|
||||
// Our components
|
||||
import Recipe from "./components/Recipe.js";
|
||||
import { noChildren } from "./components/support.js";
|
||||
import { DataExport, WithExport } from "./components/WithExport.js";
|
||||
|
||||
const glob = promisify(globModule);
|
||||
|
||||
(async () => {
|
||||
const base = "build/docs/lua";
|
||||
|
||||
const processor = unified()
|
||||
.use(rehypeParse, { emitParseErrors: true })
|
||||
.use(rehypeHighlight, { prefix: "" })
|
||||
.use(rehypeReact, {
|
||||
createElement,
|
||||
Fragment,
|
||||
passNode: false,
|
||||
components: {
|
||||
['mc-recipe']: noChildren(Recipe),
|
||||
['mcrecipe']: noChildren(Recipe),
|
||||
} as any
|
||||
});
|
||||
|
||||
const dataExport = JSON.parse(await fs.readFile("src/generated/export/index.json", "utf-8")) as DataExport;
|
||||
|
||||
for (const file of await glob(base + "/**/*.html")) {
|
||||
const contents = await fs.readFile(file, "utf-8");
|
||||
|
||||
const { result } = await processor.process(contents);
|
||||
|
||||
const outputPath = path.resolve("build/docs/site", path.relative(base, file));
|
||||
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
||||
await fs.writeFile(outputPath, "<!doctype HTML>" + renderToStaticMarkup(<WithExport data={dataExport}>{result}</WithExport>));
|
||||
}
|
||||
})();
|
@ -22,6 +22,9 @@
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"importsNotUsedAsValues": "error",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
|
||||
// Needed for some of our internal stuff.
|
||||
"allowSyntheticDefaultImports": true,
|
||||
},
|
||||
"include": [
|
||||
"src/web",
|
||||
|