mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-01 06:03:00 +00:00 
			
		
		
		
	Compare commits
	
		
			376 Commits
		
	
	
		
			v1.15.2-1.
			...
			v1.18-1.99
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 23c17075be | ||
|   | 87988a705b | ||
|   | 179da1d8cf | ||
|   | 92fd93c0e0 | ||
|   | 3929dba4a5 | ||
|   | af966179ce | ||
|   | 5927e9bb10 | ||
|   | 53811f8169 | ||
|   | 298f339376 | ||
|   | 2418cfb87b | ||
|   | 9d44f1ca66 | ||
|   | 306e06a79a | ||
|   | 4f11549112 | ||
|   | 7f3490591d | ||
|   | 095101831c | ||
|   | 7b7527ec80 | ||
|   | 8ffd45c66e | ||
|   | e247bd823e | ||
|   | 276956eed8 | ||
|   | a4c5ecf8df | ||
|   | 99de00e16e | ||
|   | 600227e481 | ||
|   | 18d66bd727 | ||
|   | d3563a3854 | ||
|   | c2dc8bf675 | ||
|   | 603119e1e6 | ||
|   | d9b3f17b52 | ||
|   | 993bccc51f | ||
|   | 96d3b27064 | ||
|   | f33f57ea35 | ||
|   | 070479d901 | ||
|   | 2fe40f669d | ||
|   | 1b39c9f470 | ||
|   | 814d5cbcd1 | ||
|   | 4d8862c78e | ||
|   | 6cc2f035db | ||
|   | cf3f1d3d48 | ||
|   | bca964629a | ||
|   | ea7a218f4a | ||
|   | 544bcaa599 | ||
|   | ab6b861cd6 | ||
|   | 72e8fc03d3 | ||
|   | 0e94355a85 | ||
|   | 482ae0d22e | ||
|   | 6dd33f7099 | ||
|   | 045472577a | ||
|   | 9f539dbd59 | ||
|   | ca367e7cc7 | ||
|   | f6fd0ad172 | ||
|   | 0d35331b82 | ||
|   | 076b454c8f | ||
|   | 36e0dcbad0 | ||
|   | 0b5fe990e5 | ||
|   | 29ece2a6e3 | ||
|   | eba26dedab | ||
|   | 13779d6ad3 | ||
|   | d700f1f500 | ||
|   | 06bf84f151 | ||
|   | 8ba20985d7 | ||
|   | 7bb7b5e638 | ||
|   | 297426419b | ||
|   | eb61c5c5d7 | ||
|   | cf2bc667c1 | ||
|   | c8449086ee | ||
|   | 662bead8be | ||
|   | acaa61a720 | ||
|   | 5facbca2b3 | ||
|   | 6c6b2c2ff3 | ||
|   | 3eb601e554 | ||
|   | d0e79f310e | ||
|   | 0d6528aaf0 | ||
|   | 647902c019 | ||
|   | 2aa70b49c1 | ||
|   | b17ab16e05 | ||
|   | b447b0e308 | ||
|   | 94ad106272 | ||
|   | dc9edf26ec | ||
|   | 048c7bda23 | ||
|   | c9397460a4 | ||
|   | b2273c9b29 | ||
|   | 9e82209aab | ||
|   | 340ade170f | ||
|   | 7cac8401e8 | ||
|   | 0f899357c2 | ||
|   | 3396fe2871 | ||
|   | bbf3e48763 | ||
|   | 92fe1d4bc2 | ||
|   | 9fbcbae5b3 | ||
|   | 36a779dc18 | ||
|   | cd8b8bbc74 | ||
|   | d8319bb35c | ||
|   | afd6adbffa | ||
|   | 4d591c600c | ||
|   | 0a8e427c61 | ||
|   | d3a5d1e314 | ||
|   | 56010382fb | ||
|   | 0ff6b0ca70 | ||
|   | 4b33306940 | ||
|   | 4dea3dff36 | ||
|   | 3e8c741170 | ||
|   | 62baa72457 | ||
|   | 5eb711da87 | ||
|   | 79c5df1d92 | ||
|   | 991ea6e829 | ||
|   | 1d160641a4 | ||
|   | c2b3d914f7 | ||
|   | 0a537eaeee | ||
|   | 143b2bdbcd | ||
|   | 8cb21ed4d1 | ||
|   | 8aa7695fdd | ||
|   | fa78818069 | ||
|   | aa857c1be3 | ||
|   | e4ced551eb | ||
|   | 6eec9ba1a3 | ||
|   | 62172c6049 | ||
|   | 39f3cf8cbe | ||
|   | 5082947331 | ||
|   | a8f675c59d | ||
|   | bb1ebaee4f | ||
|   | bb1183d274 | ||
|   | 01ddb2b4e4 | ||
|   | bdd38fb061 | ||
|   | 06f35e4997 | ||
|   | 2d95c32892 | ||
|   | 6f4d4540b2 | ||
|   | 96316cddaa | ||
|   | e84ddef877 | ||
|   | 11b40bb6d5 | ||
|   | 686c6a4c44 | ||
|   | a1821035d3 | ||
|   | 7b8650bbc8 | ||
|   | 0285260e97 | ||
|   | 10a3a223a0 | ||
|   | 2dc970a8bb | ||
|   | f74c4cc83c | ||
|   | 7012ac7163 | ||
|   | 227b444d81 | ||
|   | d50db8a6f3 | ||
|   | 3a80b51a9f | ||
|   | 03396cf07a | ||
|   | 5b57f7509d | ||
|   | 0568c86628 | ||
|   | b31e66686d | ||
|   | 924b8ef30f | ||
|   | 7bcc16bb40 | ||
|   | 31e6746bdf | ||
|   | c39bf3eb4d | ||
|   | 8b952e7e1e | ||
|   | 04e97f7b86 | ||
|   | 74752c561c | ||
|   | ee96458b56 | ||
|   | 333410e4cd | ||
|   | 999a39a3e6 | ||
|   | 82ca19c296 | ||
|   | 56d8a5d585 | ||
|   | aa5fbb2980 | ||
|   | db0bb071f5 | ||
|   | ab702e2ba1 | ||
|   | d4efacd40a | ||
|   | 347affcc5c | ||
|   | 8ebe34b8da | ||
|   | 7086cb8a02 | ||
|   | 8dbc930c2f | ||
|   | 61eb67849d | ||
|   | c2316ef256 | ||
|   | 0d22270f8b | ||
|   | abb9c14256 | ||
|   | 815e534dc6 | ||
|   | 51dde077fe | ||
|   | 31d0b7afcd | ||
|   | 95b0d950aa | ||
|   | efa2be2821 | ||
|   | 670db97fc7 | ||
|   | 1650b72edb | ||
|   | a5bca3f0df | ||
|   | 88f41314c7 | ||
|   | 5ef8d52c13 | ||
|   | 0b65d56ab0 | ||
|   | a256b70685 | ||
|   | f16d1499fe | ||
|   | 79ca851e4f | ||
|   | d5c54d64a6 | ||
|   | 5cfdd2339f | ||
|   | 3ab3213290 | ||
|   | 46c9840d00 | ||
|   | b3f2f14e96 | ||
|   | 3ace49d27f | ||
|   | 9bd662d8dc | ||
|   | df7a40354e | ||
|   | c489d4bc4f | ||
|   | 2b029bd506 | ||
|   | 2227845658 | ||
|   | 2d3e88ef59 | ||
|   | 0bfe960cbd | ||
|   | a735f23e1f | ||
|   | de6f27ceaf | ||
|   | 2fab1a3054 | ||
|   | d4745ae47e | ||
|   | dc21e2dbc9 | ||
|   | 75dfa71275 | ||
|   | d71bf225cc | ||
|   | 8644c4ebf6 | ||
|   | b323db30ee | ||
|   | 53efd6b303 | ||
|   | 97faa1b3bc | ||
|   | 7404133d40 | ||
|   | e18e24407e | ||
|   | 026afa7f73 | ||
|   | 29cc5bb86b | ||
|   | aa9d3c8269 | ||
|   | f8074636bc | ||
|   | db2cde4a4c | ||
|   | 5eec7d9172 | ||
|   | 8b9735d72e | ||
|   | 1866916cb8 | ||
|   | f38a6a9d43 | ||
|   | 0f6db63020 | ||
|   | 51fcd83b87 | ||
|   | c2190e1318 | ||
|   | c40a13558c | ||
|   | 02695aea51 | ||
|   | d5be1aca0e | ||
|   | 8ff8b78ed8 | ||
|   | 7fc55aa9a0 | ||
|   | 38335ca187 | ||
|   | e0e194099c | ||
|   | 8063059764 | ||
|   | f96d923b2a | ||
|   | 9142ccfc93 | ||
|   | 9f7cc00fcb | ||
|   | b129ae627b | ||
|   | f9fb0619fa | ||
|   | 7f9b86a78e | ||
|   | 58ea7a275e | ||
|   | 8487a13764 | ||
|   | f0ba1108d5 | ||
|   | 5d0daf9b2d | ||
|   | 8b8692ba53 | ||
|   | 1f385f5b35 | ||
|   | 34baa09b6c | ||
|   | b21866fbff | ||
|   | e0a288bcb9 | ||
|   | 4592534a18 | ||
|   | 28165bfcd6 | ||
|   | 953b94fd08 | ||
|   | e10e30f82b | ||
|   | aeb1fa0e7e | ||
|   | 349a7543b0 | ||
|   | 3d589eda4a | ||
|   | de646b66b6 | ||
|   | 4f0d311df7 | ||
|   | d6e3c9a7fa | ||
|   | a7a724f134 | ||
|   | b0e30fdce1 | ||
|   | 4e15afa254 | ||
|   | 84bac06178 | ||
|   | 1fecb995c9 | ||
|   | 99b719299c | ||
|   | fb9590467d | ||
|   | bc8e090873 | ||
|   | cf0f67265f | ||
|   | 53dd15a213 | ||
|   | eb2d617ed8 | ||
|   | 74dae4ec17 | ||
|   | abbc46877b | ||
|   | 3cb25b3525 | ||
|   | f387730b88 | ||
|   | 92b45b1868 | ||
|   | 003c7ec2e8 | ||
|   | c45221a2d0 | ||
|   | 8494ba8ce2 | ||
|   | 058d63e77f | ||
|   | 17b5bca443 | ||
|   | c3f5700494 | ||
|   | b17ff6daf0 | ||
|   | e8f5531a8c | ||
|   | 51d3b091da | ||
|   | 9708dd6786 | ||
|   | e48427dbbc | ||
|   | 669b6d2d56 | ||
|   | 32d956bbe7 | ||
|   | 3a147c78a8 | ||
|   | 8c56b6a7be | ||
|   | 66e42e0817 | ||
|   | 0ee3d10fda | ||
|   | ed0afc4068 | ||
|   | 1f70ed6985 | ||
|   | 8f3ea60c74 | ||
|   | eb722a74cd | ||
|   | 1825f67eee | ||
|   | 975a994581 | ||
|   | 061514549d | ||
|   | 5e52429c23 | ||
|   | 396cf15a1f | ||
|   | 7514cf7320 | ||
|   | 1316d6a3c9 | ||
|   | e1cbbe3628 | ||
|   | 6d367e08a3 | ||
|   | eaa7359c8c | ||
|   | 657ceda3af | ||
|   | a934e42219 | ||
|   | 1544749282 | ||
|   | 763bab80fa | ||
|   | 417fda3019 | ||
|   | 444830cf2d | ||
|   | 23bf33c454 | ||
|   | 0be030c497 | ||
|   | ee27d8f081 | ||
|   | a3a9684505 | ||
|   | 1381325813 | ||
|   | 52b112fae6 | ||
|   | c83eeb16a8 | ||
|   | 9d1ee6f61d | ||
|   | b90611b4b4 | ||
|   | e1e7ef59c6 | ||
|   | 9ae0f4a993 | ||
|   | fd262a7995 | ||
|   | 58054ad2d1 | ||
|   | 1255bd00fd | ||
|   | 1f84480a80 | ||
|   | b838efedd2 | ||
|   | f78e24f9a0 | ||
|   | 88f5b20353 | ||
|   | 331031be45 | ||
|   | c5694ea966 | ||
|   | 34b5ede326 | ||
|   | 7b476cb24b | ||
|   | 7ca261d763 | ||
|   | c864576619 | ||
|   | 247c05305d | ||
|   | 2232f025b8 | ||
|   | b2e5401486 | ||
|   | 41226371f3 | ||
|   | 1edb7288b9 | ||
|   | cc5e972cfc | ||
|   | 92be0126df | ||
|   | dd6f97622e | ||
|   | 2c9f51db89 | ||
|   | 72340defe4 | ||
|   | 542b66c79a | ||
|   | e4b0a5b3ce | ||
|   | f7e3e72a6e | ||
|   | 8b17ec76a8 | ||
|   | b8d5a89446 | ||
|   | 4af5bcc0b0 | ||
|   | 96c577482d | ||
|   | 61f8e97f6b | ||
|   | c92f06cfd9 | ||
|   | c9f3d315c0 | ||
|   | 83df64e520 | ||
|   | ab232bd689 | ||
|   | 5bf367af9f | ||
|   | 4766833cf2 | ||
|   | 71563a52ff | ||
|   | 0c6e7b5db5 | ||
|   | 72c1d451fe | ||
|   | 8b4a01df27 | ||
|   | d0a973fa46 | ||
|   | 26c12ac1a9 | ||
|   | 2c67849b35 | ||
|   | 7809a2eddd | ||
|   | e8e9294fdf | ||
|   | 99581e1f40 | ||
|   | 29646a7f61 | ||
|   | 50d2712581 | ||
|   | 3093f882d8 | ||
|   | e5cf0d1c61 | ||
|   | 6b102a8142 | ||
|   | c8a6888a2f | ||
|   | 9ce33f8a3f | ||
|   | a1dcd59d95 | ||
|   | 2a17585702 | ||
|   | 087c305b0d | ||
|   | 31764f6d65 | ||
|   | 4efde2b294 | ||
|   | 46595e73df | 
| @@ -16,6 +16,3 @@ indent_size = 2 | ||||
|  | ||||
| [*.yml] | ||||
| indent_size = 2 | ||||
|  | ||||
| [*.properties] | ||||
| insert_final_newline = false | ||||
|   | ||||
							
								
								
									
										13
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,15 @@ | ||||
| # Ignore changes in generated files | ||||
| src/generated/resources/data/** linguist-generated | ||||
| src/testMod/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 | ||||
|   | ||||
							
								
								
									
										16
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @@ -1,16 +0,0 @@ | ||||
| --- | ||||
| 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 | ||||
|  - 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. | ||||
							
								
								
									
										34
									
								
								.github/ISSUE_TEMPLATE/bug_report.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								.github/ISSUE_TEMPLATE/bug_report.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| 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 | ||||
|       - 1.17.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. | ||||
							
								
								
									
										8
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| blank_issues_enabled: false | ||||
| contact_links: | ||||
| - name: ComputerCraft Discord | ||||
|   url: https://discord.computercraft.cc | ||||
|   about: Get help on the ComputerCraft Discord. | ||||
| - name: GitHub Discussions | ||||
|   url: https://github.com/cc-tweaked/CC-Tweaked/discussions | ||||
|   about: Or ask questions on GitHub Discussions. | ||||
							
								
								
									
										4
									
								
								.github/ISSUE_TEMPLATE/something_else.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.github/ISSUE_TEMPLATE/something_else.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| --- | ||||
| name: Something else | ||||
| about: An issue about something else. | ||||
| --- | ||||
							
								
								
									
										17
									
								
								.github/matchers/checkstyle.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.github/matchers/checkstyle.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| { | ||||
|     "problemMatcher": [ | ||||
|         { | ||||
|             "owner": "checkstyle", | ||||
|             "pattern": [ | ||||
|                 { | ||||
|                     "regexp": "^([a-z]+) ([\\w./-]+):(\\d+):(\\d+): (.*)$", | ||||
|                     "severity": 1, | ||||
|                     "file": 2, | ||||
|                     "line": 3, | ||||
|                     "column": 4, | ||||
|                     "message": 5 | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										18
									
								
								.github/matchers/illuaminate.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.github/matchers/illuaminate.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|     "problemMatcher": [ | ||||
|         { | ||||
|             "owner": "illuaminate", | ||||
|             "severity": "warning", | ||||
|             "pattern": [ | ||||
|                 { | ||||
|                     "regexp": "^([\\w./-]+):\\[(\\d+):(\\d+)\\-(?:\\d+):(?:\\d+)\\]: (.*) \\[([a-z:-]+)\\]$", | ||||
|                     "file": 1, | ||||
|                     "line": 2, | ||||
|                     "column": 3, | ||||
|                     "message": 4, | ||||
|                     "code": 5 | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										15
									
								
								.github/matchers/junit.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.github/matchers/junit.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| { | ||||
|     "problemMatcher": [ | ||||
|         { | ||||
|             "owner": "junit", | ||||
|             "pattern": [ | ||||
|                 { | ||||
|                     "regexp": "^## ([\\w./-]+):(\\d+): (.*)$", | ||||
|                     "file": 1, | ||||
|                     "line": 2, | ||||
|                     "message": 3 | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										50
									
								
								.github/workflows/main-ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								.github/workflows/main-ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -16,35 +16,55 @@ jobs: | ||||
|         java-version: 8 | ||||
|  | ||||
|     - name: Cache gradle dependencies | ||||
|       uses: actions/cache@v1 | ||||
|       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 build --no-daemon || ./gradlew build --no-daemon | ||||
|       run: | | ||||
|         ./gradlew assemble || ./gradlew assemble | ||||
|         ./gradlew downloadAssets || ./gradlew downloadAssets | ||||
|         xvfb-run ./gradlew build | ||||
|  | ||||
|     - name: Upload Jar | ||||
|       uses: actions/upload-artifact@v1 | ||||
|       uses: actions/upload-artifact@v2 | ||||
|       with: | ||||
|         name: CC-Tweaked | ||||
|         path: build/libs | ||||
|  | ||||
|     - name: Upload Screnshots | ||||
|       uses: actions/upload-artifact@v2 | ||||
|       with: | ||||
|         name: Screenshots | ||||
|         path: test-files/client/screenshots | ||||
|         if-no-files-found: ignore | ||||
|         retention-days: 5 | ||||
|       if: failure() | ||||
|  | ||||
|     - name: Upload Coverage | ||||
|       run: bash <(curl -s https://codecov.io/bash) | ||||
|       continue-on-error: true | ||||
|       uses: codecov/codecov-action@v2 | ||||
|  | ||||
|     - name: Generate Java documentation stubs | ||||
|       run: ./gradlew luaJavadoc --no-daemon | ||||
|     - name: Parse test reports | ||||
|       run: ./tools/parse-reports.py | ||||
|       if: ${{ failure() }} | ||||
|  | ||||
|     - name: Lint Lua code | ||||
|     - 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: | | ||||
|         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 | ||||
|         bin/illuaminate lint | ||||
|  | ||||
|     - name: Check whitespace | ||||
|       run: python3 tools/check-lines.py | ||||
|         pip install pre-commit | ||||
|         pre-commit run --config config/pre-commit/config.yml --show-diff-on-failure --all --color=always | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/make-doc.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/make-doc.sh
									
									
									
									
										vendored
									
									
								
							| @@ -13,7 +13,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/" \ | ||||
|       "$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST" | ||||
|       "$SSH_USER@$SSH_HOST:/$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" | ||||
|       "$SSH_USER@$SSH_HOST:/$DEST/javadoc" | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/make-doc.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/make-doc.yml
									
									
									
									
										vendored
									
									
								
							| @@ -3,7 +3,7 @@ name: Build documentation | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|     - mc-1.15.x | ||||
|     - mc-1.16.x | ||||
|  | ||||
| jobs: | ||||
|   make_doc: | ||||
| @@ -11,7 +11,7 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|     - uses: actions/checkout@v1 | ||||
|     - uses: actions/checkout@v2 | ||||
|  | ||||
|     - name: Set up Java 8 | ||||
|       uses: actions/setup-java@v1 | ||||
| @@ -19,7 +19,7 @@ jobs: | ||||
|         java-version: 8 | ||||
|  | ||||
|     - name: Cache gradle dependencies | ||||
|       uses: actions/cache@v1 | ||||
|       uses: actions/cache@v2 | ||||
|       with: | ||||
|         path: ~/.gradle/caches | ||||
|         key: ${{ runner.os }}-gradle-${{ hashFiles('gradle.properties') }} | ||||
|   | ||||
							
								
								
									
										22
									
								
								.gitpod.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.gitpod.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| 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 | ||||
| @@ -8,18 +8,31 @@ 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`. | ||||
| 
 | ||||
|  - **Clone the repository:** `git clone https://github.com/SquidDev-CC/CC-Tweaked.git && cd CC-Tweaked` | ||||
|  - **Clone the repository:** `git clone https://github.com/cc-tweaked/CC-Tweaked.git && cd CC-Tweaked` | ||||
|  - **Setup Forge:** `./gradlew build` | ||||
|  - **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: [](https://gitpod.io/#https://github.com/cc-tweaked/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. | ||||
| @@ -27,15 +40,76 @@ 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. | ||||
|    how to download and run it. You may need to generate the Java documentation stubs (see "Documentation" below) for all | ||||
|    lints to pass. | ||||
| 
 | ||||
| ## 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! | ||||
| ### 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. | ||||
| 
 | ||||
| [new-issue]: https://github.com/SquidDev-CC/CC-Tweaked/issues/new/choose "Create a new issue" | ||||
| 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/testMod/java/dan200/computercraft/ingame/`): These tests are run on an actual Minecraft server and client, | ||||
|    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 testClient` and `./gradlew testServer`. You may want to run the client under `xvfb-run` | ||||
|    or similar when running in a headless environment. | ||||
| 
 | ||||
| ## 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"`. | ||||
| 
 | ||||
| [new-issue]: https://github.com/cc-tweaked/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-usage]: https://github.com/SquidDev/illuaminate/blob/master/README.md#usage | ||||
| [weblate]: https://i18n.tweaked.cc/projects/cc-tweaked/minecraft/ | ||||
| [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." | ||||
|   | ||||
							
								
								
									
										14
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -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. | ||||
|   | ||||
							
								
								
									
										55
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,40 +1,11 @@ | ||||
| #  | ||||
| [](https://github.com/SquidDev-CC/CC-Tweaked/actions "Current build status") [](https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked on CurseForge") | ||||
| [](https://github.com/cc-tweaked/CC-Tweaked/actions "Current build status") [][CurseForge] | ||||
| 
 | ||||
| CC: Tweaked is a fork of [ComputerCraft](https://github.com/dan200/ComputerCraft), adding programmable computers, | ||||
| turtles and more to Minecraft. | ||||
| CC: Tweaked is a mod for Minecraft which adds programmable computers, turtles and more to the game. A fork of the | ||||
| much-beloved [ComputerCraft], it continues its legacy with better performance, stability, and a wealth of new features. | ||||
| 
 | ||||
| ## What? | ||||
| ComputerCraft has always held a fond place in my heart: it's the mod which really got me into Minecraft, and it's the | ||||
| mod which has kept me playing it for many years. However, development of the original mod has slowed, as the original | ||||
| developers have had less time to work on the mod, and moved onto other projects and commitments. | ||||
| 
 | ||||
| CC: Tweaked (or CC:T for short) is an attempt to continue ComputerCraft's legacy. It's not intended to be a competitor | ||||
| to CC, nor do I want to take it in a vastly different direction to the original mod. Instead, CC:T focuses on making the | ||||
| ComputerCraft experience as _solid_ as possible, ironing out any wrinkles that may have developed over time. | ||||
| 
 | ||||
| ## Features | ||||
| CC: Tweaked contains all the features of the latest version of ComputerCraft, as well as numerous fixes, performance | ||||
| improvements and several nifty additions. I'd recommend checking out [the releases page](https://github.com/SquidDev-CC/CC-Tweaked/releases) | ||||
| to see the full set of changes, but here's a couple of the more interesting additions: | ||||
| 
 | ||||
|  - Improvements to the `http` library, including websockets, support for other HTTP methods (`PUT`, `DELETE`, etc...) | ||||
|    and configurable limits on HTTP usage. | ||||
|  - Full-block wired modems, allowing one to wrap non-solid peripherals (such as turtles, or chests if Plethora is | ||||
|    installed). | ||||
|  - Pocket computers can be held like maps, allowing you to view the screen without entering a GUI. | ||||
|  - Printed pages and books can be placed in item frames and held like maps. | ||||
|  - Several profiling and administration tools for server owners, via the `/computercraft` command. This allows operators | ||||
|    to track which computers are hogging resources, turn on and shutdown multiple computers at once and interact with | ||||
|    computers remotely. | ||||
|  - Closer emulation of standard Lua, adding the `debug` and `io` libraries. This also enables seeking within binary | ||||
|    files, meaning you don't need to read large files into memory. | ||||
|  - Allow running multiple computers on multiple threads, reducing latency on worlds with many computers. | ||||
| 
 | ||||
| ## Relation to CCTweaks? | ||||
| This mod has nothing to do with CCTweaks, though there is no denying the name is a throwback to it. That being said, | ||||
| several features have been included, such as full block modems, the Cobalt runtime and map-like rendering for pocket | ||||
| computers. | ||||
| CC: Tweaked can be installed from [CurseForge] or [Modrinth]. It requires the [Minecraft Forge][forge] mod loader, but | ||||
| [versions are available for Fabric][ccrestitched]. | ||||
| 
 | ||||
| ## Contributing | ||||
| Any contribution is welcome, be that using the mod, reporting bugs or contributing code. If you want to get started | ||||
| @@ -46,8 +17,7 @@ ComputerCraft we have a [forum](https://forums.computercraft.cc/) and [Discord g | ||||
| There's also a fairly populated, albeit quiet [IRC channel](http://webchat.esper.net/?channels=computercraft), if that's | ||||
| more your cup of tea. | ||||
| 
 | ||||
| I'd generally recommend you don't contact me directly (email, DM, etc...) unless absolutely necessary (i.e. in order to | ||||
| report exploits). You'll get a far quicker response if you ask the whole community! | ||||
| We also host fairly comprehensive documentation at [tweaked.cc](https://tweaked.cc/ "The CC: Tweaked website"). | ||||
| 
 | ||||
| ## 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) | ||||
| @@ -56,7 +26,12 @@ on is present. | ||||
| 
 | ||||
| ```groovy | ||||
| repositories { | ||||
|   maven { url 'https://squiddev.cc/maven/' } | ||||
|   maven { | ||||
|     url 'https://squiddev.cc/maven/' | ||||
|     content { | ||||
|       includeGroup 'org.squiddev' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
| @@ -70,3 +45,9 @@ 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/). | ||||
| 
 | ||||
| [computercraft]: https://github.com/dan200/ComputerCraft "ComputerCraft on GitHub" | ||||
| [curseforge]: https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked from CurseForge" | ||||
| [modrinth]: https://modrinth.com/mod/gu7yAYhd "Download CC: Tweaked from Modrinth" | ||||
| [forge]: https://files.minecraftforge.net/ "Download Minecraft Forge." | ||||
| [ccrestitched]: https://www.curseforge.com/minecraft/mc-mods/cc-restitched "Download CC: Restitched from CurseForge" | ||||
|   | ||||
							
								
								
									
										550
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										550
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -1,44 +1,69 @@ | ||||
| buildscript { | ||||
|     repositories { | ||||
|         jcenter() | ||||
|         mavenCentral() | ||||
|         maven { | ||||
|             name = "forge" | ||||
|             url = "https://files.minecraftforge.net/maven" | ||||
|         } | ||||
|         maven { url = "https://maven.minecraftforge.net" } | ||||
|         maven { url = 'https://maven.parchmentmc.org' } | ||||
|     } | ||||
|     dependencies { | ||||
|         classpath 'com.google.code.gson:gson:2.8.1' | ||||
|         classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.187' | ||||
|         classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2' | ||||
|         classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0' | ||||
|         classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+' | ||||
|         classpath 'org.parchmentmc:librarian:1.+' | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| plugins { | ||||
|     id "checkstyle" | ||||
|     id "jacoco" | ||||
|     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" | ||||
|     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.6.0" | ||||
|     id "com.modrinth.minotaur" version "1.2.1" | ||||
| } | ||||
| 
 | ||||
| apply plugin: 'net.minecraftforge.gradle' | ||||
| apply plugin: 'org.ajoberstar.grgit' | ||||
| apply plugin: 'maven-publish' | ||||
| apply plugin: 'maven' | ||||
| apply plugin: 'org.parchmentmc.librarian.forgegradle' | ||||
| 
 | ||||
| version = mod_version | ||||
| 
 | ||||
| group = "org.squiddev" | ||||
| archivesBaseName = "cc-tweaked-${mc_version}" | ||||
| 
 | ||||
| sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' | ||||
| def javaVersion = JavaLanguageVersion.of(17) | ||||
| java { | ||||
|     toolchain { | ||||
|         languageVersion = javaVersion | ||||
|     } | ||||
| 
 | ||||
|     withSourcesJar() | ||||
|     withJavadocJar() | ||||
| } | ||||
| 
 | ||||
| tasks.withType(JavaExec).configureEach { | ||||
|     javaLauncher = javaToolchains.launcherFor { | ||||
|         languageVersion = javaVersion | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| sourceSets { | ||||
|     main.java { | ||||
|         exclude 'dan200/computercraft/shared/integration/jei/**' | ||||
|         exclude 'dan200/computercraft/shared/integration/morered/**' | ||||
|     } | ||||
|     main.resources { | ||||
|         srcDir 'src/generated/resources' | ||||
|     } | ||||
| 
 | ||||
|     testMod {} | ||||
| } | ||||
| 
 | ||||
| minecraft { | ||||
|     runs { | ||||
|         client { | ||||
|             workingDirectory project.file('run') | ||||
|         all { | ||||
|             lazyToken('minecraft_classpath') { | ||||
|                 configurations.shade.copyRecursive().resolve().collect { it.absolutePath }.join(File.pathSeparator) | ||||
|             } | ||||
| 
 | ||||
|             property 'forge.logging.markers', 'REGISTRIES' | ||||
|             property 'forge.logging.console.level', 'debug' | ||||
| 
 | ||||
| @@ -49,43 +74,61 @@ minecraft { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         server { | ||||
|             workingDirectory project.file("run/server-${mc_version}") | ||||
|             property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' | ||||
|             property 'forge.logging.console.level', 'debug' | ||||
|         client { | ||||
|             workingDirectory project.file('run') | ||||
|         } | ||||
| 
 | ||||
|             mods { | ||||
|                 computercraft { | ||||
|                     source sourceSets.main | ||||
|                 } | ||||
|             } | ||||
|         server { | ||||
|             workingDirectory project.file("run/server") | ||||
|             arg "--nogui" | ||||
|         } | ||||
| 
 | ||||
|         data { | ||||
|             workingDirectory project.file('run') | ||||
|             property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' | ||||
|             property 'forge.logging.console.level', 'debug' | ||||
| 
 | ||||
|             args '--mod', 'computercraft', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') | ||||
|         } | ||||
| 
 | ||||
|         testClient { | ||||
|             workingDirectory project.file('test-files/client') | ||||
|             parent runs.client | ||||
| 
 | ||||
|             mods { | ||||
|                 computercraft { | ||||
|                     source sourceSets.main | ||||
|                 cctest { | ||||
|                     source sourceSets.testMod | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             lazyToken('minecraft_classpath') { | ||||
|                 (configurations.shade.copyRecursive().resolve() + configurations.testModExtra.copyRecursive().resolve()) | ||||
|                     .collect { it.absolutePath } | ||||
|                     .join(File.pathSeparator) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         testServer { | ||||
|             workingDirectory project.file('test-files/server') | ||||
|             parent runs.server | ||||
| 
 | ||||
|             mods { | ||||
|                 cctest { | ||||
|                     source sourceSets.testMod | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             lazyToken('minecraft_classpath') { | ||||
|                 (configurations.shade.copyRecursive().resolve() + configurations.testModExtra.copyRecursive().resolve()) | ||||
|                     .collect { it.absolutePath } | ||||
|                     .join(File.pathSeparator) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     mappings channel: 'snapshot', version: "${mappings_version}".toString() | ||||
|     // mappings channel: 'parchment', version: "${mapping_version}-${mc_version}" | ||||
|     mappings channel: 'official', version: mc_version | ||||
| 
 | ||||
|     accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg') | ||||
|     accessTransformer file('src/testMod/resources/META-INF/accesstransformer.cfg') | ||||
| } | ||||
| 
 | ||||
| sourceSets { | ||||
|     main.resources { | ||||
|         srcDir 'src/generated/resources' | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| repositories { | ||||
|     mavenCentral() | ||||
|     maven { | ||||
| @@ -96,38 +139,46 @@ repositories { | ||||
| 
 | ||||
| configurations { | ||||
|     shade | ||||
|     compile.extendsFrom shade | ||||
|     deployerJars | ||||
|     implementation.extendsFrom shade | ||||
| 
 | ||||
|     cctJavadoc | ||||
| 
 | ||||
|     testModExtra | ||||
|     testModImplementation.extendsFrom(testModExtra) | ||||
|     testModImplementation.extendsFrom(implementation) | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     checkstyle "com.puppycrawl.tools:checkstyle:8.25" | ||||
|     checkstyle "com.puppycrawl.tools:checkstyle:8.45" | ||||
| 
 | ||||
|     minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" | ||||
| 
 | ||||
|     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") | ||||
|     // compileOnly fg.deobf("mezz.jei:jei-1.17.1:8.0.0.14:api") | ||||
|     // runtimeOnly fg.deobf("mezz.jei:jei-1.17.1:8.0.0.14") | ||||
| 
 | ||||
|     runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3") | ||||
| 
 | ||||
|     compileOnly 'com.google.auto.service:auto-service:1.0-rc7' | ||||
|     annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7' | ||||
| 
 | ||||
|     shade 'org.squiddev:Cobalt:0.5.1-SNAPSHOT' | ||||
|     shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT' | ||||
| 
 | ||||
|     testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' | ||||
|     testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0' | ||||
|     testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' | ||||
|     testImplementation 'org.hamcrest:hamcrest:2.2' | ||||
|     testImplementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0' | ||||
|     testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' | ||||
| 
 | ||||
|     deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0" | ||||
|     testModImplementation sourceSets.main.output | ||||
|     testModExtra('org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0') { | ||||
|         exclude group: "org.jetbrains", module: "annotations" | ||||
|     } | ||||
| 
 | ||||
|     cctJavadoc 'cc.tweaked:cct-javadoc:1.3.0' | ||||
|     cctJavadoc 'cc.tweaked:cct-javadoc:1.4.2' | ||||
| } | ||||
| 
 | ||||
| // Compile tasks | ||||
| 
 | ||||
| compileTestModJava { | ||||
|     dependsOn(compileJava) | ||||
| } | ||||
| 
 | ||||
| javadoc { | ||||
|     include "dan200/computercraft/api/**/*.java" | ||||
| } | ||||
| @@ -142,173 +193,76 @@ task luaJavadoc(type: Javadoc) { | ||||
| 
 | ||||
|     options.docletpath = configurations.cctJavadoc.files as List | ||||
|     options.doclet = "cc.tweaked.javadoc.LuaDoclet" | ||||
|     options.noTimestamp = false | ||||
| 
 | ||||
|     // Attempt to run under Java 11 (any Java >= 9 will work though). | ||||
|     if(System.getProperty("java.version").startsWith("1.") | ||||
|         && (System.getenv("JAVA_HOME_11_X64") != null || project.hasProperty("java11Home"))) { | ||||
|         executable = "${System.getenv("JAVA_HOME_11_X64") ?: project.property("java11Home")}/bin/javadoc" | ||||
|     javadocTool = javaToolchains.javadocToolFor { | ||||
|         languageVersion = javaVersion | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 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")]) | ||||
|     } | ||||
| 
 | ||||
|     from (sourceSets.main.allSource) { | ||||
|         include "dan200/computercraft/api/**/*.java" | ||||
|         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") | ||||
|         ]) | ||||
|     } | ||||
| 
 | ||||
|     from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) } | ||||
| } | ||||
| 
 | ||||
| [compileJava, compileTestJava].forEach { | ||||
| jar.finalizedBy('reobfJar') | ||||
| 
 | ||||
| [compileJava, compileTestJava, compileTestModJava].forEach { | ||||
|     it.configure { | ||||
|         options.compilerArgs << "-Xlint" << "-Xlint:-processing" | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
|     // Proguard will remove directories by default, but that breaks JarMount. | ||||
|     keepdirectories 'data/computercraft/lua**' | ||||
| 
 | ||||
|     // Preserve ComputerCraft classes - we only want to strip shadowed files. | ||||
|     keep 'class dan200.computercraft.** { *; }' | ||||
| 
 | ||||
|     // LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard | ||||
|     dontwarn 'module-info' | ||||
|     dontwarn 'org.apache.**,org.lwjgl.**' | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| processResources { | ||||
|     inputs.property "version", mod_version | ||||
|     inputs.property "mcversion", mc_version | ||||
| 
 | ||||
|     def hash = 'none' | ||||
|     Set<String> contributors = [] | ||||
|     try { | ||||
|         def grgit = Grgit.open(dir: '.') | ||||
|         hash = grgit.head().id | ||||
|         hash = ["git", "-C", projectDir, "rev-parse", "HEAD"].execute().text.trim() | ||||
| 
 | ||||
|         def blacklist = ['GitHub', 'dan200', 'Daniel Ratcliffe'] | ||||
|         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) | ||||
|         ["git", "-C", projectDir, "log", "--format=tformat:%an%n%cn"].execute().text.split('\n').each { | ||||
|             if (!blacklist.contains(it)) contributors.add(it) | ||||
|         } | ||||
|     } catch(Exception ignored) { } | ||||
| 
 | ||||
|     } catch (Exception e) { | ||||
|         e.printStackTrace() | ||||
|     } | ||||
|     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' | ||||
| 
 | ||||
|         expand 'version': mod_version, | ||||
|                'mcversion': mc_version, | ||||
|                'gitcontributors': contributors.sort(false, String.CASE_INSENSITIVE_ORDER).join('\n') | ||||
|         expand( | ||||
|             'gitcontributors': contributors.sort(false, String.CASE_INSENSITIVE_ORDER).join('\n') | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     from(sourceSets.main.resources.srcDirs) { | ||||
|         exclude 'META-INF/mods.toml' | ||||
|         exclude 'data/computercraft/lua/rom/help/credits.txt' | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| task compressJson(dependsOn: jar) { | ||||
|     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) | ||||
|     } | ||||
| sourcesJar { | ||||
|     duplicatesStrategy = DuplicatesStrategy.INCLUDE | ||||
| } | ||||
| 
 | ||||
| assemble.dependsOn compressJson | ||||
| 
 | ||||
| // Web tasks | ||||
| 
 | ||||
| 
 | ||||
| import com.hierynomus.gradle.license.tasks.LicenseCheck | ||||
| import com.hierynomus.gradle.license.tasks.LicenseFormat | ||||
| import com.modrinth.minotaur.TaskModrinthUpload | ||||
| import org.apache.tools.ant.taskdefs.condition.Os | ||||
| 
 | ||||
| List<String> mkCommand(String command) { | ||||
| @@ -336,7 +290,7 @@ task minifyWeb(type: Exec, dependsOn: rollup) { | ||||
|     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") | ||||
|     commandLine mkCommand('"node_modules/.bin/terser"' + " -o '$buildDir/rollup/index.min.js' '$buildDir/rollup/index.js'") | ||||
| } | ||||
| 
 | ||||
| task illuaminateDocs(type: Exec, dependsOn: [minifyWeb, luaJavadoc]) { | ||||
| @@ -355,7 +309,9 @@ task illuaminateDocs(type: Exec, dependsOn: [minifyWeb, luaJavadoc]) { | ||||
| } | ||||
| 
 | ||||
| task docWebsite(type: Copy, dependsOn: [illuaminateDocs]) { | ||||
|     from 'doc/logo.png' | ||||
|     from 'doc' | ||||
|     include 'logo.png' | ||||
|     include 'images/**' | ||||
|     into "${project.docsDir}/lua" | ||||
| } | ||||
| 
 | ||||
| @@ -369,9 +325,10 @@ test { | ||||
| } | ||||
| 
 | ||||
| jacocoTestReport { | ||||
|     dependsOn('test') | ||||
|     reports { | ||||
|         xml.enabled true | ||||
|         html.enabled true | ||||
|         xml.required = true | ||||
|         html.required = true | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @@ -388,14 +345,14 @@ license { | ||||
|     it.configure { | ||||
|         include("**/*.java") | ||||
|         exclude("dan200/computercraft/api/**") | ||||
|         header rootProject.file('config/license/main.txt') | ||||
|         header file('config/license/main.txt') | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| [licenseTest, licenseFormatTest].forEach { | ||||
| [licenseTest, licenseFormatTest, licenseTestMod, licenseFormatTestMod].forEach { | ||||
|     it.configure { | ||||
|         include("**/*.java") | ||||
|         header rootProject.file('config/license/main.txt') | ||||
|         header file('config/license/main.txt') | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @@ -406,16 +363,80 @@ gradle.projectsEvaluated { | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| task licenseAPI(type: LicenseCheck); | ||||
| task licenseFormatAPI(type: LicenseFormat); | ||||
| task licenseAPI(type: LicenseCheck) | ||||
| task licenseFormatAPI(type: LicenseFormat) | ||||
| [licenseAPI, licenseFormatAPI].forEach { | ||||
|     it.configure { | ||||
|         source = sourceSets.main.java | ||||
|         include("dan200/computercraft/api/**") | ||||
|         header rootProject.file('config/license/api.txt') | ||||
|         header file('config/license/api.txt') | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| task setupServer(type: Copy) { | ||||
|     group "test server" | ||||
|     description "Sets up the environment for the test server." | ||||
| 
 | ||||
|     from("src/testMod/server-files") { | ||||
|         include "eula.txt" | ||||
|         include "server.properties" | ||||
|     } | ||||
|     into "test-files/server" | ||||
| } | ||||
| 
 | ||||
| ["Client", "Server"].forEach { name -> | ||||
|     tasks.register("test$name", JavaExec.class).configure { | ||||
|         it.group('In-game tests') | ||||
|         it.description("Runs tests on a temporary Minecraft instance.") | ||||
|         it.dependsOn(setupServer, "prepareRunTest$name", "cleanTest$name", 'compileTestModJava') | ||||
| 
 | ||||
|         // Copy from runTestServer. We do it in this slightly odd way as runTestServer | ||||
|         // isn't created until the task is configured (which is no good for us). | ||||
|         JavaExec exec = tasks.getByName("runTest$name") | ||||
|         exec.copyTo(it) | ||||
|         it.setClasspath(exec.getClasspath()) | ||||
|         it.mainClass = exec.mainClass | ||||
|         it.setArgs(exec.getArgs()) | ||||
| 
 | ||||
|         it.systemProperty('forge.logging.console.level', 'info') | ||||
|         it.systemProperty('cctest.run', 'true') | ||||
| 
 | ||||
|         // Jacoco and modlauncher don't play well together as the classes loaded in-game don't | ||||
|         // match up with those written to disk. We get Jacoco to dump all classes to disk, and | ||||
|         // use that when generating the report. | ||||
|         def coverageOut = new File(buildDir, "jacocoClassDump/test$name") | ||||
|         jacoco.applyTo(it) | ||||
|         it.jacoco.setIncludes(["dan200.computercraft.*"]) | ||||
|         it.jacoco.setClassDumpDir(coverageOut) | ||||
|         it.outputs.dir(coverageOut) | ||||
|         // Older versions of modlauncher don't include a protection domain (and thus no code | ||||
|         // source). Jacoco skips such classes by default, so we need to explicitly include them. | ||||
|         it.jacoco.setIncludeNoLocationClasses(true) | ||||
|     } | ||||
| 
 | ||||
|     tasks.register("jacocoTest${name}Report", JacocoReport.class).configure { | ||||
|         it.group('In-game') | ||||
|         it.description("Generate coverage reports for test$name") | ||||
|         it.dependsOn("test$name") | ||||
| 
 | ||||
|         it.executionData(new File(buildDir, "jacoco/test${name}.exec")) | ||||
|         it.sourceDirectories.from(sourceSets.main.allJava.srcDirs) | ||||
|         it.classDirectories.from(new File(buildDir, "jacocoClassDump/test$name")) | ||||
| 
 | ||||
|         it.reports { | ||||
|             xml.enabled true | ||||
|             html.enabled true | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (name != "Client" || project.findProperty('cc.tweaked.clientTests') == 'true') { | ||||
|         // Don't run client tests unless explicitly opted into them. They're a bit of a faff | ||||
|         // to run and pretty flakey. | ||||
|         check.dependsOn("jacocoTest${name}Report") | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Upload tasks | ||||
| 
 | ||||
| task checkRelease { | ||||
| @@ -423,31 +444,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.txt") | ||||
|     inputs.file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt") | ||||
|     inputs.file("src/main/resources/data/computercraft/lua/rom/help/changelog.md") | ||||
|     inputs.file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.md") | ||||
| 
 | ||||
|     doLast { | ||||
|         def ok = true | ||||
| 
 | ||||
|         // Check we're targetting the current version | ||||
|         def whatsnew = new File("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt").readLines() | ||||
|         def whatsnew = new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md").readLines() | ||||
|         if (whatsnew[0] != "New features in CC: Tweaked $mod_version") { | ||||
|             ok = false | ||||
|             project.logger.error("Expected `whatsnew.txt' to target $mod_version.") | ||||
|             project.logger.error("Expected `whatsnew.md' 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.txt") | ||||
|             project.logger.error("Must mention the changelog in whatsnew.md") | ||||
|         } else { | ||||
|             whatsnew = whatsnew.getAt(0 ..< idx) | ||||
|             whatsnew = whatsnew.getAt(0..<idx) | ||||
|         } | ||||
| 
 | ||||
|         // Check whatsnew and changelog match. | ||||
|         def versionChangelog = "# " + whatsnew.join("\n") | ||||
|         def changelog = new File("src/main/resources/data/computercraft/lua/rom/help/changelog.txt").getText() | ||||
|         def changelog = new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/changelog.md").getText() | ||||
|         if (!changelog.startsWith(versionChangelog)) { | ||||
|             ok = false | ||||
|             project.logger.error("whatsnew and changelog are not in sync") | ||||
| @@ -458,66 +479,79 @@ task checkRelease { | ||||
| } | ||||
| check.dependsOn checkRelease | ||||
| 
 | ||||
| def isStable = false | ||||
| 
 | ||||
| curseforge { | ||||
|     apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : '' | ||||
|     project { | ||||
|         id = '282001' | ||||
|         releaseType = 'release' | ||||
|         changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." | ||||
|         releaseType = isStable ? 'release' : 'alpha' | ||||
|         changelog = "Release notes can be found on the GitHub repository (https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." | ||||
| 
 | ||||
|         relations { | ||||
|             incompatible "computercraft" | ||||
|         } | ||||
|         addGameVersion "${mc_version}" | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
|     versionType = isStable ? 'RELEASE' : 'ALPHA' | ||||
|     addGameVersion(project.mc_version) | ||||
|     changelog = "Release notes can be found on the [GitHub repository](https://github.com/cc-tweaked/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})." | ||||
|     addLoader('forge') | ||||
| } | ||||
| 
 | ||||
| tasks.withType(GenerateModuleMetadata) { | ||||
|     // We can't generate metadata as that includes Forge as a dependency. | ||||
|     enabled = false | ||||
| } | ||||
| 
 | ||||
| publishing { | ||||
|     publications { | ||||
|         mavenJava(MavenPublication) { | ||||
|         maven(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/cc-tweaked/CC-Tweaked' | ||||
| 
 | ||||
|                 scm { | ||||
|                     url = 'https://github.com/cc-tweaked/CC-Tweaked.git' | ||||
|                 } | ||||
| 
 | ||||
|                 issueManagement { | ||||
|                     system = 'github' | ||||
|                     url = 'https://github.com/cc-tweaked/CC-Tweaked/issues' | ||||
|                 } | ||||
| 
 | ||||
|                 licenses { | ||||
|                     license { | ||||
|                         name = 'ComputerCraft Public License, Version 1.0' | ||||
|                         url = 'https://github.com/cc-tweaked/CC-Tweaked/blob/mc-1.15.x/LICENSE' | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 withXml { asNode().remove(asNode().get("dependencies")) } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| uploadArchives { | ||||
|     repositories { | ||||
|         if(project.hasProperty('mavenUploadUrl')) { | ||||
|             mavenDeployer { | ||||
|                 configuration = configurations.deployerJars | ||||
| 
 | ||||
|                 repository(url: project.property('mavenUploadUrl')) { | ||||
|                     authentication( | ||||
|                         userName: project.property('mavenUploadUser'), | ||||
|                         privateKey: project.property('mavenUploadKey')) | ||||
|                 } | ||||
| 
 | ||||
|                 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' | ||||
| 
 | ||||
|                     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' | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 pom.whenConfigured { pom -> | ||||
|                     pom.dependencies.clear() | ||||
|         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 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @@ -526,27 +560,37 @@ uploadArchives { | ||||
| 
 | ||||
| githubRelease { | ||||
|     token project.hasProperty('githubApiKey') ? project.githubApiKey : '' | ||||
|     owner 'SquidDev-CC' | ||||
|     owner 'cc-tweaked' | ||||
|     repo 'CC-Tweaked' | ||||
|     try { | ||||
|         targetCommitish = Grgit.open(dir: '.').branch.current().name | ||||
|     } catch(Exception ignored) { } | ||||
|     targetCommitish.set(project.provider({ | ||||
|         def cmd = ["git", "rev-parse", "--abbrev-ref", "HEAD"] | ||||
|         println(cmd) | ||||
|         def proc = cmd.execute([], projectDir) | ||||
|         if (proc.waitFor() != 0) { | ||||
|             println(proc.err.text.trim()) | ||||
|             throw new IllegalStateException("Executed with a non-0 exit code (${proc.exitValue()}).") | ||||
|         } | ||||
| 
 | ||||
|         def branch = proc.text.trim() | ||||
|         if (branch == "") throw new IllegalStateException("Cannot determine branch") | ||||
|         return branch | ||||
|     })) | ||||
| 
 | ||||
|     tagName "v${mc_version}-${mod_version}" | ||||
|     releaseName "[${mc_version}] ${mod_version}" | ||||
|     body { | ||||
|         "## " + new File("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt") | ||||
|     body.set(project.provider({ | ||||
|         "## " + new File(projectDir, "src/main/resources/data/computercraft/lua/rom/help/whatsnew.md") | ||||
|             .readLines() | ||||
|             .takeWhile { it != 'Type "help changelog" to see the full version history.' } | ||||
|             .join("\n").trim() | ||||
|     } | ||||
|     prerelease false | ||||
|     })) | ||||
|     prerelease isStable | ||||
| } | ||||
| 
 | ||||
| def uploadTasks = ["uploadArchives", "curseforge", "githubRelease"] | ||||
| def uploadTasks = ["publish", "curseforge", "publishModrinth", "githubRelease"] | ||||
| uploadTasks.forEach { tasks.getByName(it).dependsOn checkRelease } | ||||
| 
 | ||||
| task uploadAll(dependsOn: uploadTasks) { | ||||
|     group "upload" | ||||
|     description "Uploads to all repositories (Maven, Curse, GitHub release)" | ||||
|     description "Uploads to all repositories (Maven, Curse, Modrinth, GitHub release)" | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <property name="charset" value="UTF-8" /> | ||||
|  | ||||
|     <module name="SuppressionFilter"> | ||||
|         <property name="file" value="config/checkstyle/suppressions.xml" /> | ||||
| 	<property name="file" value="${config_loc}/suppressions.xml" /> | ||||
|     </module> | ||||
|  | ||||
|     <module name="BeforeExecutionExclusionFileFilter"> | ||||
| @@ -58,13 +58,20 @@ | ||||
|         <module name="SimplifyBooleanExpression" /> | ||||
|         <module name="SimplifyBooleanReturn" /> | ||||
|         <module name="StringLiteralEquality" /> | ||||
|         <module name="UnnecessaryParentheses" /> | ||||
|         <module name="UnnecessaryParentheses"> | ||||
|             <!-- Default minus LAND. --> | ||||
|             <property name="tokens" value="EXPR,IDENT,NUM_DOUBLE,NUM_FLOAT,NUM_INT,NUM_LONG,STRING_LITERAL,LITERAL_NULL,LITERAL_FALSE,LITERAL_TRUE,ASSIGN,BAND_ASSIGN,BOR_ASSIGN,BSR_ASSIGN,BXOR_ASSIGN,DIV_ASSIGN,MINUS_ASSIGN,MOD_ASSIGN,PLUS_ASSIGN,SL_ASSIGN,SR_ASSIGN,STAR_ASSIGN,LAMBDA,TEXT_BLOCK_LITERAL_BEGIN,LITERAL_INSTANCEOF,GT,LT,GE,LE,EQUAL,NOT_EQUAL,UNARY_MINUS,UNARY_PLUS,INC,DEC,LNOT,BNOT,POST_INC,POST_DEC" /> | ||||
|         </module> | ||||
|         <module name="UnnecessarySemicolonAfterTypeMemberDeclaration" /> | ||||
|         <module name="UnnecessarySemicolonInTryWithResources" /> | ||||
|         <module name="UnnecessarySemicolonInEnumeration" /> | ||||
|  | ||||
|         <!-- Imports --> | ||||
|         <module name="CustomImportOrder" /> | ||||
|         <module name="CustomImportOrder"> | ||||
|             <property name="customImportOrderRules" | ||||
|                 value="THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC" | ||||
|             /> | ||||
|         </module> | ||||
|         <module name="IllegalImport" /> | ||||
|         <module name="RedundantImport" /> | ||||
|         <module name="UnusedImports" /> | ||||
| @@ -97,20 +104,11 @@ | ||||
|         <module name="LambdaParameterName" /> | ||||
|         <module name="LocalFinalVariableName" /> | ||||
|         <module name="LocalVariableName" /> | ||||
|         <!-- 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="MemberName" /> | ||||
|         <module name="MethodName" /> | ||||
|         <module name="MethodTypeParameterName" /> | ||||
|         <module name="PackageName"> | ||||
|             <property name="format" value="^dan200\.computercraf(\.[a-z][a-z0-9]*)*" /> | ||||
|             <property name="format" value="^dan200\.computercraft(\.[a-z][a-z0-9]*)*" /> | ||||
|         </module> | ||||
|         <module name="ParameterName" /> | ||||
|         <module name="StaticVariableName"> | ||||
| @@ -158,8 +156,13 @@ | ||||
|             <property name="tokens" value="COMMA" /> | ||||
|         </module> | ||||
|         <module name="WhitespaceAround"> | ||||
|             <property name="allowEmptyConstructors" value="true" /> | ||||
|             <property name="ignoreEnhancedForColon" value="false" /> | ||||
|             <!-- Allow empty functions --> | ||||
|             <property name="allowEmptyLambdas" value="true" /> | ||||
|             <property name="allowEmptyMethods" value="true" /> | ||||
|             <property name="allowEmptyConstructors" value="true" /> | ||||
|             <property name="allowEmptyTypes" value="true" /> | ||||
|  | ||||
|             <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" /> | ||||
|         </module> | ||||
|     </module> | ||||
|   | ||||
| @@ -7,9 +7,6 @@ | ||||
|     <suppress checks="StaticVariableName" files=".*[\\/]ComputerCraft.java" /> | ||||
|     <suppress checks="StaticVariableName" files=".*[\\/]ComputerCraftAPI.java" /> | ||||
|  | ||||
|     <!-- Do not check for missing package Javadoc. --> | ||||
|     <suppress checks="JavadocStyle" files=".*[\\/]package-info.java" /> | ||||
|  | ||||
|     <!-- The commands API is documented in Lua. --> | ||||
|     <suppress checks="SummaryJavadocCheck" files=".*[\\/]CommandAPI.java" /> | ||||
| </suppressions> | ||||
|   | ||||
							
								
								
									
										8
									
								
								config/gitpod/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								config/gitpod/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| FROM gitpod/workspace-base | ||||
|  | ||||
| USER gitpod | ||||
|  | ||||
| RUN sudo apt-get -q update \ | ||||
|  && sudo apt-get install -yq openjdk-16-jdk python3-pip npm \ | ||||
|  && sudo pip3 install pre-commit \ | ||||
|  && sudo update-java-alternatives --set java-1.16.0-openjdk-amd64 | ||||
| @@ -2488,4 +2488,4 @@ | ||||
|       </option> | ||||
|     </inspection_tool> | ||||
|   </profile> | ||||
| </component> | ||||
| </component> | ||||
|   | ||||
| @@ -58,4 +58,4 @@ | ||||
|       <option name="CONTINUATION_INDENT_SIZE" value="4" /> | ||||
|     </indentOptions> | ||||
|   </codeStyleSettings> | ||||
| </code_scheme> | ||||
| </code_scheme> | ||||
|   | ||||
							
								
								
									
										55
									
								
								config/pre-commit/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								config/pre-commit/config.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| # 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: v4.0.1 | ||||
|   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.54 | ||||
|   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/testMod/server-files/| | ||||
|     config/idea/ | ||||
|   ) | ||||
							
								
								
									
										16
									
								
								config/pre-commit/illuaminate-lint.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								config/pre-commit/illuaminate-lint.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| #!/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 | ||||
							
								
								
									
										21
									
								
								doc/events/alarm.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								doc/events/alarm.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| 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") | ||||
| ``` | ||||
							
								
								
									
										24
									
								
								doc/events/char.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								doc/events/char.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										18
									
								
								doc/events/computer_command.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								doc/events/computer_command.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										19
									
								
								doc/events/disk.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								doc/events/disk.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										19
									
								
								doc/events/disk_eject.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								doc/events/disk_eject.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										14
									
								
								doc/events/http_check.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								doc/events/http_check.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| --- | ||||
| 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. | ||||
							
								
								
									
										39
									
								
								doc/events/http_failure.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								doc/events/http_failure.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| --- | ||||
| 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() | ||||
| ``` | ||||
							
								
								
									
										27
									
								
								doc/events/http_success.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								doc/events/http_success.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| --- | ||||
| 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() | ||||
| ``` | ||||
							
								
								
									
										26
									
								
								doc/events/key.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								doc/events/key.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										24
									
								
								doc/events/key_up.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								doc/events/key_up.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										22
									
								
								doc/events/modem_message.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								doc/events/modem_message.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										18
									
								
								doc/events/monitor_resize.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								doc/events/monitor_resize.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										20
									
								
								doc/events/monitor_touch.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								doc/events/monitor_touch.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										34
									
								
								doc/events/mouse_click.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								doc/events/mouse_click.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										22
									
								
								doc/events/mouse_drag.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								doc/events/mouse_drag.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										21
									
								
								doc/events/mouse_scroll.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								doc/events/mouse_scroll.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										21
									
								
								doc/events/mouse_up.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								doc/events/mouse_up.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										18
									
								
								doc/events/paste.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								doc/events/paste.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										19
									
								
								doc/events/peripheral.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								doc/events/peripheral.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										19
									
								
								doc/events/peripheral_detach.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								doc/events/peripheral_detach.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										30
									
								
								doc/events/rednet_message.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								doc/events/rednet_message.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										14
									
								
								doc/events/redstone.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								doc/events/redstone.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| --- | ||||
| module: [kind=event] redstone | ||||
| --- | ||||
| 
 | ||||
| The @{event!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 | ||||
| ``` | ||||
							
								
								
									
										28
									
								
								doc/events/task_complete.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								doc/events/task_complete.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										15
									
								
								doc/events/term_resize.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								doc/events/term_resize.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										25
									
								
								doc/events/terminate.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								doc/events/terminate.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										21
									
								
								doc/events/timer.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								doc/events/timer.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| 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") | ||||
| ``` | ||||
							
								
								
									
										14
									
								
								doc/events/turtle_inventory.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								doc/events/turtle_inventory.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| --- | ||||
| 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 | ||||
| ``` | ||||
							
								
								
									
										21
									
								
								doc/events/websocket_closed.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								doc/events/websocket_closed.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| --- | ||||
| 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.") | ||||
| ``` | ||||
							
								
								
									
										25
									
								
								doc/events/websocket_failure.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								doc/events/websocket_failure.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| --- | ||||
| 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) | ||||
| ``` | ||||
							
								
								
									
										27
									
								
								doc/events/websocket_message.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								doc/events/websocket_message.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| --- | ||||
| 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. | ||||
| 4. @{boolean}: Whether this is a binary 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() | ||||
| ``` | ||||
							
								
								
									
										28
									
								
								doc/events/websocket_success.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								doc/events/websocket_success.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| --- | ||||
| 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() | ||||
| ``` | ||||
							
								
								
									
										1
									
								
								doc/head.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								doc/head.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| <meta name="theme-color" content="#c8d87c"> | ||||
							
								
								
									
										
											BIN
										
									
								
								doc/images/basic-terminal.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/images/basic-terminal.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 53 KiB | 
							
								
								
									
										
											BIN
										
									
								
								doc/images/peripherals.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/images/peripherals.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 194 KiB | 
							
								
								
									
										
											BIN
										
									
								
								doc/images/turtle.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/images/turtle.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 163 KiB | 
							
								
								
									
										58
									
								
								doc/index.md
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								doc/index.md
									
									
									
									
									
								
							| @@ -1,11 +1,55 @@ | ||||
| #  [](https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked on CurseForge") | ||||
| #  | ||||
| CC: Tweaked is a mod for Minecraft which adds programmable computers, turtles and more to the game. A fork of the | ||||
| much-beloved [ComputerCraft], it continues its legacy with better performance, stability, and a wealth of new features. | ||||
| 
 | ||||
| CC: Tweaked is a fork of [ComputerCraft], adding programmable computers, turtles and more to Minecraft. | ||||
| CC: Tweaked can be installed from [CurseForge] or [Modrinth]. It requires the [Minecraft Forge][forge] mod loader, but | ||||
| [versions are available for Fabric][ccrestitched]. | ||||
| 
 | ||||
| This website contains documentation for all Lua libraries and APIs from the latest version of CC: Tweaked. This | ||||
| documentation is still in development, so will most likely be incomplete. If you've found something you think is wrong, | ||||
| or would like to help out [please get in touch on GitHub][gh]. | ||||
| ## Features | ||||
| Controlled using the [Lua programming language][lua], CC: Tweaked's computers provides all the tools you need to start | ||||
| writing code and automating your Minecraft world. | ||||
| 
 | ||||
| [bug]: https://github.com/SquidDev-CC/CC-Tweaked/issues/new/choose | ||||
| {.big-image} | ||||
| 
 | ||||
| While computers are incredibly powerful, they're rather limited by their inability to move about. *Turtles* are the | ||||
| solution here. They can move about the world, placing and breaking blocks, swinging a sword to protect you from zombies, | ||||
| or whatever else you program them to! | ||||
| 
 | ||||
| {.big-image} | ||||
| 
 | ||||
| Not all problems can be solved with a pickaxe though, and so CC: Tweaked also provides a bunch of additional peripherals | ||||
| for your computers. You can play a tune with speakers, display text or images on a monitor, connect all your | ||||
| computers together with modems, and much more. | ||||
| 
 | ||||
| Computers can now also interact with inventories such as chests, allowing you to build complex inventory and item | ||||
| management systems. | ||||
| 
 | ||||
| {.big-image} | ||||
| 
 | ||||
| ## Getting Started | ||||
| While ComputerCraft is lovely for both experienced programmers and for people who have never coded before, it can be a | ||||
| little daunting getting started. Thankfully, there's several fantastic tutorials out there: | ||||
| 
 | ||||
|  - [Direwolf20's ComputerCraft tutorials](https://www.youtube.com/watch?v=wrUHUhfCY5A "ComputerCraft Tutorial Episode 1 - HELP! and Hello World") | ||||
|  - [Sethbling's ComputerCraft series](https://www.youtube.com/watch?v=DSsx4VSe-Uk "Programming Tutorial with Minecraft Turtles -- Ep. 1: Intro to Turtles and If-Then-Else_End") | ||||
|  - [Lyqyd's Computer Basics 1](http://www.computercraft.info/forums2/index.php?/topic/15033-computer-basics-i/ "Computer Basics I") | ||||
| 
 | ||||
| Once you're a little more familiar with the mod, the sidebar and links below provide more detailed documentation on the | ||||
| various APIs and peripherals provided by the mod. | ||||
| 
 | ||||
| If you get stuck, do pop in to the [Minecraft Computer Mod Discord guild][discord] or ComputerCraft's | ||||
| [IRC channel][irc]. | ||||
| 
 | ||||
| ## Get Involved | ||||
| CC: Tweaked lives on [GitHub]. If you've got any ideas, feedback or bugs please do [create an issue][bug]. | ||||
| 
 | ||||
| [github]: https://github.com/cc-tweaked/CC-Tweaked/ "CC: Tweaked on GitHub" | ||||
| [bug]: https://github.com/cc-tweaked/CC-Tweaked/issues/new/choose | ||||
| [computercraft]: https://github.com/dan200/ComputerCraft "ComputerCraft on GitHub" | ||||
| [gh]: https://github.com/SquidDev-CC/CC-Tweaked "CC:Tweaked on GitHub" | ||||
| [curseforge]: https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked from CurseForge" | ||||
| [modrinth]: https://modrinth.com/mod/gu7yAYhd "Download CC: Tweaked from Modrinth" | ||||
| [forge]: https://files.minecraftforge.net/ "Download Minecraft Forge." | ||||
| [ccrestitched]: https://www.curseforge.com/minecraft/mc-mods/cc-restitched "Download CC: Restitched from CurseForge" | ||||
| [lua]: https://www.lua.org/ "Lua's main website" | ||||
| [discord]: https://discord.computercraft.cc "The Minecraft Computer Mods Discord" | ||||
| [irc]: http://webchat.esper.net/?channels=computercraft "IRC webchat on EsperNet" | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								doc/logo.png
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/logo.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.5 KiB | 
| @@ -12,6 +12,7 @@ | ||||
| -- @treturn boolean If the path is mounted, rather than a normal file/folder. | ||||
| -- @throws If the path does not exist. | ||||
| -- @see getDrive | ||||
| -- @since 1.87.0 | ||||
| function isDriveRoot(path) end | ||||
|  | ||||
| --[[- Provides completion for a file or directory name, suitable for use with | ||||
| @@ -30,5 +31,6 @@ 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. | ||||
| @since 1.74 | ||||
| ]] | ||||
| function complete(path, location, include_files, include_dirs) end | ||||
|   | ||||
| @@ -77,7 +77,7 @@ 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 | ||||
| @usage Read a string and echo it back to the user | ||||
|  | ||||
|     write("> ") | ||||
|     local msg = read() | ||||
| @@ -101,6 +101,9 @@ the prompt. | ||||
|     write("> ") | ||||
|     local msg = read(nil, history, function(text) return completion.choice(text, choices) end, "app") | ||||
|     print(msg) | ||||
|  | ||||
| @changed 1.74 Added `completeFn` parameter. | ||||
| @changed 1.80pr1 Added `default` parameter. | ||||
| ]] | ||||
| function read(replaceChar, history, completeFn, default) end | ||||
|  | ||||
| @@ -108,6 +111,7 @@ function read(replaceChar, history, completeFn, default) end | ||||
| -- | ||||
| -- For example, `ComputerCraft 1.93.0 (Minecraft 1.15.2)`. | ||||
| -- @usage _HOST | ||||
| -- @since 1.76 | ||||
| _HOST = _HOST | ||||
|  | ||||
| --[[- The default computer settings as defined in the ComputerCraft | ||||
| @@ -121,5 +125,6 @@ An example value to disable autocompletion: | ||||
|     shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false | ||||
|  | ||||
| @usage _CC_DEFAULT_SETTINGS | ||||
| @since 1.77 | ||||
| ]] | ||||
| _CC_DEFAULT_SETTINGS = _CC_DEFAULT_SETTINGS | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| -- receiving data from them. | ||||
| -- | ||||
| -- @module http | ||||
| -- @since 1.1 | ||||
|  | ||||
| --- Asynchronously make a HTTP request to the given url. | ||||
| -- | ||||
| @@ -35,6 +36,11 @@ | ||||
| -- | ||||
| -- @see http.get  For a synchronous way to make GET requests. | ||||
| -- @see http.post For a synchronous way to make POST requests. | ||||
| -- | ||||
| -- @changed 1.63 Added argument for headers. | ||||
| -- @changed 1.80pr1 Added argument for binary handles. | ||||
| -- @changed 1.80pr1.6 Added support for table argument. | ||||
| -- @changed 1.86.0 Added PATCH and TRACE methods. | ||||
| function request(...) end | ||||
|  | ||||
| --- Make a HTTP GET request to the given url. | ||||
| @@ -58,10 +64,16 @@ 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.computercraft.cc](https://example.computercraft.cc), | ||||
| -- @changed 1.63 Added argument for headers. | ||||
| -- @changed 1.80pr1 Response handles are now returned on error if available. | ||||
| -- @changed 1.80pr1 Added argument for binary handles. | ||||
| -- @changed 1.80pr1.6 Added support for table argument. | ||||
| -- @changed 1.86.0 Added PATCH and TRACE methods. | ||||
| -- | ||||
| -- @usage Make a request to [example.tweaked.cc](https://example.tweaked.cc), | ||||
| -- and print the returned page. | ||||
| -- ```lua | ||||
| -- local request = http.get("https://example.computercraft.cc") | ||||
| -- local request = http.get("https://example.tweaked.cc") | ||||
| -- print(request.readAll()) | ||||
| -- -- => HTTP is working! | ||||
| -- request.close() | ||||
| @@ -89,6 +101,13 @@ function get(...) end | ||||
| -- error or connection timeout. | ||||
| -- @treturn string A message detailing why the request failed. | ||||
| -- @treturn Response|nil The failing http response, if available. | ||||
| -- | ||||
| -- @since 1.31 | ||||
| -- @changed 1.63 Added argument for headers. | ||||
| -- @changed 1.80pr1 Response handles are now returned on error if available. | ||||
| -- @changed 1.80pr1 Added argument for binary handles. | ||||
| -- @changed 1.80pr1.6 Added support for table argument. | ||||
| -- @changed 1.86.0 Added PATCH and TRACE methods. | ||||
| function post(...) end | ||||
|  | ||||
| --- Asynchronously determine whether a URL can be requested. | ||||
| @@ -123,7 +142,7 @@ function checkURLAsync(url) end | ||||
| -- | ||||
| -- @usage | ||||
| -- ```lua | ||||
| -- print(http.checkURL("https://example.computercraft.cc/")) | ||||
| -- print(http.checkURL("https://example.tweaked.cc/")) | ||||
| -- -- => true | ||||
| -- print(http.checkURL("http://localhost/")) | ||||
| -- -- => false Domain not permitted | ||||
| @@ -142,6 +161,9 @@ function checkURL(url) end | ||||
| -- @treturn Websocket The websocket connection. | ||||
| -- @treturn[2] false If the websocket connection failed. | ||||
| -- @treturn string An error message describing why the connection failed. | ||||
| -- @since 1.80pr1.1 | ||||
| -- @changed 1.80pr1.3 No longer asynchronous. | ||||
| -- @changed 1.95.3 Added User-Agent to default headers. | ||||
| function websocket(url, headers) end | ||||
|  | ||||
| --- Asynchronously open a websocket. | ||||
| @@ -154,4 +176,6 @@ function websocket(url, headers) end | ||||
| -- `ws://` or `wss://` protocol. | ||||
| -- @tparam[opt] { [string] = string } headers Additional headers to send as part | ||||
| -- of the initial websocket connection. | ||||
| -- @since 1.80pr1.3 | ||||
| -- @changed 1.95.3 Added User-Agent to default headers. | ||||
| function websocketAsync(url, headers) end | ||||
|   | ||||
| @@ -2,17 +2,18 @@ | ||||
|  | ||||
| --[[- 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. | ||||
| @since 1.2 | ||||
|  | ||||
| @deprecated Use @{require}. | ||||
| @deprecated When possible it's best to avoid using this function. It pollutes | ||||
| the global table and can mask errors. | ||||
|  | ||||
| @{require} should be used to load libraries instead. | ||||
| ]] | ||||
| function loadAPI(path) end | ||||
|  | ||||
| @@ -21,7 +22,8 @@ function loadAPI(path) end | ||||
| -- This effectively removes the specified table from `_G`. | ||||
| -- | ||||
| -- @tparam string name The name of the API to unload. | ||||
| -- @deprecated Use @{require}. | ||||
| -- @since 1.2 | ||||
| -- @deprecated See @{os.loadAPI} for why. | ||||
| function unloadAPI(name) end | ||||
|  | ||||
| --[[- Pause execution of the current thread and waits for any events matching | ||||
| @@ -58,6 +60,7 @@ event, printing the error "Terminated". | ||||
|     end | ||||
|  | ||||
| @see os.pullEventRaw To pull the terminate event. | ||||
| @changed 1.3 Added filter argument. | ||||
| ]] | ||||
| function pullEvent(filter) end | ||||
|  | ||||
|   | ||||
| @@ -1 +1,14 @@ | ||||
| --[[- Craft a recipe based on the turtle's inventory. | ||||
|  | ||||
| The turtle's inventory should set up like a crafting grid. For instance, to | ||||
| craft sticks, slots 1 and 5 should contain planks. _All_ other slots should be | ||||
| empty, including those outside the crafting "grid". | ||||
|  | ||||
| @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. | ||||
| @since 1.4 | ||||
| ]] | ||||
| function craft(limit) end | ||||
|   | ||||
| @@ -1,7 +1,10 @@ | ||||
| org.gradle.jvmargs=-Xmx3G | ||||
|  | ||||
| # Mod properties | ||||
| mod_version=1.95.0 | ||||
| mod_version=1.99.0 | ||||
|  | ||||
| # Minecraft properties (update mods.toml when changing) | ||||
| mc_version=1.15.2 | ||||
| forge_version=31.1.41 | ||||
| mappings_version=20200429-1.15.1 | ||||
| mc_version=1.18 | ||||
| mapping_version=2021.09.05 | ||||
| forge_version=38.0.0 | ||||
| # NO SERIOUSLY, UPDATE mods.toml WHEN CHANGING | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
|   | ||||
							
								
								
									
										286
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										286
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -1,78 +1,129 @@ | ||||
| #!/usr/bin/env sh | ||||
| #!/bin/sh | ||||
|  | ||||
| # | ||||
| # Copyright © 2015-2021 the original 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 | ||||
| ## | ||||
| # | ||||
| #   Gradle start up script for POSIX generated by Gradle. | ||||
| # | ||||
| #   Important for running: | ||||
| # | ||||
| #   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | ||||
| #       noncompliant, but you have some other compliant shell such as ksh or | ||||
| #       bash, then to run this script, type that shell name before the whole | ||||
| #       command line, like: | ||||
| # | ||||
| #           ksh Gradle | ||||
| # | ||||
| #       Busybox and similar reduced shells will NOT work, because this script | ||||
| #       requires all of these POSIX shell features: | ||||
| #         * functions; | ||||
| #         * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | ||||
| #           «${var#prefix}», «${var%suffix}», and «$( cmd )»; | ||||
| #         * compound commands having a testable exit status, especially «case»; | ||||
| #         * various built-in commands including «command», «set», and «ulimit». | ||||
| # | ||||
| #   Important for patching: | ||||
| # | ||||
| #   (2) This script targets any POSIX shell, so it avoids extensions provided | ||||
| #       by Bash, Ksh, etc; in particular arrays are avoided. | ||||
| # | ||||
| #       The "traditional" practice of packing multiple parameters into a | ||||
| #       space-separated string is a well documented source of bugs and security | ||||
| #       problems, so this is (mostly) avoided, by progressively accumulating | ||||
| #       options in "$@", and eventually passing that to Java. | ||||
| # | ||||
| #       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | ||||
| #       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | ||||
| #       see the in-line comments for details. | ||||
| # | ||||
| #       There are tweaks for specific operating systems such as AIX, CygWin, | ||||
| #       Darwin, MinGW, and NonStop. | ||||
| # | ||||
| #   (3) This script is generated from the Groovy template | ||||
| #       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||
| #       within the Gradle project. | ||||
| # | ||||
| #       You can find Gradle at https://github.com/gradle/gradle/. | ||||
| # | ||||
| ############################################################################## | ||||
|  | ||||
| # Attempt to set APP_HOME | ||||
|  | ||||
| # Resolve links: $0 may be a link | ||||
| PRG="$0" | ||||
| # Need this for relative symlinks. | ||||
| while [ -h "$PRG" ] ; do | ||||
|     ls=`ls -ld "$PRG"` | ||||
|     link=`expr "$ls" : '.*-> \(.*\)$'` | ||||
|     if expr "$link" : '/.*' > /dev/null; then | ||||
|         PRG="$link" | ||||
|     else | ||||
|         PRG=`dirname "$PRG"`"/$link" | ||||
|     fi | ||||
| app_path=$0 | ||||
|  | ||||
| # Need this for daisy-chained symlinks. | ||||
| while | ||||
|     APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path | ||||
|     [ -h "$app_path" ] | ||||
| do | ||||
|     ls=$( ls -ld "$app_path" ) | ||||
|     link=${ls#*' -> '} | ||||
|     case $link in             #( | ||||
|       /*)   app_path=$link ;; #( | ||||
|       *)    app_path=$APP_HOME$link ;; | ||||
|     esac | ||||
| done | ||||
| SAVED="`pwd`" | ||||
| cd "`dirname \"$PRG\"`/" >/dev/null | ||||
| APP_HOME="`pwd -P`" | ||||
| cd "$SAVED" >/dev/null | ||||
|  | ||||
| APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit | ||||
|  | ||||
| APP_NAME="Gradle" | ||||
| APP_BASE_NAME=`basename "$0"` | ||||
| APP_BASE_NAME=${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="" | ||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||
|  | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD="maximum" | ||||
| MAX_FD=maximum | ||||
|  | ||||
| warn () { | ||||
|     echo "$*" | ||||
| } | ||||
| } >&2 | ||||
|  | ||||
| die () { | ||||
|     echo | ||||
|     echo "$*" | ||||
|     echo | ||||
|     exit 1 | ||||
| } | ||||
| } >&2 | ||||
|  | ||||
| # OS specific support (must be 'true' or 'false'). | ||||
| cygwin=false | ||||
| msys=false | ||||
| darwin=false | ||||
| nonstop=false | ||||
| case "`uname`" in | ||||
|   CYGWIN* ) | ||||
|     cygwin=true | ||||
|     ;; | ||||
|   Darwin* ) | ||||
|     darwin=true | ||||
|     ;; | ||||
|   MINGW* ) | ||||
|     msys=true | ||||
|     ;; | ||||
|   NONSTOP* ) | ||||
|     nonstop=true | ||||
|     ;; | ||||
| case "$( uname )" in                #( | ||||
|   CYGWIN* )         cygwin=true  ;; #( | ||||
|   Darwin* )         darwin=true  ;; #( | ||||
|   MSYS* | MINGW* )  msys=true    ;; #( | ||||
|   NONSTOP* )        nonstop=true ;; | ||||
| 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 | ||||
|         # IBM's JDK on AIX uses strange locations for the executables | ||||
|         JAVACMD="$JAVA_HOME/jre/sh/java" | ||||
|         JAVACMD=$JAVA_HOME/jre/sh/java | ||||
|     else | ||||
|         JAVACMD="$JAVA_HOME/bin/java" | ||||
|         JAVACMD=$JAVA_HOME/bin/java | ||||
|     fi | ||||
|     if [ ! -x "$JAVACMD" ] ; then | ||||
|         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||
| @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
|     fi | ||||
| else | ||||
|     JAVACMD="java" | ||||
|     JAVACMD=java | ||||
|     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
|  | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| @@ -89,84 +140,95 @@ location of your Java installation." | ||||
| fi | ||||
|  | ||||
| # Increase the maximum file descriptors if we can. | ||||
| if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | ||||
|     MAX_FD_LIMIT=`ulimit -H -n` | ||||
|     if [ $? -eq 0 ] ; then | ||||
|         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | ||||
|             MAX_FD="$MAX_FD_LIMIT" | ||||
|         fi | ||||
|         ulimit -n $MAX_FD | ||||
|         if [ $? -ne 0 ] ; then | ||||
|             warn "Could not set maximum file descriptor limit: $MAX_FD" | ||||
|         fi | ||||
|     else | ||||
|         warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| # For Darwin, add options to specify how the application appears in the dock | ||||
| if $darwin; then | ||||
|     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | ||||
| fi | ||||
|  | ||||
| # 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 | ||||
|     ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | ||||
|     SEP="" | ||||
|     for dir in $ROOTDIRSRAW ; do | ||||
|         ROOTDIRS="$ROOTDIRS$SEP$dir" | ||||
|         SEP="|" | ||||
|     done | ||||
|     OURCYGPATTERN="(^($ROOTDIRS))" | ||||
|     # Add a user-defined pattern to the cygpath arguments | ||||
|     if [ "$GRADLE_CYGPATTERN" != "" ] ; then | ||||
|         OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | ||||
|     fi | ||||
|     # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||
|     i=0 | ||||
|     for arg in "$@" ; do | ||||
|         CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | ||||
|         CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option | ||||
|  | ||||
|         if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition | ||||
|             eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | ||||
|         else | ||||
|             eval `echo args$i`="\"$arg\"" | ||||
|         fi | ||||
|         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" ;; | ||||
| if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | ||||
|     case $MAX_FD in #( | ||||
|       max*) | ||||
|         MAX_FD=$( ulimit -H -n ) || | ||||
|             warn "Could not query maximum file descriptor limit" | ||||
|     esac | ||||
|     case $MAX_FD in  #( | ||||
|       '' | soft) :;; #( | ||||
|       *) | ||||
|         ulimit -n "$MAX_FD" || | ||||
|             warn "Could not set maximum file descriptor limit to $MAX_FD" | ||||
|     esac | ||||
| fi | ||||
|  | ||||
| # Escape application args | ||||
| save () { | ||||
|     for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | ||||
|     echo " " | ||||
| } | ||||
| APP_ARGS=$(save "$@") | ||||
| # Collect all arguments for the java command, stacking in reverse order: | ||||
| #   * args from the command line | ||||
| #   * the main class name | ||||
| #   * -classpath | ||||
| #   * -D...appname settings | ||||
| #   * --module-path (only if needed) | ||||
| #   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | ||||
|  | ||||
| # 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" | ||||
| # For Cygwin or MSYS, switch paths to Windows format before running java | ||||
| if "$cygwin" || "$msys" ; then | ||||
|     APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | ||||
|     CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | ||||
|  | ||||
| # 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")" | ||||
|     JAVACMD=$( cygpath --unix "$JAVACMD" ) | ||||
|  | ||||
|     # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||
|     for arg do | ||||
|         if | ||||
|             case $arg in                                #( | ||||
|               -*)   false ;;                            # don't mess with options #( | ||||
|               /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath | ||||
|                     [ -e "$t" ] ;;                      #( | ||||
|               *)    false ;; | ||||
|             esac | ||||
|         then | ||||
|             arg=$( cygpath --path --ignore --mixed "$arg" ) | ||||
|         fi | ||||
|         # Roll the args list around exactly as many times as the number of | ||||
|         # args, so each arg winds up back in the position where it started, but | ||||
|         # possibly modified. | ||||
|         # | ||||
|         # NB: a `for` loop captures its iteration list before it begins, so | ||||
|         # changing the positional parameters here affects neither the number of | ||||
|         # iterations, nor the values presented in `arg`. | ||||
|         shift                   # remove old arg | ||||
|         set -- "$@" "$arg"      # push replacement arg | ||||
|     done | ||||
| fi | ||||
|  | ||||
| # Collect all arguments for the java command; | ||||
| #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of | ||||
| #     shell script including quotes and variable substitutions, so put them in | ||||
| #     double quotes to make sure that they get re-expanded; and | ||||
| #   * put everything else in single quotes, so that it's not re-expanded. | ||||
|  | ||||
| set -- \ | ||||
|         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||
|         -classpath "$CLASSPATH" \ | ||||
|         org.gradle.wrapper.GradleWrapperMain \ | ||||
|         "$@" | ||||
|  | ||||
| # Use "xargs" to parse quoted args. | ||||
| # | ||||
| # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||||
| # | ||||
| # In Bash we could simply go: | ||||
| # | ||||
| #   readarray ARGS < <( xargs -n1 <<<"$var" ) && | ||||
| #   set -- "${ARGS[@]}" "$@" | ||||
| # | ||||
| # but POSIX shell has neither arrays nor command substitution, so instead we | ||||
| # post-process each arg (as a line of input to sed) to backslash-escape any | ||||
| # character that might be a shell metacharacter, then use eval to reverse | ||||
| # that process (while maintaining the separation between arguments), and wrap | ||||
| # the whole thing up as a single "set" statement. | ||||
| # | ||||
| # This will of course break if any of these variables contains a newline or | ||||
| # an unmatched quote. | ||||
| # | ||||
|  | ||||
| eval "set -- $( | ||||
|         printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | ||||
|         xargs -n1 | | ||||
|         sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | ||||
|         tr '\n' ' ' | ||||
|     )" '"$@"' | ||||
|  | ||||
| exec "$JAVACMD" "$@" | ||||
|   | ||||
							
								
								
									
										43
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,19 @@ | ||||
| @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 | ||||
| @@ -13,15 +29,18 @@ 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= | ||||
| set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||
|  | ||||
| @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 init | ||||
| if "%ERRORLEVEL%" == "0" goto execute | ||||
|  | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
| @@ -35,7 +54,7 @@ goto fail | ||||
| set JAVA_HOME=%JAVA_HOME:"=% | ||||
| set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||
|  | ||||
| if exist "%JAVA_EXE%" goto init | ||||
| if exist "%JAVA_EXE%" goto execute | ||||
|  | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||||
| @@ -45,28 +64,14 @@ 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 %CMD_LINE_ARGS% | ||||
| "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||||
|  | ||||
| :end | ||||
| @rem End local scope for the variables with windows NT shell | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| (sources | ||||
|   /doc/stub/ | ||||
|   /doc/events/ | ||||
|   /build/docs/luaJavadoc/ | ||||
|   /src/main/resources/*/computercraft/lua/bios.lua | ||||
|   /src/main/resources/*/computercraft/lua/rom/ | ||||
| @@ -10,29 +11,35 @@ | ||||
|  | ||||
|  | ||||
| (doc | ||||
|   (title "CC: Tweaked") | ||||
|   (destination build/docs/lua) | ||||
|   (logo src/main/resources/pack.png) | ||||
|   (index doc/index.md) | ||||
|   (styles src/web/styles.css) | ||||
|   (scripts build/rollup/index.js) | ||||
|   (source-link https://github.com/SquidDev-CC/CC-Tweaked/blob/${commit}/${path}#L${line}) | ||||
|  | ||||
|   (site | ||||
|     (title "CC: Tweaked") | ||||
|     (logo src/main/resources/pack.png) | ||||
|     (url https://tweaked.cc/) | ||||
|     (source-link https://github.com/cc-tweaked/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")) | ||||
|     (generic_peripheral "Generic Peripherals") | ||||
|     (event Events)) | ||||
|  | ||||
|   (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 | ||||
| @@ -54,6 +61,8 @@ | ||||
|       (table space) | ||||
|       (index no-space)) | ||||
|  | ||||
|     (allow-clarifying-parens true) | ||||
|  | ||||
|     ;; 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) | ||||
| @@ -62,6 +71,7 @@ | ||||
|       :max | ||||
|       _CC_DEFAULT_SETTINGS | ||||
|       _CC_DISABLE_LUA51_FEATURES | ||||
|       _HOST | ||||
|       ;; Ideally we'd pick these up from bios.lua, but illuaminate currently | ||||
|       ;; isn't smart enough. | ||||
|       sleep write printError read rs))) | ||||
| @@ -81,27 +91,16 @@ | ||||
|  | ||||
| ;; Suppress warnings for currently undocumented modules. | ||||
| (at | ||||
|   (; Java APIs | ||||
|    /doc/stub/http.lua | ||||
|    /doc/stub/os.lua | ||||
|    /doc/stub/turtle.lua | ||||
|    /doc/stub/global.lua | ||||
|    ; Java generated APIs | ||||
|    /build/docs/luaJavadoc/turtle.lua | ||||
|    ; Peripherals | ||||
|    /build/docs/luaJavadoc/drive.lua | ||||
|    /build/docs/luaJavadoc/speaker.lua | ||||
|    /build/docs/luaJavadoc/printer.lua | ||||
|    ; Generic peripherals | ||||
|    /build/docs/luaJavadoc/fluid_storage.lua | ||||
|    ; Lua APIs | ||||
|   (; Lua APIs | ||||
|    /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)) | ||||
|  | ||||
| ;; Suppress warnings for the BIOS using its own deprecated members for now. | ||||
| (at /src/main/resources/*/computercraft/lua/bios.lua | ||||
| ;; Suppress warnings for various APIs using its own deprecated members. | ||||
| (at | ||||
|   (/src/main/resources/*/computercraft/lua/bios.lua | ||||
|    /src/main/resources/*/computercraft/lua/rom/apis/turtle/turtle.lua) | ||||
|   (linters -var:deprecated)) | ||||
|  | ||||
| (at /src/test/resources/test-rom | ||||
|   | ||||
							
								
								
									
										722
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										722
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,13 +1,511 @@ | ||||
| { | ||||
|   "name": "tweaked.cc", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "tweaked.cc", | ||||
|       "version": "1.0.0", | ||||
|       "license": "BSD-3-Clause", | ||||
|       "dependencies": { | ||||
|         "preact": "^10.5.5", | ||||
|         "tslib": "^2.0.3" | ||||
|       }, | ||||
|       "devDependencies": { | ||||
|         "@rollup/plugin-typescript": "^8.2.5", | ||||
|         "requirejs": "^2.3.6", | ||||
|         "rollup": "^2.33.1", | ||||
|         "rollup-plugin-terser": "^7.0.2", | ||||
|         "typescript": "^4.0.5" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@babel/code-frame": { | ||||
|       "version": "7.16.0", | ||||
|       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", | ||||
|       "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@babel/highlight": "^7.16.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=6.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@babel/helper-validator-identifier": { | ||||
|       "version": "7.15.7", | ||||
|       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", | ||||
|       "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=6.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@babel/highlight": { | ||||
|       "version": "7.16.0", | ||||
|       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", | ||||
|       "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@babel/helper-validator-identifier": "^7.15.7", | ||||
|         "chalk": "^2.0.0", | ||||
|         "js-tokens": "^4.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=6.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@rollup/plugin-typescript": { | ||||
|       "version": "8.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.0.tgz", | ||||
|       "integrity": "sha512-I5FpSvLbtAdwJ+naznv+B4sjXZUcIvLLceYpITAn7wAP8W0wqc5noLdGIp9HGVntNhRWXctwPYrSSFQxtl0FPA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@rollup/pluginutils": "^3.1.0", | ||||
|         "resolve": "^1.17.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=8.0.0" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "rollup": "^2.14.0", | ||||
|         "tslib": "*", | ||||
|         "typescript": ">=3.7.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@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, | ||||
|       "dependencies": { | ||||
|         "@types/estree": "0.0.39", | ||||
|         "estree-walker": "^1.0.1", | ||||
|         "picomatch": "^2.2.2" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">= 8.0.0" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "rollup": "^1.20.0||^2.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@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 | ||||
|     }, | ||||
|     "node_modules/@types/node": { | ||||
|       "version": "16.11.10", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", | ||||
|       "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/ansi-styles": { | ||||
|       "version": "3.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", | ||||
|       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "color-convert": "^1.9.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/buffer-from": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", | ||||
|       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/chalk": { | ||||
|       "version": "2.4.2", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", | ||||
|       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "ansi-styles": "^3.2.1", | ||||
|         "escape-string-regexp": "^1.0.5", | ||||
|         "supports-color": "^5.3.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/color-convert": { | ||||
|       "version": "1.9.3", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", | ||||
|       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "color-name": "1.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/color-name": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", | ||||
|       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/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 | ||||
|     }, | ||||
|     "node_modules/escape-string-regexp": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", | ||||
|       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=0.8.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/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 | ||||
|     }, | ||||
|     "node_modules/fsevents": { | ||||
|       "version": "2.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", | ||||
|       "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", | ||||
|       "dev": true, | ||||
|       "hasInstallScript": true, | ||||
|       "optional": true, | ||||
|       "os": [ | ||||
|         "darwin" | ||||
|       ], | ||||
|       "engines": { | ||||
|         "node": "^8.16.0 || ^10.6.0 || >=11.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/function-bind": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | ||||
|       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/has": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | ||||
|       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "function-bind": "^1.1.1" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">= 0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/has-flag": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", | ||||
|       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/is-core-module": { | ||||
|       "version": "2.8.0", | ||||
|       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", | ||||
|       "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "has": "^1.0.3" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/ljharb" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/jest-worker": { | ||||
|       "version": "26.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", | ||||
|       "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@types/node": "*", | ||||
|         "merge-stream": "^2.0.0", | ||||
|         "supports-color": "^7.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">= 10.13.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/jest-worker/node_modules/has-flag": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/jest-worker/node_modules/supports-color": { | ||||
|       "version": "7.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", | ||||
|       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "has-flag": "^4.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/js-tokens": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", | ||||
|       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/merge-stream": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", | ||||
|       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/path-parse": { | ||||
|       "version": "1.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", | ||||
|       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/picomatch": { | ||||
|       "version": "2.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", | ||||
|       "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=8.6" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/jonschlinkert" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/preact": { | ||||
|       "version": "10.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.1.tgz", | ||||
|       "integrity": "sha512-ydCg+ISIq70vqiThvNWStZWLRjR9U2awP/JAmGdWUKm9+Tyuy+MqVdAIyEByeIspAVtD4GWC/SJtxO8XD4knVA==", | ||||
|       "funding": { | ||||
|         "type": "opencollective", | ||||
|         "url": "https://opencollective.com/preact" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/randombytes": { | ||||
|       "version": "2.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", | ||||
|       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "safe-buffer": "^5.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/requirejs": { | ||||
|       "version": "2.3.6", | ||||
|       "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", | ||||
|       "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", | ||||
|       "dev": true, | ||||
|       "bin": { | ||||
|         "r_js": "bin/r.js", | ||||
|         "r.js": "bin/r.js" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/resolve": { | ||||
|       "version": "1.20.0", | ||||
|       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", | ||||
|       "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "is-core-module": "^2.2.0", | ||||
|         "path-parse": "^1.0.6" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/ljharb" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/rollup": { | ||||
|       "version": "2.60.1", | ||||
|       "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", | ||||
|       "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", | ||||
|       "dev": true, | ||||
|       "bin": { | ||||
|         "rollup": "dist/bin/rollup" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=10.0.0" | ||||
|       }, | ||||
|       "optionalDependencies": { | ||||
|         "fsevents": "~2.3.2" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/rollup-plugin-terser": { | ||||
|       "version": "7.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", | ||||
|       "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@babel/code-frame": "^7.10.4", | ||||
|         "jest-worker": "^26.2.1", | ||||
|         "serialize-javascript": "^4.0.0", | ||||
|         "terser": "^5.0.0" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "rollup": "^2.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/safe-buffer": { | ||||
|       "version": "5.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", | ||||
|       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", | ||||
|       "dev": true, | ||||
|       "funding": [ | ||||
|         { | ||||
|           "type": "github", | ||||
|           "url": "https://github.com/sponsors/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "patreon", | ||||
|           "url": "https://www.patreon.com/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "consulting", | ||||
|           "url": "https://feross.org/support" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     "node_modules/serialize-javascript": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", | ||||
|       "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "randombytes": "^2.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/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, | ||||
|       "engines": { | ||||
|         "node": ">= 8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/source-map-support": { | ||||
|       "version": "0.5.21", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", | ||||
|       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "buffer-from": "^1.0.0", | ||||
|         "source-map": "^0.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/source-map-support/node_modules/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, | ||||
|       "engines": { | ||||
|         "node": ">=0.10.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/supports-color": { | ||||
|       "version": "5.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", | ||||
|       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "has-flag": "^3.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/terser": { | ||||
|       "version": "5.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", | ||||
|       "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "commander": "^2.20.0", | ||||
|         "source-map": "~0.7.2", | ||||
|         "source-map-support": "~0.5.20" | ||||
|       }, | ||||
|       "bin": { | ||||
|         "terser": "bin/terser" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=10" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "acorn": "^8.5.0" | ||||
|       }, | ||||
|       "peerDependenciesMeta": { | ||||
|         "acorn": { | ||||
|           "optional": true | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/tslib": { | ||||
|       "version": "2.3.1", | ||||
|       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", | ||||
|       "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" | ||||
|     }, | ||||
|     "node_modules/typescript": { | ||||
|       "version": "4.5.2", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", | ||||
|       "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", | ||||
|       "dev": true, | ||||
|       "bin": { | ||||
|         "tsc": "bin/tsc", | ||||
|         "tsserver": "bin/tsserver" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=4.2.0" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@babel/code-frame": { | ||||
|       "version": "7.16.0", | ||||
|       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", | ||||
|       "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@babel/highlight": "^7.16.0" | ||||
|       } | ||||
|     }, | ||||
|     "@babel/helper-validator-identifier": { | ||||
|       "version": "7.15.7", | ||||
|       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", | ||||
|       "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@babel/highlight": { | ||||
|       "version": "7.16.0", | ||||
|       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", | ||||
|       "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@babel/helper-validator-identifier": "^7.15.7", | ||||
|         "chalk": "^2.0.0", | ||||
|         "js-tokens": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "@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==", | ||||
|       "version": "8.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.0.tgz", | ||||
|       "integrity": "sha512-I5FpSvLbtAdwJ+naznv+B4sjXZUcIvLLceYpITAn7wAP8W0wqc5noLdGIp9HGVntNhRWXctwPYrSSFQxtl0FPA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@rollup/pluginutils": "^3.1.0", | ||||
| @@ -31,10 +529,51 @@ | ||||
|       "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "16.11.10", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", | ||||
|       "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "ansi-styles": { | ||||
|       "version": "3.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", | ||||
|       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-convert": "^1.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "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==", | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", | ||||
|       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "chalk": { | ||||
|       "version": "2.4.2", | ||||
|       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", | ||||
|       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "ansi-styles": "^3.2.1", | ||||
|         "escape-string-regexp": "^1.0.5", | ||||
|         "supports-color": "^5.3.0" | ||||
|       } | ||||
|     }, | ||||
|     "color-convert": { | ||||
|       "version": "1.9.3", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", | ||||
|       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "color-name": "1.1.3" | ||||
|       } | ||||
|     }, | ||||
|     "color-name": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", | ||||
|       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "commander": { | ||||
| @@ -43,6 +582,12 @@ | ||||
|       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "escape-string-regexp": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", | ||||
|       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "estree-walker": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", | ||||
| @@ -50,9 +595,9 @@ | ||||
|       "dev": true | ||||
|     }, | ||||
|     "fsevents": { | ||||
|       "version": "2.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", | ||||
|       "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", | ||||
|       "version": "2.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", | ||||
|       "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", | ||||
|       "dev": true, | ||||
|       "optional": true | ||||
|     }, | ||||
| @@ -71,31 +616,86 @@ | ||||
|         "function-bind": "^1.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "has-flag": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", | ||||
|       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "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==", | ||||
|       "version": "2.8.0", | ||||
|       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", | ||||
|       "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "jest-worker": { | ||||
|       "version": "26.6.2", | ||||
|       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", | ||||
|       "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/node": "*", | ||||
|         "merge-stream": "^2.0.0", | ||||
|         "supports-color": "^7.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "has-flag": { | ||||
|           "version": "4.0.0", | ||||
|           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||
|           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||
|           "dev": true | ||||
|         }, | ||||
|         "supports-color": { | ||||
|           "version": "7.2.0", | ||||
|           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", | ||||
|           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", | ||||
|           "dev": true, | ||||
|           "requires": { | ||||
|             "has-flag": "^4.0.0" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "js-tokens": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", | ||||
|       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "merge-stream": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", | ||||
|       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "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==", | ||||
|       "version": "1.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", | ||||
|       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "picomatch": { | ||||
|       "version": "2.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", | ||||
|       "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", | ||||
|       "version": "2.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", | ||||
|       "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "preact": { | ||||
|       "version": "10.5.5", | ||||
|       "resolved": "https://registry.npmjs.org/preact/-/preact-10.5.5.tgz", | ||||
|       "integrity": "sha512-5ONLNH1SXMzzbQoExZX4TELemNt+TEDb622xXFNfZngjjM9qtrzseJt+EfiUu4TZ6EJ95X5sE1ES4yqHFSIdhg==" | ||||
|       "version": "10.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.1.tgz", | ||||
|       "integrity": "sha512-ydCg+ISIq70vqiThvNWStZWLRjR9U2awP/JAmGdWUKm9+Tyuy+MqVdAIyEByeIspAVtD4GWC/SJtxO8XD4knVA==" | ||||
|     }, | ||||
|     "randombytes": { | ||||
|       "version": "2.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", | ||||
|       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "safe-buffer": "^5.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "requirejs": { | ||||
|       "version": "2.3.6", | ||||
| @@ -104,22 +704,49 @@ | ||||
|       "dev": true | ||||
|     }, | ||||
|     "resolve": { | ||||
|       "version": "1.18.1", | ||||
|       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", | ||||
|       "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", | ||||
|       "version": "1.20.0", | ||||
|       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", | ||||
|       "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "is-core-module": "^2.0.0", | ||||
|         "is-core-module": "^2.2.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==", | ||||
|       "version": "2.60.1", | ||||
|       "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", | ||||
|       "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "fsevents": "~2.1.2" | ||||
|         "fsevents": "~2.3.2" | ||||
|       } | ||||
|     }, | ||||
|     "rollup-plugin-terser": { | ||||
|       "version": "7.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", | ||||
|       "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@babel/code-frame": "^7.10.4", | ||||
|         "jest-worker": "^26.2.1", | ||||
|         "serialize-javascript": "^4.0.0", | ||||
|         "terser": "^5.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "safe-buffer": { | ||||
|       "version": "5.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", | ||||
|       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "serialize-javascript": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", | ||||
|       "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "randombytes": "^2.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "source-map": { | ||||
| @@ -129,9 +756,9 @@ | ||||
|       "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==", | ||||
|       "version": "0.5.21", | ||||
|       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", | ||||
|       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "buffer-from": "^1.0.0", | ||||
| @@ -146,26 +773,35 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "5.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", | ||||
|       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "has-flag": "^3.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "terser": { | ||||
|       "version": "5.3.8", | ||||
|       "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", | ||||
|       "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", | ||||
|       "version": "5.10.0", | ||||
|       "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", | ||||
|       "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "commander": "^2.20.0", | ||||
|         "source-map": "~0.7.2", | ||||
|         "source-map-support": "~0.5.19" | ||||
|         "source-map-support": "~0.5.20" | ||||
|       } | ||||
|     }, | ||||
|     "tslib": { | ||||
|       "version": "2.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", | ||||
|       "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" | ||||
|       "version": "2.3.1", | ||||
|       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", | ||||
|       "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "4.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", | ||||
|       "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", | ||||
|       "version": "4.5.2", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", | ||||
|       "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", | ||||
|       "dev": true | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -9,10 +9,10 @@ | ||||
|     "tslib": "^2.0.3" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@rollup/plugin-typescript": "^6.1.0", | ||||
|     "@rollup/plugin-typescript": "^8.2.5", | ||||
|     "requirejs": "^2.3.6", | ||||
|     "rollup": "^2.33.1", | ||||
|     "terser": "^5.3.8", | ||||
|     "rollup-plugin-terser": "^7.0.2", | ||||
|     "typescript": "^4.0.5" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| import { readFileSync, promises as fs } from "fs"; | ||||
| import { readFileSync    } from "fs"; | ||||
| import path from "path"; | ||||
|  | ||||
| import typescript from "@rollup/plugin-typescript"; | ||||
| import { terser } from "rollup-plugin-terser"; | ||||
|  | ||||
| const input = "src/web"; | ||||
| const requirejs = readFileSync("node_modules/requirejs/require.js"); | ||||
| @@ -12,7 +13,14 @@ export default { | ||||
|         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" } });`, | ||||
|         // Also suffix a ?v=${date} onto the end in the event we need to require a specific copy-cat version. | ||||
|         banner: ` | ||||
|             ${requirejs} | ||||
|             require.config({ | ||||
|                 paths: { copycat: "https://copy-cat.squiddev.cc" }, | ||||
|                 urlArgs: function(id) { return id == "copycat/embed" ? "?v=20211127" : ""; } | ||||
|             }); | ||||
|         `, | ||||
|         format: "amd", | ||||
|         preferConst: true, | ||||
|         amd: { | ||||
| @@ -27,22 +35,6 @@ export default { | ||||
|  | ||||
|         { | ||||
|             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); | ||||
| @@ -50,6 +42,8 @@ export default { | ||||
|                     ? `export default ${JSON.stringify(code)};\n` | ||||
|                     : null; | ||||
|             }, | ||||
|         } | ||||
|         }, | ||||
|  | ||||
|         terser(), | ||||
|     ], | ||||
| }; | ||||
|   | ||||
| @@ -0,0 +1,19 @@ | ||||
| { | ||||
|   "variants": { | ||||
|     "facing=north": { | ||||
|       "model": "computercraft:block/speaker" | ||||
|     }, | ||||
|     "facing=south": { | ||||
|       "model": "computercraft:block/speaker", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west": { | ||||
|       "model": "computercraft:block/speaker", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east": { | ||||
|       "model": "computercraft:block/speaker", | ||||
|       "y": 90 | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,19 @@ | ||||
| { | ||||
|   "variants": { | ||||
|     "facing=north": { | ||||
|       "model": "computercraft:block/turtle_advanced" | ||||
|     }, | ||||
|     "facing=south": { | ||||
|       "model": "computercraft:block/turtle_advanced", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west": { | ||||
|       "model": "computercraft:block/turtle_advanced", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east": { | ||||
|       "model": "computercraft:block/turtle_advanced", | ||||
|       "y": 90 | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,19 @@ | ||||
| { | ||||
|   "variants": { | ||||
|     "facing=north": { | ||||
|       "model": "computercraft:block/turtle_normal" | ||||
|     }, | ||||
|     "facing=south": { | ||||
|       "model": "computercraft:block/turtle_normal", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west": { | ||||
|       "model": "computercraft:block/turtle_normal", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east": { | ||||
|       "model": "computercraft:block/turtle_normal", | ||||
|       "y": 90 | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,16 @@ | ||||
| { | ||||
|   "variants": { | ||||
|     "modem=false,peripheral=false": { | ||||
|       "model": "computercraft:block/wired_modem_full_off" | ||||
|     }, | ||||
|     "modem=true,peripheral=false": { | ||||
|       "model": "computercraft:block/wired_modem_full_on" | ||||
|     }, | ||||
|     "modem=false,peripheral=true": { | ||||
|       "model": "computercraft:block/wired_modem_full_off_peripheral" | ||||
|     }, | ||||
|     "modem=true,peripheral=true": { | ||||
|       "model": "computercraft:block/wired_modem_full_on_peripheral" | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| { | ||||
|   "variants": { | ||||
|     "facing=down,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_off", | ||||
|       "x": 90, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=up,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_off", | ||||
|       "x": 270, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=north,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_off" | ||||
|     }, | ||||
|     "facing=south,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_off", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_off", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_off", | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=down,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_on", | ||||
|       "x": 90, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=up,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_on", | ||||
|       "x": 270, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=north,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_on" | ||||
|     }, | ||||
|     "facing=south,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_on", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_on", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_advanced_on", | ||||
|       "y": 90 | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| { | ||||
|   "variants": { | ||||
|     "facing=down,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_off", | ||||
|       "x": 90, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=up,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_off", | ||||
|       "x": 270, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=north,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_off" | ||||
|     }, | ||||
|     "facing=south,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_off", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_off", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east,on=false": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_off", | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=down,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_on", | ||||
|       "x": 90, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=up,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_on", | ||||
|       "x": 270, | ||||
|       "y": 90 | ||||
|     }, | ||||
|     "facing=north,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_on" | ||||
|     }, | ||||
|     "facing=south,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_on", | ||||
|       "y": 180 | ||||
|     }, | ||||
|     "facing=west,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_on", | ||||
|       "y": 270 | ||||
|     }, | ||||
|     "facing=east,on=true": { | ||||
|       "model": "computercraft:block/wireless_modem_normal_on", | ||||
|       "y": 90 | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_advanced_top", | ||||
|     "side": "computercraft:block/computer_advanced_side", | ||||
|     "front": "computercraft:block/computer_advanced_front_blink" | ||||
|     "front": "computercraft:block/computer_advanced_front_blink", | ||||
|     "top": "computercraft:block/computer_advanced_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_advanced_top", | ||||
|     "side": "computercraft:block/computer_advanced_side", | ||||
|     "front": "computercraft:block/computer_advanced_front" | ||||
|     "front": "computercraft:block/computer_advanced_front", | ||||
|     "top": "computercraft:block/computer_advanced_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_advanced_top", | ||||
|     "side": "computercraft:block/computer_advanced_side", | ||||
|     "front": "computercraft:block/computer_advanced_front_on" | ||||
|     "front": "computercraft:block/computer_advanced_front_on", | ||||
|     "top": "computercraft:block/computer_advanced_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_command_top", | ||||
|     "side": "computercraft:block/computer_command_side", | ||||
|     "front": "computercraft:block/computer_command_front_blink" | ||||
|     "front": "computercraft:block/computer_command_front_blink", | ||||
|     "top": "computercraft:block/computer_command_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_command_top", | ||||
|     "side": "computercraft:block/computer_command_side", | ||||
|     "front": "computercraft:block/computer_command_front" | ||||
|     "front": "computercraft:block/computer_command_front", | ||||
|     "top": "computercraft:block/computer_command_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_command_top", | ||||
|     "side": "computercraft:block/computer_command_side", | ||||
|     "front": "computercraft:block/computer_command_front_on" | ||||
|     "front": "computercraft:block/computer_command_front_on", | ||||
|     "top": "computercraft:block/computer_command_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_normal_top", | ||||
|     "side": "computercraft:block/computer_normal_side", | ||||
|     "front": "computercraft:block/computer_normal_front_blink" | ||||
|     "front": "computercraft:block/computer_normal_front_blink", | ||||
|     "top": "computercraft:block/computer_normal_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_normal_top", | ||||
|     "side": "computercraft:block/computer_normal_side", | ||||
|     "front": "computercraft:block/computer_normal_front" | ||||
|     "front": "computercraft:block/computer_normal_front", | ||||
|     "top": "computercraft:block/computer_normal_top" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "parent": "block/orientable", | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "top": "computercraft:block/computer_normal_top", | ||||
|     "side": "computercraft:block/computer_normal_side", | ||||
|     "front": "computercraft:block/computer_normal_front_on" | ||||
|     "front": "computercraft:block/computer_normal_front_on", | ||||
|     "top": "computercraft:block/computer_normal_top" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| { | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "side": "computercraft:block/monitor_advanced_4", | ||||
|     "front": "computercraft:block/monitor_advanced_15", | ||||
|     "top": "computercraft:block/monitor_advanced_0" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| { | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "side": "computercraft:block/monitor_normal_4", | ||||
|     "front": "computercraft:block/monitor_normal_15", | ||||
|     "top": "computercraft:block/monitor_normal_0" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| { | ||||
|   "parent": "minecraft:block/orientable", | ||||
|   "textures": { | ||||
|     "side": "computercraft:block/speaker_side", | ||||
|     "front": "computercraft:block/speaker_front", | ||||
|     "top": "computercraft:block/speaker_top" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,4 @@ | ||||
| { | ||||
|   "loader": "computercraft:turtle", | ||||
|   "model": "computercraft:block/turtle_advanced_base" | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "parent": "computercraft:block/turtle_base", | ||||
|   "textures": { | ||||
|     "texture": "computercraft:block/turtle_advanced" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,4 @@ | ||||
| { | ||||
|   "loader": "computercraft:turtle", | ||||
|   "model": "computercraft:block/turtle_normal_base" | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "parent": "computercraft:block/turtle_base", | ||||
|   "textures": { | ||||
|     "texture": "computercraft:block/turtle_normal" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "parent": "minecraft:block/cube_all", | ||||
|   "textures": { | ||||
|     "all": "computercraft:block/wired_modem_face" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "parent": "minecraft:block/cube_all", | ||||
|   "textures": { | ||||
|     "all": "computercraft:block/wired_modem_face_peripheral" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "parent": "minecraft:block/cube_all", | ||||
|   "textures": { | ||||
|     "all": "computercraft:block/wired_modem_face_on" | ||||
|   } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user