mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-03 23:22:59 +00:00 
			
		
		
		
	Compare commits
	
		
			259 Commits
		
	
	
		
			v1.91.2
			...
			v1.16.5-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8755a9e3c8 | ||
| 
						 | 
					985ce43639 | ||
| 
						 | 
					58c2a17dfb | ||
| 
						 | 
					df08ec1d51 | ||
| 
						 | 
					3b4fcaa355 | ||
| 
						 | 
					1102ad6452 | ||
| 
						 | 
					9266b60950 | ||
| 
						 | 
					e0a337a6f0 | ||
| 
						 | 
					24ec601e74 | ||
| 
						 | 
					cbff505297 | ||
| 
						 | 
					c4aef2d4c7 | ||
| 
						 | 
					2ed6692f76 | ||
| 
						 | 
					f075eabc32 | ||
| 
						 | 
					3d1c9d1667 | ||
| 
						 | 
					0028ad8f54 | ||
| 
						 | 
					4c805f1c27 | ||
| 
						 | 
					505543ad94 | ||
| 
						 | 
					644471c6bf | ||
| 
						 | 
					bf87d7faa1 | ||
| 
						 | 
					be95b65488 | ||
| 
						 | 
					7e9f3bd61a | ||
| 
						 | 
					4a74aa8166 | ||
| 
						 | 
					b4ce4361ce | ||
| 
						 | 
					42a3dd24ad | ||
| 
						 | 
					9129da2e3d | ||
| 
						 | 
					668cdcdd39 | ||
| 
						 | 
					2543ebee10 | ||
| 
						 | 
					104a317163 | ||
| 
						 | 
					921802e6c9 | ||
| 
						 | 
					56cfc1a452 | ||
| 
						 | 
					a14b98be22 | ||
| 
						 | 
					76b5c05acc | ||
| 
						 | 
					8b3f1a448f | ||
| 
						 | 
					3de515c617 | ||
| 
						 | 
					ab199cd9b0 | ||
| 
						 | 
					fc4bc9aa05 | ||
| 
						 | 
					9662a106f0 | ||
| 
						 | 
					06b0538b76 | ||
| 
						 | 
					fb128152a5 | ||
| 
						 | 
					f596af059d | ||
| 
						 | 
					52bb06d250 | ||
| 
						 | 
					f3d22444d3 | ||
| 
						 | 
					84a1f63445 | ||
| 
						 | 
					dbe98ac270 | ||
| 
						 | 
					a00775dcbb | ||
| 
						 | 
					2279f5044d | ||
| 
						 | 
					e8d90b94ec | ||
| 
						 | 
					0bf7f3de89 | ||
| 
						 | 
					59266fe6e9 | ||
| 
						 | 
					a198a5241d | ||
| 
						 | 
					b429095f88 | ||
| 
						 | 
					a6c7236fa0 | ||
| 
						 | 
					69deb0c947 | ||
| 
						 | 
					b0d7f690eb | ||
| 
						 | 
					62f93f1b4b | ||
| 
						 | 
					7fe322a93a | ||
| 
						 | 
					de97fa35a8 | ||
| 
						 | 
					25ce9b9bea | ||
| 
						 | 
					59048b3f30 | ||
| 
						 | 
					a960db7ced | ||
| 
						 | 
					6a4f09e7b1 | ||
| 
						 | 
					19d1cc0320 | ||
| 
						 | 
					1a52275dcb | ||
| 
						 | 
					2fc2cf2e29 | ||
| 
						 | 
					80c2fc68aa | ||
| 
						 | 
					7c0664b9f2 | ||
| 
						 | 
					4d1a950fbf | ||
| 
						 | 
					135a3f56a5 | ||
| 
						 | 
					1f117b7c47 | ||
| 
						 | 
					c820e051b3 | ||
| 
						 | 
					01d7aaf062 | ||
| 
						 | 
					1e75e4ff6e | ||
| 
						 | 
					f967a70121 | ||
| 
						 | 
					ac5150a664 | ||
| 
						 | 
					0318e62524 | ||
| 
						 | 
					ca69d755e6 | ||
| 
						 | 
					3ba7acc414 | ||
| 
						 | 
					4c27eea73b | ||
| 
						 | 
					225a64dd6b | ||
| 
						 | 
					1831e81dd4 | ||
| 
						 | 
					a4dd6c24e5 | ||
| 
						 | 
					936742895b | ||
| 
						 | 
					b5d1e618b9 | ||
| 
						 | 
					10aa6c5297 | ||
| 
						 | 
					010ebacd1a | ||
| 
						 | 
					9e002beed7 | ||
| 
						 | 
					6029defb20 | ||
| 
						 | 
					c16aa5f247 | ||
| 
						 | 
					8d27bdca7b | ||
| 
						 | 
					41aa8fa163 | ||
| 
						 | 
					e40fb67b50 | ||
| 
						 | 
					96d46ffd2c | ||
| 
						 | 
					652b7ebba6 | ||
| 
						 | 
					f0d7a1165d | ||
| 
						 | 
					4a20eea852 | ||
| 
						 | 
					ccdd2bf477 | ||
| 
						 | 
					8d8f41a50b | ||
| 
						 | 
					72c78db28b | ||
| 
						 | 
					bf8a992273 | ||
| 
						 | 
					9c214fcd8a | ||
| 
						 | 
					082cc9d2d8 | ||
| 
						 | 
					bff2e81713 | ||
| 
						 | 
					63aa3d8877 | ||
| 
						 | 
					74c5d7e719 | ||
| 
						 | 
					78a685c2cb | ||
| 
						 | 
					a475f55b9c | ||
| 
						 | 
					9353ded2d5 | ||
| 
						 | 
					d197268e53 | ||
| 
						 | 
					9648265056 | ||
| 
						 | 
					264dbc570f | ||
| 
						 | 
					e4ad8bc117 | ||
| 
						 | 
					1b31972092 | ||
| 
						 | 
					6cd9fa9fb2 | ||
| 
						 | 
					d10f297ca0 | ||
| 
						 | 
					9ae5636d41 | ||
| 
						 | 
					a60daf78cf | ||
| 
						 | 
					76e0507c3b | ||
| 
						 | 
					d8e2fab2b1 | ||
| 
						 | 
					5c5e510075 | ||
| 
						 | 
					5a309258af | ||
| 
						 | 
					b0782ec38b | ||
| 
						 | 
					46846a4fde | ||
| 
						 | 
					d955443b21 | ||
| 
						 | 
					57e6c49844 | ||
| 
						 | 
					66dbab7a6b | ||
| 
						 | 
					558976e4ca | ||
| 
						 | 
					3a7470a108 | ||
| 
						 | 
					cf2b332c3c | ||
| 
						 | 
					8984ebcf80 | ||
| 
						 | 
					a28e7e2db3 | ||
| 
						 | 
					3860e2466c | ||
| 
						 | 
					5b31c2536a | ||
| 
						 | 
					98dc7a6e58 | ||
| 
						 | 
					5e0ceda7ce | ||
| 
						 | 
					7fe3ac9222 | ||
| 
						 | 
					a65b8ed04c | ||
| 
						 | 
					3e14b84c23 | ||
| 
						 | 
					1710ad9861 | ||
| 
						 | 
					9c48c99be7 | ||
| 
						 | 
					d10d1b45fe | ||
| 
						 | 
					70a1cf5c5a | ||
| 
						 | 
					b546a10bd6 | ||
| 
						 | 
					2f35bbb538 | ||
| 
						 | 
					891dde43a9 | ||
| 
						 | 
					094e0d4f33 | ||
| 
						 | 
					df40adce20 | ||
| 
						 | 
					e12ce95b2d | ||
| 
						 | 
					bcc0effd00 | ||
| 
						 | 
					64f3aa2dba | ||
| 
						 | 
					515ccfebd3 | ||
| 
						 | 
					0b6dbe7778 | ||
| 
						 | 
					19054684c6 | ||
| 
						 | 
					a72a5e6deb | ||
| 
						 | 
					eb2d9482a2 | ||
| 
						 | 
					95794fdaf3 | ||
| 
						 | 
					af477a401a | ||
| 
						 | 
					27531c161d | ||
| 
						 | 
					a8f208c394 | ||
| 
						 | 
					148d9e9dda | ||
| 
						 | 
					67fc21271b | ||
| 
						 | 
					ce28e2659a | ||
| 
						 | 
					47e4826f2b | ||
| 
						 | 
					9bde2d8d13 | ||
| 
						 | 
					46acb6866e | ||
| 
						 | 
					c0506108f9 | ||
| 
						 | 
					0dd7c3695f | ||
| 
						 | 
					2a290be248 | ||
| 
						 | 
					c4a6c16330 | ||
| 
						 | 
					f8b3b544d1 | ||
| 
						 | 
					53ae689468 | ||
| 
						 | 
					73e460e533 | ||
| 
						 | 
					a4e68d637a | ||
| 
						 | 
					1f1b20c81e | ||
| 
						 | 
					20a9ff7a3f | ||
| 
						 | 
					58cd5e3df7 | ||
| 
						 | 
					5922d7548c | ||
| 
						 | 
					386e01364e | ||
| 
						 | 
					70eff6aa63 | ||
| 
						 | 
					45ac601946 | ||
| 
						 | 
					d6c5a5bd27 | ||
| 
						 | 
					02c7903cb7 | ||
| 
						 | 
					37e856efdc | ||
| 
						 | 
					8a38097887 | ||
| 
						 | 
					884b417ec2 | ||
| 
						 | 
					1d1d6227eb | ||
| 
						 | 
					d5eb82db60 | ||
| 
						 | 
					3575654d02 | ||
| 
						 | 
					79fcc7241b | ||
| 
						 | 
					b203d3aa0a | ||
| 
						 | 
					f1176af9d1 | ||
| 
						 | 
					717686d855 | ||
| 
						 | 
					92811ca0bc | ||
| 
						 | 
					f8a58dbcb1 | ||
| 
						 | 
					98aabe2cfb | ||
| 
						 | 
					f938ed9779 | ||
| 
						 | 
					03c9274b27 | ||
| 
						 | 
					92c94ac039 | ||
| 
						 | 
					5c6fd80b0c | ||
| 
						 | 
					f1ec59df15 | ||
| 
						 | 
					624b23c7ac | ||
| 
						 | 
					9b77a4aaee | ||
| 
						 | 
					d8b0037cfa | ||
| 
						 | 
					91a9e7fdf7 | ||
| 
						 | 
					2c3573719b | ||
| 
						 | 
					46bc42d5a7 | ||
| 
						 | 
					1b9e93a80f | ||
| 
						 | 
					7b93f91ffa | ||
| 
						 | 
					31a1027401 | ||
| 
						 | 
					e0fc994819 | ||
| 
						 | 
					43408bf085 | ||
| 
						 | 
					d28f42e8b7 | ||
| 
						 | 
					ac452582c1 | ||
| 
						 | 
					7e65c6b25c | ||
| 
						 | 
					457a863842 | ||
| 
						 | 
					eef36e1358 | ||
| 
						 | 
					feda08b915 | ||
| 
						 | 
					0240ce50ce | ||
| 
						 | 
					592b83e784 | ||
| 
						 | 
					5d91491ec7 | ||
| 
						 | 
					7326d1110d | ||
| 
						 | 
					0aa6ac05a0 | ||
| 
						 | 
					27a2c063b9 | ||
| 
						 | 
					89a195ec06 | ||
| 
						 | 
					0e5fd4e8e0 | ||
| 
						 | 
					aa4ec53bb6 | ||
| 
						 | 
					6b49327462 | ||
| 
						 | 
					74ad934889 | ||
| 
						 | 
					08b3dbbad5 | ||
| 
						 | 
					54eac0a2f8 | ||
| 
						 | 
					51ca5e620c | ||
| 
						 | 
					076d572831 | ||
| 
						 | 
					75f2b91fef | ||
| 
						 | 
					79534e5630 | ||
| 
						 | 
					d483a91459 | ||
| 
						 | 
					71d764f122 | ||
| 
						 | 
					2e527eb11e | ||
| 
						 | 
					19273b3696 | ||
| 
						 | 
					4643641d51 | ||
| 
						 | 
					63cd9c5bc7 | ||
| 
						 | 
					e9c11ff325 | ||
| 
						 | 
					452464aa01 | ||
| 
						 | 
					8885462175 | ||
| 
						 | 
					b8bd64913b | ||
| 
						 | 
					00b458c39a | ||
| 
						 | 
					88722d484f | ||
| 
						 | 
					6d103e2114 | ||
| 
						 | 
					42f23d56ae | ||
| 
						 | 
					89d5211bd7 | ||
| 
						 | 
					83e70377f7 | ||
| 
						 | 
					f6a26f75c3 | ||
| 
						 | 
					664df62d5d | ||
| 
						 | 
					1348ee0588 | ||
| 
						 | 
					145dce7653 | ||
| 
						 | 
					7f2651c23e | ||
| 
						 | 
					05464107a8 | ||
| 
						 | 
					86705787f0 | ||
| 
						 | 
					b34d8387d9 | ||
| 
						 | 
					4d00969ef0 | ||
| 
						 | 
					01d3d12992 | 
@@ -10,6 +10,3 @@ insert_final_newline = true
 | 
			
		||||
 | 
			
		||||
[*.md]
 | 
			
		||||
trim_trailing_whitespace = false
 | 
			
		||||
 | 
			
		||||
[*.properties]
 | 
			
		||||
insert_final_newline = false
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							@@ -11,5 +11,6 @@ labels: bug
 | 
			
		||||
 | 
			
		||||
## Useful information to include:
 | 
			
		||||
 - Minecraft version
 | 
			
		||||
 - CC: Tweaked version
 | 
			
		||||
 - CC: Restitched 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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/ISSUE_TEMPLATE/peripheral_shoutout.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.github/ISSUE_TEMPLATE/peripheral_shoutout.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
---
 | 
			
		||||
name: Peripheral Shoutout
 | 
			
		||||
about: Made a Peripheral mod for CC:R? Let us know so we can give it a shoutout
 | 
			
		||||
labels: peripheralShoutout
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## What to include?
 | 
			
		||||
 - Link to the mod's Icon
 | 
			
		||||
 - Link to the mod
 | 
			
		||||
 - Mod Name
 | 
			
		||||
 - Basic description of the mod
 | 
			
		||||
 - Link to CC:R Peripheral Documentation for the mod
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								.github/workflows/main-ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								.github/workflows/main-ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
name: Build
 | 
			
		||||
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    name: Build
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v2
 | 
			
		||||
    - name: Checkout submodules
 | 
			
		||||
      run: git submodule update --init --recursive
 | 
			
		||||
 | 
			
		||||
    - name: Set up Java 8
 | 
			
		||||
      uses: actions/setup-java@v1
 | 
			
		||||
      with:
 | 
			
		||||
        java-version: 8
 | 
			
		||||
 | 
			
		||||
    - name: Cache gradle dependencies
 | 
			
		||||
      uses: actions/cache@v2
 | 
			
		||||
      with:
 | 
			
		||||
        path: ~/.gradle/caches
 | 
			
		||||
        key: ${{ runner.os }}-gradle-${{ hashFiles('gradle.properties') }}
 | 
			
		||||
        restore-keys: |
 | 
			
		||||
          ${{ runner.os }}-gradle-
 | 
			
		||||
 | 
			
		||||
    - name: Disable Gradle daemon
 | 
			
		||||
      run: |
 | 
			
		||||
        mkdir -p ~/.gradle
 | 
			
		||||
        echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties
 | 
			
		||||
 | 
			
		||||
    - name: Build with Gradle
 | 
			
		||||
      run: |
 | 
			
		||||
        ./gradlew assemble || ./gradlew assemble
 | 
			
		||||
        ./gradlew build
 | 
			
		||||
 | 
			
		||||
    - name: Upload Jar
 | 
			
		||||
      uses: actions/upload-artifact@v2
 | 
			
		||||
      with:
 | 
			
		||||
        name: cc-restitched
 | 
			
		||||
        path: build/libs
 | 
			
		||||
 | 
			
		||||
    - name: Parse test reports
 | 
			
		||||
      run: ./tools/parse-reports.py
 | 
			
		||||
      if: ${{ failure() }}
 | 
			
		||||
 | 
			
		||||
    - name: Cache pre-commit
 | 
			
		||||
      uses: actions/cache@v2
 | 
			
		||||
      with:
 | 
			
		||||
        path: ~/.cache/pre-commit
 | 
			
		||||
        key: ${{ runner.os }}-pre-commit-${{ hashFiles('config/pre-commit/config.yml') }}
 | 
			
		||||
        restore-keys: |
 | 
			
		||||
          ${{ runner.os }}-pre-commit-
 | 
			
		||||
 | 
			
		||||
    - name: Run linters
 | 
			
		||||
      run: |
 | 
			
		||||
        pip install pre-commit
 | 
			
		||||
        pre-commit run --config config/pre-commit/config.yml --show-diff-on-failure --all --color=always
 | 
			
		||||
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -9,9 +9,15 @@
 | 
			
		||||
/run-*
 | 
			
		||||
/test-files
 | 
			
		||||
 | 
			
		||||
# Autogenerated by IDE
 | 
			
		||||
/bin
 | 
			
		||||
/.settings
 | 
			
		||||
.classpath
 | 
			
		||||
 | 
			
		||||
*.ipr
 | 
			
		||||
*.iws
 | 
			
		||||
*.iml
 | 
			
		||||
.idea
 | 
			
		||||
.gradle
 | 
			
		||||
*.DS_Store
 | 
			
		||||
.project
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
[submodule "src/main/resources/resourcepacks/overhaul"]
 | 
			
		||||
	path = src/main/resources/resourcepacks/overhaul
 | 
			
		||||
	url = https://github.com/3prm3/cc-pack
 | 
			
		||||
							
								
								
									
										19
									
								
								.gitpod.Dockerfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.gitpod.Dockerfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
FROM gitpod/workspace-base
 | 
			
		||||
 | 
			
		||||
USER gitpod
 | 
			
		||||
 | 
			
		||||
# Install custom tools, runtime, etc. using apt-get
 | 
			
		||||
# For example, the command below would install "bastet" - a command line tetris clone:
 | 
			
		||||
#
 | 
			
		||||
# RUN sudo apt-get -q update && \
 | 
			
		||||
#     sudo apt-get install -yq bastet && \
 | 
			
		||||
#     sudo rm -rf /var/lib/apt/lists/*
 | 
			
		||||
#
 | 
			
		||||
# More information: https://www.gitpod.io/docs/config-docker/
 | 
			
		||||
 | 
			
		||||
# Install Java 8 and 16
 | 
			
		||||
RUN sudo apt-get -q update && \
 | 
			
		||||
    sudo apt install -yq openjdk-8-jdk openjdk-16-jdk
 | 
			
		||||
 | 
			
		||||
# This is so that you can use java 8 until such a time as you switch to java 16
 | 
			
		||||
RUN sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
 | 
			
		||||
							
								
								
									
										18
									
								
								.gitpod.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.gitpod.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
image:
 | 
			
		||||
  file: .gitpod.Dockerfile
 | 
			
		||||
 | 
			
		||||
ports:
 | 
			
		||||
  - port: 25565
 | 
			
		||||
    onOpen: notify
 | 
			
		||||
 | 
			
		||||
vscode:
 | 
			
		||||
  extensions:
 | 
			
		||||
    - ms-azuretools.vscode-docker
 | 
			
		||||
    - redhat.java
 | 
			
		||||
    - richardwillis.vscode-gradle
 | 
			
		||||
    - vscjava.vscode-java-debug
 | 
			
		||||
    - vscode.github
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
tasks:
 | 
			
		||||
  - init: ./gradlew
 | 
			
		||||
							
								
								
									
										14
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,14 +0,0 @@
 | 
			
		||||
language: java
 | 
			
		||||
 | 
			
		||||
script: ./gradlew build --no-daemon
 | 
			
		||||
 | 
			
		||||
before_cache:
 | 
			
		||||
  - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
 | 
			
		||||
  - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
 | 
			
		||||
cache:
 | 
			
		||||
  directories:
 | 
			
		||||
    - $HOME/.gradle/caches/
 | 
			
		||||
    - $HOME/.gradle/wrapper/s
 | 
			
		||||
 | 
			
		||||
jdk:
 | 
			
		||||
    - oraclejdk8
 | 
			
		||||
							
								
								
									
										15
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
{
 | 
			
		||||
	"files.exclude": {
 | 
			
		||||
		// Default Java Dev
 | 
			
		||||
        "**/.classpath": true,
 | 
			
		||||
        "**/.project": true,
 | 
			
		||||
        "**/.settings": true,
 | 
			
		||||
        "**/.factorypath": true,
 | 
			
		||||
 | 
			
		||||
		// Custom Hidden Files
 | 
			
		||||
		"**/.bin": true,
 | 
			
		||||
		"**/.editorconfig": true,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
	"java.configuration.updateBuildConfiguration": "automatic"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								README.md
									
									
									
									
									
								
							@@ -1,7 +1,71 @@
 | 
			
		||||
# CC:T for Fabric
 | 
			
		||||
<img src="logo.png" alt="CC: Restitched" width="100%"/>
 | 
			
		||||
 | 
			
		||||
* [Download on CurseForge](https://www.curseforge.com/minecraft/mc-mods/cc-restitched)
 | 
			
		||||
[](https://github.com/Merith-TK/cc-restitched/actions "Current build status")
 | 
			
		||||
[](https://www.curseforge.com/minecraft/mc-mods/cc-restitched "Download CC:  Restitched on CurseForge")
 | 
			
		||||
[](https://gitpod.io/#https://github.com/Merith-TK/cc-restitched)
 | 
			
		||||
 | 
			
		||||
A fork of [CC: Tweaked](https://github.com/SquidDev-CC/CC-Tweaked) for use with the latest Fabric.
 | 
			
		||||
# CC: R Version VS CC: T Version
 | 
			
		||||
CC: R Strives to maintain perfect pairity with CC: T, however in some cases this is not possible, so CC: R might have a "newer" version than what CC: T has, these newer versions will be primarily bugfixes and the like because fabric is "weird" when porting a forge mod.
 | 
			
		||||
 | 
			
		||||
NOTE: This project is currently in alpha stage. It may not be well-tested and stable, so use it at your own peril!
 | 
			
		||||
## What is CC: Restiched
 | 
			
		||||
This is an fork of [Zundrel/cc-tweaked-fabric](https://github.com/Zundrel/cc-tweaked-fabric) who's goal was to port [SquidDev-CC/CC-Tweaked](https://github.com/SquidDev-CC/CC-Tweaked) to the [Fabric](https://fabricmc.net/) modloader. I picked up maintaining the mod because the team working on Zundrel's fork can no longer mantain it so I picked it up to make it as equal as possible with CC: T.
 | 
			
		||||
 | 
			
		||||
## Resource Packs
 | 
			
		||||
This mod includes textures that are more in-line with the style of Mojang's new texture-artist, Jappa. If you prefer the original textures, enable the "Classic" resource pack.
 | 
			
		||||
 | 
			
		||||
<img src="https://raw.githubusercontent.com/3prm3/cc-pack/main/pack.png" alt="CC: Restitched" width="16"  height="16"/> [3prm3/cc-pack](https://github.com/3prm3/cc-pack/)
 | 
			
		||||
We also have a second resourcepack made by [3prm3](https://github.com/3prm3), it features a complete overhaul and can be enabled by enabling the `overhaul` resource pack, go check out his resource pack over here!
 | 
			
		||||
 | 
			
		||||
# Conflicts
 | 
			
		||||
Currently Iris and Canvas Shaders are Incompatible with this mod,
 | 
			
		||||
 - Iris has transparent monitors, and when a computer displays something on the monitor, the face becomes black.
 | 
			
		||||
 - Canvas... uhm...
 | 
			
		||||
	- Computer Terminals are 100% unusable and scuffed
 | 
			
		||||
		<img src="https://user-images.githubusercontent.com/16393543/120464345-ab619b00-c351-11eb-9dfb-e68ddc93de5e.png">
 | 
			
		||||
	- Monitors break with either rendering option.
 | 
			
		||||
		- TBO
 | 
			
		||||
			- Just crashes on world load.
 | 
			
		||||
		- VBO
 | 
			
		||||
			<img src="https://user-images.githubusercontent.com/16393543/120475933-d999a780-c35e-11eb-9d94-ef4e5988ad5f.png">
 | 
			
		||||
## Contributing
 | 
			
		||||
Any contribution is welcome, be that using the mod, reporting bugs or contributing code. In order to start helping develop CC: R there are a few rules;
 | 
			
		||||
1) Any updates that port commits from CC: T, ***MUST*** follow the format defined in [patchwork.md](patchwork.md) otherwise they will not be accepted,
 | 
			
		||||
	* Commit Message must be the same as it is in CC: T ,
 | 
			
		||||
	* patchwork.md must be updated in the following format.
 | 
			
		||||
	> Comments, optional but useful if you had to do something 	differently than in CC: T outside of [Fabric](https://fabricmc.net/)/[Forge](https://mcforge.readthedocs.io/en/1.16.x/) differences.
 | 
			
		||||
	>
 | 
			
		||||
	> \`\`\`
 | 
			
		||||
	>
 | 
			
		||||
	>commitID
 | 
			
		||||
	>
 | 
			
		||||
	> commit title
 | 
			
		||||
	>
 | 
			
		||||
	> commit desc
 | 
			
		||||
	>
 | 
			
		||||
	> \`\`\`
 | 
			
		||||
2) Follow the [Fabric](https://fabricmc.net/) programming guidelines as close as possible. This means you have to use [`loom`](https://fabricmc.net/wiki/tutorial:mappings) mappings,
 | 
			
		||||
3) You cannot intentionally implement bugs and security vulnerabilities.
 | 
			
		||||
4) Unless the commit is a ["patchwork"](https://github.com/Merith-TK/cc-restitched/blob/fabric/patchwork.md) compliant commit, (IE: taken from CC: T), the lua code is off limits.
 | 
			
		||||
## Bleeding Edge Builds
 | 
			
		||||
Bleeding edge builds can be found [here](https://github.com/Merith-TK/cc-restitched/actions) at Github Actions.
 | 
			
		||||
 | 
			
		||||
## Community
 | 
			
		||||
If you need help getting started with CC: Restitched, want to show off your latest project, or just want to chat about ComputerCraft, here is the [Forum](https://forums.computercraft.cc/) and the [Discord](https://discord.gg/H2UyJXe).
 | 
			
		||||
 | 
			
		||||
## Known Issues
 | 
			
		||||
Main Known issue
 | 
			
		||||
* Mods that add blocks that can be used as peripherals for CC: T on forge, don't work with CC: R.
 | 
			
		||||
	* This is because of the differences between forge and fabric, and that mod devs, to my knowledge have not agreed upon a standard method in which to implement cross compatibility between mods,
 | 
			
		||||
* [Fixed (d10f297c): please report if bug persists]</br> ~~Storage Peripherals throw a java "StackOverflowError" when using `pushItems()`,~~
 | 
			
		||||
    * ~~Work around, you are probably using `pushItems(chest, 1)` or similar. please use `pushItems(chest, 1, nil, 1)`.~~
 | 
			
		||||
* Computers will not run built in commands, saying "File not found".
 | 
			
		||||
    * This is a know bug, dont know what causes it, but just restart the computer (`ctrl+r` for one second) and it will work again.
 | 
			
		||||
    * Occurs when server runs `/reload` or a datapack is updated.
 | 
			
		||||
 | 
			
		||||
## Perpherals
 | 
			
		||||
Unfortunately, unlike the original CC: Tweaked project, CC: Restitched, does not have any actual peripheral mods, currently the only one we have is an example for mod devs to get started with making/adding the peripheral API to their mods!
 | 
			
		||||
 | 
			
		||||
If your a mod dev made a mod with CC: R peripheral support, OR if your a player who found a mod with CC: R support, please open an [issue here](https://github.com/Merith-TK/cc-restitched/issues/new?assignees=&labels=peripheralShoutout&template=peripheral_shoutout.md) to let us know so we can add it to the list!
 | 
			
		||||
 | 
			
		||||
*  [CC Peripheral Test](https://github.com/Toad-Dev/cc-peripheral-test)
 | 
			
		||||
	* This is an example mod for how to make peripherals that work as a block, or as a turtle upgrade!
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										99
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								build.gradle
									
									
									
									
									
								
							@@ -1,18 +1,26 @@
 | 
			
		||||
plugins {
 | 
			
		||||
    id 'fabric-loom' version '0.5-SNAPSHOT'
 | 
			
		||||
    id 'fabric-loom' version '0.7-SNAPSHOT'
 | 
			
		||||
    id 'maven-publish'
 | 
			
		||||
    id "checkstyle"
 | 
			
		||||
    id "com.github.hierynomus.license" version "0.15.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceCompatibility = JavaVersion.VERSION_1_8
 | 
			
		||||
targetCompatibility = JavaVersion.VERSION_1_8
 | 
			
		||||
java {
 | 
			
		||||
    toolchain {
 | 
			
		||||
        languageVersion = JavaLanguageVersion.of(8)
 | 
			
		||||
        vendor = JvmVendorSpec.ADOPTOPENJDK
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
version = mod_version
 | 
			
		||||
 | 
			
		||||
group = "dan200.computercraft"
 | 
			
		||||
archivesBaseName = "cc-tweaked-fabric-${mc_version}"
 | 
			
		||||
archivesBaseName = "cc-restiched"
 | 
			
		||||
 | 
			
		||||
repositories {
 | 
			
		||||
    mavenCentral()
 | 
			
		||||
    maven { url 'https://jitpack.io' }
 | 
			
		||||
    maven { url "https://maven.shedaniel.me/" }
 | 
			
		||||
    maven {
 | 
			
		||||
        name "SquidDev"
 | 
			
		||||
        url "https://squiddev.cc/maven"
 | 
			
		||||
@@ -20,45 +28,35 @@ repositories {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
configurations {
 | 
			
		||||
    compile.extendsFrom shade
 | 
			
		||||
    implementation.extendsFrom shade
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    checkstyle "com.puppycrawl.tools:checkstyle:8.25"
 | 
			
		||||
 | 
			
		||||
    minecraft "com.mojang:minecraft:${mc_version}"
 | 
			
		||||
    mappings "net.fabricmc:yarn:${mc_version}+build.${mappings_version}:v2"
 | 
			
		||||
    modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}"
 | 
			
		||||
    modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}"
 | 
			
		||||
 | 
			
		||||
    modImplementation "me.shedaniel.cloth:config-2:${cloth_config_version}"
 | 
			
		||||
    modApi("me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}") {
 | 
			
		||||
        exclude(group: "net.fabricmc.fabric-api")
 | 
			
		||||
    }
 | 
			
		||||
    modImplementation "io.github.prospector:modmenu:${modmenu_version}"
 | 
			
		||||
    modImplementation "me.shedaniel.cloth.api:cloth-utils-v1:${cloth_api_version}"
 | 
			
		||||
 | 
			
		||||
    modApi "me.shedaniel.cloth.api:cloth-utils-v1:${project.cloth_api_version}"
 | 
			
		||||
    include "me.shedaniel.cloth.api:cloth-utils-v1:${project.cloth_api_version}"
 | 
			
		||||
 | 
			
		||||
    implementation "blue.endless:jankson:${jankson_version}"
 | 
			
		||||
    implementation 'com.electronwill.night-config:toml:3.6.3'
 | 
			
		||||
    implementation 'com.google.code.findbugs:jsr305:3.0.2'
 | 
			
		||||
 | 
			
		||||
    include "me.shedaniel.cloth:config-2:${cloth_config_version}"
 | 
			
		||||
    include "blue.endless:jankson:${jankson_version}"
 | 
			
		||||
    include 'javax.vecmath:vecmath:1.5.2'
 | 
			
		||||
    shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT'
 | 
			
		||||
 | 
			
		||||
    compile 'javax.vecmath:vecmath:1.5.2'
 | 
			
		||||
    include "me.shedaniel.cloth.api:cloth-utils-v1:${cloth_api_version}"
 | 
			
		||||
    include 'com.electronwill.night-config:core:3.6.3'
 | 
			
		||||
    include 'com.electronwill.night-config:toml:3.6.3'
 | 
			
		||||
    include "me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}"
 | 
			
		||||
 | 
			
		||||
    shade 'org.squiddev:Cobalt:0.5.1-SNAPSHOT'
 | 
			
		||||
 | 
			
		||||
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
 | 
			
		||||
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
 | 
			
		||||
 | 
			
		||||
    modRuntime "me.shedaniel:RoughlyEnoughItems-api:5.2.10"
 | 
			
		||||
    modRuntime "me.shedaniel:RoughlyEnoughItems:5.2.10"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceSets {
 | 
			
		||||
    main {
 | 
			
		||||
        java {
 | 
			
		||||
            exclude 'dan200/computercraft/shared/integration'
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    modRuntime "me.shedaniel:RoughlyEnoughItems-api:5.12.248"
 | 
			
		||||
    modRuntime "me.shedaniel:RoughlyEnoughItems:5.12.248"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
processResources {
 | 
			
		||||
@@ -95,6 +93,49 @@ jar {
 | 
			
		||||
    from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.hierynomus.gradle.license.tasks.LicenseCheck
 | 
			
		||||
import com.hierynomus.gradle.license.tasks.LicenseFormat
 | 
			
		||||
 | 
			
		||||
license {
 | 
			
		||||
    mapping("java", "SLASHSTAR_STYLE")
 | 
			
		||||
    strictCheck true
 | 
			
		||||
 | 
			
		||||
    ext.year = Calendar.getInstance().get(Calendar.YEAR)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[licenseMain, licenseFormatMain].forEach {
 | 
			
		||||
    it.configure {
 | 
			
		||||
        include("**/*.java")
 | 
			
		||||
        exclude("dan200/computercraft/api/**")
 | 
			
		||||
        header file('config/license/main.txt')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[licenseTest, licenseFormatTest].forEach {
 | 
			
		||||
    it.configure {
 | 
			
		||||
        include("**/*.java")
 | 
			
		||||
        header file('config/license/main.txt')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gradle.projectsEvaluated {
 | 
			
		||||
    tasks.withType(LicenseFormat) {
 | 
			
		||||
        outputs.upToDateWhen { false }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
task licenseAPI(type: LicenseCheck);
 | 
			
		||||
task licenseFormatAPI(type: LicenseFormat);
 | 
			
		||||
[licenseAPI, licenseFormatAPI].forEach {
 | 
			
		||||
    it.configure {
 | 
			
		||||
        source = sourceSets.main.java
 | 
			
		||||
        include("dan200/computercraft/api/**")
 | 
			
		||||
        header file('config/license/api.txt')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// configure the maven publication
 | 
			
		||||
publishing {
 | 
			
		||||
    publications {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										164
									
								
								config/checkstyle/checkstyle.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								config/checkstyle/checkstyle.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,164 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE module PUBLIC
 | 
			
		||||
    "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
 | 
			
		||||
    "https://checkstyle.org/dtds/configuration_1_3.dtd">
 | 
			
		||||
<module name="Checker">
 | 
			
		||||
    <property name="tabWidth" value="4"/>
 | 
			
		||||
    <property name="charset" value="UTF-8" />
 | 
			
		||||
 | 
			
		||||
    <module name="SuppressionFilter">
 | 
			
		||||
	<property name="file" value="${config_loc}/suppressions.xml" />
 | 
			
		||||
    </module>
 | 
			
		||||
 | 
			
		||||
    <module name="BeforeExecutionExclusionFileFilter">
 | 
			
		||||
        <property name="fileNamePattern" value="render_old"/>
 | 
			
		||||
    </module>
 | 
			
		||||
 | 
			
		||||
    <module name="TreeWalker">
 | 
			
		||||
        <!-- Annotations -->
 | 
			
		||||
        <module name="AnnotationLocation" />
 | 
			
		||||
        <module name="AnnotationUseStyle" />
 | 
			
		||||
        <module name="MissingDeprecated" />
 | 
			
		||||
        <module name="MissingOverride" />
 | 
			
		||||
 | 
			
		||||
        <!-- Blocks -->
 | 
			
		||||
        <module name="EmptyBlock" />
 | 
			
		||||
        <module name="EmptyCatchBlock">
 | 
			
		||||
            <property name="exceptionVariableName" value="ignored" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="LeftCurly">
 | 
			
		||||
            <property name="option" value="nl" />
 | 
			
		||||
            <!-- The defaults, minus lambdas. -->
 | 
			
		||||
            <property name="tokens" value="ANNOTATION_DEF,CLASS_DEF,CTOR_DEF,ENUM_CONSTANT_DEF,ENUM_DEF,INTERFACE_DEF,LITERAL_CASE,LITERAL_CATCH,LITERAL_DEFAULT,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,METHOD_DEF,OBJBLOCK,STATIC_INIT" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="NeedBraces">
 | 
			
		||||
            <property name="allowSingleLineStatement" value="true"/>
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="RightCurly">
 | 
			
		||||
            <property name="option" value="alone" />
 | 
			
		||||
        </module>
 | 
			
		||||
 | 
			
		||||
        <!-- Class design. As if we've ever followed good practice here. -->
 | 
			
		||||
        <module name="FinalClass" />
 | 
			
		||||
        <module name="InterfaceIsType" />
 | 
			
		||||
        <module name="MutableException" />
 | 
			
		||||
        <module name="OneTopLevelClass" />
 | 
			
		||||
 | 
			
		||||
        <!-- Coding -->
 | 
			
		||||
        <module name="ArrayTrailingComma" />
 | 
			
		||||
        <module name="EqualsHashCode" />
 | 
			
		||||
        <!-- FallThrough does not handle unreachable code well -->
 | 
			
		||||
        <module name="IllegalInstantiation" />
 | 
			
		||||
        <module name="IllegalThrows" />
 | 
			
		||||
        <module name="ModifiedControlVariable" />
 | 
			
		||||
        <module name="NoClone" />
 | 
			
		||||
        <module name="NoFinalizer" />
 | 
			
		||||
        <module name="OneStatementPerLine" />
 | 
			
		||||
        <module name="PackageDeclaration" />
 | 
			
		||||
        <module name="SimplifyBooleanExpression" />
 | 
			
		||||
        <module name="SimplifyBooleanReturn" />
 | 
			
		||||
        <module name="StringLiteralEquality" />
 | 
			
		||||
        <module name="UnnecessaryParentheses" />
 | 
			
		||||
        <module name="UnnecessarySemicolonAfterTypeMemberDeclaration" />
 | 
			
		||||
        <module name="UnnecessarySemicolonInTryWithResources" />
 | 
			
		||||
        <module name="UnnecessarySemicolonInEnumeration" />
 | 
			
		||||
 | 
			
		||||
        <!-- Imports -->
 | 
			
		||||
        <module name="CustomImportOrder" />
 | 
			
		||||
        <module name="IllegalImport" />
 | 
			
		||||
        <module name="RedundantImport" />
 | 
			
		||||
        <module name="UnusedImports" />
 | 
			
		||||
 | 
			
		||||
        <!-- Javadoc -->
 | 
			
		||||
        <!-- TODO: Missing* checks for the dan200.computercraft.api package? -->
 | 
			
		||||
        <module name="AtclauseOrder" />
 | 
			
		||||
        <module name="InvalidJavadocPosition" />
 | 
			
		||||
        <module name="JavadocBlockTagLocation" />
 | 
			
		||||
        <module name="JavadocMethod"/>
 | 
			
		||||
        <module name="JavadocType"/>
 | 
			
		||||
        <module name="JavadocStyle" />
 | 
			
		||||
        <module name="NonEmptyAtclauseDescription" />
 | 
			
		||||
        <module name="SingleLineJavadoc" />
 | 
			
		||||
        <module name="SummaryJavadocCheck"/>
 | 
			
		||||
 | 
			
		||||
        <!-- Misc -->
 | 
			
		||||
        <module name="ArrayTypeStyle" />
 | 
			
		||||
        <module name="CommentsIndentation" />
 | 
			
		||||
        <module name="Indentation" />
 | 
			
		||||
        <module name="OuterTypeFilename" />
 | 
			
		||||
 | 
			
		||||
        <!-- Modifiers -->
 | 
			
		||||
        <module name="ModifierOrder" />
 | 
			
		||||
        <module name="RedundantModifier" />
 | 
			
		||||
 | 
			
		||||
        <!-- Naming -->
 | 
			
		||||
        <module name="ClassTypeParameterName" />
 | 
			
		||||
        <module name="InterfaceTypeParameterName" />
 | 
			
		||||
        <module name="LambdaParameterName" />
 | 
			
		||||
        <module name="LocalFinalVariableName" />
 | 
			
		||||
        <module name="LocalVariableName" />
 | 
			
		||||
        <module name="MemberName" />
 | 
			
		||||
        <module name="MethodName" />
 | 
			
		||||
        <module name="MethodTypeParameterName" />
 | 
			
		||||
        <module name="PackageName">
 | 
			
		||||
            <property name="format" value="^dan200\.computercraft(\.[a-z][a-z0-9]*)*" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="ParameterName" />
 | 
			
		||||
        <module name="StaticVariableName">
 | 
			
		||||
            <property name="format" value="^[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z_]+)?$" />
 | 
			
		||||
            <property name="applyToPrivate" value="false" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="StaticVariableName">
 | 
			
		||||
            <property name="format" value="^(s_)?[a-z][a-zA-Z0-9]*|CAPABILITY(_[A-Z_]+)?$" />
 | 
			
		||||
            <property name="applyToPrivate" value="true" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="TypeName" />
 | 
			
		||||
 | 
			
		||||
        <!-- Whitespace -->
 | 
			
		||||
        <module name="EmptyForInitializerPad"/>
 | 
			
		||||
        <module name="EmptyForIteratorPad">
 | 
			
		||||
            <property name="option" value="space"/>
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="GenericWhitespace" />
 | 
			
		||||
        <module name="MethodParamPad" />
 | 
			
		||||
        <module name="NoLineWrap" />
 | 
			
		||||
        <module name="NoWhitespaceAfter">
 | 
			
		||||
            <property name="tokens" value="AT,INC,DEC,UNARY_MINUS,UNARY_PLUS,BNOT,LNOT,DOT,ARRAY_DECLARATOR,INDEX_OP" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="NoWhitespaceBefore" />
 | 
			
		||||
        <!-- TODO: Decide on an OperatorWrap style. -->
 | 
			
		||||
        <module name="ParenPad">
 | 
			
		||||
            <property name="option" value="space" />
 | 
			
		||||
            <property name="tokens" value="ANNOTATION,ANNOTATION_FIELD_DEF,CTOR_CALL,CTOR_DEF,ENUM_CONSTANT_DEF,LITERAL_CATCH,LITERAL_DO,LITERAL_FOR,LITERAL_IF,LITERAL_NEW,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_WHILE,METHOD_CALL,METHOD_DEF,RESOURCE_SPECIFICATION,SUPER_CTOR_CALL,LAMBDA" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="ParenPad">
 | 
			
		||||
            <property name="option" value="nospace" />
 | 
			
		||||
            <property name="tokens" value="DOT,EXPR,QUESTION" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="SeparatorWrap">
 | 
			
		||||
            <property name="option" value="eol" />
 | 
			
		||||
            <property name="tokens" value="COMMA,SEMI,ELLIPSIS,ARRAY_DECLARATOR,RBRACK,METHOD_REF" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="SeparatorWrap">
 | 
			
		||||
            <property name="option" value="nl" />
 | 
			
		||||
            <property name="tokens" value="DOT,AT" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="SingleSpaceSeparator" />
 | 
			
		||||
        <module name="TypecastParenPad" />
 | 
			
		||||
        <module name="WhitespaceAfter">
 | 
			
		||||
            <property name="tokens" value="COMMA" />
 | 
			
		||||
        </module>
 | 
			
		||||
        <module name="WhitespaceAround">
 | 
			
		||||
            <property name="allowEmptyConstructors" value="true" />
 | 
			
		||||
            <property name="ignoreEnhancedForColon" value="false" />
 | 
			
		||||
            <property name="tokens" value="ASSIGN,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,EQUAL,GE,GT,LAMBDA,LAND,LCURLY,LE,LITERAL_RETURN,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND" />
 | 
			
		||||
        </module>
 | 
			
		||||
    </module>
 | 
			
		||||
 | 
			
		||||
    <module name="FileTabCharacter" />
 | 
			
		||||
    <module name="NewlineAtEndOfFile" />
 | 
			
		||||
    <module name="RegexpSingleline">
 | 
			
		||||
        <property name="format" value="\s+$"/>
 | 
			
		||||
        <property name="message" value="Trailing whitespace"/>
 | 
			
		||||
    </module>
 | 
			
		||||
</module>
 | 
			
		||||
							
								
								
									
										15
									
								
								config/checkstyle/suppressions.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								config/checkstyle/suppressions.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE suppressions PUBLIC
 | 
			
		||||
    "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
 | 
			
		||||
    "https://checkstyle.org/dtds/suppressions_1_2.dtd">
 | 
			
		||||
<suppressions>
 | 
			
		||||
    <!-- All the config options and method fields. -->
 | 
			
		||||
    <suppress checks="StaticVariableName" files=".*[\\/]ComputerCraft.java" />
 | 
			
		||||
    <suppress checks="StaticVariableName" files=".*[\\/]ComputerCraftAPI.java" />
 | 
			
		||||
 | 
			
		||||
    <!-- Some shadowed fields in mixins can't be renamed -->
 | 
			
		||||
    <suppress checks="StaticVariableName" files=".*[\\/]mixin[\\/].*" />
 | 
			
		||||
 | 
			
		||||
    <!-- The commands API is documented in Lua. -->
 | 
			
		||||
    <suppress checks="SummaryJavadocCheck" files=".*[\\/]CommandAPI.java" />
 | 
			
		||||
</suppressions>
 | 
			
		||||
							
								
								
									
										2491
									
								
								config/idea/codeInspectionSettings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2491
									
								
								config/idea/codeInspectionSettings.xml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										61
									
								
								config/idea/codeStyleSettings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								config/idea/codeStyleSettings.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
<code_scheme name="Project" version="173">
 | 
			
		||||
  <JSON>
 | 
			
		||||
    <option name="OBJECT_WRAPPING" value="1" />
 | 
			
		||||
    <option name="ARRAY_WRAPPING" value="1" />
 | 
			
		||||
  </JSON>
 | 
			
		||||
  <JavaCodeStyleSettings>
 | 
			
		||||
    <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
 | 
			
		||||
      <value />
 | 
			
		||||
    </option>
 | 
			
		||||
    <option name="JD_P_AT_EMPTY_LINES" value="false" />
 | 
			
		||||
    <option name="JD_PRESERVE_LINE_FEEDS" value="true" />
 | 
			
		||||
  </JavaCodeStyleSettings>
 | 
			
		||||
  <codeStyleSettings language="JAVA">
 | 
			
		||||
    <option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
 | 
			
		||||
    <option name="BRACE_STYLE" value="2" />
 | 
			
		||||
    <option name="CLASS_BRACE_STYLE" value="2" />
 | 
			
		||||
    <option name="METHOD_BRACE_STYLE" value="2" />
 | 
			
		||||
    <option name="LAMBDA_BRACE_STYLE" value="5" />
 | 
			
		||||
    <option name="ELSE_ON_NEW_LINE" value="true" />
 | 
			
		||||
    <option name="CATCH_ON_NEW_LINE" value="true" />
 | 
			
		||||
    <option name="FINALLY_ON_NEW_LINE" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_METHOD_CALL_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_METHOD_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_IF_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_WHILE_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_FOR_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_TRY_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_CATCH_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_SWITCH_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_SYNCHRONIZED_PARENTHESES" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACES" value="true" />
 | 
			
		||||
    <option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_TRY_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" />
 | 
			
		||||
    <option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true" />
 | 
			
		||||
    <option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" />
 | 
			
		||||
    <option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="true" />
 | 
			
		||||
    <option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="true" />
 | 
			
		||||
    <option name="IF_BRACE_FORCE" value="1" />
 | 
			
		||||
    <option name="DOWHILE_BRACE_FORCE" value="1" />
 | 
			
		||||
    <option name="WHILE_BRACE_FORCE" value="1" />
 | 
			
		||||
    <option name="FOR_BRACE_FORCE" value="1" />
 | 
			
		||||
    <option name="SPACE_WITHIN_ANNOTATION_PARENTHESES" value="true" />
 | 
			
		||||
    <indentOptions>
 | 
			
		||||
      <option name="CONTINUATION_INDENT_SIZE" value="4" />
 | 
			
		||||
    </indentOptions>
 | 
			
		||||
  </codeStyleSettings>
 | 
			
		||||
  <codeStyleSettings language="JSON">
 | 
			
		||||
    <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
 | 
			
		||||
    <option name="SPACE_WITHIN_BRACKETS" value="true" />
 | 
			
		||||
    <option name="SPACE_WITHIN_BRACES" value="true" />
 | 
			
		||||
    <indentOptions>
 | 
			
		||||
      <option name="INDENT_SIZE" value="4" />
 | 
			
		||||
      <option name="CONTINUATION_INDENT_SIZE" value="4" />
 | 
			
		||||
    </indentOptions>
 | 
			
		||||
  </codeStyleSettings>
 | 
			
		||||
</code_scheme>
 | 
			
		||||
							
								
								
									
										3
									
								
								config/license/api.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								config/license/api.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
Copyright Daniel Ratcliffe, 2011-${year}. This API may be redistributed unmodified and in full only.
 | 
			
		||||
For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
							
								
								
									
										3
									
								
								config/license/main.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								config/license/main.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
Copyright Daniel Ratcliffe, 2011-${year}. Do not distribute without permission.
 | 
			
		||||
Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
							
								
								
									
										49
									
								
								config/pre-commit/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								config/pre-commit/config.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
# See https://pre-commit.com for more information
 | 
			
		||||
# See https://pre-commit.com/hooks.html for more hooks
 | 
			
		||||
repos:
 | 
			
		||||
- repo: https://github.com/pre-commit/pre-commit-hooks
 | 
			
		||||
  rev: v3.2.0
 | 
			
		||||
  hooks:
 | 
			
		||||
  - id: trailing-whitespace
 | 
			
		||||
  - id: end-of-file-fixer
 | 
			
		||||
  - id: check-merge-conflict
 | 
			
		||||
 | 
			
		||||
  # Quick syntax checkers
 | 
			
		||||
  - id: check-xml
 | 
			
		||||
  - id: check-yaml
 | 
			
		||||
  - id: check-toml
 | 
			
		||||
  - id: check-json
 | 
			
		||||
    exclude: "tsconfig\\.json$"
 | 
			
		||||
 | 
			
		||||
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
 | 
			
		||||
  rev: 2.3.5
 | 
			
		||||
  hooks:
 | 
			
		||||
  - id: editorconfig-checker
 | 
			
		||||
    args: ['-disable-indentation']
 | 
			
		||||
    exclude: "^(.*\\.(bat)|LICENSE)$"
 | 
			
		||||
 | 
			
		||||
- repo: local
 | 
			
		||||
  hooks:
 | 
			
		||||
  - id: checkstyle
 | 
			
		||||
    name: Check Java codestyle
 | 
			
		||||
    files: ".*\\.java$"
 | 
			
		||||
    language: system
 | 
			
		||||
    entry: ./gradlew checkstyleMain checkstyleTest
 | 
			
		||||
    pass_filenames: false
 | 
			
		||||
    require_serial: true
 | 
			
		||||
  - id: license
 | 
			
		||||
    name: Check Java license headers
 | 
			
		||||
    files: ".*\\.java$"
 | 
			
		||||
    language: system
 | 
			
		||||
    entry: ./gradlew licenseFormat
 | 
			
		||||
    pass_filenames: false
 | 
			
		||||
    require_serial: true
 | 
			
		||||
 | 
			
		||||
exclude: |
 | 
			
		||||
  (?x)^(
 | 
			
		||||
    src/generated|
 | 
			
		||||
    src/test/resources/test-rom/data/json-parsing/|
 | 
			
		||||
    src/test/server-files/|
 | 
			
		||||
    config/idea/|
 | 
			
		||||
    .vscode/
 | 
			
		||||
  )
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
@@ -2,16 +2,16 @@
 | 
			
		||||
org.gradle.jvmargs=-Xmx1G
 | 
			
		||||
 | 
			
		||||
# Mod properties
 | 
			
		||||
mod_version=1.91.1
 | 
			
		||||
mod_version=1.96.3
 | 
			
		||||
 | 
			
		||||
# Minecraft properties
 | 
			
		||||
mc_version=1.16.2
 | 
			
		||||
mappings_version=31
 | 
			
		||||
mc_version=1.16.5
 | 
			
		||||
mappings_version=9
 | 
			
		||||
 | 
			
		||||
# Dependencies
 | 
			
		||||
cloth_config_version=4.8.1
 | 
			
		||||
fabric_api_version=0.19.0+build.398-1.16
 | 
			
		||||
fabric_loader_version=0.9.2+build.206
 | 
			
		||||
cloth_config_version=4.11.26
 | 
			
		||||
fabric_loader_version=0.11.3
 | 
			
		||||
fabric_api_version=0.32.0+1.16
 | 
			
		||||
jankson_version=1.2.0
 | 
			
		||||
modmenu_version=1.14.6+
 | 
			
		||||
modmenu_version=1.16.9
 | 
			
		||||
cloth_api_version=1.4.5
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,5 @@
 | 
			
		||||
#Tue Jul 07 13:15:43 EDT 2020
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
 | 
			
		||||
distributionBase=GRADLE_USER_HOME
 | 
			
		||||
distributionPath=wrapper/dists
 | 
			
		||||
zipStorePath=wrapper/dists
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
 | 
			
		||||
zipStoreBase=GRADLE_USER_HOME
 | 
			
		||||
zipStorePath=wrapper/dists
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2015 the original author or authors.
 | 
			
		||||
#
 | 
			
		||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
# you may not use this file except in compliance with the License.
 | 
			
		||||
# You may obtain a copy of the License at
 | 
			
		||||
#
 | 
			
		||||
#      https://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
#
 | 
			
		||||
# Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
# See the License for the specific language governing permissions and
 | 
			
		||||
# limitations under the License.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
##############################################################################
 | 
			
		||||
##
 | 
			
		||||
##  Gradle start up script for UN*X
 | 
			
		||||
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
 | 
			
		||||
APP_BASE_NAME=`basename "$0"`
 | 
			
		||||
 | 
			
		||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
			
		||||
DEFAULT_JVM_OPTS=""
 | 
			
		||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 | 
			
		||||
 | 
			
		||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
			
		||||
MAX_FD="maximum"
 | 
			
		||||
@@ -66,6 +82,7 @@ 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
 | 
			
		||||
@@ -109,10 +126,11 @@ 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
 | 
			
		||||
# For Cygwin or MSYS, switch paths to Windows format before running java
 | 
			
		||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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
 | 
			
		||||
@@ -138,19 +156,19 @@ if $cygwin ; then
 | 
			
		||||
        else
 | 
			
		||||
            eval `echo args$i`="\"$arg\""
 | 
			
		||||
        fi
 | 
			
		||||
        i=$((i+1))
 | 
			
		||||
        i=`expr $i + 1`
 | 
			
		||||
    done
 | 
			
		||||
    case $i in
 | 
			
		||||
        (0) set -- ;;
 | 
			
		||||
        (1) set -- "$args0" ;;
 | 
			
		||||
        (2) set -- "$args0" "$args1" ;;
 | 
			
		||||
        (3) set -- "$args0" "$args1" "$args2" ;;
 | 
			
		||||
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
			
		||||
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
			
		||||
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
			
		||||
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
			
		||||
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
			
		||||
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
			
		||||
        0) set -- ;;
 | 
			
		||||
        1) set -- "$args0" ;;
 | 
			
		||||
        2) set -- "$args0" "$args1" ;;
 | 
			
		||||
        3) set -- "$args0" "$args1" "$args2" ;;
 | 
			
		||||
        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
			
		||||
        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
			
		||||
        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
			
		||||
        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
			
		||||
        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
			
		||||
        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
			
		||||
    esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -159,14 +177,9 @@ save () {
 | 
			
		||||
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
 | 
			
		||||
    echo " "
 | 
			
		||||
}
 | 
			
		||||
APP_ARGS=$(save "$@")
 | 
			
		||||
APP_ARGS=`save "$@"`
 | 
			
		||||
 | 
			
		||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
 | 
			
		||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 | 
			
		||||
 | 
			
		||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
 | 
			
		||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
 | 
			
		||||
  cd "$(dirname "$0")"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exec "$JAVACMD" "$@"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								logo.png
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								logo.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 8.1 KiB  | 
							
								
								
									
										627
									
								
								patchwork.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										627
									
								
								patchwork.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,627 @@
 | 
			
		||||
# Just my list of things I have ported over
 | 
			
		||||
 | 
			
		||||
Format for the changelog of ported stuff
 | 
			
		||||
```
 | 
			
		||||
commit    // Shows commit from CC:T
 | 
			
		||||
commit2   // Shows a commit that is the same thing, just a clean up, only if right after
 | 
			
		||||
Title     // Commit Title
 | 
			
		||||
SubScript // Desc of commit
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If a edit that is present in CC:T is not needed, I will skip over it.
 | 
			
		||||
Any and all references to an issue number, are to be found on CC:T's repo.
 | 
			
		||||
 | 
			
		||||
Any commit that starts with `[Patchwork]` are purely edits made by my hand, and not based on other commits from CC:T, this is to help differentiate my changes from the official changes
 | 
			
		||||
 | 
			
		||||
Lines that are found above a commit in this log like this one, (excluding this one) are comments about how i had to implement things that are not a simple 1:1 (excluding fabric/forge differences) conversion
 | 
			
		||||
 | 
			
		||||
```md
 | 
			
		||||
5155e18de279a193c558aa029963486fd1294769
 | 
			
		||||
Added translation for Vietnamese
 | 
			
		||||
Co-authored-by: Boom <boom@flyingpackets.net>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
7e121ff72f2b1504cd6af47b57500876682bac45
 | 
			
		||||
ae6124d1f477487abab1858abde8c4ec49dfee3c
 | 
			
		||||
Translations for Vienamese
 | 
			
		||||
Co-authored-by: Boom <boom@flyingpackets.net>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
59de21eae29849988e77fad6bc335f5ce78dfec7
 | 
			
		||||
Handle tabs when parsing JSON
 | 
			
		||||
Fixes #539
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
748ebbe66bf0a4239bde34f557e4b4b75d61d990
 | 
			
		||||
Bump to 1.92.0
 | 
			
		||||
A tiny release, but there's new features so it's technically a minor
 | 
			
		||||
bump.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Cherry Picked because this update was partially related to forge updates rather than mod updates
 | 
			
		||||
```
 | 
			
		||||
8b4a01df27ff7f6fa9ffd9c2188c6e3166edd515
 | 
			
		||||
Update to Minecraft 1.16.3
 | 
			
		||||
 | 
			
		||||
I hope the Fabric folks now realise this is gonna be a race of who can
 | 
			
		||||
update first :p. Either way, this was a very easy update - only changes
 | 
			
		||||
were due to unrelated Forge changes.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
87393e8aef9ddfaca465d626ee7cff5ff499a7e8
 | 
			
		||||
Fix additional `-` in docs
 | 
			
		||||
 | 
			
		||||
Why isn't this automatically stripped! Bad squid.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
275ca58a82c627128a145a8754cbe32568536bd9
 | 
			
		||||
HTTP rules now allow filtering by port
 | 
			
		||||
 | 
			
		||||
The HTTP filtering system becomes even more complex! Though in this
 | 
			
		||||
case, it's pretty minimal, and definitely worth doing.
 | 
			
		||||
 | 
			
		||||
For instance, the following rule will allow connecting to localhost on
 | 
			
		||||
port :8080.
 | 
			
		||||
 | 
			
		||||
    [[http.rules]]
 | 
			
		||||
    host = "127.0.0.1"
 | 
			
		||||
    port = 8080
 | 
			
		||||
    action = "allow"
 | 
			
		||||
 | 
			
		||||
    # Other rules as before.
 | 
			
		||||
 | 
			
		||||
Closes #540
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The alterations in ColourUtils.java were not needed so they were not ported over
 | 
			
		||||
```
 | 
			
		||||
6f868849ab2f264508e12c184cc56f2632aaf5bc
 | 
			
		||||
Use tags to check if something is a dye
 | 
			
		||||
 | 
			
		||||
We half did this already, just needed to change a couple of checks.
 | 
			
		||||
Closes #541.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
6cee4efcd3610536ee74330cd728f7371011e5a8
 | 
			
		||||
Fix incorrect open container check
 | 
			
		||||
 | 
			
		||||
Was this always broken, or did it happen in a Minecraft update? Don't
 | 
			
		||||
know, but it's a very silly mistake either way. Fixes #544
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
0832974725b2478c5227b81f82c35bbf03cf6aba
 | 
			
		||||
Translations for Swedish
 | 
			
		||||
 | 
			
		||||
Co-authored-by: David Isaksson <davidisaksson93@gmail.com>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
84036d97d99efd8762e0170002060ae3471508bf
 | 
			
		||||
Fix io.open documentation
 | 
			
		||||
 | 
			
		||||
Well, that was silly.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
I set the default properties for computers as `Block.GLASS` and then set their strength to `2F` and their soundgroup to stone
 | 
			
		||||
```
 | 
			
		||||
8472112fc1eaad18ed6ed2c6c62b040fe421e81a
 | 
			
		||||
Don't propagate adjacent redstone signals for computers (#549)
 | 
			
		||||
 | 
			
		||||
Minecraft propagates "strong" redstone signals (such as those directly
 | 
			
		||||
from comparators or repeaters) through solid blocks. This includes
 | 
			
		||||
computers, which is a little annoying as it means one cannot feed
 | 
			
		||||
redstone wire from one side and a repeater from another.
 | 
			
		||||
 | 
			
		||||
This changes computers to not propagate strong redstone signals, in the
 | 
			
		||||
same way transparent blocks like glass do.
 | 
			
		||||
 | 
			
		||||
Closes #548.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
30d35883b83831900b34040f0131c7e06f5c3e52
 | 
			
		||||
Fix my docs
 | 
			
		||||
 | 
			
		||||
Thanks @plt-hokusai. Kinda embarrassing this slipped through - I
 | 
			
		||||
evidently need to lint examples too.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
34a2c835d412c0d9e1fb20a42b7f2cd2738289c7
 | 
			
		||||
Add color table to docs (#553)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
All API Documentation updates,
 | 
			
		||||
`Not Needed` for this repo.
 | 
			
		||||
```
 | 
			
		||||
93068402a2ffec00eedb8fe2d859ebdc005a1989
 | 
			
		||||
Document remaining OS functions (#554)
 | 
			
		||||
 | 
			
		||||
01d81cb91da938836f953b290ad6b8fc87cb7e35
 | 
			
		||||
Update illuaminate CSS for deprecation (#556)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Not Needed
 | 
			
		||||
4766833cf2d041ed179529eecb9402ad09b2b79b
 | 
			
		||||
Bump JEI/crafttweaker versions
 | 
			
		||||
 | 
			
		||||
In my defence, they weren't out when I started the 1.15 update.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
bf6053906dc6a3c7b0d40d5b097e745dce1f33bc
 | 
			
		||||
Fix TBO norm issues on old GPUs
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Not Needed
 | 
			
		||||
113b560a201dbdea9de2a2ef536bcce1d6e51978
 | 
			
		||||
Update configuration to match latest illuaminate
 | 
			
		||||
 | 
			
		||||
Ooooooh, it's all fancy now. Well, that or horrifically broken.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
c334423d42ba3b653ac3a8c27bce7970457f8f96
 | 
			
		||||
Add function to get window visibility
 | 
			
		||||
 | 
			
		||||
Closes #562
 | 
			
		||||
 | 
			
		||||
Co-authored-by: devomaa <lmao@distruzione.org>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[WARN] Could not implement changes to the following files
 | 
			
		||||
* `src/main/java/dan200/computercraft/ComputerCraft.java` < Structure too different, cannot find equivalent to alter
 | 
			
		||||
* `src/main/java/dan200/computercraft/shared/Config.java` < Files Does not exist in this repo
 | 
			
		||||
```
 | 
			
		||||
84a6bb1cf3b0668ddc7d8c409a2477a42390e3f7
 | 
			
		||||
Make generic peripherals on by default
 | 
			
		||||
 | 
			
		||||
This is a long way away from "feature complete" as it were. However,
 | 
			
		||||
it's definitely at a point where it's suitable for general usage - I'm
 | 
			
		||||
happy with the API, and don't think I'm going to be breaking things any
 | 
			
		||||
time soon.
 | 
			
		||||
 | 
			
		||||
That said, things aren't exposed yet for Java-side public consumption. I
 | 
			
		||||
was kinda waiting until working on Plethora to actually do that, but not
 | 
			
		||||
sure if/when that'll happen.
 | 
			
		||||
 | 
			
		||||
If someone else wants to work on an integration mod (or just adding
 | 
			
		||||
integrations for their own mod), do get in touch and I can work out how
 | 
			
		||||
to expose this.
 | 
			
		||||
 | 
			
		||||
Closes #452
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Not Needed
 | 
			
		||||
6aae4e576621090840724e094aa25e51696530fc
 | 
			
		||||
Remove superfluous imports
 | 
			
		||||
 | 
			
		||||
Hah, this is embarassing
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[TODO] [M3R1-01] Code has been applied, players still dont get achievments
 | 
			
		||||
```
 | 
			
		||||
f6160bdc57b3d9850607c2c7c2ce9734b4963478
 | 
			
		||||
Fix players not getting advancements when they own turtles
 | 
			
		||||
 | 
			
		||||
When we construct a new ServerPlayerEntity (and thus TurtlePlayer), we
 | 
			
		||||
get the current (global) advancement state and call .setPlayer() on it.
 | 
			
		||||
 | 
			
		||||
As grantCriterion blocks FakePlayers from getting advancements, this
 | 
			
		||||
means a player will no longer receive any advancements, as the "wrong"
 | 
			
		||||
player object is being consulted.
 | 
			
		||||
 | 
			
		||||
As a temporary work around, we attempt to restore the previous player to
 | 
			
		||||
the advancement store. I'll try to upstream something into Forge to
 | 
			
		||||
resolve this properly.
 | 
			
		||||
 | 
			
		||||
Fixes #564
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
17a932920711a5c0361a5048c9e0a5e7a58e6364
 | 
			
		||||
Bump cct-javadoc version
 | 
			
		||||
 | 
			
		||||
Documentation will now be sorted (somewhat) correctly!
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
a6fcfb6af2fc1bef8ca3a19122c9267549202424
 | 
			
		||||
Draw in-hand pocket computers with blending
 | 
			
		||||
 | 
			
		||||
It might be worth switching to RenderTypes here, rather than a pure
 | 
			
		||||
Tesselator, but this'll do for now.
 | 
			
		||||
 | 
			
		||||
Fixes Zundrel/cc-tweaked-fabric#20.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
c58441b29c3715f092e7f3747bb3ec65ae5a3d29
 | 
			
		||||
Various SNBT parsing improvements
 | 
			
		||||
 | 
			
		||||
Correctly handle:
 | 
			
		||||
 - Typed arrays ([I; 1, 2, 3])
 | 
			
		||||
 - All suffixed numbers (1.2d)
 | 
			
		||||
 - Single-quoted strings
 | 
			
		||||
 | 
			
		||||
Fixes #559
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
e2a635b6e5f5942f999213434054e06833c5cb06
 | 
			
		||||
Dont fail when codecov is being finicky
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
666e83cf4fd0eb327f465d5b919a708790f99b00
 | 
			
		||||
Fix JSON objects failing to pass
 | 
			
		||||
 | 
			
		||||
Maybe I should run the whole test suite, not just the things I think
 | 
			
		||||
matter? Nah....
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
741adfa7bb2b950d2851c3f0072d6a4769f22773
 | 
			
		||||
 | 
			
		||||
Use blit to draw boxes, add colors.toBlit (#570)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
d13bd2cce8d102ad7f61f557e707d6fe3731bc37
 | 
			
		||||
 | 
			
		||||
use arg[0] in all usage printouts (#571)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
74ac5bb3d17e5bee30643a5d6702696600c06229
 | 
			
		||||
 | 
			
		||||
Bump to 1.94.0
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[TODO] [M3R1-02] Zero Clue how to reimplement this in fabric.
 | 
			
		||||
```
 | 
			
		||||
c8aeddedd4ed430f9cb6428676ebb4fa39834182
 | 
			
		||||
 | 
			
		||||
Auto-generate monitor models
 | 
			
		||||
 | 
			
		||||
I didn't think it was worth it, and then I found myself needing to
 | 
			
		||||
update a dozen of them. The code isn't especially pretty, but it works,
 | 
			
		||||
so that's fine.
 | 
			
		||||
 | 
			
		||||
Also fixes several issues with us using the wrong texture (closes #572).
 | 
			
		||||
I've put together a wiki page[1] which describes each texture in a
 | 
			
		||||
little more detail.
 | 
			
		||||
 | 
			
		||||
[1] https://github.com/SquidDev-CC/CC-Tweaked/wiki/Monitor-texture-reference
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
7f90f2f7cadce0d5b9177b16626979591bce8137
 | 
			
		||||
 | 
			
		||||
Clean up some examples a little bit
 | 
			
		||||
 | 
			
		||||
Would be good if they didn't crash and burn on entry :).
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
f194f4fa3a17c48ff1a9088d50063f4a675a23b6
 | 
			
		||||
 | 
			
		||||
Fix epoch documentation to use milliseconds (#580)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
d2a1a00dc43e5b65f6b64111ce76dd3db16c919f
 | 
			
		||||
 | 
			
		||||
Clear gets an option to reset the palette (#582)
 | 
			
		||||
 | 
			
		||||
Fixes #555.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
aab0cd34cd64fdf837ff1c3b91a957a25c2cf7f9
 | 
			
		||||
 | 
			
		||||
Use term.blit on original paint render
 | 
			
		||||
 | 
			
		||||
This makes it super speedy, meaning an initial refresh doesn't take ages
 | 
			
		||||
to load.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
b0651082f472baee8f0fa8ec7ba95f433e2637bb
 | 
			
		||||
 | 
			
		||||
Cleanup examples for the various modules
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Ignored Documentation Changes, these are locate
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
9a749642d294506095e697a3a4345dfe260bd68c
 | 
			
		||||
 | 
			
		||||
Strict Globals (#583)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
fff8353451451be5ae31e0f63d8e529b127fd186
 | 
			
		||||
 | 
			
		||||
Remove extra space (#586)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
486f41f08286ddcfad91d72b83a9361bd9c215cb
 | 
			
		||||
 | 
			
		||||
Fixed length check on function name in `expect` (#589)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
04f9644ae75dafc72da4c4790f334d2e90b03e6f
 | 
			
		||||
 | 
			
		||||
Allow strings or numbers in textutils.*tabulate
 | 
			
		||||
 | 
			
		||||
A little dubious, but apparently CC used to support it. This means we're
 | 
			
		||||
consistent with methods like io.write or string.len which accept strings
 | 
			
		||||
or numbers.
 | 
			
		||||
 | 
			
		||||
Fixes #591
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
d4199064ae5ae8023c589f80f12d94e1c6bbc2b5
 | 
			
		||||
 | 
			
		||||
Make fs.combine accept multiple arguments
 | 
			
		||||
 | 
			
		||||
Means we can now do fs.combine("a", "b", "c"). Of course, one may just
 | 
			
		||||
write "a/b/c" in this case, but it's definitely useful elsewhere.
 | 
			
		||||
 | 
			
		||||
This is /technically/ a breaking change as fs.combine(a, b:gsub(...))
 | 
			
		||||
will no longer function (as gsub returns multiple arguments). However,
 | 
			
		||||
I've done a quick search through GH and my Pastebin archives and can't
 | 
			
		||||
find any programs which would break. Fingers crossed.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
24af36743d08fcdb58439c52bf587b33ed828263
 | 
			
		||||
 | 
			
		||||
Try to handle a turtle being broken while ticked
 | 
			
		||||
 | 
			
		||||
Hopefully fixes #585. Hopefully.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
511eea39a11956c82e2c11a47b2e7cad27f9887e
 | 
			
		||||
 | 
			
		||||
Remove <!-- -->s in usages
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
826797cbd579e867f0f35f0be44b6a28c8c094a9
 | 
			
		||||
 | 
			
		||||
Added documentation for global functions (#592)
 | 
			
		||||
```
 | 
			
		||||
Didn't port the docs over.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
d83a68f3ff6e3833278a38798d06215293656e85
 | 
			
		||||
 | 
			
		||||
Allow $private HTTP rule to block any private IP
 | 
			
		||||
```
 | 
			
		||||
The config still uses a `blacklist` and `whitelist` array.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
24d3777722812f975d2bc4594437fbbb0431d910
 | 
			
		||||
 | 
			
		||||
Added improved help viewer (#595)
 | 
			
		||||
```
 | 
			
		||||
Didn't port the lua tests over.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
737b3cb57696fb5517252e7db38bc88ce960b4d8
 | 
			
		||||
 | 
			
		||||
Don't use capabilities for generic peripherals
 | 
			
		||||
```
 | 
			
		||||
Not ported, related to forges capability system which is not used in the port.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
ea3a16036794357c3a44edffc90fdb652e03881e
 | 
			
		||||
 | 
			
		||||
Remove a couple of todos
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
bb8f4c624bf87169b73fb631d8250cfc38181e15
 | 
			
		||||
 | 
			
		||||
Some sanity checks for get{Direction,Orientation}
 | 
			
		||||
```
 | 
			
		||||
Use `getCachedState` instead of forge's `getBlockState` and `contains` instead of `has`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
05c3c8ad3269c9025757f9261e7f609889fb6bdc
 | 
			
		||||
 | 
			
		||||
Generate docs for generic peripherals
 | 
			
		||||
```
 | 
			
		||||
Skipped everything except some removed whitespace.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
85cf2d5ff1b63010de4661301801aa504e5b9015
 | 
			
		||||
 | 
			
		||||
Docs for energy and inventory methods
 | 
			
		||||
```
 | 
			
		||||
and
 | 
			
		||||
```
 | 
			
		||||
5865e9c41a0140b9f1acdd2fb095353c467fbb45
 | 
			
		||||
 | 
			
		||||
Not sure what irritates me more
 | 
			
		||||
```
 | 
			
		||||
both skipped because the changes where already ported.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
4ae370b9dbaf1de0ed32a5f32340b1448136c9cc
 | 
			
		||||
 | 
			
		||||
Merge pull request #606 from TheWireLord/numpadenter-support
 | 
			
		||||
```
 | 
			
		||||
Just lua changes.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
f5eb6ce03e0d9bbbf77130452afd4b49e758f7bd
 | 
			
		||||
 | 
			
		||||
Fix copy-paste error in inventory docs
 | 
			
		||||
```
 | 
			
		||||
Skipped because it was already ported.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
663859d2e5a97edefebf9ac36206903d7dd33a3e
 | 
			
		||||
Fix double URL decode
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
abf425dfb5553483cdc51c50a6b7d8b5e44814f4
 | 
			
		||||
 | 
			
		||||
Fix overflow in os.epoch
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
e3a672099c1b5d2c06f9fe4d8ccd024fef0873a2
 | 
			
		||||
 | 
			
		||||
Fix JEI integration with turtle/pocket upgrades
 | 
			
		||||
```
 | 
			
		||||
Skipped because there seems to be no REI integration.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
2f0cae0bc1b038ac092bafa7f65a317537203cd8
 | 
			
		||||
 | 
			
		||||
Make upgrade recipe requirements a little more lax
 | 
			
		||||
```
 | 
			
		||||
[TODO] [JUMT-01] Crafting is still messed up, but this port didn't change the behavior.
 | 
			
		||||
[TODO] [JUMT-02] Tag comparison code doesn't need to be that verbose, a simple `isEqual` check would suffice.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
7f9a707f75636d5816f752dc93d7b6b998c61a03
 | 
			
		||||
 | 
			
		||||
Bump version to 1.95.0
 | 
			
		||||
```
 | 
			
		||||
Changed the name from CC: Tweaked to CC: Restitched in the changelog and whatsnew files. New version is 1.95.0-beta.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
4af5bcc0b0ff464e7e7428c389d47140580ea7a7
 | 
			
		||||
 | 
			
		||||
Fix serveral 1.15 -> 1.16 issues
 | 
			
		||||
```
 | 
			
		||||
Skipped, changes where already made.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
b8d5a89446ac02fc5b38cc5c0b4805de9d11a7d5
 | 
			
		||||
 | 
			
		||||
Add explicit @module annotation
 | 
			
		||||
```
 | 
			
		||||
Tiny lua change.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
8b17ec76a8e94251803e6f4ba4e65970c6a70b7f
 | 
			
		||||
 | 
			
		||||
Fixed missing argument names in file handle docs (#632)
 | 
			
		||||
```
 | 
			
		||||
A java doc change.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
e4b0a5b3ce035eb23feb4191432fc49af5772c5b
 | 
			
		||||
 | 
			
		||||
2020 -> 2021
 | 
			
		||||
```
 | 
			
		||||
A huge amount of changes.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
542b66c79a9b08e080c39c9a73d74ffe71c0106a
 | 
			
		||||
 | 
			
		||||
Add back command computer block drops
 | 
			
		||||
```
 | 
			
		||||
Didn't port some forge-related changes, but it works.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
dd6f97622e6c18ce0d8988da6a5bede45c94ca5d
 | 
			
		||||
 | 
			
		||||
Prevent reflection errors crashing the game
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
92be0126df63927d07fc695945f8b98e328f945a
 | 
			
		||||
 | 
			
		||||
Fix disk recipes
 | 
			
		||||
```
 | 
			
		||||
Dye recipes actually work now.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
1edb7288b974aec3764b0a820edce7e9eee38e66
 | 
			
		||||
 | 
			
		||||
Merge branch 'mc-1.15.x' into mc-1.16.x
 | 
			
		||||
```
 | 
			
		||||
New version: 1.95.1.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
41226371f3b5fd35f48b6d39c2e8e0c277125b21
 | 
			
		||||
 | 
			
		||||
Add isReadOnly to fs.attributes (#639)
 | 
			
		||||
```
 | 
			
		||||
Also changed some lua test files, but made the changes anyway.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
b2e54014869fac4b819b01b6c24e550ca113ce8a
 | 
			
		||||
 | 
			
		||||
Added Numpad Enter Support in rom lua programs. (#657)
 | 
			
		||||
```
 | 
			
		||||
Just lua changes.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
247c05305d106af430fcdaee41371a152bf7c38c
 | 
			
		||||
 | 
			
		||||
Fix problem with RepeatArgumentType
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
c864576619751077a0d8ac1a18123e14b095ec03
 | 
			
		||||
 | 
			
		||||
Fix impostor recipes for disks
 | 
			
		||||
```
 | 
			
		||||
[TODO] [JUMT-03] REI still shows white disks, probably because it doesn' show nbt items.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
c5694ea9661c7a40021ebd280c378bd7bdc56988
 | 
			
		||||
 | 
			
		||||
Merge branch 'mc-1.15.x' into mc-1.16.x
 | 
			
		||||
```
 | 
			
		||||
Update to 1.16.4.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
1f84480a80677cfaaf19d319290f5b44635eba47
 | 
			
		||||
 | 
			
		||||
Make rightAlt only close menu, never open it. (#672)
 | 
			
		||||
```
 | 
			
		||||
Lua changes.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
1255bd00fd21247a50046020d7d9a396f66bc6bd
 | 
			
		||||
 | 
			
		||||
Fix mounts being usable after a disk is ejected
 | 
			
		||||
```
 | 
			
		||||
Reverted a lot of code style changes made by Zundrel, so the diffs are huge.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
b90611b4b4c176ec1c80df002cc4ac36aa0c4dc8
 | 
			
		||||
 | 
			
		||||
Preserve registration order of upgrades
 | 
			
		||||
```
 | 
			
		||||
Again, a huge diff because of code style changes.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
8494ba8ce29cd8d7b9105eef497fe3fe3f89d350
 | 
			
		||||
 | 
			
		||||
Improve UX when a resource mount cannot be found
 | 
			
		||||
```
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
pluginManagement {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
        maven {
 | 
			
		||||
            name = 'Fabric'
 | 
			
		||||
            url = 'https://maven.fabricmc.net/'
 | 
			
		||||
@@ -9,4 +8,4 @@ pluginManagement {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rootProject.name = "cc-tweaked-fabric-${mc_version}"
 | 
			
		||||
rootProject.name = "cc-restiched"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.shared.ComputerCraftRegistry.ModBlocks;
 | 
			
		||||
import static dan200.computercraft.shared.ComputerCraftRegistry.init;
 | 
			
		||||
 | 
			
		||||
import java.nio.file.Paths;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.EnumSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.Stream;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleAction;
 | 
			
		||||
import dan200.computercraft.core.apis.AddressPredicate;
 | 
			
		||||
import dan200.computercraft.core.apis.http.options.Action;
 | 
			
		||||
import dan200.computercraft.core.apis.http.options.AddressRule;
 | 
			
		||||
import dan200.computercraft.core.apis.http.websocket.Websocket;
 | 
			
		||||
import dan200.computercraft.shared.common.ColourableRecipe;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ServerComputerRegistry;
 | 
			
		||||
@@ -33,125 +18,119 @@ import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
 | 
			
		||||
import dan200.computercraft.shared.media.recipes.DiskRecipe;
 | 
			
		||||
import dan200.computercraft.shared.media.recipes.PrintoutRecipe;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
 | 
			
		||||
import dan200.computercraft.shared.pocket.peripherals.PocketModem;
 | 
			
		||||
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
 | 
			
		||||
import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe;
 | 
			
		||||
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
 | 
			
		||||
import dan200.computercraft.shared.turtle.recipes.TurtleRecipe;
 | 
			
		||||
import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleAxe;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleCraftingTable;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleHoe;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleModem;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleShovel;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleSpeaker;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleSword;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.TurtleTool;
 | 
			
		||||
import dan200.computercraft.shared.util.Config;
 | 
			
		||||
import dan200.computercraft.shared.util.ImpostorRecipe;
 | 
			
		||||
import dan200.computercraft.shared.util.ImpostorShapelessRecipe;
 | 
			
		||||
import org.apache.logging.log4j.LogManager;
 | 
			
		||||
import org.apache.logging.log4j.Logger;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.api.ModInitializer;
 | 
			
		||||
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
 | 
			
		||||
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
 | 
			
		||||
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
 | 
			
		||||
import net.fabricmc.loader.api.FabricLoader;
 | 
			
		||||
import net.minecraft.item.ItemGroup;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.registry.Registry;
 | 
			
		||||
import org.apache.logging.log4j.LogManager;
 | 
			
		||||
import org.apache.logging.log4j.Logger;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.api.ModInitializer;
 | 
			
		||||
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
 | 
			
		||||
import net.fabricmc.loader.api.FabricLoader;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.EnumSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
public final class ComputerCraft implements ModInitializer {
 | 
			
		||||
import static dan200.computercraft.shared.ComputerCraftRegistry.ModBlocks;
 | 
			
		||||
import static dan200.computercraft.shared.ComputerCraftRegistry.init;
 | 
			
		||||
 | 
			
		||||
public final class ComputerCraft implements ModInitializer
 | 
			
		||||
{
 | 
			
		||||
    public static final String MOD_ID = "computercraft";
 | 
			
		||||
    // Configuration options
 | 
			
		||||
    public static final String[] DEFAULT_HTTP_WHITELIST = new String[] {"*"};
 | 
			
		||||
    public static final String[] DEFAULT_HTTP_BLACKLIST = new String[] {
 | 
			
		||||
        "127.0.0.0/8",
 | 
			
		||||
        "10.0.0.0/8",
 | 
			
		||||
        "172.16.0.0/12",
 | 
			
		||||
        "192.168.0.0/16",
 | 
			
		||||
        "fd00::/8",
 | 
			
		||||
        };
 | 
			
		||||
    public static final int terminalWidth_computer = 51;
 | 
			
		||||
    public static final int terminalHeight_computer = 19;
 | 
			
		||||
    public static final int terminalWidth_turtle = 39;
 | 
			
		||||
    public static final int terminalHeight_turtle = 13;
 | 
			
		||||
    public static final int terminalWidth_pocketComputer = 26;
 | 
			
		||||
    public static final int terminalHeight_pocketComputer = 20;
 | 
			
		||||
    // Registries
 | 
			
		||||
    public static final ClientComputerRegistry clientComputerRegistry = new ClientComputerRegistry();
 | 
			
		||||
    public static final ServerComputerRegistry serverComputerRegistry = new ServerComputerRegistry();
 | 
			
		||||
    // Logging
 | 
			
		||||
    public static final Logger log = LogManager.getLogger(MOD_ID);
 | 
			
		||||
    public static ItemGroup MAIN_GROUP = FabricItemGroupBuilder.build(new Identifier(MOD_ID, "main"), () -> new ItemStack(ModBlocks.COMPUTER_NORMAL));
 | 
			
		||||
    public static List<AddressRule> httpRules = Collections.unmodifiableList(Stream.concat(Stream.of(DEFAULT_HTTP_BLACKLIST)
 | 
			
		||||
                                                                                                 .map(x -> AddressRule.parse(x, Action.DENY.toPartial()))
 | 
			
		||||
                                                                                                 .filter(Objects::nonNull),
 | 
			
		||||
                                                                                           Stream.of(DEFAULT_HTTP_WHITELIST)
 | 
			
		||||
                                                                                                 .map(x -> AddressRule.parse(x, Action.ALLOW.toPartial()))
 | 
			
		||||
                                                                                                 .filter(Objects::nonNull))
 | 
			
		||||
                                                                                   .collect(Collectors.toList()));
 | 
			
		||||
    public static boolean commandRequireCreative = false;
 | 
			
		||||
    public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST;
 | 
			
		||||
 | 
			
		||||
    // Configuration fields
 | 
			
		||||
    public static int computerSpaceLimit = 1000 * 1000;
 | 
			
		||||
    public static int floppySpaceLimit = 125 * 1000;
 | 
			
		||||
    public static int maximumFilesOpen = 128;
 | 
			
		||||
    public static boolean disable_lua51_features = false;
 | 
			
		||||
    public static String default_computer_settings = "";
 | 
			
		||||
    public static boolean debug_enable = true;
 | 
			
		||||
    public static boolean logPeripheralErrors = false;
 | 
			
		||||
    public static int computer_threads = 1;
 | 
			
		||||
    public static long maxMainGlobalTime = TimeUnit.MILLISECONDS.toNanos(10);
 | 
			
		||||
    public static long maxMainComputerTime = TimeUnit.MILLISECONDS.toNanos(5);
 | 
			
		||||
    public static boolean http_enable = true;
 | 
			
		||||
    public static boolean http_websocket_enable = true;
 | 
			
		||||
    public static AddressPredicate http_whitelist = new AddressPredicate(DEFAULT_HTTP_WHITELIST);
 | 
			
		||||
    public static AddressPredicate http_blacklist = new AddressPredicate(DEFAULT_HTTP_BLACKLIST);
 | 
			
		||||
    public static int httpTimeout = 30000;
 | 
			
		||||
    public static boolean disableLua51Features = false;
 | 
			
		||||
    public static String defaultComputerSettings = "";
 | 
			
		||||
    public static boolean debugEnable = true;
 | 
			
		||||
    public static boolean logComputerErrors = true;
 | 
			
		||||
    public static boolean commandRequireCreative = true;
 | 
			
		||||
 | 
			
		||||
    public static int computerThreads = 1;
 | 
			
		||||
    public static long maxMainGlobalTime = TimeUnit.MILLISECONDS.toNanos( 10 );
 | 
			
		||||
    public static long maxMainComputerTime = TimeUnit.MILLISECONDS.toNanos( 5 );
 | 
			
		||||
 | 
			
		||||
    public static boolean httpEnabled = true;
 | 
			
		||||
    public static boolean httpWebsocketEnabled = true;
 | 
			
		||||
    public static List<AddressRule> httpRules = Collections.unmodifiableList( Arrays.asList(
 | 
			
		||||
        AddressRule.parse( "$private", null, Action.DENY.toPartial() ),
 | 
			
		||||
        AddressRule.parse( "*", null, Action.ALLOW.toPartial() )
 | 
			
		||||
    ) );
 | 
			
		||||
    public static int httpMaxRequests = 16;
 | 
			
		||||
    public static long httpMaxDownload = 16 * 1024 * 1024;
 | 
			
		||||
    public static long httpMaxUpload = 4 * 1024 * 1024;
 | 
			
		||||
    public static int httpMaxWebsockets = 4;
 | 
			
		||||
    public static int httpMaxWebsocketMessage = Websocket.MAX_MESSAGE_SIZE;
 | 
			
		||||
 | 
			
		||||
    public static boolean enableCommandBlock = false;
 | 
			
		||||
    public static int modem_range = 64;
 | 
			
		||||
    public static int modem_highAltitudeRange = 384;
 | 
			
		||||
    public static int modem_rangeDuringStorm = 64;
 | 
			
		||||
    public static int modem_highAltitudeRangeDuringStorm = 384;
 | 
			
		||||
    public static int modemRange = 64;
 | 
			
		||||
    public static int modemHighAltitudeRange = 384;
 | 
			
		||||
    public static int modemRangeDuringStorm = 64;
 | 
			
		||||
    public static int modemHighAltitudeRangeDuringStorm = 384;
 | 
			
		||||
    public static int maxNotesPerTick = 8;
 | 
			
		||||
    public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST;
 | 
			
		||||
    public static double monitorDistanceSq = 4096;
 | 
			
		||||
    public static long monitorBandwidth = 1_000_000;
 | 
			
		||||
 | 
			
		||||
    public static boolean turtlesNeedFuel = true;
 | 
			
		||||
    public static int turtleFuelLimit = 20000;
 | 
			
		||||
    public static int advancedTurtleFuelLimit = 100000;
 | 
			
		||||
    public static boolean turtlesObeyBlockProtection = true;
 | 
			
		||||
    public static boolean turtlesCanPush = true;
 | 
			
		||||
    public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf(TurtleAction.class);
 | 
			
		||||
    public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf( TurtleAction.class );
 | 
			
		||||
 | 
			
		||||
    public static int computerTermWidth = 51;
 | 
			
		||||
    public static int computerTermHeight = 19;
 | 
			
		||||
 | 
			
		||||
    public static final int turtleTermWidth = 39;
 | 
			
		||||
    public static final int turtleTermHeight = 13;
 | 
			
		||||
 | 
			
		||||
    public static int pocketTermWidth = 26;
 | 
			
		||||
    public static int pocketTermHeight = 20;
 | 
			
		||||
    public static int monitorWidth = 8;
 | 
			
		||||
    public static int monitorHeight = 6;
 | 
			
		||||
    public static double monitorDistanceSq = 4096;
 | 
			
		||||
 | 
			
		||||
    // Registries
 | 
			
		||||
    public static final ClientComputerRegistry clientComputerRegistry = new ClientComputerRegistry();
 | 
			
		||||
    public static final ServerComputerRegistry serverComputerRegistry = new ServerComputerRegistry();
 | 
			
		||||
 | 
			
		||||
    // Logging
 | 
			
		||||
    public static final Logger log = LogManager.getLogger( MOD_ID );
 | 
			
		||||
 | 
			
		||||
    public static ItemGroup MAIN_GROUP = FabricItemGroupBuilder.build( new Identifier( MOD_ID, "main" ), () -> new ItemStack( ModBlocks.COMPUTER_NORMAL ) );
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onInitialize() {
 | 
			
		||||
        Config.load(Paths.get(FabricLoader.getInstance()
 | 
			
		||||
                                          .getConfigDir()
 | 
			
		||||
                                          .toFile()
 | 
			
		||||
                                          .getPath(), MOD_ID + ".json5"));
 | 
			
		||||
    public void onInitialize()
 | 
			
		||||
    {
 | 
			
		||||
        ComputerCraftProxyCommon.init();
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "colour"), ColourableRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "computer_upgrade"), ComputerUpgradeRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER,
 | 
			
		||||
                          new Identifier(ComputerCraft.MOD_ID, "pocket_computer_upgrade"),
 | 
			
		||||
                          PocketComputerUpgradeRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "disk"), DiskRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "printout"), PrintoutRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "turtle"), TurtleRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "turtle_upgrade"), TurtleUpgradeRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "impostor_shaped"), ImpostorRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.RECIPE_SERIALIZER, new Identifier(ComputerCraft.MOD_ID, "impostor_shapeless"), ImpostorShapelessRecipe.SERIALIZER);
 | 
			
		||||
        Registry.register(Registry.LOOT_CONDITION_TYPE, new Identifier(ComputerCraft.MOD_ID, "block_named"), BlockNamedEntityLootCondition.TYPE);
 | 
			
		||||
        Registry.register(Registry.LOOT_CONDITION_TYPE, new Identifier(ComputerCraft.MOD_ID, "player_creative"), PlayerCreativeLootCondition.TYPE);
 | 
			
		||||
        Registry.register(Registry.LOOT_CONDITION_TYPE, new Identifier(ComputerCraft.MOD_ID, "has_id"), HasComputerIdLootCondition.TYPE);
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "colour" ), ColourableRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "computer_upgrade" ), ComputerUpgradeRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER,
 | 
			
		||||
            new Identifier( ComputerCraft.MOD_ID, "pocket_computer_upgrade" ),
 | 
			
		||||
            PocketComputerUpgradeRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "disk" ), DiskRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "printout" ), PrintoutRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "turtle" ), TurtleRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "turtle_upgrade" ), TurtleUpgradeRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "impostor_shaped" ), ImpostorRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "impostor_shapeless" ), ImpostorShapelessRecipe.SERIALIZER );
 | 
			
		||||
        Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "block_named" ), BlockNamedEntityLootCondition.TYPE );
 | 
			
		||||
        Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "player_creative" ), PlayerCreativeLootCondition.TYPE );
 | 
			
		||||
        Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "has_id" ), HasComputerIdLootCondition.TYPE );
 | 
			
		||||
        init();
 | 
			
		||||
        FabricLoader.getInstance().getModContainer( MOD_ID ).ifPresent( modContainer -> {
 | 
			
		||||
            ResourceManagerHelper.registerBuiltinResourcePack( new Identifier( MOD_ID, "classic" ), modContainer, ResourcePackActivationType.NORMAL );
 | 
			
		||||
            ResourceManagerHelper.registerBuiltinResourcePack( new Identifier( MOD_ID, "overhaul" ), modContainer, ResourcePackActivationType.NORMAL );
 | 
			
		||||
        } );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI.IComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IWritableMount;
 | 
			
		||||
import dan200.computercraft.api.lua.GenericSource;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaAPIFactory;
 | 
			
		||||
import dan200.computercraft.api.media.IMediaProvider;
 | 
			
		||||
import dan200.computercraft.api.network.IPacketNetwork;
 | 
			
		||||
@@ -26,23 +19,21 @@ import dan200.computercraft.api.pocket.IPocketUpgrade;
 | 
			
		||||
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.core.apis.ApiFactories;
 | 
			
		||||
import dan200.computercraft.core.asm.GenericMethod;
 | 
			
		||||
import dan200.computercraft.core.filesystem.FileMount;
 | 
			
		||||
import dan200.computercraft.core.filesystem.ResourceMount;
 | 
			
		||||
import dan200.computercraft.mixin.MinecraftServerAccess;
 | 
			
		||||
import dan200.computercraft.shared.BundledRedstone;
 | 
			
		||||
import dan200.computercraft.shared.MediaProviders;
 | 
			
		||||
import dan200.computercraft.shared.Peripherals;
 | 
			
		||||
import dan200.computercraft.shared.PocketUpgrades;
 | 
			
		||||
import dan200.computercraft.shared.TurtleUpgrades;
 | 
			
		||||
import dan200.computercraft.fabric.mixin.MinecraftServerAccess;
 | 
			
		||||
import dan200.computercraft.shared.*;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.TileCable;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.TileWiredModemFull;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
 | 
			
		||||
import dan200.computercraft.shared.util.IDAssigner;
 | 
			
		||||
import dan200.computercraft.shared.wired.WiredNode;
 | 
			
		||||
import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.loader.api.FabricLoader;
 | 
			
		||||
import net.minecraft.block.entity.BlockEntity;
 | 
			
		||||
import net.minecraft.resource.ReloadableResourceManager;
 | 
			
		||||
import net.minecraft.resource.ResourceManager;
 | 
			
		||||
import net.minecraft.server.MinecraftServer;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
@@ -50,24 +41,35 @@ import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.BlockView;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.loader.api.FabricLoader;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
 | 
			
		||||
public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
 | 
			
		||||
public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
{
 | 
			
		||||
    public static final ComputerCraftAPIImpl INSTANCE = new ComputerCraftAPIImpl();
 | 
			
		||||
 | 
			
		||||
    private String version;
 | 
			
		||||
 | 
			
		||||
    private ComputerCraftAPIImpl() {
 | 
			
		||||
    private ComputerCraftAPIImpl()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static InputStream getResourceFile(String domain, String subPath) {
 | 
			
		||||
    public static InputStream getResourceFile( String domain, String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        MinecraftServer server = GameInstanceUtils.getServer();
 | 
			
		||||
        if (server != null) {
 | 
			
		||||
            ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess)server).getServerResourceManager().getResourceManager();
 | 
			
		||||
            try {
 | 
			
		||||
                return manager.getResource(new Identifier(domain, subPath))
 | 
			
		||||
                              .getInputStream();
 | 
			
		||||
            } catch (IOException ignored) {
 | 
			
		||||
        if( server != null )
 | 
			
		||||
        {
 | 
			
		||||
            ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                return manager.getResource( new Identifier( domain, subPath ) )
 | 
			
		||||
                    .getInputStream();
 | 
			
		||||
            }
 | 
			
		||||
            catch( IOException ignored )
 | 
			
		||||
            {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -76,97 +78,125 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getInstalledVersion() {
 | 
			
		||||
        if (this.version != null) {
 | 
			
		||||
            return this.version;
 | 
			
		||||
    public String getInstalledVersion()
 | 
			
		||||
    {
 | 
			
		||||
        if( version != null )
 | 
			
		||||
        {
 | 
			
		||||
            return version;
 | 
			
		||||
        }
 | 
			
		||||
        return this.version = FabricLoader.getInstance()
 | 
			
		||||
                                          .getModContainer(ComputerCraft.MOD_ID)
 | 
			
		||||
                                          .map(x -> x.getMetadata()
 | 
			
		||||
                                                .getVersion()
 | 
			
		||||
                                                .toString())
 | 
			
		||||
                                          .orElse("unknown");
 | 
			
		||||
        return version = FabricLoader.getInstance()
 | 
			
		||||
            .getModContainer( ComputerCraft.MOD_ID )
 | 
			
		||||
            .map( x -> x.getMetadata()
 | 
			
		||||
                .getVersion()
 | 
			
		||||
                .toString() )
 | 
			
		||||
            .orElse( "unknown" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int createUniqueNumberedSaveDir(@Nonnull World world, @Nonnull String parentSubPath) {
 | 
			
		||||
        return IDAssigner.getNextId(parentSubPath);
 | 
			
		||||
    public int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath )
 | 
			
		||||
    {
 | 
			
		||||
        return IDAssigner.getNextId( parentSubPath );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public IWritableMount createSaveDirMount(@Nonnull World world, @Nonnull String subPath, long capacity) {
 | 
			
		||||
        try {
 | 
			
		||||
            return new FileMount(new File(IDAssigner.getDir(), subPath), capacity);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
    public IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity )
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return new FileMount( new File( IDAssigner.getDir(), subPath ), capacity );
 | 
			
		||||
        }
 | 
			
		||||
        catch( Exception e )
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public IMount createResourceMount(@Nonnull String domain, @Nonnull String subPath) {
 | 
			
		||||
    public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        MinecraftServer server = GameInstanceUtils.getServer();
 | 
			
		||||
        if (server != null) {
 | 
			
		||||
            ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess)server).getServerResourceManager().getResourceManager();
 | 
			
		||||
            ResourceMount mount = ResourceMount.get(domain, subPath, manager);
 | 
			
		||||
            return mount.exists("") ? mount : null;
 | 
			
		||||
        if( server != null )
 | 
			
		||||
        {
 | 
			
		||||
            ResourceManager manager = ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager();
 | 
			
		||||
            ResourceMount mount = ResourceMount.get( domain, subPath, manager );
 | 
			
		||||
            return mount.exists( "" ) ? mount : null;
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerPeripheralProvider(@Nonnull IPeripheralProvider provider) {
 | 
			
		||||
        Peripherals.register(provider);
 | 
			
		||||
    public void registerPeripheralProvider( @Nonnull IPeripheralProvider provider )
 | 
			
		||||
    {
 | 
			
		||||
        Peripherals.register( provider );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerTurtleUpgrade(@Nonnull ITurtleUpgrade upgrade) {
 | 
			
		||||
        TurtleUpgrades.register(upgrade);
 | 
			
		||||
    public void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        TurtleUpgrades.register( upgrade );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerBundledRedstoneProvider(@Nonnull IBundledRedstoneProvider provider) {
 | 
			
		||||
        BundledRedstone.register(provider);
 | 
			
		||||
    public void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider )
 | 
			
		||||
    {
 | 
			
		||||
        BundledRedstone.register( provider );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getBundledRedstoneOutput(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side) {
 | 
			
		||||
        return BundledRedstone.getDefaultOutput(world, pos, side);
 | 
			
		||||
    public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        return BundledRedstone.getDefaultOutput( world, pos, side );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerMediaProvider(@Nonnull IMediaProvider provider) {
 | 
			
		||||
        MediaProviders.register(provider);
 | 
			
		||||
    public void registerMediaProvider( @Nonnull IMediaProvider provider )
 | 
			
		||||
    {
 | 
			
		||||
        MediaProviders.register( provider );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerPocketUpgrade(@Nonnull IPocketUpgrade upgrade) {
 | 
			
		||||
        PocketUpgrades.register(upgrade);
 | 
			
		||||
    public void registerPocketUpgrade( @Nonnull IPocketUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        PocketUpgrades.register( upgrade );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerGenericSource( @Nonnull GenericSource source )
 | 
			
		||||
    {
 | 
			
		||||
        GenericMethod.register( source );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPacketNetwork getWirelessNetwork() {
 | 
			
		||||
    public IPacketNetwork getWirelessNetwork()
 | 
			
		||||
    {
 | 
			
		||||
        return WirelessNetwork.getUniversal();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerAPIFactory(@Nonnull ILuaAPIFactory factory) {
 | 
			
		||||
        ApiFactories.register(factory);
 | 
			
		||||
    public void registerAPIFactory( @Nonnull ILuaAPIFactory factory )
 | 
			
		||||
    {
 | 
			
		||||
        ApiFactories.register( factory );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public IWiredNode createWiredNodeForElement(@Nonnull IWiredElement element) {
 | 
			
		||||
        return new WiredNode(element);
 | 
			
		||||
    public IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element )
 | 
			
		||||
    {
 | 
			
		||||
        return new WiredNode( element );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side) {
 | 
			
		||||
        BlockEntity tile = world.getBlockEntity(pos);
 | 
			
		||||
        if (tile instanceof TileCable) {
 | 
			
		||||
            return ((TileCable) tile).getElement(side);
 | 
			
		||||
        } else if (tile instanceof TileWiredModemFull) {
 | 
			
		||||
    public IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        BlockEntity tile = world.getBlockEntity( pos );
 | 
			
		||||
        if( tile instanceof TileCable )
 | 
			
		||||
        {
 | 
			
		||||
            return ((TileCable) tile).getElement( side );
 | 
			
		||||
        }
 | 
			
		||||
        else if( tile instanceof TileWiredModemFull )
 | 
			
		||||
        {
 | 
			
		||||
            return ((TileWiredModemFull) tile).getElement();
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IWritableMount;
 | 
			
		||||
import dan200.computercraft.api.lua.GenericSource;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaAPIFactory;
 | 
			
		||||
import dan200.computercraft.api.media.IMedia;
 | 
			
		||||
import dan200.computercraft.api.media.IMediaProvider;
 | 
			
		||||
@@ -23,43 +20,53 @@ import dan200.computercraft.api.peripheral.IPeripheralProvider;
 | 
			
		||||
import dan200.computercraft.api.pocket.IPocketUpgrade;
 | 
			
		||||
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.BlockView;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The static entry point to the ComputerCraft API.
 | 
			
		||||
 *
 | 
			
		||||
 * Members in this class must be called after mod_ComputerCraft has been initialised, but may be called before it is fully loaded.
 | 
			
		||||
 */
 | 
			
		||||
public final class ComputerCraftAPI {
 | 
			
		||||
public final class ComputerCraftAPI
 | 
			
		||||
{
 | 
			
		||||
    private static IComputerCraftAPI instance;
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public static String getAPIVersion() {
 | 
			
		||||
    public static String getAPIVersion()
 | 
			
		||||
    {
 | 
			
		||||
        return getInstalledVersion();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static String getInstalledVersion() {
 | 
			
		||||
    public static String getInstalledVersion()
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().getInstalledVersion();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    private static IComputerCraftAPI getInstance() {
 | 
			
		||||
        if (instance != null) {
 | 
			
		||||
    private static IComputerCraftAPI getInstance()
 | 
			
		||||
    {
 | 
			
		||||
        if( instance != null )
 | 
			
		||||
        {
 | 
			
		||||
            return instance;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            return instance = (IComputerCraftAPI) Class.forName("dan200.computercraft.ComputerCraftAPIImpl")
 | 
			
		||||
                                                       .getField("INSTANCE")
 | 
			
		||||
                                                       .get(null);
 | 
			
		||||
        } catch (ReflectiveOperationException e) {
 | 
			
		||||
            throw new IllegalStateException("Cannot find ComputerCraft API", e);
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return instance = (IComputerCraftAPI) Class.forName( "dan200.computercraft.ComputerCraftAPIImpl" )
 | 
			
		||||
                .getField( "INSTANCE" )
 | 
			
		||||
                .get( null );
 | 
			
		||||
        }
 | 
			
		||||
        catch( ReflectiveOperationException e )
 | 
			
		||||
        {
 | 
			
		||||
            throw new IllegalStateException( "Cannot find ComputerCraft API", e );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -68,15 +75,16 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     *
 | 
			
		||||
     * Use in conjunction with createSaveDirMount() to create a unique place for your peripherals or media items to store files.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world for which the save dir should be created. This should be the server side world object.
 | 
			
		||||
     * @param world         The world for which the save dir should be created. This should be the server side world object.
 | 
			
		||||
     * @param parentSubPath The folder path within the save directory where the new directory should be created. eg: "computercraft/disk"
 | 
			
		||||
     * @return The numerical value of the name of the new folder, or -1 if the folder could not be created for some reason.
 | 
			
		||||
     *
 | 
			
		||||
     *     eg: if createUniqueNumberedSaveDir( world, "computer/disk" ) was called returns 42, then "computer/disk/42" is now available for writing.
 | 
			
		||||
     * eg: if createUniqueNumberedSaveDir( world, "computer/disk" ) was called returns 42, then "computer/disk/42" is now available for writing.
 | 
			
		||||
     * @see #createSaveDirMount(World, String, long)
 | 
			
		||||
     */
 | 
			
		||||
    public static int createUniqueNumberedSaveDir(@Nonnull World world, @Nonnull String parentSubPath) {
 | 
			
		||||
        return getInstance().createUniqueNumberedSaveDir(world, parentSubPath);
 | 
			
		||||
    public static int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().createUniqueNumberedSaveDir( world, parentSubPath );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -85,12 +93,12 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * Use in conjunction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a folder from the users save directory onto a computers
 | 
			
		||||
     * file system.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world for which the save dir can be found. This should be the server side world object.
 | 
			
		||||
     * @param subPath The folder path within the save directory that the mount should map to. eg: "computer/disk/42". Use createUniqueNumberedSaveDir()
 | 
			
		||||
     *     to create a new numbered folder to use.
 | 
			
		||||
     * @param world    The world for which the save dir can be found. This should be the server side world object.
 | 
			
		||||
     * @param subPath  The folder path within the save directory that the mount should map to. eg: "computer/disk/42". Use createUniqueNumberedSaveDir()
 | 
			
		||||
     *                 to create a new numbered folder to use.
 | 
			
		||||
     * @param capacity The amount of data that can be stored in the directory before it fills up, in bytes.
 | 
			
		||||
     * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() to mount this on a
 | 
			
		||||
     *     Computers' file system.
 | 
			
		||||
     * Computers' file system.
 | 
			
		||||
     * @see #createUniqueNumberedSaveDir(World, String)
 | 
			
		||||
     * @see IComputerAccess#mount(String, IMount)
 | 
			
		||||
     * @see IComputerAccess#mountWritable(String, IWritableMount)
 | 
			
		||||
@@ -98,8 +106,9 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @see IWritableMount
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public static IWritableMount createSaveDirMount(@Nonnull World world, @Nonnull String subPath, long capacity) {
 | 
			
		||||
        return getInstance().createSaveDirMount(world, subPath, capacity);
 | 
			
		||||
    public static IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().createSaveDirMount( world, subPath, capacity );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -108,9 +117,12 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * Use in conjunction with {@link IComputerAccess#mount} or {@link IComputerAccess#mountWritable} to mount a resource folder onto a computer's file
 | 
			
		||||
     * system.
 | 
			
		||||
     *
 | 
			
		||||
     * The files in this mount will be a combination of files in all mod jar, and data packs that contain resources with the same domain and path.
 | 
			
		||||
     * The files in this mount will be a combination of files in all mod jar, and data packs that contain
 | 
			
		||||
     * resources with the same domain and path. For instance, ComputerCraft's resources are stored in
 | 
			
		||||
     * "/data/computercraft/lua/rom". We construct a mount for that with
 | 
			
		||||
     * {@code createResourceMount("computercraft", "lua/rom")}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param domain The domain under which to look for resources. eg: "mymod".
 | 
			
		||||
     * @param domain  The domain under which to look for resources. eg: "mymod".
 | 
			
		||||
     * @param subPath The subPath under which to look for resources. eg: "lua/myfiles".
 | 
			
		||||
     * @return The mount, or {@code null} if it could be created for some reason.
 | 
			
		||||
     * @see IComputerAccess#mount(String, IMount)
 | 
			
		||||
@@ -118,8 +130,9 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public static IMount createResourceMount(@Nonnull String domain, @Nonnull String subPath) {
 | 
			
		||||
        return getInstance().createResourceMount(domain, subPath);
 | 
			
		||||
    public static IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().createResourceMount( domain, subPath );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -129,8 +142,20 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @see IPeripheral
 | 
			
		||||
     * @see IPeripheralProvider
 | 
			
		||||
     */
 | 
			
		||||
    public static void registerPeripheralProvider(@Nonnull IPeripheralProvider provider) {
 | 
			
		||||
        getInstance().registerPeripheralProvider(provider);
 | 
			
		||||
    public static void registerPeripheralProvider( @Nonnull IPeripheralProvider provider )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerPeripheralProvider( provider );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a method source for generic peripherals.
 | 
			
		||||
     *
 | 
			
		||||
     * @param source The method source to register.
 | 
			
		||||
     * @see GenericSource
 | 
			
		||||
     */
 | 
			
		||||
    public static void registerGenericSource( @Nonnull GenericSource source )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerGenericSource( source );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -140,8 +165,9 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @param upgrade The turtle upgrade to register.
 | 
			
		||||
     * @see ITurtleUpgrade
 | 
			
		||||
     */
 | 
			
		||||
    public static void registerTurtleUpgrade(@Nonnull ITurtleUpgrade upgrade) {
 | 
			
		||||
        getInstance().registerTurtleUpgrade(upgrade);
 | 
			
		||||
    public static void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerTurtleUpgrade( upgrade );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -150,22 +176,24 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @param provider The bundled redstone provider to register.
 | 
			
		||||
     * @see IBundledRedstoneProvider
 | 
			
		||||
     */
 | 
			
		||||
    public static void registerBundledRedstoneProvider(@Nonnull IBundledRedstoneProvider provider) {
 | 
			
		||||
        getInstance().registerBundledRedstoneProvider(provider);
 | 
			
		||||
    public static void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerBundledRedstoneProvider( provider );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If there is a Computer or Turtle at a certain position in the world, get it's bundled redstone output.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world this block is in.
 | 
			
		||||
     * @param pos The position this block is at.
 | 
			
		||||
     * @param side The side to extract the bundled redstone output from.
 | 
			
		||||
     * @param pos   The position this block is at.
 | 
			
		||||
     * @param side  The side to extract the bundled redstone output from.
 | 
			
		||||
     * @return If there is a block capable of emitting bundled redstone at the location, it's signal (0-65535) will be returned. If there is no block
 | 
			
		||||
     *     capable of emitting bundled redstone at the location, -1 will be returned.
 | 
			
		||||
     * capable of emitting bundled redstone at the location, -1 will be returned.
 | 
			
		||||
     * @see IBundledRedstoneProvider
 | 
			
		||||
     */
 | 
			
		||||
    public static int getBundledRedstoneOutput(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side) {
 | 
			
		||||
        return getInstance().getBundledRedstoneOutput(world, pos, side);
 | 
			
		||||
    public static int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().getBundledRedstoneOutput( world, pos, side );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -174,12 +202,14 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @param provider The media provider to register.
 | 
			
		||||
     * @see IMediaProvider
 | 
			
		||||
     */
 | 
			
		||||
    public static void registerMediaProvider(@Nonnull IMediaProvider provider) {
 | 
			
		||||
        getInstance().registerMediaProvider(provider);
 | 
			
		||||
    public static void registerMediaProvider( @Nonnull IMediaProvider provider )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerMediaProvider( provider );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void registerPocketUpgrade(@Nonnull IPocketUpgrade upgrade) {
 | 
			
		||||
        getInstance().registerPocketUpgrade(upgrade);
 | 
			
		||||
    public static void registerPocketUpgrade( @Nonnull IPocketUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerPocketUpgrade( upgrade );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -187,12 +217,14 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     *
 | 
			
		||||
     * @return The global wireless network, or {@code null} if it could not be fetched.
 | 
			
		||||
     */
 | 
			
		||||
    public static IPacketNetwork getWirelessNetwork() {
 | 
			
		||||
    public static IPacketNetwork getWirelessNetwork()
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().getWirelessNetwork();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void registerAPIFactory(@Nonnull ILuaAPIFactory factory) {
 | 
			
		||||
        getInstance().registerAPIFactory(factory);
 | 
			
		||||
    public static void registerAPIFactory( @Nonnull ILuaAPIFactory factory )
 | 
			
		||||
    {
 | 
			
		||||
        getInstance().registerAPIFactory( factory );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -203,57 +235,62 @@ public final class ComputerCraftAPI {
 | 
			
		||||
     * @see IWiredElement#getNode()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static IWiredNode createWiredNodeForElement(@Nonnull IWiredElement element) {
 | 
			
		||||
        return getInstance().createWiredNodeForElement(element);
 | 
			
		||||
    public static IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().createWiredNodeForElement( element );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the wired network element for a block in world.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world the block exists in
 | 
			
		||||
     * @param pos The position the block exists in
 | 
			
		||||
     * @param side The side to extract the network element from
 | 
			
		||||
     * @param pos   The position the block exists in
 | 
			
		||||
     * @param side  The side to extract the network element from
 | 
			
		||||
     * @return The element's node
 | 
			
		||||
     * @see IWiredElement#getNode()
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public static IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side) {
 | 
			
		||||
        return getInstance().getWiredElementAt(world, pos, side);
 | 
			
		||||
    public static IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().getWiredElementAt( world, pos, side );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface IComputerCraftAPI {
 | 
			
		||||
    public interface IComputerCraftAPI
 | 
			
		||||
    {
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        String getInstalledVersion();
 | 
			
		||||
 | 
			
		||||
        int createUniqueNumberedSaveDir(@Nonnull World world, @Nonnull String parentSubPath);
 | 
			
		||||
        int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath );
 | 
			
		||||
 | 
			
		||||
        @Nullable
 | 
			
		||||
        IWritableMount createSaveDirMount(@Nonnull World world, @Nonnull String subPath, long capacity);
 | 
			
		||||
        IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity );
 | 
			
		||||
 | 
			
		||||
        @Nullable
 | 
			
		||||
        IMount createResourceMount(@Nonnull String domain, @Nonnull String subPath);
 | 
			
		||||
        IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath );
 | 
			
		||||
 | 
			
		||||
        void registerPeripheralProvider(@Nonnull IPeripheralProvider provider);
 | 
			
		||||
        void registerPeripheralProvider( @Nonnull IPeripheralProvider provider );
 | 
			
		||||
 | 
			
		||||
        void registerTurtleUpgrade(@Nonnull ITurtleUpgrade upgrade);
 | 
			
		||||
        void registerGenericSource( @Nonnull GenericSource source );
 | 
			
		||||
 | 
			
		||||
        void registerBundledRedstoneProvider(@Nonnull IBundledRedstoneProvider provider);
 | 
			
		||||
        void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade );
 | 
			
		||||
 | 
			
		||||
        int getBundledRedstoneOutput(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side);
 | 
			
		||||
        void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider );
 | 
			
		||||
 | 
			
		||||
        void registerMediaProvider(@Nonnull IMediaProvider provider);
 | 
			
		||||
        int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
 | 
			
		||||
        void registerPocketUpgrade(@Nonnull IPocketUpgrade upgrade);
 | 
			
		||||
        void registerMediaProvider( @Nonnull IMediaProvider provider );
 | 
			
		||||
 | 
			
		||||
        void registerPocketUpgrade( @Nonnull IPocketUpgrade upgrade );
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        IPacketNetwork getWirelessNetwork();
 | 
			
		||||
 | 
			
		||||
        void registerAPIFactory(@Nonnull ILuaAPIFactory factory);
 | 
			
		||||
        void registerAPIFactory( @Nonnull ILuaAPIFactory factory );
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        IWiredNode createWiredNodeForElement(@Nonnull IWiredElement element);
 | 
			
		||||
        IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element );
 | 
			
		||||
 | 
			
		||||
        @Nullable
 | 
			
		||||
        IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side);
 | 
			
		||||
        IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										86
									
								
								src/main/java/dan200/computercraft/api/IUpgradeBase.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/main/java/dan200/computercraft/api/IUpgradeBase.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.pocket.IPocketUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.CompoundTag;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Common functionality between {@link ITurtleUpgrade} and {@link IPocketUpgrade}.
 | 
			
		||||
 */
 | 
			
		||||
public interface IUpgradeBase
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a unique identifier representing this type of turtle upgrade. eg: "computercraft:wireless_modem"
 | 
			
		||||
     * or "my_mod:my_upgrade".
 | 
			
		||||
     *
 | 
			
		||||
     * You should use a unique resource domain to ensure this upgrade is uniquely identified.
 | 
			
		||||
     * The upgrade will fail registration if an already used ID is specified.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The unique ID for this upgrade.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Identifier getUpgradeID();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an unlocalised string to describe this type of computer in item names.
 | 
			
		||||
     *
 | 
			
		||||
     * Examples of built-in adjectives are "Wireless", "Mining" and "Crafty".
 | 
			
		||||
     *
 | 
			
		||||
     * @return The localisation key for this upgrade's adjective.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String getUnlocalisedAdjective();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an item stack representing the type of item that a computer must be crafted
 | 
			
		||||
     * with to create a version which holds this upgrade. This item stack is also used
 | 
			
		||||
     * to determine the upgrade given by {@code turtle.equipLeft()} or {@code pocket.equipBack()}
 | 
			
		||||
     *
 | 
			
		||||
     * This should be constant over a session (or at least a datapack reload). It is recommended
 | 
			
		||||
     * that you cache the stack too, in order to prevent constructing it every time the method
 | 
			
		||||
     * is called.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The item stack to craft with, or {@link ItemStack#EMPTY} if it cannot be crafted.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ItemStack getCraftingItem();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine if an item is suitable for being used for this upgrade.
 | 
			
		||||
     *
 | 
			
		||||
     * When un-equipping an upgrade, we return {@link #getCraftingItem()} rather than
 | 
			
		||||
     * the original stack. In order to prevent people losing items with enchantments (or
 | 
			
		||||
     * repairing items with non-0 damage), we impose additional checks on the item.
 | 
			
		||||
     *
 | 
			
		||||
     * The default check requires that any non-capability NBT is exactly the same as the
 | 
			
		||||
     * crafting item, but this may be relaxed for your upgrade.
 | 
			
		||||
     *
 | 
			
		||||
     * @param stack The stack to check. This is guaranteed to be non-empty and have the same item as
 | 
			
		||||
     *              {@link #getCraftingItem()}.
 | 
			
		||||
     * @return If this stack may be used to equip this upgrade.
 | 
			
		||||
     * @see net.minecraftforge.common.crafting.NBTIngredient#test(ItemStack) For the implementation of the default
 | 
			
		||||
     * check.
 | 
			
		||||
     */
 | 
			
		||||
    default boolean isItemSuitable( @Nonnull ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        ItemStack crafting = getCraftingItem();
 | 
			
		||||
 | 
			
		||||
        // A more expanded form of ItemStack.areShareTagsEqual, but allowing an empty tag to be equal to a
 | 
			
		||||
        // null one.
 | 
			
		||||
        CompoundTag shareTag = stack.getTag();
 | 
			
		||||
        CompoundTag craftingShareTag = crafting.getTag();
 | 
			
		||||
        if( shareTag == craftingShareTag ) return true;
 | 
			
		||||
        if( shareTag == null ) return craftingShareTag.isEmpty();
 | 
			
		||||
        if( craftingShareTag == null ) return shareTag.isEmpty();
 | 
			
		||||
        return shareTag.equals( craftingShareTag );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,17 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.client;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.mixin.AffineTransformationAccess;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.fabric.mixin.AffineTransformationAccess;
 | 
			
		||||
import net.fabricmc.api.EnvType;
 | 
			
		||||
import net.fabricmc.api.Environment;
 | 
			
		||||
import net.minecraft.client.MinecraftClient;
 | 
			
		||||
import net.minecraft.client.render.model.BakedModel;
 | 
			
		||||
import net.minecraft.client.render.model.BakedModelManager;
 | 
			
		||||
@@ -20,64 +16,78 @@ import net.minecraft.client.util.math.AffineTransformation;
 | 
			
		||||
import net.minecraft.client.util.math.MatrixStack;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.api.EnvType;
 | 
			
		||||
import net.fabricmc.api.Environment;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A model to render, combined with a transformation matrix to apply.
 | 
			
		||||
 */
 | 
			
		||||
@Environment (EnvType.CLIENT)
 | 
			
		||||
public final class TransformedModel {
 | 
			
		||||
@Environment( EnvType.CLIENT )
 | 
			
		||||
public final class TransformedModel
 | 
			
		||||
{
 | 
			
		||||
    private final BakedModel model;
 | 
			
		||||
    private final AffineTransformation matrix;
 | 
			
		||||
 | 
			
		||||
    public TransformedModel(@Nonnull BakedModel model, @Nonnull AffineTransformation matrix) {
 | 
			
		||||
        this.model = Objects.requireNonNull(model);
 | 
			
		||||
        this.matrix = Objects.requireNonNull(matrix);
 | 
			
		||||
    public TransformedModel( @Nonnull BakedModel model, @Nonnull AffineTransformation matrix )
 | 
			
		||||
    {
 | 
			
		||||
        this.model = Objects.requireNonNull( model );
 | 
			
		||||
        this.matrix = Objects.requireNonNull( matrix );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TransformedModel(@Nonnull BakedModel model) {
 | 
			
		||||
        this.model = Objects.requireNonNull(model);
 | 
			
		||||
        this.matrix = AffineTransformation.identity();
 | 
			
		||||
    public TransformedModel( @Nonnull BakedModel model )
 | 
			
		||||
    {
 | 
			
		||||
        this.model = Objects.requireNonNull( model );
 | 
			
		||||
        matrix = AffineTransformation.identity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static TransformedModel of(@Nonnull ModelIdentifier location) {
 | 
			
		||||
    public static TransformedModel of( @Nonnull ModelIdentifier location )
 | 
			
		||||
    {
 | 
			
		||||
        BakedModelManager modelManager = MinecraftClient.getInstance()
 | 
			
		||||
                                                        .getBakedModelManager();
 | 
			
		||||
        return new TransformedModel(modelManager.getModel(location));
 | 
			
		||||
            .getBakedModelManager();
 | 
			
		||||
        return new TransformedModel( modelManager.getModel( location ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static TransformedModel of(@Nonnull ItemStack item, @Nonnull AffineTransformation transform) {
 | 
			
		||||
    public static TransformedModel of( @Nonnull ItemStack item, @Nonnull AffineTransformation transform )
 | 
			
		||||
    {
 | 
			
		||||
        BakedModel model = MinecraftClient.getInstance()
 | 
			
		||||
                                          .getItemRenderer()
 | 
			
		||||
                                          .getModels()
 | 
			
		||||
                                          .getModel(item);
 | 
			
		||||
        return new TransformedModel(model, transform);
 | 
			
		||||
            .getItemRenderer()
 | 
			
		||||
            .getModels()
 | 
			
		||||
            .getModel( item );
 | 
			
		||||
        return new TransformedModel( model, transform );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public BakedModel getModel() {
 | 
			
		||||
        return this.model;
 | 
			
		||||
    public BakedModel getModel()
 | 
			
		||||
    {
 | 
			
		||||
        return model;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public AffineTransformation getMatrix() {
 | 
			
		||||
        return this.matrix;
 | 
			
		||||
    public AffineTransformation getMatrix()
 | 
			
		||||
    {
 | 
			
		||||
        return matrix;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void push(MatrixStack matrixStack) {
 | 
			
		||||
    public void push( MatrixStack matrixStack )
 | 
			
		||||
    {
 | 
			
		||||
        matrixStack.push();
 | 
			
		||||
 | 
			
		||||
        AffineTransformationAccess access = (AffineTransformationAccess) (Object) this.matrix;
 | 
			
		||||
        if (access.getTranslation() != null)
 | 
			
		||||
            matrixStack.translate(access.getTranslation().getX(), access.getTranslation().getY(), access.getTranslation().getZ());
 | 
			
		||||
        AffineTransformationAccess access = (AffineTransformationAccess) (Object) matrix;
 | 
			
		||||
        if( access.getTranslation() != null )
 | 
			
		||||
        {
 | 
			
		||||
            matrixStack.translate( access.getTranslation().getX(), access.getTranslation().getY(), access.getTranslation().getZ() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        matrixStack.multiply(this.matrix.getRotation2());
 | 
			
		||||
        matrixStack.multiply( matrix.getRotation2() );
 | 
			
		||||
 | 
			
		||||
        if (access.getScale() != null)
 | 
			
		||||
            matrixStack.scale(access.getScale().getX(), access.getScale().getY(), access.getScale().getZ());
 | 
			
		||||
        if( access.getScale() != null )
 | 
			
		||||
        {
 | 
			
		||||
            matrixStack.scale( access.getScale().getX(), access.getScale().getY(), access.getScale().getZ() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (access.getRotation1() != null)
 | 
			
		||||
            matrixStack.multiply(access.getRotation1());
 | 
			
		||||
        if( access.getRotation1() != null )
 | 
			
		||||
        {
 | 
			
		||||
            matrixStack.multiply( access.getRotation1() );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import java.nio.file.attribute.BasicFileAttributes;
 | 
			
		||||
@@ -13,59 +12,70 @@ import java.time.Instant;
 | 
			
		||||
/**
 | 
			
		||||
 * A simple version of {@link BasicFileAttributes}, which provides what information a {@link IMount} already exposes.
 | 
			
		||||
 */
 | 
			
		||||
final class FileAttributes implements BasicFileAttributes {
 | 
			
		||||
    private static final FileTime EPOCH = FileTime.from(Instant.EPOCH);
 | 
			
		||||
final class FileAttributes implements BasicFileAttributes
 | 
			
		||||
{
 | 
			
		||||
    private static final FileTime EPOCH = FileTime.from( Instant.EPOCH );
 | 
			
		||||
 | 
			
		||||
    private final boolean isDirectory;
 | 
			
		||||
    private final long size;
 | 
			
		||||
 | 
			
		||||
    FileAttributes(boolean isDirectory, long size) {
 | 
			
		||||
    FileAttributes( boolean isDirectory, long size )
 | 
			
		||||
    {
 | 
			
		||||
        this.isDirectory = isDirectory;
 | 
			
		||||
        this.size = size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileTime lastModifiedTime() {
 | 
			
		||||
    public FileTime lastModifiedTime()
 | 
			
		||||
    {
 | 
			
		||||
        return EPOCH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileTime lastAccessTime() {
 | 
			
		||||
    public FileTime lastAccessTime()
 | 
			
		||||
    {
 | 
			
		||||
        return EPOCH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileTime creationTime() {
 | 
			
		||||
    public FileTime creationTime()
 | 
			
		||||
    {
 | 
			
		||||
        return EPOCH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isRegularFile() {
 | 
			
		||||
        return !this.isDirectory;
 | 
			
		||||
    public boolean isRegularFile()
 | 
			
		||||
    {
 | 
			
		||||
        return !isDirectory;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isDirectory() {
 | 
			
		||||
        return this.isDirectory;
 | 
			
		||||
    public boolean isDirectory()
 | 
			
		||||
    {
 | 
			
		||||
        return isDirectory;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isSymbolicLink() {
 | 
			
		||||
    public boolean isSymbolicLink()
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isOther() {
 | 
			
		||||
    public boolean isOther()
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public long size() {
 | 
			
		||||
        return this.size;
 | 
			
		||||
    public long size()
 | 
			
		||||
    {
 | 
			
		||||
        return size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object fileKey() {
 | 
			
		||||
    public Object fileKey()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,39 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An {@link IOException} which occurred on a specific file.
 | 
			
		||||
 *
 | 
			
		||||
 * This may be thrown from a {@link IMount} or {@link IWritableMount} to give more information about a failure.
 | 
			
		||||
 */
 | 
			
		||||
public class FileOperationException extends IOException {
 | 
			
		||||
public class FileOperationException extends IOException
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = -8809108200853029849L;
 | 
			
		||||
 | 
			
		||||
    private final String filename;
 | 
			
		||||
 | 
			
		||||
    public FileOperationException(@Nullable String filename, @Nonnull String message) {
 | 
			
		||||
        super(Objects.requireNonNull(message, "message cannot be null"));
 | 
			
		||||
    public FileOperationException( @Nullable String filename, @Nonnull String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( Objects.requireNonNull( message, "message cannot be null" ) );
 | 
			
		||||
        this.filename = filename;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public FileOperationException(@Nonnull String message) {
 | 
			
		||||
        super(Objects.requireNonNull(message, "message cannot be null"));
 | 
			
		||||
        this.filename = null;
 | 
			
		||||
    public FileOperationException( @Nonnull String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( Objects.requireNonNull( message, "message cannot be null" ) );
 | 
			
		||||
        filename = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public String getFilename() {
 | 
			
		||||
        return this.filename;
 | 
			
		||||
    public String getFilename()
 | 
			
		||||
    {
 | 
			
		||||
        return filename;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -13,31 +12,32 @@ import java.io.IOException;
 | 
			
		||||
 *
 | 
			
		||||
 * This exists for use by various APIs - one should not attempt to mount it.
 | 
			
		||||
 */
 | 
			
		||||
public interface IFileSystem extends IWritableMount {
 | 
			
		||||
public interface IFileSystem extends IWritableMount
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Combine two paths together, reducing them into a normalised form.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path The main path.
 | 
			
		||||
     * @param path  The main path.
 | 
			
		||||
     * @param child The path to append.
 | 
			
		||||
     * @return The combined, normalised path.
 | 
			
		||||
     */
 | 
			
		||||
    String combine(String path, String child);
 | 
			
		||||
    String combine( String path, String child );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Copy files from one location to another.
 | 
			
		||||
     *
 | 
			
		||||
     * @param from The location to copy from.
 | 
			
		||||
     * @param to The location to copy to. This should not exist.
 | 
			
		||||
     * @param to   The location to copy to. This should not exist.
 | 
			
		||||
     * @throws IOException If the copy failed.
 | 
			
		||||
     */
 | 
			
		||||
    void copy(String from, String to) throws IOException;
 | 
			
		||||
    void copy( String from, String to ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Move files from one location to another.
 | 
			
		||||
     *
 | 
			
		||||
     * @param from The location to move from.
 | 
			
		||||
     * @param to The location to move to. This should not exist.
 | 
			
		||||
     * @param to   The location to move to. This should not exist.
 | 
			
		||||
     * @throws IOException If the move failed.
 | 
			
		||||
     */
 | 
			
		||||
    void move(String from, String to) throws IOException;
 | 
			
		||||
    void move( String from, String to ) throws IOException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.nio.channels.ReadableByteChannel;
 | 
			
		||||
import java.nio.file.attribute.BasicFileAttributes;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a read only part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)}.
 | 
			
		||||
 *
 | 
			
		||||
@@ -29,26 +26,27 @@ import net.minecraft.world.World;
 | 
			
		||||
 * @see IComputerAccess#mount(String, IMount)
 | 
			
		||||
 * @see IWritableMount
 | 
			
		||||
 */
 | 
			
		||||
public interface IMount {
 | 
			
		||||
public interface IMount
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the file names of all the files in a directory.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprograms".
 | 
			
		||||
     * @param path     A file path in normalised format, relative to the mount location. ie: "programs/myprograms".
 | 
			
		||||
     * @param contents A list of strings. Add all the file names to this list.
 | 
			
		||||
     * @throws IOException If the file was not a directory, or could not be listed.
 | 
			
		||||
     */
 | 
			
		||||
    void list(@Nonnull String path, @Nonnull List<String> contents) throws IOException;
 | 
			
		||||
    void list( @Nonnull String path, @Nonnull List<String> contents ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens a file with a given path, and returns an {@link ReadableByteChannel} representing its contents.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram".
 | 
			
		||||
     * @return A channel representing the contents of the file. If the channel implements {@link java.nio.channels.SeekableByteChannel}, one will be able to
 | 
			
		||||
     *     seek to arbitrary positions when using binary mode.
 | 
			
		||||
     * seek to arbitrary positions when using binary mode.
 | 
			
		||||
     * @throws IOException If the file does not exist, or could not be opened.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ReadableByteChannel openForRead(@Nonnull String path) throws IOException;
 | 
			
		||||
    ReadableByteChannel openForRead( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get attributes about the given file.
 | 
			
		||||
@@ -58,11 +56,13 @@ public interface IMount {
 | 
			
		||||
     * @throws IOException If the file does not exist, or attributes could not be fetched.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default BasicFileAttributes getAttributes(@Nonnull String path) throws IOException {
 | 
			
		||||
        if (!this.exists(path)) {
 | 
			
		||||
            throw new FileOperationException(path, "No such file");
 | 
			
		||||
    default BasicFileAttributes getAttributes( @Nonnull String path ) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        if( !exists( path ) )
 | 
			
		||||
        {
 | 
			
		||||
            throw new FileOperationException( path, "No such file" );
 | 
			
		||||
        }
 | 
			
		||||
        return new FileAttributes(this.isDirectory(path), this.getSize(path));
 | 
			
		||||
        return new FileAttributes( isDirectory( path ), getSize( path ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -72,7 +72,7 @@ public interface IMount {
 | 
			
		||||
     * @return If the file exists.
 | 
			
		||||
     * @throws IOException If an error occurs when checking the existence of the file.
 | 
			
		||||
     */
 | 
			
		||||
    boolean exists(@Nonnull String path) throws IOException;
 | 
			
		||||
    boolean exists( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns whether a file with a given path is a directory or not.
 | 
			
		||||
@@ -81,7 +81,7 @@ public interface IMount {
 | 
			
		||||
     * @return If the file exists and is a directory
 | 
			
		||||
     * @throws IOException If an error occurs when checking whether the file is a directory.
 | 
			
		||||
     */
 | 
			
		||||
    boolean isDirectory(@Nonnull String path) throws IOException;
 | 
			
		||||
    boolean isDirectory( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the size of a file with a given path, in bytes.
 | 
			
		||||
@@ -90,5 +90,5 @@ public interface IMount {
 | 
			
		||||
     * @return The size of the file, in bytes.
 | 
			
		||||
     * @throws IOException If the file does not exist, or its size could not be determined.
 | 
			
		||||
     */
 | 
			
		||||
    long getSize(@Nonnull String path) throws IOException;
 | 
			
		||||
    long getSize( @Nonnull String path ) throws IOException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.filesystem;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
import java.nio.channels.WritableByteChannel;
 | 
			
		||||
import java.util.OptionalLong;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)} or {@link
 | 
			
		||||
 * IComputerAccess#mountWritable(String, IWritableMount)}, that can also be written to.
 | 
			
		||||
@@ -30,14 +27,15 @@ import net.minecraft.world.World;
 | 
			
		||||
 * @see IComputerAccess#mountWritable(String, IWritableMount)
 | 
			
		||||
 * @see IMount
 | 
			
		||||
 */
 | 
			
		||||
public interface IWritableMount extends IMount {
 | 
			
		||||
public interface IWritableMount extends IMount
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a directory at a given path inside the virtual file system.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/mynewprograms".
 | 
			
		||||
     * @throws IOException If the directory already exists or could not be created.
 | 
			
		||||
     */
 | 
			
		||||
    void makeDirectory(@Nonnull String path) throws IOException;
 | 
			
		||||
    void makeDirectory( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Deletes a directory at a given path inside the virtual file system.
 | 
			
		||||
@@ -45,29 +43,29 @@ public interface IWritableMount extends IMount {
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myoldprograms".
 | 
			
		||||
     * @throws IOException If the file does not exist or could not be deleted.
 | 
			
		||||
     */
 | 
			
		||||
    void delete(@Nonnull String path) throws IOException;
 | 
			
		||||
    void delete( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens a file with a given path, and returns an {@link OutputStream} for writing to it.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram".
 | 
			
		||||
     * @return A stream for writing to. If the channel implements {@link java.nio.channels.SeekableByteChannel}, one will be able to seek to arbitrary
 | 
			
		||||
     *     positions when using binary mode.
 | 
			
		||||
     * positions when using binary mode.
 | 
			
		||||
     * @throws IOException If the file could not be opened for writing.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    WritableByteChannel openForWrite(@Nonnull String path) throws IOException;
 | 
			
		||||
    WritableByteChannel openForWrite( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens a file with a given path, and returns an {@link OutputStream} for appending to it.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram".
 | 
			
		||||
     * @return A stream for writing to. If the channel implements {@link java.nio.channels.SeekableByteChannel}, one will be able to seek to arbitrary
 | 
			
		||||
     *     positions when using binary mode.
 | 
			
		||||
     * positions when using binary mode.
 | 
			
		||||
     * @throws IOException If the file could not be opened for writing.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    WritableByteChannel openForAppend(@Nonnull String path) throws IOException;
 | 
			
		||||
    WritableByteChannel openForAppend( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the amount of free space on the mount, in bytes. You should decrease this value as the user writes to the mount, and write operations should fail
 | 
			
		||||
@@ -84,7 +82,8 @@ public interface IWritableMount extends IMount {
 | 
			
		||||
     * @return The capacity of this mount, in bytes.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default OptionalLong getCapacity() {
 | 
			
		||||
    default OptionalLong getCapacity()
 | 
			
		||||
    {
 | 
			
		||||
        return OptionalLong.empty();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheralProvider;
 | 
			
		||||
import dan200.computercraft.core.asm.LuaMethod;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A generic source of {@link LuaMethod} functions.
 | 
			
		||||
 *
 | 
			
		||||
 * Unlike normal objects ({@link IDynamicLuaObject} or {@link IPeripheral}), methods do not target this object but
 | 
			
		||||
 * instead are defined as {@code static} and accept their target as the first parameter. This allows you to inject
 | 
			
		||||
 * methods onto objects you do not own, as well as declaring methods for a specific "trait" (for instance, a
 | 
			
		||||
 * {@link Capability}).
 | 
			
		||||
 *
 | 
			
		||||
 * Currently the "generic peripheral" system is incompatible with normal peripherals. Normal {@link IPeripheralProvider}
 | 
			
		||||
 * or {@link IPeripheral} implementations take priority. Tile entities which use this system are given a peripheral name
 | 
			
		||||
 * determined by their id, rather than any peripheral provider. This will hopefully change in the future, once a suitable
 | 
			
		||||
 * design has been established.
 | 
			
		||||
 *
 | 
			
		||||
 * For example, the main CC: Tweaked mod defines a generic source for inventories, which works on {@link IItemHandler}s:
 | 
			
		||||
 *
 | 
			
		||||
 * <pre>{@code
 | 
			
		||||
 * public class InventoryMethods implements GenericSource {
 | 
			
		||||
 *     \@LuaFunction( mainThread = true )
 | 
			
		||||
 *     public static int size(IItemHandler inventory) {
 | 
			
		||||
 *         return inventory.getSlots();
 | 
			
		||||
 *     }
 | 
			
		||||
 *
 | 
			
		||||
 *     // ...
 | 
			
		||||
 * }
 | 
			
		||||
 * }</pre>
 | 
			
		||||
 *
 | 
			
		||||
 * @see ComputerCraftAPI#registerGenericSource(GenericSource)
 | 
			
		||||
 * @see ComputerCraftAPI#registerGenericCapability(Capability) New capabilities (those not built into Forge) must be
 | 
			
		||||
 * explicitly given to the generic peripheral system, as there is no way to enumerate all capabilities.
 | 
			
		||||
 */
 | 
			
		||||
public interface GenericSource
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * A unique identifier for this generic source.
 | 
			
		||||
     *
 | 
			
		||||
     * This is currently unused, but may be used in the future to allow disabling specific sources. It is recommended
 | 
			
		||||
     * to return an identifier using your mod's ID.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This source's identifier.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Identifier id();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,24 +1,23 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.api.lua.LuaValues.checkFinite;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.nio.ByteBuffer;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import static dan200.computercraft.api.lua.LuaValues.checkFinite;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The arguments passed to a function.
 | 
			
		||||
 */
 | 
			
		||||
public interface IArguments {
 | 
			
		||||
public interface IArguments
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Drop a number of arguments. The returned arguments instance will access arguments at position {@code i + count}, rather than {@code i}. However,
 | 
			
		||||
     * errors will still use the given argument index.
 | 
			
		||||
@@ -26,12 +25,14 @@ public interface IArguments {
 | 
			
		||||
     * @param count The number of arguments to drop.
 | 
			
		||||
     * @return The new {@link IArguments} instance.
 | 
			
		||||
     */
 | 
			
		||||
    IArguments drop(int count);
 | 
			
		||||
    IArguments drop( int count );
 | 
			
		||||
 | 
			
		||||
    default Object[] getAll() {
 | 
			
		||||
        Object[] result = new Object[this.count()];
 | 
			
		||||
        for (int i = 0; i < result.length; i++) {
 | 
			
		||||
            result[i] = this.get(i);
 | 
			
		||||
    default Object[] getAll()
 | 
			
		||||
    {
 | 
			
		||||
        Object[] result = new Object[count()];
 | 
			
		||||
        for( int i = 0; i < result.length; i++ )
 | 
			
		||||
        {
 | 
			
		||||
            result[i] = get( i );
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
@@ -58,7 +59,7 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@code null} if not present.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object get(int index);
 | 
			
		||||
    Object get( int index );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as an integer.
 | 
			
		||||
@@ -67,8 +68,9 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not an integer.
 | 
			
		||||
     */
 | 
			
		||||
    default int getInt(int index) throws LuaException {
 | 
			
		||||
        return (int) this.getLong(index);
 | 
			
		||||
    default int getInt( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return (int) getLong( index );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -78,13 +80,15 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a long.
 | 
			
		||||
     */
 | 
			
		||||
    default long getLong(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (!(value instanceof Number)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "number", value);
 | 
			
		||||
    default long getLong( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof Number) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "number", value );
 | 
			
		||||
        }
 | 
			
		||||
        return LuaValues.checkFiniteNum(index, (Number) value)
 | 
			
		||||
                        .longValue();
 | 
			
		||||
        return LuaValues.checkFiniteNum( index, (Number) value )
 | 
			
		||||
            .longValue();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -94,8 +98,9 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not finite.
 | 
			
		||||
     */
 | 
			
		||||
    default double getFiniteDouble(int index) throws LuaException {
 | 
			
		||||
        return checkFinite(index, this.getDouble(index));
 | 
			
		||||
    default double getFiniteDouble( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return checkFinite( index, getDouble( index ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -106,10 +111,12 @@ public interface IArguments {
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     * @see #getFiniteDouble(int) if you require this to be finite (i.e. not infinite or NaN).
 | 
			
		||||
     */
 | 
			
		||||
    default double getDouble(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (!(value instanceof Number)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "number", value);
 | 
			
		||||
    default double getDouble( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof Number) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "number", value );
 | 
			
		||||
        }
 | 
			
		||||
        return ((Number) value).doubleValue();
 | 
			
		||||
    }
 | 
			
		||||
@@ -121,10 +128,12 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a boolean.
 | 
			
		||||
     */
 | 
			
		||||
    default boolean getBoolean(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (!(value instanceof Boolean)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "boolean", value);
 | 
			
		||||
    default boolean getBoolean( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof Boolean) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "boolean", value );
 | 
			
		||||
        }
 | 
			
		||||
        return (Boolean) value;
 | 
			
		||||
    }
 | 
			
		||||
@@ -137,8 +146,9 @@ public interface IArguments {
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default ByteBuffer getBytes(int index) throws LuaException {
 | 
			
		||||
        return LuaValues.encode(this.getString(index));
 | 
			
		||||
    default ByteBuffer getBytes( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return LuaValues.encode( getString( index ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -149,10 +159,12 @@ public interface IArguments {
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default String getString(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (!(value instanceof String)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "string", value);
 | 
			
		||||
    default String getString( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof String) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "string", value );
 | 
			
		||||
        }
 | 
			
		||||
        return (String) value;
 | 
			
		||||
    }
 | 
			
		||||
@@ -162,13 +174,14 @@ public interface IArguments {
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param klass The type of enum to parse.
 | 
			
		||||
     * @param <T> The type of enum to parse.
 | 
			
		||||
     * @param <T>   The type of enum to parse.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a string or not a valid option for this enum.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default <T extends Enum<T>> T getEnum(int index, Class<T> klass) throws LuaException {
 | 
			
		||||
        return LuaValues.checkEnum(index, klass, this.getString(index));
 | 
			
		||||
    default <T extends Enum<T>> T getEnum( int index, Class<T> klass ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return LuaValues.checkEnum( index, klass, getString( index ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -179,10 +192,12 @@ public interface IArguments {
 | 
			
		||||
     * @throws LuaException If the value is not a table.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Map<?, ?> getTable(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (!(value instanceof Map)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "table", value);
 | 
			
		||||
    default Map<?, ?> getTable( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof Map) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "table", value );
 | 
			
		||||
        }
 | 
			
		||||
        return (Map<?, ?>) value;
 | 
			
		||||
    }
 | 
			
		||||
@@ -194,8 +209,9 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present. This is a <em>read only</em> buffer.
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    default Optional<ByteBuffer> optBytes(int index) throws LuaException {
 | 
			
		||||
        return this.optString(index).map(LuaValues::encode);
 | 
			
		||||
    default Optional<ByteBuffer> optBytes( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optString( index ).map( LuaValues::encode );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -205,15 +221,18 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    default Optional<String> optString(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
    default Optional<String> optString( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if (!(value instanceof String)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "string", value);
 | 
			
		||||
        if( !(value instanceof String) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "string", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of((String) value);
 | 
			
		||||
        return Optional.of( (String) value );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -221,26 +240,28 @@ public interface IArguments {
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param klass The type of enum to parse.
 | 
			
		||||
     * @param <T> The type of enum to parse.
 | 
			
		||||
     * @param <T>   The type of enum to parse.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a string or not a valid option for this enum.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default <T extends Enum<T>> Optional<T> optEnum(int index, Class<T> klass) throws LuaException {
 | 
			
		||||
        Optional<String> str = this.optString(index);
 | 
			
		||||
        return str.isPresent() ? Optional.of(LuaValues.checkEnum(index, klass, str.get())) : Optional.empty();
 | 
			
		||||
    default <T extends Enum<T>> Optional<T> optEnum( int index, Class<T> klass ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Optional<String> str = optString( index );
 | 
			
		||||
        return str.isPresent() ? Optional.of( LuaValues.checkEnum( index, klass, str.get() ) ) : Optional.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a double.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    default double optDouble(int index, double def) throws LuaException {
 | 
			
		||||
        return this.optDouble(index).orElse(def);
 | 
			
		||||
    default double optDouble( int index, double def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optDouble( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -251,27 +272,31 @@ public interface IArguments {
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Optional<Double> optDouble(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
    default Optional<Double> optDouble( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if (!(value instanceof Number)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "number", value);
 | 
			
		||||
        if( !(value instanceof Number) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "number", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of(((Number) value).doubleValue());
 | 
			
		||||
        return Optional.of( ((Number) value).doubleValue() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as an int.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    default int optInt(int index, int def) throws LuaException {
 | 
			
		||||
        return this.optInt(index).orElse(def);
 | 
			
		||||
    default int optInt( int index, int def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optInt( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -282,8 +307,9 @@ public interface IArguments {
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Optional<Integer> optInt(int index) throws LuaException {
 | 
			
		||||
        return this.optLong(index).map(Long::intValue);
 | 
			
		||||
    default Optional<Integer> optInt( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optLong( index ).map( Long::intValue );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -293,40 +319,45 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    default Optional<Long> optLong(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
    default Optional<Long> optLong( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if (!(value instanceof Number)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "number", value);
 | 
			
		||||
        if( !(value instanceof Number) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "number", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of(LuaValues.checkFiniteNum(index, (Number) value)
 | 
			
		||||
                                    .longValue());
 | 
			
		||||
        return Optional.of( LuaValues.checkFiniteNum( index, (Number) value )
 | 
			
		||||
            .longValue() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a long.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    default long optLong(int index, long def) throws LuaException {
 | 
			
		||||
        return this.optLong(index).orElse(def);
 | 
			
		||||
    default long optLong( int index, long def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optLong( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a finite number (not infinite or NaN).
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not finite.
 | 
			
		||||
     */
 | 
			
		||||
    default double optFiniteDouble(int index, double def) throws LuaException {
 | 
			
		||||
        return this.optFiniteDouble(index).orElse(def);
 | 
			
		||||
    default double optFiniteDouble( int index, double def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optFiniteDouble( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -336,10 +367,12 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not finite.
 | 
			
		||||
     */
 | 
			
		||||
    default Optional<Double> optFiniteDouble(int index) throws LuaException {
 | 
			
		||||
        Optional<Double> value = this.optDouble(index);
 | 
			
		||||
        if (value.isPresent()) {
 | 
			
		||||
            LuaValues.checkFiniteNum(index, value.get());
 | 
			
		||||
    default Optional<Double> optFiniteDouble( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Optional<Double> value = optDouble( index );
 | 
			
		||||
        if( value.isPresent() )
 | 
			
		||||
        {
 | 
			
		||||
            LuaValues.checkFiniteNum( index, value.get() );
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
@@ -348,12 +381,13 @@ public interface IArguments {
 | 
			
		||||
     * Get an argument as a boolean.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not a boolean.
 | 
			
		||||
     */
 | 
			
		||||
    default boolean optBoolean(int index, boolean def) throws LuaException {
 | 
			
		||||
        return this.optBoolean(index).orElse(def);
 | 
			
		||||
    default boolean optBoolean( int index, boolean def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optBoolean( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -363,39 +397,44 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not a boolean.
 | 
			
		||||
     */
 | 
			
		||||
    default Optional<Boolean> optBoolean(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
    default Optional<Boolean> optBoolean( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if (!(value instanceof Boolean)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "boolean", value);
 | 
			
		||||
        if( !(value instanceof Boolean) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "boolean", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of((Boolean) value);
 | 
			
		||||
        return Optional.of( (Boolean) value );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a string.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    default String optString(int index, String def) throws LuaException {
 | 
			
		||||
        return this.optString(index).orElse(def);
 | 
			
		||||
    default String optString( int index, String def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optString( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a table.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param def The default value, if this argument is not given.
 | 
			
		||||
     * @param def   The default value, if this argument is not given.
 | 
			
		||||
     * @return The argument's value, or {@code def} if none was provided.
 | 
			
		||||
     * @throws LuaException If the value is not a table.
 | 
			
		||||
     */
 | 
			
		||||
    default Map<?, ?> optTable(int index, Map<Object, Object> def) throws LuaException {
 | 
			
		||||
        return this.optTable(index).orElse(def);
 | 
			
		||||
    default Map<?, ?> optTable( int index, Map<Object, Object> def ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optTable( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -405,14 +444,17 @@ public interface IArguments {
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not a table.
 | 
			
		||||
     */
 | 
			
		||||
    default Optional<Map<?, ?>> optTable(int index) throws LuaException {
 | 
			
		||||
        Object value = this.get(index);
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
    default Optional<Map<?, ?>> optTable( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if (!(value instanceof Map)) {
 | 
			
		||||
            throw LuaValues.badArgumentOf(index, "map", value);
 | 
			
		||||
        if( !(value instanceof Map) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "map", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of((Map<?, ?>) value);
 | 
			
		||||
        return Optional.of( (Map<?, ?>) value );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IFileSystem;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An interface passed to {@link ILuaAPIFactory} in order to provide additional information about a computer.
 | 
			
		||||
 */
 | 
			
		||||
public interface IComputerSystem extends IComputerAccess {
 | 
			
		||||
public interface IComputerSystem extends IComputerAccess
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the file system for this computer.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,22 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IDynamicPeripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An interface for representing custom objects returned by peripherals or other Lua objects.
 | 
			
		||||
 *
 | 
			
		||||
 * Generally, one does not need to implement this type - it is sufficient to return an object with some methods annotated with {@link LuaFunction}. {@link
 | 
			
		||||
 * IDynamicLuaObject} is useful when you wish your available methods to change at runtime.
 | 
			
		||||
 */
 | 
			
		||||
public interface IDynamicLuaObject {
 | 
			
		||||
public interface IDynamicLuaObject
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the names of the methods that this object implements. This should not change over the course of the object's lifetime.
 | 
			
		||||
     *
 | 
			
		||||
@@ -29,12 +29,12 @@ public interface IDynamicLuaObject {
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when a user calls one of the methods that this object implements.
 | 
			
		||||
     *
 | 
			
		||||
     * @param context The context of the currently running lua thread. This can be used to wait for events or otherwise yield.
 | 
			
		||||
     * @param method An integer identifying which method index from {@link #getMethodNames()} the computer wishes to call.
 | 
			
		||||
     * @param context   The context of the currently running lua thread. This can be used to wait for events or otherwise yield.
 | 
			
		||||
     * @param method    An integer identifying which method index from {@link #getMethodNames()} the computer wishes to call.
 | 
			
		||||
     * @param arguments The arguments for this method.
 | 
			
		||||
     * @return The result of this function. Either an immediate value ({@link MethodResult#of(Object...)} or an instruction to yield.
 | 
			
		||||
     * @throws LuaException If the function threw an exception.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult callMethod(@Nonnull ILuaContext context, int method, @Nonnull IArguments arguments) throws LuaException;
 | 
			
		||||
    MethodResult callMethod( @Nonnull ILuaContext context, int method, @Nonnull IArguments arguments ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
@@ -18,7 +17,8 @@ import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 * @see ILuaAPIFactory
 | 
			
		||||
 * @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory)
 | 
			
		||||
 */
 | 
			
		||||
public interface ILuaAPI {
 | 
			
		||||
public interface ILuaAPI
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the globals this API will be assigned to. This will override any other global, so you should
 | 
			
		||||
     *
 | 
			
		||||
@@ -31,13 +31,15 @@ public interface ILuaAPI {
 | 
			
		||||
     *
 | 
			
		||||
     * One should only interact with the file system.
 | 
			
		||||
     */
 | 
			
		||||
    default void startup() {
 | 
			
		||||
    default void startup()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called every time the computer is ticked. This can be used to process various.
 | 
			
		||||
     */
 | 
			
		||||
    default void update() {
 | 
			
		||||
    default void update()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -45,6 +47,7 @@ public interface ILuaAPI {
 | 
			
		||||
     *
 | 
			
		||||
     * This should reset the state of the object, disposing any remaining file handles, or other resources.
 | 
			
		||||
     */
 | 
			
		||||
    default void shutdown() {
 | 
			
		||||
    default void shutdown()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Construct an {@link ILuaAPI} for a specific computer.
 | 
			
		||||
 *
 | 
			
		||||
@@ -18,7 +17,8 @@ import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 * @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface ILuaAPIFactory {
 | 
			
		||||
public interface ILuaAPIFactory
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a new API instance for a given computer.
 | 
			
		||||
     *
 | 
			
		||||
@@ -26,5 +26,5 @@ public interface ILuaAPIFactory {
 | 
			
		||||
     * @return The created API, or {@code null} if one should not be injected.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    ILuaAPI create(@Nonnull IComputerSystem computer);
 | 
			
		||||
    ILuaAPI create( @Nonnull IComputerSystem computer );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -13,7 +12,8 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 *
 | 
			
		||||
 * @see MethodResult#yield(Object[], ILuaCallback)
 | 
			
		||||
 */
 | 
			
		||||
public interface ILuaCallback {
 | 
			
		||||
public interface ILuaCallback
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Resume this coroutine.
 | 
			
		||||
     *
 | 
			
		||||
@@ -22,5 +22,5 @@ public interface ILuaCallback {
 | 
			
		||||
     * @throws LuaException On an error.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult resume(Object[] args) throws LuaException;
 | 
			
		||||
    MethodResult resume( Object[] args ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -12,7 +11,8 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 * An interface passed to peripherals and {@link IDynamicLuaObject}s by computers or turtles, providing methods that allow the peripheral call to interface
 | 
			
		||||
 * with the computer.
 | 
			
		||||
 */
 | 
			
		||||
public interface ILuaContext {
 | 
			
		||||
public interface ILuaContext
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Queue a task to be executed on the main server thread at the beginning of next tick, but do not wait for it to complete. This should be used when you
 | 
			
		||||
     * need to interact with the world in a thread-safe manner but do not care about the result or you wish to run asynchronously.
 | 
			
		||||
@@ -25,5 +25,5 @@ public interface ILuaContext {
 | 
			
		||||
     * @throws LuaException If the task could not be queued.
 | 
			
		||||
     * @see LuaFunction#mainThread() To run functions on the main thread and return their results synchronously.
 | 
			
		||||
     */
 | 
			
		||||
    long issueMainThreadTask(@Nonnull ILuaTask task) throws LuaException;
 | 
			
		||||
    long issueMainThreadTask( @Nonnull ILuaTask task ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -15,7 +14,8 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 * @see MethodResult#of(Object)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface ILuaFunction {
 | 
			
		||||
public interface ILuaFunction
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Call this function with a series of arguments. Note, this will <em>always</em> be called on the computer thread, and so its implementation must be
 | 
			
		||||
     * thread-safe.
 | 
			
		||||
@@ -25,5 +25,5 @@ public interface ILuaFunction {
 | 
			
		||||
     * @throws LuaException Upon Lua errors.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult call(@Nonnull IArguments arguments) throws LuaException;
 | 
			
		||||
    MethodResult call( @Nonnull IArguments arguments ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,18 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
public interface ILuaObject {
 | 
			
		||||
public interface ILuaObject
 | 
			
		||||
{
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String[] getMethodNames();
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object[] callMethod(@Nonnull ILuaContext context, int method, @Nonnull Object[] arguments) throws LuaException, InterruptedException;
 | 
			
		||||
    Object[] callMethod( @Nonnull ILuaContext context, int method, @Nonnull Object[] arguments ) throws LuaException, InterruptedException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -15,13 +14,14 @@ import javax.annotation.Nullable;
 | 
			
		||||
 * @see ILuaContext#issueMainThreadTask(ILuaTask)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface ILuaTask {
 | 
			
		||||
public interface ILuaTask
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Execute this task.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The arguments to add to the {@code task_completed} event.
 | 
			
		||||
     * @throws LuaException If you throw any exception from this function, a lua error will be raised with the same message as your exception. Use this
 | 
			
		||||
     *     to throw appropriate errors if the wrong arguments are supplied to your method.
 | 
			
		||||
     *                      to throw appropriate errors if the wrong arguments are supplied to your method.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object[] execute() throws LuaException;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -11,20 +10,23 @@ import javax.annotation.Nullable;
 | 
			
		||||
/**
 | 
			
		||||
 * An exception representing an error in Lua, like that raised by the {@code error()} function.
 | 
			
		||||
 */
 | 
			
		||||
public class LuaException extends Exception {
 | 
			
		||||
public class LuaException extends Exception
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = -6136063076818512651L;
 | 
			
		||||
    private final boolean hasLevel;
 | 
			
		||||
    private final int level;
 | 
			
		||||
 | 
			
		||||
    public LuaException(@Nullable String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
        this.hasLevel = false;
 | 
			
		||||
        this.level = 1;
 | 
			
		||||
    public LuaException( @Nullable String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( message );
 | 
			
		||||
        hasLevel = false;
 | 
			
		||||
        level = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LuaException(@Nullable String message, int level) {
 | 
			
		||||
        super(message);
 | 
			
		||||
        this.hasLevel = true;
 | 
			
		||||
    public LuaException( @Nullable String message, int level )
 | 
			
		||||
    {
 | 
			
		||||
        super( message );
 | 
			
		||||
        hasLevel = true;
 | 
			
		||||
        this.level = level;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -33,8 +35,9 @@ public class LuaException extends Exception {
 | 
			
		||||
     *
 | 
			
		||||
     * @return Whether this has an explicit level.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean hasLevel() {
 | 
			
		||||
        return this.hasLevel;
 | 
			
		||||
    public boolean hasLevel()
 | 
			
		||||
    {
 | 
			
		||||
        return hasLevel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -42,7 +45,8 @@ public class LuaException extends Exception {
 | 
			
		||||
     *
 | 
			
		||||
     * @return The level to raise the error at.
 | 
			
		||||
     */
 | 
			
		||||
    public int getLevel() {
 | 
			
		||||
        return this.level;
 | 
			
		||||
    public int getLevel()
 | 
			
		||||
    {
 | 
			
		||||
        return level;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Documented;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.*;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Used to mark a Java function which is callable from Lua.
 | 
			
		||||
 *
 | 
			
		||||
@@ -41,9 +36,10 @@ import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 * {@link MethodResult#of(Object...)}.
 | 
			
		||||
 */
 | 
			
		||||
@Documented
 | 
			
		||||
@Retention (RetentionPolicy.RUNTIME)
 | 
			
		||||
@Target (ElementType.METHOD)
 | 
			
		||||
public @interface LuaFunction {
 | 
			
		||||
@Retention( RetentionPolicy.RUNTIME )
 | 
			
		||||
@Target( ElementType.METHOD )
 | 
			
		||||
public @interface LuaFunction
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Explicitly specify the method names of this function. If not given, it uses the name of the annotated method.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import java.nio.ByteBuffer;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.nio.ByteBuffer;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Various utility functions for operating with Lua values.
 | 
			
		||||
 *
 | 
			
		||||
 * @see IArguments
 | 
			
		||||
 */
 | 
			
		||||
public final class LuaValues {
 | 
			
		||||
    private LuaValues() {
 | 
			
		||||
public final class LuaValues
 | 
			
		||||
{
 | 
			
		||||
    private LuaValues()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -28,41 +28,45 @@ public final class LuaValues {
 | 
			
		||||
     * @return The encoded string.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static ByteBuffer encode(@Nonnull String string) {
 | 
			
		||||
    public static ByteBuffer encode( @Nonnull String string )
 | 
			
		||||
    {
 | 
			
		||||
        byte[] chars = new byte[string.length()];
 | 
			
		||||
        for (int i = 0; i < chars.length; i++) {
 | 
			
		||||
            char c = string.charAt(i);
 | 
			
		||||
        for( int i = 0; i < chars.length; i++ )
 | 
			
		||||
        {
 | 
			
		||||
            char c = string.charAt( i );
 | 
			
		||||
            chars[i] = c < 256 ? (byte) c : 63;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ByteBuffer.wrap(chars)
 | 
			
		||||
                         .asReadOnlyBuffer();
 | 
			
		||||
        return ByteBuffer.wrap( chars )
 | 
			
		||||
            .asReadOnlyBuffer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Construct a "bad argument" exception, from an expected type and the actual value provided.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number, starting from 0.
 | 
			
		||||
     * @param index    The argument number, starting from 0.
 | 
			
		||||
     * @param expected The expected type for this argument.
 | 
			
		||||
     * @param actual The actual value provided for this argument.
 | 
			
		||||
     * @param actual   The actual value provided for this argument.
 | 
			
		||||
     * @return The constructed exception, which should be thrown immediately.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static LuaException badArgumentOf(int index, @Nonnull String expected, @Nullable Object actual) {
 | 
			
		||||
        return badArgument(index, expected, getType(actual));
 | 
			
		||||
    public static LuaException badArgumentOf( int index, @Nonnull String expected, @Nullable Object actual )
 | 
			
		||||
    {
 | 
			
		||||
        return badArgument( index, expected, getType( actual ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Construct a "bad argument" exception, from an expected and actual type.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number, starting from 0.
 | 
			
		||||
     * @param index    The argument number, starting from 0.
 | 
			
		||||
     * @param expected The expected type for this argument.
 | 
			
		||||
     * @param actual The provided type for this argument.
 | 
			
		||||
     * @param actual   The provided type for this argument.
 | 
			
		||||
     * @return The constructed exception, which should be thrown immediately.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static LuaException badArgument(int index, @Nonnull String expected, @Nonnull String actual) {
 | 
			
		||||
        return new LuaException("bad argument #" + (index + 1) + " (" + expected + " expected, got " + actual + ")");
 | 
			
		||||
    public static LuaException badArgument( int index, @Nonnull String expected, @Nonnull String actual )
 | 
			
		||||
    {
 | 
			
		||||
        return new LuaException( "bad argument #" + (index + 1) + " (" + expected + " expected, got " + actual + ")" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -72,20 +76,26 @@ public final class LuaValues {
 | 
			
		||||
     * @return A string representation of the given value's type, in a similar format to that provided by Lua's {@code type} function.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static String getType(@Nullable Object value) {
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
    public static String getType( @Nullable Object value )
 | 
			
		||||
    {
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return "nil";
 | 
			
		||||
        }
 | 
			
		||||
        if (value instanceof String) {
 | 
			
		||||
        if( value instanceof String )
 | 
			
		||||
        {
 | 
			
		||||
            return "string";
 | 
			
		||||
        }
 | 
			
		||||
        if (value instanceof Boolean) {
 | 
			
		||||
        if( value instanceof Boolean )
 | 
			
		||||
        {
 | 
			
		||||
            return "boolean";
 | 
			
		||||
        }
 | 
			
		||||
        if (value instanceof Number) {
 | 
			
		||||
        if( value instanceof Number )
 | 
			
		||||
        {
 | 
			
		||||
            return "number";
 | 
			
		||||
        }
 | 
			
		||||
        if (value instanceof Map) {
 | 
			
		||||
        if( value instanceof Map )
 | 
			
		||||
        {
 | 
			
		||||
            return "table";
 | 
			
		||||
        }
 | 
			
		||||
        return "userdata";
 | 
			
		||||
@@ -99,8 +109,9 @@ public final class LuaValues {
 | 
			
		||||
     * @return The input {@code value}.
 | 
			
		||||
     * @throws LuaException If this is not a finite number.
 | 
			
		||||
     */
 | 
			
		||||
    public static Number checkFiniteNum(int index, Number value) throws LuaException {
 | 
			
		||||
        checkFinite(index, value.doubleValue());
 | 
			
		||||
    public static Number checkFiniteNum( int index, Number value ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        checkFinite( index, value.doubleValue() );
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -112,9 +123,11 @@ public final class LuaValues {
 | 
			
		||||
     * @return The input {@code value}.
 | 
			
		||||
     * @throws LuaException If this is not a finite number.
 | 
			
		||||
     */
 | 
			
		||||
    public static double checkFinite(int index, double value) throws LuaException {
 | 
			
		||||
        if (!Double.isFinite(value)) {
 | 
			
		||||
            throw badArgument(index, "number", getNumericType(value));
 | 
			
		||||
    public static double checkFinite( int index, double value ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        if( !Double.isFinite( value ) )
 | 
			
		||||
        {
 | 
			
		||||
            throw badArgument( index, "number", getNumericType( value ) );
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
@@ -127,14 +140,18 @@ public final class LuaValues {
 | 
			
		||||
     * @return This value's numeric type.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static String getNumericType(double value) {
 | 
			
		||||
        if (Double.isNaN(value)) {
 | 
			
		||||
    public static String getNumericType( double value )
 | 
			
		||||
    {
 | 
			
		||||
        if( Double.isNaN( value ) )
 | 
			
		||||
        {
 | 
			
		||||
            return "nan";
 | 
			
		||||
        }
 | 
			
		||||
        if (value == Double.POSITIVE_INFINITY) {
 | 
			
		||||
        if( value == Double.POSITIVE_INFINITY )
 | 
			
		||||
        {
 | 
			
		||||
            return "inf";
 | 
			
		||||
        }
 | 
			
		||||
        if (value == Double.NEGATIVE_INFINITY) {
 | 
			
		||||
        if( value == Double.NEGATIVE_INFINITY )
 | 
			
		||||
        {
 | 
			
		||||
            return "-inf";
 | 
			
		||||
        }
 | 
			
		||||
        return "number";
 | 
			
		||||
@@ -146,18 +163,21 @@ public final class LuaValues {
 | 
			
		||||
     * @param index The argument index to check.
 | 
			
		||||
     * @param klass The class of the enum instance.
 | 
			
		||||
     * @param value The value to extract.
 | 
			
		||||
     * @param <T> The type of enum we are extracting.
 | 
			
		||||
     * @param <T>   The type of enum we are extracting.
 | 
			
		||||
     * @return The parsed enum value.
 | 
			
		||||
     * @throws LuaException If this is not a known enum value.
 | 
			
		||||
     */
 | 
			
		||||
    public static <T extends Enum<T>> T checkEnum(int index, Class<T> klass, String value) throws LuaException {
 | 
			
		||||
        for (T possibility : klass.getEnumConstants()) {
 | 
			
		||||
            if (possibility.name()
 | 
			
		||||
                           .equalsIgnoreCase(value)) {
 | 
			
		||||
    public static <T extends Enum<T>> T checkEnum( int index, Class<T> klass, String value ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        for( T possibility : klass.getEnumConstants() )
 | 
			
		||||
        {
 | 
			
		||||
            if( possibility.name()
 | 
			
		||||
                .equalsIgnoreCase( value ) )
 | 
			
		||||
            {
 | 
			
		||||
                return possibility;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new LuaException("bad argument #" + (index + 1) + " (unknown option " + value + ")");
 | 
			
		||||
        throw new LuaException( "bad argument #" + (index + 1) + " (unknown option " + value + ")" );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,42 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.nio.ByteBuffer;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The result of invoking a Lua method.
 | 
			
		||||
 *
 | 
			
		||||
 * Method results either return a value immediately ({@link #of(Object...)} or yield control to the parent coroutine. When the current coroutine is resumed,
 | 
			
		||||
 * we invoke the provided {@link ILuaCallback#resume(Object[])} callback.
 | 
			
		||||
 */
 | 
			
		||||
public final class MethodResult {
 | 
			
		||||
    private static final MethodResult empty = new MethodResult(null, null);
 | 
			
		||||
public final class MethodResult
 | 
			
		||||
{
 | 
			
		||||
    private static final MethodResult empty = new MethodResult( null, null );
 | 
			
		||||
 | 
			
		||||
    private final Object[] result;
 | 
			
		||||
    private final ILuaCallback callback;
 | 
			
		||||
    private final int adjust;
 | 
			
		||||
 | 
			
		||||
    private MethodResult(Object[] arguments, ILuaCallback callback) {
 | 
			
		||||
        this.result = arguments;
 | 
			
		||||
    private MethodResult( Object[] arguments, ILuaCallback callback )
 | 
			
		||||
    {
 | 
			
		||||
        result = arguments;
 | 
			
		||||
        this.callback = callback;
 | 
			
		||||
        this.adjust = 0;
 | 
			
		||||
        adjust = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MethodResult(Object[] arguments, ILuaCallback callback, int adjust) {
 | 
			
		||||
        this.result = arguments;
 | 
			
		||||
    private MethodResult( Object[] arguments, ILuaCallback callback, int adjust )
 | 
			
		||||
    {
 | 
			
		||||
        result = arguments;
 | 
			
		||||
        this.callback = callback;
 | 
			
		||||
        this.adjust = adjust;
 | 
			
		||||
    }
 | 
			
		||||
@@ -47,7 +48,8 @@ public final class MethodResult {
 | 
			
		||||
     * @return A method result which returns immediately with no values.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult of() {
 | 
			
		||||
    public static MethodResult of()
 | 
			
		||||
    {
 | 
			
		||||
        return empty;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -64,8 +66,9 @@ public final class MethodResult {
 | 
			
		||||
     * @return A method result which returns immediately with the given value.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult of(@Nullable Object value) {
 | 
			
		||||
        return new MethodResult(new Object[] {value}, null);
 | 
			
		||||
    public static MethodResult of( @Nullable Object value )
 | 
			
		||||
    {
 | 
			
		||||
        return new MethodResult( new Object[] { value }, null );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -75,43 +78,47 @@ public final class MethodResult {
 | 
			
		||||
     * @return A method result which returns immediately with the given values.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult of(@Nullable Object... values) {
 | 
			
		||||
        return values == null || values.length == 0 ? empty : new MethodResult(values, null);
 | 
			
		||||
    public static MethodResult of( @Nullable Object... values )
 | 
			
		||||
    {
 | 
			
		||||
        return values == null || values.length == 0 ? empty : new MethodResult( values, null );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Wait for an event to occur on the computer, suspending the thread until it arises. This method is exactly equivalent to {@code os.pullEvent()} in
 | 
			
		||||
     * lua.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filter A specific event to wait for, or null to wait for any event.
 | 
			
		||||
     * @param filter   A specific event to wait for, or null to wait for any event.
 | 
			
		||||
     * @param callback The callback to resume with the name of the event that occurred, and any event parameters.
 | 
			
		||||
     * @return The method result which represents this yield.
 | 
			
		||||
     * @see IComputerAccess#queueEvent(String, Object[])
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult pullEvent(@Nullable String filter, @Nonnull ILuaCallback callback) {
 | 
			
		||||
        Objects.requireNonNull(callback, "callback cannot be null");
 | 
			
		||||
        return new MethodResult(new Object[] {filter}, results -> {
 | 
			
		||||
            if (results.length >= 1 && results[0].equals("terminate")) {
 | 
			
		||||
                throw new LuaException("Terminated", 0);
 | 
			
		||||
    public static MethodResult pullEvent( @Nullable String filter, @Nonnull ILuaCallback callback )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( callback, "callback cannot be null" );
 | 
			
		||||
        return new MethodResult( new Object[] { filter }, results -> {
 | 
			
		||||
            if( results.length >= 1 && results[0].equals( "terminate" ) )
 | 
			
		||||
            {
 | 
			
		||||
                throw new LuaException( "Terminated", 0 );
 | 
			
		||||
            }
 | 
			
		||||
            return callback.resume(results);
 | 
			
		||||
        });
 | 
			
		||||
            return callback.resume( results );
 | 
			
		||||
        } );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The same as {@link #pullEvent(String, ILuaCallback)}, except "terminated" events are ignored. Only use this if you want to prevent program
 | 
			
		||||
     * termination, which is not recommended. This method is exactly equivalent to {@code os.pullEventRaw()} in Lua.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filter A specific event to wait for, or null to wait for any event.
 | 
			
		||||
     * @param filter   A specific event to wait for, or null to wait for any event.
 | 
			
		||||
     * @param callback The callback to resume with the name of the event that occurred, and any event parameters.
 | 
			
		||||
     * @return The method result which represents this yield.
 | 
			
		||||
     * @see #pullEvent(String, ILuaCallback)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult pullEventRaw(@Nullable String filter, @Nonnull ILuaCallback callback) {
 | 
			
		||||
        Objects.requireNonNull(callback, "callback cannot be null");
 | 
			
		||||
        return new MethodResult(new Object[] {filter}, callback);
 | 
			
		||||
    public static MethodResult pullEventRaw( @Nullable String filter, @Nonnull ILuaCallback callback )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( callback, "callback cannot be null" );
 | 
			
		||||
        return new MethodResult( new Object[] { filter }, callback );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -119,28 +126,32 @@ public final class MethodResult {
 | 
			
		||||
     * {@code pullEvent()} if you wish to wait for events.
 | 
			
		||||
     *
 | 
			
		||||
     * @param arguments An object array containing the arguments to pass to coroutine.yield()
 | 
			
		||||
     * @param callback The callback to resume with an array containing the return values from coroutine.yield()
 | 
			
		||||
     * @param callback  The callback to resume with an array containing the return values from coroutine.yield()
 | 
			
		||||
     * @return The method result which represents this yield.
 | 
			
		||||
     * @see #pullEvent(String, ILuaCallback)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult yield(@Nullable Object[] arguments, @Nonnull ILuaCallback callback) {
 | 
			
		||||
        Objects.requireNonNull(callback, "callback cannot be null");
 | 
			
		||||
        return new MethodResult(arguments, callback);
 | 
			
		||||
    public static MethodResult yield( @Nullable Object[] arguments, @Nonnull ILuaCallback callback )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( callback, "callback cannot be null" );
 | 
			
		||||
        return new MethodResult( arguments, callback );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Object[] getResult() {
 | 
			
		||||
        return this.result;
 | 
			
		||||
    public Object[] getResult()
 | 
			
		||||
    {
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public ILuaCallback getCallback() {
 | 
			
		||||
        return this.callback;
 | 
			
		||||
    public ILuaCallback getCallback()
 | 
			
		||||
    {
 | 
			
		||||
        return callback;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getErrorAdjust() {
 | 
			
		||||
        return this.adjust;
 | 
			
		||||
    public int getErrorAdjust()
 | 
			
		||||
    {
 | 
			
		||||
        return adjust;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -150,13 +161,16 @@ public final class MethodResult {
 | 
			
		||||
     * @return The new {@link MethodResult} with an adjusted error. This has no effect on immediate results.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public MethodResult adjustError(int adjust) {
 | 
			
		||||
        if (adjust < 0) {
 | 
			
		||||
            throw new IllegalArgumentException("cannot adjust by a negative amount");
 | 
			
		||||
    public MethodResult adjustError( int adjust )
 | 
			
		||||
    {
 | 
			
		||||
        if( adjust < 0 )
 | 
			
		||||
        {
 | 
			
		||||
            throw new IllegalArgumentException( "cannot adjust by a negative amount" );
 | 
			
		||||
        }
 | 
			
		||||
        if (adjust == 0 || this.callback == null) {
 | 
			
		||||
        if( adjust == 0 || callback == null )
 | 
			
		||||
        {
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        return new MethodResult(this.result, this.callback, this.adjust + adjust);
 | 
			
		||||
        return new MethodResult( result, callback, this.adjust + adjust );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,66 +1,75 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An implementation of {@link IArguments} which wraps an array of {@link Object}.
 | 
			
		||||
 */
 | 
			
		||||
public final class ObjectArguments implements IArguments {
 | 
			
		||||
public final class ObjectArguments implements IArguments
 | 
			
		||||
{
 | 
			
		||||
    private static final IArguments EMPTY = new ObjectArguments();
 | 
			
		||||
    private final List<Object> args;
 | 
			
		||||
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    @SuppressWarnings ("unused")
 | 
			
		||||
    public ObjectArguments(IArguments arguments) {
 | 
			
		||||
    @SuppressWarnings( "unused" )
 | 
			
		||||
    public ObjectArguments( IArguments arguments )
 | 
			
		||||
    {
 | 
			
		||||
        throw new IllegalStateException();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ObjectArguments(Object... args) {
 | 
			
		||||
        this.args = Arrays.asList(args);
 | 
			
		||||
    public ObjectArguments( Object... args )
 | 
			
		||||
    {
 | 
			
		||||
        this.args = Arrays.asList( args );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ObjectArguments(List<Object> args) {
 | 
			
		||||
        this.args = Objects.requireNonNull(args);
 | 
			
		||||
    public ObjectArguments( List<Object> args )
 | 
			
		||||
    {
 | 
			
		||||
        this.args = Objects.requireNonNull( args );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public IArguments drop(int count) {
 | 
			
		||||
        if (count < 0) {
 | 
			
		||||
            throw new IllegalStateException("count cannot be negative");
 | 
			
		||||
    public IArguments drop( int count )
 | 
			
		||||
    {
 | 
			
		||||
        if( count < 0 )
 | 
			
		||||
        {
 | 
			
		||||
            throw new IllegalStateException( "count cannot be negative" );
 | 
			
		||||
        }
 | 
			
		||||
        if (count == 0) {
 | 
			
		||||
        if( count == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        if (count >= this.args.size()) {
 | 
			
		||||
        if( count >= args.size() )
 | 
			
		||||
        {
 | 
			
		||||
            return EMPTY;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return new ObjectArguments(this.args.subList(count, this.args.size()));
 | 
			
		||||
        return new ObjectArguments( args.subList( count, args.size() ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object[] getAll() {
 | 
			
		||||
        return this.args.toArray();
 | 
			
		||||
    public Object[] getAll()
 | 
			
		||||
    {
 | 
			
		||||
        return args.toArray();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int count() {
 | 
			
		||||
        return this.args.size();
 | 
			
		||||
    public int count()
 | 
			
		||||
    {
 | 
			
		||||
        return args.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object get(int index) {
 | 
			
		||||
        return index >= this.args.size() ? null : this.args.get(index);
 | 
			
		||||
    public Object get( int index )
 | 
			
		||||
    {
 | 
			
		||||
        return index >= args.size() ? null : args.get( index );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,27 +1,26 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.media;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.sound.SoundEvent;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents an item that can be placed in a disk drive and used by a Computer.
 | 
			
		||||
 *
 | 
			
		||||
 * Implement this interface on your {@link Item} class to allow it to be used in the drive. Alternatively, register a {@link IMediaProvider}.
 | 
			
		||||
 */
 | 
			
		||||
public interface IMedia {
 | 
			
		||||
public interface IMedia
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string representing the label of this item. Will be called via {@code disk.getLabel()} in lua.
 | 
			
		||||
     *
 | 
			
		||||
@@ -29,7 +28,7 @@ public interface IMedia {
 | 
			
		||||
     * @return The label. ie: "Dan's Programs".
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    String getLabel(@Nonnull ItemStack stack);
 | 
			
		||||
    String getLabel( @Nonnull ItemStack stack );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set a string representing the label of this item. Will be called vi {@code disk.setLabel()} in lua.
 | 
			
		||||
@@ -38,7 +37,8 @@ public interface IMedia {
 | 
			
		||||
     * @param label The string to set the label to.
 | 
			
		||||
     * @return true if the label was updated, false if the label may not be modified.
 | 
			
		||||
     */
 | 
			
		||||
    default boolean setLabel(@Nonnull ItemStack stack, @Nullable String label) {
 | 
			
		||||
    default boolean setLabel( @Nonnull ItemStack stack, @Nullable String label )
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +49,8 @@ public interface IMedia {
 | 
			
		||||
     * @return The name, or null if this item does not represent an item with audio.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default String getAudioTitle(@Nonnull ItemStack stack) {
 | 
			
		||||
    default String getAudioTitle( @Nonnull ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -60,7 +61,8 @@ public interface IMedia {
 | 
			
		||||
     * @return The name, or null if this item does not represent an item with audio.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default SoundEvent getAudio(@Nonnull ItemStack stack) {
 | 
			
		||||
    default SoundEvent getAudio( @Nonnull ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -71,14 +73,15 @@ public interface IMedia {
 | 
			
		||||
     * @param stack The {@link ItemStack} to modify.
 | 
			
		||||
     * @param world The world in which the item and disk drive reside.
 | 
			
		||||
     * @return The mount, or null if this item does not represent an item with data. If the mount returned also implements {@link
 | 
			
		||||
     *     dan200.computercraft.api.filesystem.IWritableMount}, it will mounted using mountWritable()
 | 
			
		||||
     * dan200.computercraft.api.filesystem.IWritableMount}, it will mounted using mountWritable()
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     * @see dan200.computercraft.api.filesystem.IWritableMount
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default IMount createDataMount(@Nonnull ItemStack stack, @Nonnull World world) {
 | 
			
		||||
    default IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world )
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,23 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.media;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is used to provide {@link IMedia} implementations for {@link ItemStack}.
 | 
			
		||||
 *
 | 
			
		||||
 * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface IMediaProvider {
 | 
			
		||||
public interface IMediaProvider
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Produce an IMedia implementation from an ItemStack.
 | 
			
		||||
     *
 | 
			
		||||
@@ -26,5 +26,5 @@ public interface IMediaProvider {
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IMedia getMedia(@Nonnull ItemStack stack);
 | 
			
		||||
    IMedia getMedia( @Nonnull ItemStack stack );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -14,20 +13,21 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 * @see Packet
 | 
			
		||||
 * @see IPacketReceiver
 | 
			
		||||
 */
 | 
			
		||||
public interface IPacketNetwork {
 | 
			
		||||
public interface IPacketNetwork
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a receiver to the network.
 | 
			
		||||
     *
 | 
			
		||||
     * @param receiver The receiver to register to the network.
 | 
			
		||||
     */
 | 
			
		||||
    void addReceiver(@Nonnull IPacketReceiver receiver);
 | 
			
		||||
    void addReceiver( @Nonnull IPacketReceiver receiver );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove a receiver from the network.
 | 
			
		||||
     *
 | 
			
		||||
     * @param receiver The device to remove from the network.
 | 
			
		||||
     */
 | 
			
		||||
    void removeReceiver(@Nonnull IPacketReceiver receiver);
 | 
			
		||||
    void removeReceiver( @Nonnull IPacketReceiver receiver );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine whether this network is wireless.
 | 
			
		||||
@@ -41,11 +41,11 @@ public interface IPacketNetwork {
 | 
			
		||||
     * interdimensional ones).
 | 
			
		||||
     *
 | 
			
		||||
     * @param packet The packet to send.
 | 
			
		||||
     * @param range The maximum distance this packet will be sent.
 | 
			
		||||
     * @param range  The maximum distance this packet will be sent.
 | 
			
		||||
     * @see #transmitInterdimensional(Packet)
 | 
			
		||||
     * @see IPacketReceiver#receiveSameDimension(Packet, double)
 | 
			
		||||
     */
 | 
			
		||||
    void transmitSameDimension(@Nonnull Packet packet, double range);
 | 
			
		||||
    void transmitSameDimension( @Nonnull Packet packet, double range );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Submit a packet for transmitting across the network. This will route the packet through the network, sending it to all receivers across all
 | 
			
		||||
@@ -55,5 +55,5 @@ public interface IPacketNetwork {
 | 
			
		||||
     * @see #transmitSameDimension(Packet, double)
 | 
			
		||||
     * @see IPacketReceiver#receiveDifferentDimension(Packet)
 | 
			
		||||
     */
 | 
			
		||||
    void transmitInterdimensional(@Nonnull Packet packet);
 | 
			
		||||
    void transmitInterdimensional( @Nonnull Packet packet );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An object on an {@link IPacketNetwork}, capable of receiving packets.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPacketReceiver {
 | 
			
		||||
public interface IPacketReceiver
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the world in which this packet receiver exists.
 | 
			
		||||
     *
 | 
			
		||||
@@ -59,25 +59,25 @@ public interface IPacketReceiver {
 | 
			
		||||
    /**
 | 
			
		||||
     * Receive a network packet from the same dimension.
 | 
			
		||||
     *
 | 
			
		||||
     * @param packet The packet to receive. Generally you should check that you are listening on the given channel and, if so, queue the appropriate
 | 
			
		||||
     *     modem event.
 | 
			
		||||
     * @param packet   The packet to receive. Generally you should check that you are listening on the given channel and, if so, queue the appropriate
 | 
			
		||||
     *                 modem event.
 | 
			
		||||
     * @param distance The distance this packet has travelled from the source.
 | 
			
		||||
     * @see Packet
 | 
			
		||||
     * @see #getRange()
 | 
			
		||||
     * @see IPacketNetwork#transmitSameDimension(Packet, double)
 | 
			
		||||
     * @see IPacketNetwork#transmitInterdimensional(Packet)
 | 
			
		||||
     */
 | 
			
		||||
    void receiveSameDimension(@Nonnull Packet packet, double distance);
 | 
			
		||||
    void receiveSameDimension( @Nonnull Packet packet, double distance );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Receive a network packet from a different dimension.
 | 
			
		||||
     *
 | 
			
		||||
     * @param packet The packet to receive. Generally you should check that you are listening on the given channel and, if so, queue the appropriate
 | 
			
		||||
     *     modem event.
 | 
			
		||||
     *               modem event.
 | 
			
		||||
     * @see Packet
 | 
			
		||||
     * @see IPacketNetwork#transmitInterdimensional(Packet)
 | 
			
		||||
     * @see IPacketNetwork#transmitSameDimension(Packet, double)
 | 
			
		||||
     * @see #isInterdimensional()
 | 
			
		||||
     */
 | 
			
		||||
    void receiveDifferentDimension(@Nonnull Packet packet);
 | 
			
		||||
    void receiveDifferentDimension( @Nonnull Packet packet );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,20 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An object on a {@link IPacketNetwork}, capable of sending packets.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPacketSender {
 | 
			
		||||
public interface IPacketSender
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the world in which this packet sender exists.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a packet which may be sent across a {@link IPacketNetwork}.
 | 
			
		||||
@@ -20,7 +18,8 @@ import javax.annotation.Nullable;
 | 
			
		||||
 * @see IPacketReceiver#receiveDifferentDimension(Packet)
 | 
			
		||||
 * @see IPacketReceiver#receiveSameDimension(Packet, double)
 | 
			
		||||
 */
 | 
			
		||||
public class Packet {
 | 
			
		||||
public class Packet
 | 
			
		||||
{
 | 
			
		||||
    private final int channel;
 | 
			
		||||
    private final int replyChannel;
 | 
			
		||||
    private final Object payload;
 | 
			
		||||
@@ -30,14 +29,15 @@ public class Packet {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a new packet, ready for transmitting across the network.
 | 
			
		||||
     *
 | 
			
		||||
     * @param channel The channel to send the packet along. Receiving devices should only process packets from on channels they are listening to.
 | 
			
		||||
     * @param channel      The channel to send the packet along. Receiving devices should only process packets from on channels they are listening to.
 | 
			
		||||
     * @param replyChannel The channel to reply on.
 | 
			
		||||
     * @param payload The contents of this packet. This should be a "valid" Lua object, safe for queuing as an event or returning from a peripheral
 | 
			
		||||
     *     call.
 | 
			
		||||
     * @param sender The object which sent this packet.
 | 
			
		||||
     * @param payload      The contents of this packet. This should be a "valid" Lua object, safe for queuing as an event or returning from a peripheral
 | 
			
		||||
     *                     call.
 | 
			
		||||
     * @param sender       The object which sent this packet.
 | 
			
		||||
     */
 | 
			
		||||
    public Packet(int channel, int replyChannel, @Nullable Object payload, @Nonnull IPacketSender sender) {
 | 
			
		||||
        Objects.requireNonNull(sender, "sender cannot be null");
 | 
			
		||||
    public Packet( int channel, int replyChannel, @Nullable Object payload, @Nonnull IPacketSender sender )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( sender, "sender cannot be null" );
 | 
			
		||||
 | 
			
		||||
        this.channel = channel;
 | 
			
		||||
        this.replyChannel = replyChannel;
 | 
			
		||||
@@ -50,8 +50,9 @@ public class Packet {
 | 
			
		||||
     *
 | 
			
		||||
     * @return This packet's channel.
 | 
			
		||||
     */
 | 
			
		||||
    public int getChannel() {
 | 
			
		||||
        return this.channel;
 | 
			
		||||
    public int getChannel()
 | 
			
		||||
    {
 | 
			
		||||
        return channel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -59,8 +60,9 @@ public class Packet {
 | 
			
		||||
     *
 | 
			
		||||
     * @return This channel to reply on.
 | 
			
		||||
     */
 | 
			
		||||
    public int getReplyChannel() {
 | 
			
		||||
        return this.replyChannel;
 | 
			
		||||
    public int getReplyChannel()
 | 
			
		||||
    {
 | 
			
		||||
        return replyChannel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -69,8 +71,9 @@ public class Packet {
 | 
			
		||||
     * @return The packet's payload
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Object getPayload() {
 | 
			
		||||
        return this.payload;
 | 
			
		||||
    public Object getPayload()
 | 
			
		||||
    {
 | 
			
		||||
        return payload;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -79,40 +82,48 @@ public class Packet {
 | 
			
		||||
     * @return The sending object.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public IPacketSender getSender() {
 | 
			
		||||
        return this.sender;
 | 
			
		||||
    public IPacketSender getSender()
 | 
			
		||||
    {
 | 
			
		||||
        return sender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        int result;
 | 
			
		||||
        result = this.channel;
 | 
			
		||||
        result = 31 * result + this.replyChannel;
 | 
			
		||||
        result = 31 * result + (this.payload != null ? this.payload.hashCode() : 0);
 | 
			
		||||
        result = 31 * result + this.sender.hashCode();
 | 
			
		||||
        result = channel;
 | 
			
		||||
        result = 31 * result + replyChannel;
 | 
			
		||||
        result = 31 * result + (payload != null ? payload.hashCode() : 0);
 | 
			
		||||
        result = 31 * result + sender.hashCode();
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object o) {
 | 
			
		||||
        if (this == o) {
 | 
			
		||||
    public boolean equals( Object o )
 | 
			
		||||
    {
 | 
			
		||||
        if( this == o )
 | 
			
		||||
        {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (o == null || this.getClass() != o.getClass()) {
 | 
			
		||||
        if( o == null || getClass() != o.getClass() )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Packet packet = (Packet) o;
 | 
			
		||||
 | 
			
		||||
        if (this.channel != packet.channel) {
 | 
			
		||||
        if( channel != packet.channel )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if (this.replyChannel != packet.replyChannel) {
 | 
			
		||||
        if( replyChannel != packet.replyChannel )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if (!Objects.equals(this.payload, packet.payload)) {
 | 
			
		||||
        if( !Objects.equals( payload, packet.payload ) )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return this.sender.equals(packet.sender);
 | 
			
		||||
        return sender.equals( packet.sender );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An object which may be part of a wired network.
 | 
			
		||||
 *
 | 
			
		||||
@@ -19,13 +18,15 @@ import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 * Elements are generally tied to a block or tile entity in world. In such as case, one should provide the {@link IWiredElement} capability for the
 | 
			
		||||
 * appropriate sides.
 | 
			
		||||
 */
 | 
			
		||||
public interface IWiredElement extends IWiredSender {
 | 
			
		||||
public interface IWiredElement extends IWiredSender
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when objects on the network change. This may occur when network nodes are added or removed, or when peripherals change.
 | 
			
		||||
     *
 | 
			
		||||
     * @param change The change which occurred.
 | 
			
		||||
     * @see IWiredNetworkChange
 | 
			
		||||
     */
 | 
			
		||||
    default void networkChanged(@Nonnull IWiredNetworkChange change) {
 | 
			
		||||
    default void networkChanged( @Nonnull IWiredNetworkChange change )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A wired network is composed of one of more {@link IWiredNode}s, a set of connections between them, and a series of peripherals.
 | 
			
		||||
@@ -24,28 +22,29 @@ import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 *
 | 
			
		||||
 * @see IWiredNode#getNetwork()
 | 
			
		||||
 */
 | 
			
		||||
public interface IWiredNetwork {
 | 
			
		||||
public interface IWiredNetwork
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a connection between two nodes.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @param left The first node to connect
 | 
			
		||||
     * @param left  The first node to connect
 | 
			
		||||
     * @param right The second node to connect
 | 
			
		||||
     * @return {@code true} if a connection was created or {@code false} if the connection already exists.
 | 
			
		||||
     * @throws IllegalStateException If neither node is on the network.
 | 
			
		||||
     * @throws IllegalStateException    If neither node is on the network.
 | 
			
		||||
     * @throws IllegalArgumentException If {@code left} and {@code right} are equal.
 | 
			
		||||
     * @see IWiredNode#connectTo(IWiredNode)
 | 
			
		||||
     * @see IWiredNetwork#connect(IWiredNode, IWiredNode)
 | 
			
		||||
     */
 | 
			
		||||
    boolean connect(@Nonnull IWiredNode left, @Nonnull IWiredNode right);
 | 
			
		||||
    boolean connect( @Nonnull IWiredNode left, @Nonnull IWiredNode right );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Destroy a connection between this node and another.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @param left The first node in the connection.
 | 
			
		||||
     * @param left  The first node in the connection.
 | 
			
		||||
     * @param right The second node in the connection.
 | 
			
		||||
     * @return {@code true} if a connection was destroyed or {@code false} if no connection exists.
 | 
			
		||||
     * @throws IllegalArgumentException If either node is not on the network.
 | 
			
		||||
@@ -53,7 +52,7 @@ public interface IWiredNetwork {
 | 
			
		||||
     * @see IWiredNode#disconnectFrom(IWiredNode)
 | 
			
		||||
     * @see IWiredNetwork#connect(IWiredNode, IWiredNode)
 | 
			
		||||
     */
 | 
			
		||||
    boolean disconnect(@Nonnull IWiredNode left, @Nonnull IWiredNode right);
 | 
			
		||||
    boolean disconnect( @Nonnull IWiredNode left, @Nonnull IWiredNode right );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sever all connections this node has, removing it from this network.
 | 
			
		||||
@@ -65,17 +64,17 @@ public interface IWiredNetwork {
 | 
			
		||||
     * @throws IllegalArgumentException If the node is not in the network.
 | 
			
		||||
     * @see IWiredNode#remove()
 | 
			
		||||
     */
 | 
			
		||||
    boolean remove(@Nonnull IWiredNode node);
 | 
			
		||||
    boolean remove( @Nonnull IWiredNode node );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Update the peripherals a node provides.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread. You should only call this on nodes that your network element owns.
 | 
			
		||||
     *
 | 
			
		||||
     * @param node The node to attach peripherals for.
 | 
			
		||||
     * @param node        The node to attach peripherals for.
 | 
			
		||||
     * @param peripherals The new peripherals for this node.
 | 
			
		||||
     * @throws IllegalArgumentException If the node is not in the network.
 | 
			
		||||
     * @see IWiredNode#updatePeripherals(Map)
 | 
			
		||||
     */
 | 
			
		||||
    void updatePeripherals(@Nonnull IWiredNode node, @Nonnull Map<String, IPeripheral> peripherals);
 | 
			
		||||
    void updatePeripherals( @Nonnull IWiredNode node, @Nonnull Map<String, IPeripheral> peripherals );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,22 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a change to the objects on a wired network.
 | 
			
		||||
 *
 | 
			
		||||
 * @see IWiredElement#networkChanged(IWiredNetworkChange)
 | 
			
		||||
 */
 | 
			
		||||
public interface IWiredNetworkChange {
 | 
			
		||||
public interface IWiredNetworkChange
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * A set of peripherals which have been removed. Note that there may be entries with the same name in the added and removed set, but with a different
 | 
			
		||||
     * peripheral.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.network.IPacketNetwork;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Wired nodes act as a layer between {@link IWiredElement}s and {@link IWiredNetwork}s.
 | 
			
		||||
 *
 | 
			
		||||
@@ -25,7 +23,8 @@ import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 *
 | 
			
		||||
 * Wired nodes also provide several convenience methods for interacting with a wired network. These should only ever be used on the main server thread.
 | 
			
		||||
 */
 | 
			
		||||
public interface IWiredNode extends IPacketNetwork {
 | 
			
		||||
public interface IWiredNode extends IPacketNetwork
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The associated element for this network node.
 | 
			
		||||
     *
 | 
			
		||||
@@ -44,8 +43,9 @@ public interface IWiredNode extends IPacketNetwork {
 | 
			
		||||
     * @see IWiredNetwork#connect(IWiredNode, IWiredNode)
 | 
			
		||||
     * @see IWiredNode#disconnectFrom(IWiredNode)
 | 
			
		||||
     */
 | 
			
		||||
    default boolean connectTo(@Nonnull IWiredNode node) {
 | 
			
		||||
        return this.getNetwork().connect(this, node);
 | 
			
		||||
    default boolean connectTo( @Nonnull IWiredNode node )
 | 
			
		||||
    {
 | 
			
		||||
        return getNetwork().connect( this, node );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -69,8 +69,9 @@ public interface IWiredNode extends IPacketNetwork {
 | 
			
		||||
     * @see IWiredNetwork#disconnect(IWiredNode, IWiredNode)
 | 
			
		||||
     * @see IWiredNode#connectTo(IWiredNode)
 | 
			
		||||
     */
 | 
			
		||||
    default boolean disconnectFrom(@Nonnull IWiredNode node) {
 | 
			
		||||
        return this.getNetwork().disconnect(this, node);
 | 
			
		||||
    default boolean disconnectFrom( @Nonnull IWiredNode node )
 | 
			
		||||
    {
 | 
			
		||||
        return getNetwork().disconnect( this, node );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -82,8 +83,9 @@ public interface IWiredNode extends IPacketNetwork {
 | 
			
		||||
     * @throws IllegalArgumentException If the node is not in the network.
 | 
			
		||||
     * @see IWiredNetwork#remove(IWiredNode)
 | 
			
		||||
     */
 | 
			
		||||
    default boolean remove() {
 | 
			
		||||
        return this.getNetwork().remove(this);
 | 
			
		||||
    default boolean remove()
 | 
			
		||||
    {
 | 
			
		||||
        return getNetwork().remove( this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -94,7 +96,8 @@ public interface IWiredNode extends IPacketNetwork {
 | 
			
		||||
     * @param peripherals The new peripherals for this node.
 | 
			
		||||
     * @see IWiredNetwork#updatePeripherals(IWiredNode, Map)
 | 
			
		||||
     */
 | 
			
		||||
    default void updatePeripherals(@Nonnull Map<String, IPeripheral> peripherals) {
 | 
			
		||||
        this.getNetwork().updatePeripherals(this, peripherals);
 | 
			
		||||
    default void updatePeripherals( @Nonnull Map<String, IPeripheral> peripherals )
 | 
			
		||||
    {
 | 
			
		||||
        getNetwork().updatePeripherals( this, peripherals );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,21 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.network.wired;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.network.IPacketSender;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An object on a {@link IWiredNetwork} capable of sending packets.
 | 
			
		||||
 *
 | 
			
		||||
 * Unlike a regular {@link IPacketSender}, this must be associated with the node you are attempting to to send the packet from.
 | 
			
		||||
 */
 | 
			
		||||
public interface IWiredSender extends IPacketSender {
 | 
			
		||||
public interface IWiredSender extends IPacketSender
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The node in the network representing this object.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IWritableMount;
 | 
			
		||||
@@ -18,21 +12,25 @@ import dan200.computercraft.api.lua.ILuaCallback;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaTask;
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The interface passed to peripherals by computers or turtles, providing methods that they can call. This should not be implemented by your classes. Do not
 | 
			
		||||
 * interact with computers except via this interface.
 | 
			
		||||
 */
 | 
			
		||||
public interface IComputerAccess {
 | 
			
		||||
public interface IComputerAccess
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Mount a mount onto the computer's file system in a read only mode.
 | 
			
		||||
     *
 | 
			
		||||
     * @param desiredLocation The location on the computer's file system where you would like the mount to be mounted.
 | 
			
		||||
     * @param mount The mount object to mount on the computer.
 | 
			
		||||
     * @param mount           The mount object to mount on the computer.
 | 
			
		||||
     * @return The location on the computer's file system where you the mount mounted, or {@code null} if there was already a file in the desired location.
 | 
			
		||||
     *     Store this value if you wish to unmount the mount later.
 | 
			
		||||
     * Store this value if you wish to unmount the mount later.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
@@ -42,18 +40,19 @@ public interface IComputerAccess {
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default String mount(@Nonnull String desiredLocation, @Nonnull IMount mount) {
 | 
			
		||||
        return this.mount(desiredLocation, mount, this.getAttachmentName());
 | 
			
		||||
    default String mount( @Nonnull String desiredLocation, @Nonnull IMount mount )
 | 
			
		||||
    {
 | 
			
		||||
        return mount( desiredLocation, mount, getAttachmentName() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mount a mount onto the computer's file system in a read only mode.
 | 
			
		||||
     *
 | 
			
		||||
     * @param desiredLocation The location on the computer's file system where you would like the mount to be mounted.
 | 
			
		||||
     * @param mount The mount object to mount on the computer.
 | 
			
		||||
     * @param driveName A custom name to give for this mount location, as returned by {@code fs.getDrive()}.
 | 
			
		||||
     * @param mount           The mount object to mount on the computer.
 | 
			
		||||
     * @param driveName       A custom name to give for this mount location, as returned by {@code fs.getDrive()}.
 | 
			
		||||
     * @return The location on the computer's file system where you the mount mounted, or {@code null} if there was already a file in the desired location.
 | 
			
		||||
     *     Store this value if you wish to unmount the mount later.
 | 
			
		||||
     * Store this value if you wish to unmount the mount later.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
@@ -63,7 +62,7 @@ public interface IComputerAccess {
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    String mount(@Nonnull String desiredLocation, @Nonnull IMount mount, @Nonnull String driveName);
 | 
			
		||||
    String mount( @Nonnull String desiredLocation, @Nonnull IMount mount, @Nonnull String driveName );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string, unique to the computer, by which the computer refers to this peripheral. For directly attached peripherals this will be
 | 
			
		||||
@@ -80,9 +79,9 @@ public interface IComputerAccess {
 | 
			
		||||
     * Mount a mount onto the computer's file system in a writable mode.
 | 
			
		||||
     *
 | 
			
		||||
     * @param desiredLocation The location on the computer's file system where you would like the mount to be mounted.
 | 
			
		||||
     * @param mount The mount object to mount on the computer.
 | 
			
		||||
     * @param mount           The mount object to mount on the computer.
 | 
			
		||||
     * @return The location on the computer's file system where you the mount mounted, or null if there was already a file in the desired location. Store
 | 
			
		||||
     *     this value if you wish to unmount the mount later.
 | 
			
		||||
     * this value if you wish to unmount the mount later.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
@@ -91,18 +90,19 @@ public interface IComputerAccess {
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default String mountWritable(@Nonnull String desiredLocation, @Nonnull IWritableMount mount) {
 | 
			
		||||
        return this.mountWritable(desiredLocation, mount, this.getAttachmentName());
 | 
			
		||||
    default String mountWritable( @Nonnull String desiredLocation, @Nonnull IWritableMount mount )
 | 
			
		||||
    {
 | 
			
		||||
        return mountWritable( desiredLocation, mount, getAttachmentName() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mount a mount onto the computer's file system in a writable mode.
 | 
			
		||||
     *
 | 
			
		||||
     * @param desiredLocation The location on the computer's file system where you would like the mount to be mounted.
 | 
			
		||||
     * @param mount The mount object to mount on the computer.
 | 
			
		||||
     * @param driveName A custom name to give for this mount location, as returned by {@code fs.getDrive()}.
 | 
			
		||||
     * @param mount           The mount object to mount on the computer.
 | 
			
		||||
     * @param driveName       A custom name to give for this mount location, as returned by {@code fs.getDrive()}.
 | 
			
		||||
     * @return The location on the computer's file system where you the mount mounted, or null if there was already a file in the desired location. Store
 | 
			
		||||
     *     this value if you wish to unmount the mount later.
 | 
			
		||||
     * this value if you wish to unmount the mount later.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
@@ -110,7 +110,7 @@ public interface IComputerAccess {
 | 
			
		||||
     * @see #unmount(String)
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     */
 | 
			
		||||
    String mountWritable(@Nonnull String desiredLocation, @Nonnull IWritableMount mount, @Nonnull String driveName);
 | 
			
		||||
    String mountWritable( @Nonnull String desiredLocation, @Nonnull IWritableMount mount, @Nonnull String driveName );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Unmounts a directory previously mounted onto the computers file system by {@link #mount(String, IMount)} or {@link #mountWritable(String,
 | 
			
		||||
@@ -122,13 +122,13 @@ public interface IComputerAccess {
 | 
			
		||||
     * Note that you cannot unmount another peripheral's mounts.
 | 
			
		||||
     *
 | 
			
		||||
     * @param location The desired location in the computers file system of the directory to unmount. This must be the location of a directory
 | 
			
		||||
     *     previously mounted by {@link #mount(String, IMount)} or {@link #mountWritable(String, IWritableMount)}, as indicated by their return value.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     *                 previously mounted by {@link #mount(String, IMount)} or {@link #mountWritable(String, IWritableMount)}, as indicated by their return value.
 | 
			
		||||
     * @throws NotAttachedException  If the peripheral has been detached.
 | 
			
		||||
     * @throws IllegalStateException If the mount does not exist, or was mounted by another peripheral.
 | 
			
		||||
     * @see #mount(String, IMount)
 | 
			
		||||
     * @see #mountWritable(String, IWritableMount)
 | 
			
		||||
     */
 | 
			
		||||
    void unmount(@Nullable String location);
 | 
			
		||||
    void unmount( @Nullable String location );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the numerical ID of this computer.
 | 
			
		||||
@@ -144,17 +144,17 @@ public interface IComputerAccess {
 | 
			
		||||
     * Causes an event to be raised on this computer, which the computer can respond to by calling {@code os.pullEvent()}. This can be used to notify the
 | 
			
		||||
     * computer when things happen in the world or to this peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @param event A string identifying the type of event that has occurred, this will be returned as the first value from {@code os.pullEvent()}. It
 | 
			
		||||
     *     is recommended that you you choose a name that is unique, and recognisable as originating from your peripheral. eg: If your peripheral type is
 | 
			
		||||
     *     "button", a suitable event would be "button_pressed".
 | 
			
		||||
     * @param event     A string identifying the type of event that has occurred, this will be returned as the first value from {@code os.pullEvent()}. It
 | 
			
		||||
     *                  is recommended that you you choose a name that is unique, and recognisable as originating from your peripheral. eg: If your peripheral type is
 | 
			
		||||
     *                  "button", a suitable event would be "button_pressed".
 | 
			
		||||
     * @param arguments In addition to a name, you may pass an array of extra arguments to the event, that will be supplied as extra return values to
 | 
			
		||||
     *     os.pullEvent(). Objects in the array will be converted to lua data types in the same fashion as the return values of IPeripheral.callMethod().
 | 
			
		||||
     *                  os.pullEvent(). Objects in the array will be converted to lua data types in the same fashion as the return values of IPeripheral.callMethod().
 | 
			
		||||
     *
 | 
			
		||||
     *     You may supply {@code null} to indicate that no arguments are to be supplied.
 | 
			
		||||
     *                  You may supply {@code null} to indicate that no arguments are to be supplied.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see MethodResult#pullEvent(String, ILuaCallback)
 | 
			
		||||
     */
 | 
			
		||||
    void queueEvent(@Nonnull String event, @Nullable Object... arguments);
 | 
			
		||||
    void queueEvent( @Nonnull String event, @Nullable Object... arguments );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a set of peripherals that this computer access can "see", along with their attachment name.
 | 
			
		||||
@@ -178,7 +178,7 @@ public interface IComputerAccess {
 | 
			
		||||
     * @see #getAvailablePeripherals()
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral getAvailablePeripheral(@Nonnull String name);
 | 
			
		||||
    IPeripheral getAvailablePeripheral( @Nonnull String name );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a {@link IWorkMonitor} for tasks your peripheral might execute on the main (server) thread.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import dan200.computercraft.api.lua.*;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.IArguments;
 | 
			
		||||
import dan200.computercraft.api.lua.IDynamicLuaObject;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
import dan200.computercraft.api.lua.LuaFunction;
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A peripheral whose methods are not known at runtime.
 | 
			
		||||
@@ -21,7 +15,8 @@ import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
 * This behaves similarly to {@link IDynamicLuaObject}, though also accepting the current {@link IComputerAccess}. Generally one may use {@link LuaFunction}
 | 
			
		||||
 * instead of implementing this interface.
 | 
			
		||||
 */
 | 
			
		||||
public interface IDynamicPeripheral extends IPeripheral {
 | 
			
		||||
public interface IDynamicPeripheral extends IPeripheral
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Should return an array of strings that identify the methods that this peripheral exposes to Lua. This will be called once before each attachment, and
 | 
			
		||||
     * should not change when called multiple times.
 | 
			
		||||
@@ -38,16 +33,16 @@ public interface IDynamicPeripheral extends IPeripheral {
 | 
			
		||||
     *
 | 
			
		||||
     * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe when interacting with Minecraft objects.
 | 
			
		||||
     *
 | 
			
		||||
     * @param computer The interface to the computer that is making the call. Remember that multiple computers can be attached to a peripheral at once.
 | 
			
		||||
     * @param context The context of the currently running lua thread. This can be used to wait for events or otherwise yield.
 | 
			
		||||
     * @param method An integer identifying which of the methods from getMethodNames() the computercraft wishes to call. The integer indicates the index
 | 
			
		||||
     *     into the getMethodNames() table that corresponds to the string passed into peripheral.call()
 | 
			
		||||
     * @param computer  The interface to the computer that is making the call. Remember that multiple computers can be attached to a peripheral at once.
 | 
			
		||||
     * @param context   The context of the currently running lua thread. This can be used to wait for events or otherwise yield.
 | 
			
		||||
     * @param method    An integer identifying which of the methods from getMethodNames() the computercraft wishes to call. The integer indicates the index
 | 
			
		||||
     *                  into the getMethodNames() table that corresponds to the string passed into peripheral.call()
 | 
			
		||||
     * @param arguments The arguments for this method.
 | 
			
		||||
     * @return A {@link MethodResult} containing the values to return or the action to perform.
 | 
			
		||||
     * @throws LuaException If you throw any exception from this function, a lua error will be raised with the same message as your exception. Use this
 | 
			
		||||
     *     to throw appropriate errors if the wrong arguments are supplied to your method.
 | 
			
		||||
     *                      to throw appropriate errors if the wrong arguments are supplied to your method.
 | 
			
		||||
     * @see #getMethodNames()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult callMethod(@Nonnull IComputerAccess computer, @Nonnull ILuaContext context, int method, @Nonnull IArguments arguments) throws LuaException;
 | 
			
		||||
    MethodResult callMethod( @Nonnull IComputerAccess computer, @Nonnull ILuaContext context, int method, @Nonnull IArguments arguments ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.LuaFunction;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.LuaFunction;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The interface that defines a peripheral.
 | 
			
		||||
 *
 | 
			
		||||
@@ -19,7 +18,8 @@ import dan200.computercraft.api.lua.LuaFunction;
 | 
			
		||||
 *
 | 
			
		||||
 * Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing {@link IDynamicPeripheral}.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPeripheral {
 | 
			
		||||
public interface IPeripheral
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Should return a string that uniquely identifies this type of peripheral. This can be queried from lua by calling {@code peripheral.getType()}
 | 
			
		||||
     *
 | 
			
		||||
@@ -42,7 +42,8 @@ public interface IPeripheral {
 | 
			
		||||
     * @param computer The interface to the computer that is being attached. Remember that multiple computers can be attached to a peripheral at once.
 | 
			
		||||
     * @see #detach
 | 
			
		||||
     */
 | 
			
		||||
    default void attach(@Nonnull IComputerAccess computer) {
 | 
			
		||||
    default void attach( @Nonnull IComputerAccess computer )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -58,7 +59,8 @@ public interface IPeripheral {
 | 
			
		||||
     * @param computer The interface to the computer that is being detached. Remember that multiple computers can be attached to a peripheral at once.
 | 
			
		||||
     * @see #attach
 | 
			
		||||
     */
 | 
			
		||||
    default void detach(@Nonnull IComputerAccess computer) {
 | 
			
		||||
    default void detach( @Nonnull IComputerAccess computer )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -67,7 +69,8 @@ public interface IPeripheral {
 | 
			
		||||
     * @return The object this peripheral targets
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default Object getTarget() {
 | 
			
		||||
    default Object getTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -80,5 +83,5 @@ public interface IPeripheral {
 | 
			
		||||
     * @param other The peripheral to compare against. This may be {@code null}.
 | 
			
		||||
     * @return Whether these peripherals are equivalent.
 | 
			
		||||
     */
 | 
			
		||||
    boolean equals(@Nullable IPeripheral other);
 | 
			
		||||
    boolean equals( @Nullable IPeripheral other );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,18 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.block.entity.BlockEntity;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is used to create peripheral implementations for blocks.
 | 
			
		||||
 *
 | 
			
		||||
@@ -23,16 +21,17 @@ import net.minecraft.world.World;
 | 
			
		||||
 * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface IPeripheralProvider {
 | 
			
		||||
public interface IPeripheralProvider
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Produce an peripheral implementation from a block location.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world the block is in.
 | 
			
		||||
     * @param pos The position the block is at.
 | 
			
		||||
     * @param side The side to get the peripheral from.
 | 
			
		||||
     * @param pos   The position the block is at.
 | 
			
		||||
     * @param side  The side to get the peripheral from.
 | 
			
		||||
     * @return A peripheral, or {@link Optional#empty()} if there is not a peripheral here you'd like to handle.
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IPeripheral getPeripheral(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side);
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A {@link net.minecraft.block.entity.BlockEntity} which may act as a peripheral.
 | 
			
		||||
 *
 | 
			
		||||
 * If you need more complex capabilities (such as handling TEs not belonging to your mod), you should use {@link IPeripheralProvider}.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPeripheralTile {
 | 
			
		||||
public interface IPeripheralTile
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the peripheral on the given {@code side}.
 | 
			
		||||
     *
 | 
			
		||||
@@ -27,5 +27,5 @@ public interface IPeripheralTile {
 | 
			
		||||
     * @see IPeripheralProvider#getPeripheral(World, BlockPos, Direction)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral getPeripheral(@Nonnull Direction side);
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull Direction side );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Monitors "work" associated with a computer, keeping track of how much a computer has done, and ensuring every computer receives a fair share of any
 | 
			
		||||
 * processing time.
 | 
			
		||||
@@ -25,7 +23,8 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 *
 | 
			
		||||
 * @see IComputerAccess#getMainThreadMonitor()
 | 
			
		||||
 */
 | 
			
		||||
public interface IWorkMonitor {
 | 
			
		||||
public interface IWorkMonitor
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * If the owning computer is currently allowed to execute work, and has ample time to do so.
 | 
			
		||||
     *
 | 
			
		||||
@@ -42,17 +41,22 @@ public interface IWorkMonitor {
 | 
			
		||||
     * @param runnable The task to run.
 | 
			
		||||
     * @return If the task was actually run (namely, {@link #canWork()} returned {@code true}).
 | 
			
		||||
     */
 | 
			
		||||
    default boolean runWork(@Nonnull Runnable runnable) {
 | 
			
		||||
        Objects.requireNonNull(runnable, "runnable should not be null");
 | 
			
		||||
        if (!this.canWork()) {
 | 
			
		||||
    default boolean runWork( @Nonnull Runnable runnable )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( runnable, "runnable should not be null" );
 | 
			
		||||
        if( !canWork() )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        long start = System.nanoTime();
 | 
			
		||||
        try {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            runnable.run();
 | 
			
		||||
        } finally {
 | 
			
		||||
            this.trackWork(System.nanoTime() - start, TimeUnit.NANOSECONDS);
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            trackWork( System.nanoTime() - start, TimeUnit.NANOSECONDS );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
@@ -71,5 +75,5 @@ public interface IWorkMonitor {
 | 
			
		||||
     * @param time The time some task took to run
 | 
			
		||||
     * @param unit The unit that {@code time} was measured in.
 | 
			
		||||
     */
 | 
			
		||||
    void trackWork(long time, @Nonnull TimeUnit unit);
 | 
			
		||||
    void trackWork( long time, @Nonnull TimeUnit unit );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.peripheral;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Thrown when performing operations on {@link IComputerAccess} when the current peripheral is no longer attached to the computer.
 | 
			
		||||
 */
 | 
			
		||||
public class NotAttachedException extends IllegalStateException {
 | 
			
		||||
public class NotAttachedException extends IllegalStateException
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 1221244785535553536L;
 | 
			
		||||
 | 
			
		||||
    public NotAttachedException() {
 | 
			
		||||
        super("You are not attached to this computer");
 | 
			
		||||
    public NotAttachedException()
 | 
			
		||||
    {
 | 
			
		||||
        super( "You are not attached to this computer" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NotAttachedException(String s) {
 | 
			
		||||
        super(s);
 | 
			
		||||
    public NotAttachedException( String s )
 | 
			
		||||
    {
 | 
			
		||||
        super( s );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,39 +1,42 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.pocket;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemConvertible;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.Util;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A base class for {@link IPocketUpgrade}s.
 | 
			
		||||
 *
 | 
			
		||||
 * One does not have to use this, but it does provide a convenient template.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractPocketUpgrade implements IPocketUpgrade {
 | 
			
		||||
public abstract class AbstractPocketUpgrade implements IPocketUpgrade
 | 
			
		||||
{
 | 
			
		||||
    private final Identifier id;
 | 
			
		||||
    private final String adjective;
 | 
			
		||||
    private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade(Identifier id, ItemConvertible item) {
 | 
			
		||||
        this(id, Util.createTranslationKey("upgrade", id) + ".adjective", item);
 | 
			
		||||
    protected AbstractPocketUpgrade( Identifier id, ItemConvertible item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, Util.createTranslationKey( "upgrade", id ) + ".adjective", item );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade(Identifier id, String adjective, ItemConvertible item) {
 | 
			
		||||
    protected AbstractPocketUpgrade( Identifier id, String adjective, ItemConvertible item )
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.adjective = adjective;
 | 
			
		||||
        this.stack = new ItemStack(item);
 | 
			
		||||
        stack = new ItemStack( item );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade(Identifier id, String adjective, ItemStack stack) {
 | 
			
		||||
    protected AbstractPocketUpgrade( Identifier id, String adjective, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.adjective = adjective;
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
@@ -42,19 +45,22 @@ public abstract class AbstractPocketUpgrade implements IPocketUpgrade {
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final Identifier getUpgradeID() {
 | 
			
		||||
        return this.id;
 | 
			
		||||
    public final Identifier getUpgradeID()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final String getUnlocalisedAdjective() {
 | 
			
		||||
        return this.adjective;
 | 
			
		||||
    public final String getUnlocalisedAdjective()
 | 
			
		||||
    {
 | 
			
		||||
        return adjective;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final ItemStack getCraftingItem() {
 | 
			
		||||
        return this.stack;
 | 
			
		||||
    public final ItemStack getCraftingItem()
 | 
			
		||||
    {
 | 
			
		||||
        return stack;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,26 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.pocket;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.nbt.CompoundTag;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Wrapper class for pocket computers.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPocketAccess {
 | 
			
		||||
public interface IPocketAccess
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the entity holding this item.
 | 
			
		||||
     *
 | 
			
		||||
@@ -43,10 +41,10 @@ public interface IPocketAccess {
 | 
			
		||||
     * Set the colour of the pocket computer to a RGB number.
 | 
			
		||||
     *
 | 
			
		||||
     * @param colour The colour this pocket computer should be changed to. This should be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or
 | 
			
		||||
     *     -1 to reset to the default colour.
 | 
			
		||||
     *               -1 to reset to the default colour.
 | 
			
		||||
     * @see #getColour()
 | 
			
		||||
     */
 | 
			
		||||
    void setColour(int colour);
 | 
			
		||||
    void setColour( int colour );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the colour of this pocket computer's light as a RGB number.
 | 
			
		||||
@@ -60,10 +58,10 @@ public interface IPocketAccess {
 | 
			
		||||
     * Set the colour of the pocket computer's light to a RGB number.
 | 
			
		||||
     *
 | 
			
		||||
     * @param colour The colour this modem's light will be changed to. This should be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or -1
 | 
			
		||||
     *     to reset to the default colour.
 | 
			
		||||
     *               to reset to the default colour.
 | 
			
		||||
     * @see #getLight()
 | 
			
		||||
     */
 | 
			
		||||
    void setLight(int colour);
 | 
			
		||||
    void setLight( int colour );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the upgrade-specific NBT.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,65 +1,25 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.pocket;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.IUpgradeBase;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Additional peripherals for pocket computers.
 | 
			
		||||
 *
 | 
			
		||||
 * This is similar to {@link ITurtleUpgrade}.
 | 
			
		||||
 * @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade)
 | 
			
		||||
 */
 | 
			
		||||
public interface IPocketUpgrade {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a unique identifier representing this type of turtle upgrade. eg: "computercraft:wireless_modem" or "my_mod:my_upgrade".
 | 
			
		||||
     *
 | 
			
		||||
     * You should use a unique resource domain to ensure this upgrade is uniquely identified. The upgrade will fail registration if an already used ID is
 | 
			
		||||
     * specified.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The upgrade's id.
 | 
			
		||||
     * @see IPocketUpgrade#getUpgradeID()
 | 
			
		||||
     * @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Identifier getUpgradeID();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an unlocalised string to describe the type of pocket computer this upgrade provides.
 | 
			
		||||
     *
 | 
			
		||||
     * An example of a built-in adjectives is "Wireless" - this is converted to "Wireless Pocket Computer".
 | 
			
		||||
     *
 | 
			
		||||
     * @return The unlocalised adjective.
 | 
			
		||||
     * @see ITurtleUpgrade#getUnlocalisedAdjective()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String getUnlocalisedAdjective();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an item stack representing the type of item that a pocket computer must be crafted with to create a pocket computer which holds this upgrade.
 | 
			
		||||
     * This item stack is also used to determine the upgrade given by {@code pocket.equip()}/{@code pocket.unequip()}.
 | 
			
		||||
     *
 | 
			
		||||
     * Ideally this should be constant over a session. It is recommended that you cache the item too, in order to prevent constructing it every time the
 | 
			
		||||
     * method is called.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The item stack used for crafting. This can be {@link ItemStack#EMPTY} if crafting is disabled.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ItemStack getCraftingItem();
 | 
			
		||||
 | 
			
		||||
public interface IPocketUpgrade extends IUpgradeBase
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a peripheral for the pocket computer.
 | 
			
		||||
     *
 | 
			
		||||
@@ -71,29 +31,31 @@ public interface IPocketUpgrade {
 | 
			
		||||
     * @see #update(IPocketAccess, IPeripheral)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral createPeripheral(@Nonnull IPocketAccess access);
 | 
			
		||||
    IPeripheral createPeripheral( @Nonnull IPocketAccess access );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when the pocket computer item stack updates.
 | 
			
		||||
     *
 | 
			
		||||
     * @param access The access object for the pocket item stack.
 | 
			
		||||
     * @param access     The access object for the pocket item stack.
 | 
			
		||||
     * @param peripheral The peripheral for this upgrade.
 | 
			
		||||
     * @see #createPeripheral(IPocketAccess)
 | 
			
		||||
     */
 | 
			
		||||
    default void update(@Nonnull IPocketAccess access, @Nullable IPeripheral peripheral) {
 | 
			
		||||
    default void update( @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when the pocket computer is right clicked.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world the computer is in.
 | 
			
		||||
     * @param access The access object for the pocket item stack.
 | 
			
		||||
     * @param world      The world the computer is in.
 | 
			
		||||
     * @param access     The access object for the pocket item stack.
 | 
			
		||||
     * @param peripheral The peripheral for this upgrade.
 | 
			
		||||
     * @return {@code true} to stop the GUI from opening, otherwise false. You should always provide some code path which returns {@code false}, such as
 | 
			
		||||
     *     requiring the player to be sneaking - otherwise they will be unable to access the GUI.
 | 
			
		||||
     * requiring the player to be sneaking - otherwise they will be unable to access the GUI.
 | 
			
		||||
     * @see #createPeripheral(IPocketAccess)
 | 
			
		||||
     */
 | 
			
		||||
    default boolean onRightClick(@Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral) {
 | 
			
		||||
    default boolean onRightClick( @Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,32 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.redstone;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is used to provide bundled redstone output for blocks.
 | 
			
		||||
 *
 | 
			
		||||
 * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface IBundledRedstoneProvider {
 | 
			
		||||
public interface IBundledRedstoneProvider
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Produce an bundled redstone output from a block location.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The world this block is in.
 | 
			
		||||
     * @param pos The position this block is at.
 | 
			
		||||
     * @param side The side to extract the bundled redstone output from.
 | 
			
		||||
     * @param pos   The position this block is at.
 | 
			
		||||
     * @param side  The side to extract the bundled redstone output from.
 | 
			
		||||
     * @return A number in the range 0-65535 to indicate this block is providing output, or -1 if you do not wish to handle this block.
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider)
 | 
			
		||||
     */
 | 
			
		||||
    int getBundledRedstoneOutput(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side);
 | 
			
		||||
    int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,70 +1,78 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemConvertible;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.Util;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A base class for {@link ITurtleUpgrade}s.
 | 
			
		||||
 *
 | 
			
		||||
 * One does not have to use this, but it does provide a convenient template.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade {
 | 
			
		||||
public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade
 | 
			
		||||
{
 | 
			
		||||
    private final Identifier id;
 | 
			
		||||
    private final TurtleUpgradeType type;
 | 
			
		||||
    private final String adjective;
 | 
			
		||||
    private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item) {
 | 
			
		||||
        this(id, type, adjective, new ItemStack(item));
 | 
			
		||||
    protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, type, adjective, new ItemStack( item ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack) {
 | 
			
		||||
    protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.type = type;
 | 
			
		||||
        this.adjective = adjective;
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, ItemConvertible item) {
 | 
			
		||||
        this(id, type, new ItemStack(item));
 | 
			
		||||
    protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemConvertible item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, type, new ItemStack( item ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, ItemStack stack) {
 | 
			
		||||
        this(id, type, Util.createTranslationKey("upgrade", id) + ".adjective", stack);
 | 
			
		||||
    protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, type, Util.createTranslationKey( "upgrade", id ) + ".adjective", stack );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final Identifier getUpgradeID() {
 | 
			
		||||
        return this.id;
 | 
			
		||||
    public final Identifier getUpgradeID()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final String getUnlocalisedAdjective() {
 | 
			
		||||
        return this.adjective;
 | 
			
		||||
    public final String getUnlocalisedAdjective()
 | 
			
		||||
    {
 | 
			
		||||
        return adjective;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final TurtleUpgradeType getType() {
 | 
			
		||||
        return this.type;
 | 
			
		||||
    public final TurtleUpgradeType getType()
 | 
			
		||||
    {
 | 
			
		||||
        return type;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final ItemStack getCraftingItem() {
 | 
			
		||||
        return this.stack;
 | 
			
		||||
    public final ItemStack getCraftingItem()
 | 
			
		||||
    {
 | 
			
		||||
        return stack;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.OptionalInt;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import javax.crypto.SecretKey;
 | 
			
		||||
 | 
			
		||||
import com.mojang.authlib.GameProfile;
 | 
			
		||||
import io.netty.channel.ChannelHandlerContext;
 | 
			
		||||
import io.netty.util.concurrent.Future;
 | 
			
		||||
import io.netty.util.concurrent.GenericFutureListener;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.block.entity.CommandBlockBlockEntity;
 | 
			
		||||
import net.minecraft.block.entity.SignBlockEntity;
 | 
			
		||||
import net.minecraft.command.argument.EntityAnchorArgumentType;
 | 
			
		||||
@@ -27,11 +18,7 @@ import net.minecraft.entity.effect.StatusEffectInstance;
 | 
			
		||||
import net.minecraft.entity.passive.HorseBaseEntity;
 | 
			
		||||
import net.minecraft.inventory.Inventory;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.network.ClientConnection;
 | 
			
		||||
import net.minecraft.network.MessageType;
 | 
			
		||||
import net.minecraft.network.NetworkSide;
 | 
			
		||||
import net.minecraft.network.NetworkState;
 | 
			
		||||
import net.minecraft.network.Packet;
 | 
			
		||||
import net.minecraft.network.*;
 | 
			
		||||
import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket;
 | 
			
		||||
import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket;
 | 
			
		||||
import net.minecraft.recipe.Recipe;
 | 
			
		||||
@@ -48,219 +35,322 @@ import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.collection.DefaultedList;
 | 
			
		||||
import net.minecraft.util.math.ChunkPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.village.TraderOfferList;
 | 
			
		||||
import net.minecraft.village.TradeOfferList;
 | 
			
		||||
import net.minecraft.world.GameMode;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import javax.crypto.Cipher;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.OptionalInt;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A wrapper for {@link ServerPlayerEntity} which denotes a "fake" player.
 | 
			
		||||
 *
 | 
			
		||||
 * Please note that this does not implement any of the traditional fake player behaviour. It simply exists to prevent me passing in normal players.
 | 
			
		||||
 */
 | 
			
		||||
public class FakePlayer extends ServerPlayerEntity {
 | 
			
		||||
    public FakePlayer(ServerWorld world, GameProfile gameProfile) {
 | 
			
		||||
        super(world.getServer(), world, gameProfile, new ServerPlayerInteractionManager(world));
 | 
			
		||||
        this.networkHandler = new FakeNetHandler(this);
 | 
			
		||||
public class FakePlayer extends ServerPlayerEntity
 | 
			
		||||
{
 | 
			
		||||
    public FakePlayer( ServerWorld world, GameProfile gameProfile )
 | 
			
		||||
    {
 | 
			
		||||
        super( world.getServer(), world, gameProfile, new ServerPlayerInteractionManager( world ) );
 | 
			
		||||
        networkHandler = new FakeNetHandler( this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // region Direct networkHandler access
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enterCombat() { }
 | 
			
		||||
    public void enterCombat()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void endCombat() { }
 | 
			
		||||
    public void endCombat()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void tick() { }
 | 
			
		||||
    public void tick()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playerTick() { }
 | 
			
		||||
    public void playerTick()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDeath(DamageSource damage) { }
 | 
			
		||||
    public void onDeath( DamageSource damage )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Entity moveToWorld(ServerWorld destination) {
 | 
			
		||||
    public Entity moveToWorld( ServerWorld destination )
 | 
			
		||||
    {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void wakeUp(boolean bl, boolean updateSleepingPlayers) {
 | 
			
		||||
    public void wakeUp( boolean bl, boolean updateSleepingPlayers )
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean startRiding(Entity entity, boolean flag) {
 | 
			
		||||
    public boolean startRiding( Entity entity, boolean flag )
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stopRiding() { }
 | 
			
		||||
    public void stopRiding()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openEditSignScreen(SignBlockEntity tile) { }
 | 
			
		||||
    public void openEditSignScreen( SignBlockEntity tile )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public OptionalInt openHandledScreen(@Nullable NamedScreenHandlerFactory container) {
 | 
			
		||||
    public OptionalInt openHandledScreen( @Nullable NamedScreenHandlerFactory container )
 | 
			
		||||
    {
 | 
			
		||||
        return OptionalInt.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendTradeOffers(int id, TraderOfferList list, int level, int experience, boolean levelled, boolean refreshable) { }
 | 
			
		||||
    public void sendTradeOffers( int id, TradeOfferList list, int level, int experience, boolean levelled, boolean refreshable )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openHorseInventory(HorseBaseEntity horse, Inventory inventory) { }
 | 
			
		||||
    public void openHorseInventory( HorseBaseEntity horse, Inventory inventory )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openEditBookScreen(ItemStack stack, Hand hand) { }
 | 
			
		||||
    public void openEditBookScreen( ItemStack stack, Hand hand )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openCommandBlockScreen(CommandBlockBlockEntity block) { }
 | 
			
		||||
    public void openCommandBlockScreen( CommandBlockBlockEntity block )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onSlotUpdate(ScreenHandler container, int slot, ItemStack stack) { }
 | 
			
		||||
    public void onSlotUpdate( ScreenHandler container, int slot, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onHandlerRegistered(ScreenHandler container, DefaultedList<ItemStack> defaultedList) { }
 | 
			
		||||
    public void onHandlerRegistered( ScreenHandler container, DefaultedList<ItemStack> defaultedList )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onPropertyUpdate(ScreenHandler container, int key, int value) { }
 | 
			
		||||
    public void onPropertyUpdate( ScreenHandler container, int key, int value )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void closeHandledScreen() { }
 | 
			
		||||
    public void closeHandledScreen()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateCursorStack() { }
 | 
			
		||||
    public void updateCursorStack()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int unlockRecipes(Collection<Recipe<?>> recipes) {
 | 
			
		||||
    public int unlockRecipes( Collection<Recipe<?>> recipes )
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Indirect
 | 
			
		||||
    @Override
 | 
			
		||||
    public int lockRecipes(Collection<Recipe<?>> recipes) {
 | 
			
		||||
    public int lockRecipes( Collection<Recipe<?>> recipes )
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(Text textComponent, boolean status) { }
 | 
			
		||||
    public void sendMessage( Text textComponent, boolean status )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void consumeItem() { }
 | 
			
		||||
    protected void consumeItem()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void lookAt(EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d) {}
 | 
			
		||||
    public void lookAt( EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void method_14222(EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target) { }
 | 
			
		||||
    public void method_14222( EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onStatusEffectApplied(StatusEffectInstance statusEffectInstance) { }
 | 
			
		||||
    protected void onStatusEffectApplied( StatusEffectInstance statusEffectInstance )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onStatusEffectUpgraded(StatusEffectInstance statusEffectInstance, boolean particles) { }
 | 
			
		||||
    protected void onStatusEffectUpgraded( StatusEffectInstance statusEffectInstance, boolean particles )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onStatusEffectRemoved(StatusEffectInstance statusEffectInstance) { }
 | 
			
		||||
    protected void onStatusEffectRemoved( StatusEffectInstance statusEffectInstance )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void requestTeleport(double x, double y, double z) { }
 | 
			
		||||
    public void requestTeleport( double x, double y, double z )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setGameMode(GameMode gameMode) { }
 | 
			
		||||
    public void setGameMode( GameMode gameMode )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage(Text message, MessageType type, UUID senderUuid) {
 | 
			
		||||
    public void sendMessage( Text message, MessageType type, UUID senderUuid )
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getIp() {
 | 
			
		||||
    public String getIp()
 | 
			
		||||
    {
 | 
			
		||||
        return "[Fake Player]";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendResourcePackUrl(String url, String hash) { }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onStoppedTracking(Entity entity) { }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setCameraEntity(Entity entity) { }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void teleport(ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw) { }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendInitialChunkPackets(ChunkPos chunkPos, Packet<?> packet, Packet<?> packet2) { }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendUnloadChunkPacket(ChunkPos chunkPos) { }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound(SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch) { }
 | 
			
		||||
 | 
			
		||||
    private static class FakeNetHandler extends ServerPlayNetworkHandler {
 | 
			
		||||
        FakeNetHandler(ServerPlayerEntity player) {
 | 
			
		||||
            super(player.server, new FakeConnection(), player);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void disconnect(Text message) { }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onVehicleMove(VehicleMoveC2SPacket move) { }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onRequestCommandCompletions(RequestCommandCompletionsC2SPacket packet) { }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void sendPacket(Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener) { }
 | 
			
		||||
    public void sendResourcePackUrl( String url, String hash )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class FakeConnection extends ClientConnection {
 | 
			
		||||
        FakeConnection() {
 | 
			
		||||
            super(NetworkSide.CLIENTBOUND);
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onStoppedTracking( Entity entity )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setCameraEntity( Entity entity )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void teleport( ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendInitialChunkPackets( ChunkPos chunkPos, Packet<?> packet, Packet<?> packet2 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendUnloadChunkPacket( ChunkPos chunkPos )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound( SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class FakeNetHandler extends ServerPlayNetworkHandler
 | 
			
		||||
    {
 | 
			
		||||
        FakeNetHandler( ServerPlayerEntity player )
 | 
			
		||||
        {
 | 
			
		||||
            super( player.server, new FakeConnection(), player );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void channelActive(ChannelHandlerContext active) {
 | 
			
		||||
        public void disconnect( Text message )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setState(NetworkState state) {
 | 
			
		||||
        public void onVehicleMove( VehicleMoveC2SPacket move )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void exceptionCaught(ChannelHandlerContext context, Throwable err) {
 | 
			
		||||
        public void onRequestCommandCompletions( RequestCommandCompletionsC2SPacket packet )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected void channelRead0(ChannelHandlerContext context, Packet<?> packet) {
 | 
			
		||||
        public void sendPacket( Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class FakeConnection extends ClientConnection
 | 
			
		||||
    {
 | 
			
		||||
        FakeConnection()
 | 
			
		||||
        {
 | 
			
		||||
            super( NetworkSide.CLIENTBOUND );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void send(Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener) {
 | 
			
		||||
        public void channelActive( ChannelHandlerContext active )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void tick() {
 | 
			
		||||
        public void setState( NetworkState state )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void disconnect(Text message) {
 | 
			
		||||
        public void exceptionCaught( ChannelHandlerContext context, Throwable err )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setupEncryption(SecretKey key) {
 | 
			
		||||
        protected void channelRead0( ChannelHandlerContext context, Packet<?> packet )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void disableAutoRead() {
 | 
			
		||||
        public void send( Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setCompressionThreshold(int size) {
 | 
			
		||||
        public void tick()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void disconnect( Text message )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setupEncryption( Cipher cipher, Cipher cipher2 )
 | 
			
		||||
        {
 | 
			
		||||
            super.setupEncryption( cipher, cipher2 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void disableAutoRead()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setCompressionThreshold( int size )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import com.mojang.authlib.GameProfile;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaCallback;
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.shared.util.ItemStorage;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.inventory.Inventory;
 | 
			
		||||
import net.minecraft.nbt.CompoundTag;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
@@ -22,12 +17,16 @@ import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The interface passed to turtle by turtles, providing methods that they can call.
 | 
			
		||||
 *
 | 
			
		||||
 * This should not be implemented by your classes. Do not interact with turtles except via this interface and {@link ITurtleUpgrade}.
 | 
			
		||||
 */
 | 
			
		||||
public interface ITurtleAccess {
 | 
			
		||||
public interface ITurtleAccess
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the world in which the turtle resides.
 | 
			
		||||
     *
 | 
			
		||||
@@ -51,11 +50,11 @@ public interface ITurtleAccess {
 | 
			
		||||
     * using {@link #playAnimation(TurtleAnimation)}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The new world to move it to
 | 
			
		||||
     * @param pos The new position to move it to.
 | 
			
		||||
     * @param pos   The new position to move it to.
 | 
			
		||||
     * @return Whether the movement was successful. It may fail if the block was not loaded or the block placement was cancelled.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to teleport on the client side.
 | 
			
		||||
     */
 | 
			
		||||
    boolean teleportTo(@Nonnull World world, @Nonnull BlockPos pos);
 | 
			
		||||
    boolean teleportTo( @Nonnull World world, @Nonnull BlockPos pos );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a vector containing the floating point co-ordinates at which the turtle is rendered. This will shift when the turtle is moving.
 | 
			
		||||
@@ -65,7 +64,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @see #getVisualYaw(float)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Vec3d getVisualPosition(float f);
 | 
			
		||||
    Vec3d getVisualPosition( float f );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the yaw the turtle is facing when it is rendered.
 | 
			
		||||
@@ -74,7 +73,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @return The yaw the turtle is facing.
 | 
			
		||||
     * @see #getVisualPosition(float)
 | 
			
		||||
     */
 | 
			
		||||
    float getVisualYaw(float f);
 | 
			
		||||
    float getVisualYaw( float f );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the world direction the turtle is currently facing.
 | 
			
		||||
@@ -92,7 +91,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @param dir The new direction to set. This should be on either the x or z axis (so north, south, east or west).
 | 
			
		||||
     * @see #getDirection()
 | 
			
		||||
     */
 | 
			
		||||
    void setDirection(@Nonnull Direction dir);
 | 
			
		||||
    void setDirection( @Nonnull Direction dir );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the currently selected slot in the turtle's inventory.
 | 
			
		||||
@@ -111,7 +110,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @see #getInventory()
 | 
			
		||||
     * @see #getSelectedSlot()
 | 
			
		||||
     */
 | 
			
		||||
    void setSelectedSlot(int slot);
 | 
			
		||||
    void setSelectedSlot( int slot );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the colour of this turtle as a RGB number.
 | 
			
		||||
@@ -125,17 +124,17 @@ public interface ITurtleAccess {
 | 
			
		||||
     * Set the colour of the turtle to a RGB number.
 | 
			
		||||
     *
 | 
			
		||||
     * @param colour The colour this turtle should be changed to. This should be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or -1 to
 | 
			
		||||
     *     reset to the default colour.
 | 
			
		||||
     *               reset to the default colour.
 | 
			
		||||
     * @see #getColour()
 | 
			
		||||
     */
 | 
			
		||||
    void setColour(int colour);
 | 
			
		||||
    void setColour( int colour );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the player who owns this turtle, namely whoever placed it.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This turtle's owner.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Nullable
 | 
			
		||||
    GameProfile getOwningPlayer();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -165,7 +164,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @see #addFuel(int)
 | 
			
		||||
     * @see #consumeFuel(int)
 | 
			
		||||
     */
 | 
			
		||||
    void setFuelLevel(int fuel);
 | 
			
		||||
    void setFuelLevel( int fuel );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the maximum amount of fuel a turtle can hold.
 | 
			
		||||
@@ -179,10 +178,10 @@ public interface ITurtleAccess {
 | 
			
		||||
     *
 | 
			
		||||
     * @param fuel The amount of fuel to consume.
 | 
			
		||||
     * @return Whether the turtle was able to consume the amount of fuel specified. Will return false if you supply a number greater than the current fuel
 | 
			
		||||
     *     level of the turtle. No fuel will be consumed if {@code false} is returned.
 | 
			
		||||
     * level of the turtle. No fuel will be consumed if {@code false} is returned.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to consume fuel on the client side.
 | 
			
		||||
     */
 | 
			
		||||
    boolean consumeFuel(int fuel);
 | 
			
		||||
    boolean consumeFuel( int fuel );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Increase the turtle's fuel level by the given amount.
 | 
			
		||||
@@ -190,7 +189,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @param fuel The amount to refuel with.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to refuel on the client side.
 | 
			
		||||
     */
 | 
			
		||||
    void addFuel(int fuel);
 | 
			
		||||
    void addFuel( int fuel );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds a custom command to the turtles command queue. Unlike peripheral methods, these custom commands will be executed on the main thread, so are
 | 
			
		||||
@@ -205,7 +204,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @see MethodResult#pullEvent(String, ILuaCallback)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult executeCommand(@Nonnull ITurtleCommand command);
 | 
			
		||||
    MethodResult executeCommand( @Nonnull ITurtleCommand command );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Start playing a specific animation. This will prevent other turtle commands from executing until it is finished.
 | 
			
		||||
@@ -214,7 +213,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to execute play an animation on the client side.
 | 
			
		||||
     * @see TurtleAnimation
 | 
			
		||||
     */
 | 
			
		||||
    void playAnimation(@Nonnull TurtleAnimation animation);
 | 
			
		||||
    void playAnimation( @Nonnull TurtleAnimation animation );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the turtle on the specified side of the turtle, if there is one.
 | 
			
		||||
@@ -224,16 +223,16 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @see #setUpgrade(TurtleSide, ITurtleUpgrade)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    ITurtleUpgrade getUpgrade(@Nonnull TurtleSide side);
 | 
			
		||||
    ITurtleUpgrade getUpgrade( @Nonnull TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the upgrade for a given side, resetting peripherals and clearing upgrade specific data.
 | 
			
		||||
     *
 | 
			
		||||
     * @param side The side to set the upgrade on.
 | 
			
		||||
     * @param side    The side to set the upgrade on.
 | 
			
		||||
     * @param upgrade The upgrade to set, may be {@code null} to clear.
 | 
			
		||||
     * @see #getUpgrade(TurtleSide)
 | 
			
		||||
     */
 | 
			
		||||
    void setUpgrade(@Nonnull TurtleSide side, @Nullable ITurtleUpgrade upgrade);
 | 
			
		||||
    void setUpgrade( @Nonnull TurtleSide side, @Nullable ITurtleUpgrade upgrade );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the peripheral created by the upgrade on the specified side of the turtle, if there is one.
 | 
			
		||||
@@ -242,7 +241,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @return The peripheral created by the upgrade on the specified side of the turtle, {@code null} if none exists.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral getPeripheral(@Nonnull TurtleSide side);
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an upgrade-specific NBT compound, which can be used to store arbitrary data.
 | 
			
		||||
@@ -255,7 +254,7 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @see #updateUpgradeNBTData(TurtleSide)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    CompoundTag getUpgradeNBTData(@Nullable TurtleSide side);
 | 
			
		||||
    CompoundTag getUpgradeNBTData( @Nullable TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark the upgrade-specific data as dirty on a specific side. This is required for the data to be synced to the client and persisted.
 | 
			
		||||
@@ -263,10 +262,11 @@ public interface ITurtleAccess {
 | 
			
		||||
     * @param side The side to mark dirty.
 | 
			
		||||
     * @see #updateUpgradeNBTData(TurtleSide)
 | 
			
		||||
     */
 | 
			
		||||
    void updateUpgradeNBTData(@Nonnull TurtleSide side);
 | 
			
		||||
    void updateUpgradeNBTData( @Nonnull TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    default ItemStorage getItemHandler() {
 | 
			
		||||
        return ItemStorage.wrap(this.getInventory());
 | 
			
		||||
    default ItemStorage getItemHandler()
 | 
			
		||||
    {
 | 
			
		||||
        return ItemStorage.wrap( getInventory() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -14,7 +13,8 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 * @see ITurtleAccess#executeCommand(ITurtleCommand)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface ITurtleCommand {
 | 
			
		||||
public interface ITurtleCommand
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Will be called by the turtle on the main thread when it is time to execute the custom command.
 | 
			
		||||
     *
 | 
			
		||||
@@ -29,5 +29,5 @@ public interface ITurtleCommand {
 | 
			
		||||
     * @see TurtleCommandResult
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    TurtleCommandResult execute(@Nonnull ITurtleAccess turtle);
 | 
			
		||||
    TurtleCommandResult execute( @Nonnull ITurtleAccess turtle );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,51 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.IUpgradeBase;
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import net.fabricmc.api.EnvType;
 | 
			
		||||
import net.fabricmc.api.Environment;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.api.EnvType;
 | 
			
		||||
import net.fabricmc.api.Environment;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The primary interface for defining an update for Turtles. A turtle update can either be a new tool, or a new peripheral.
 | 
			
		||||
 *
 | 
			
		||||
 * @see ComputerCraftAPI#registerTurtleUpgrade(ITurtleUpgrade)
 | 
			
		||||
 */
 | 
			
		||||
public interface ITurtleUpgrade {
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a unique identifier representing this type of turtle upgrade. eg: "computercraft:wireless_modem" or "my_mod:my_upgrade". You should use a unique
 | 
			
		||||
     * resource domain to ensure this upgrade is uniquely identified. The turtle will fail registration if an already used ID is specified.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The unique ID for this upgrade.
 | 
			
		||||
     * @see ComputerCraftAPI#registerTurtleUpgrade(ITurtleUpgrade)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Identifier getUpgradeID();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an unlocalised string to describe this type of turtle in turtle item names.
 | 
			
		||||
     *
 | 
			
		||||
     * Examples of built-in adjectives are "Wireless", "Mining" and "Crafty".
 | 
			
		||||
     *
 | 
			
		||||
     * @return The localisation key for this upgrade's adjective.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String getUnlocalisedAdjective();
 | 
			
		||||
 | 
			
		||||
public interface ITurtleUpgrade extends IUpgradeBase
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Return whether this turtle adds a tool or a peripheral to the turtle.
 | 
			
		||||
     *
 | 
			
		||||
@@ -55,18 +32,6 @@ public interface ITurtleUpgrade {
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    TurtleUpgradeType getType();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an item stack representing the type of item that a turtle must be crafted with to create a turtle which holds this upgrade. This item stack is
 | 
			
		||||
     * also used to determine the upgrade given by {@code turtle.equip()}
 | 
			
		||||
     *
 | 
			
		||||
     * Ideally this should be constant over a session. It is recommended that you cache the item too, in order to prevent constructing it every time the
 | 
			
		||||
     * method is called.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The item stack to craft with, or {@link ItemStack#EMPTY} if it cannot be crafted.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ItemStack getCraftingItem();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Will only be called for peripheral upgrades. Creates a peripheral for a turtle being placed using this upgrade.
 | 
			
		||||
     *
 | 
			
		||||
@@ -74,28 +39,30 @@ public interface ITurtleUpgrade {
 | 
			
		||||
     * TurtleSide)}. It will be attached, detached and have methods called in the same manner as a Computer peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle that the peripheral is being created for.
 | 
			
		||||
     * @param side Which side of the turtle (left or right) that the upgrade resides on.
 | 
			
		||||
     * @param side   Which side of the turtle (left or right) that the upgrade resides on.
 | 
			
		||||
     * @return The newly created peripheral. You may return {@code null} if this upgrade is a Tool and this method is not expected to be called.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default IPeripheral createPeripheral(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side) {
 | 
			
		||||
    default IPeripheral createPeripheral( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side )
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Will only be called for Tool turtle. Called when turtle.dig() or turtle.attack() is called by the turtle, and the tool is required to do some work.
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle that the tool resides on.
 | 
			
		||||
     * @param side Which side of the turtle (left or right) the tool resides on.
 | 
			
		||||
     * @param verb Which action (dig or attack) the turtle is being called on to perform.
 | 
			
		||||
     * @param turtle    Access to the turtle that the tool resides on.
 | 
			
		||||
     * @param side      Which side of the turtle (left or right) the tool resides on.
 | 
			
		||||
     * @param verb      Which action (dig or attack) the turtle is being called on to perform.
 | 
			
		||||
     * @param direction Which world direction the action should be performed in, relative to the turtles position. This will either be up, down, or the
 | 
			
		||||
     *     direction the turtle is facing, depending on whether dig, digUp or digDown was called.
 | 
			
		||||
     *                  direction the turtle is facing, depending on whether dig, digUp or digDown was called.
 | 
			
		||||
     * @return Whether the turtle was able to perform the action, and hence whether the {@code turtle.dig()} or {@code turtle.attack()} lua method should
 | 
			
		||||
     *     return true. If true is returned, the tool will perform a swinging animation. You may return {@code null} if this turtle is a Peripheral  and
 | 
			
		||||
     *     this method is not expected to be called.
 | 
			
		||||
     * return true. If true is returned, the tool will perform a swinging animation. You may return {@code null} if this turtle is a Peripheral  and
 | 
			
		||||
     * this method is not expected to be called.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default TurtleCommandResult useTool(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side, @Nonnull TurtleVerb verb, @Nonnull Direction direction) {
 | 
			
		||||
    default TurtleCommandResult useTool( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side, @Nonnull TurtleVerb verb, @Nonnull Direction direction )
 | 
			
		||||
    {
 | 
			
		||||
        return TurtleCommandResult.failure();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -103,19 +70,20 @@ public interface ITurtleUpgrade {
 | 
			
		||||
     * Called to obtain the model to be used when rendering a turtle peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle that the upgrade resides on. This will be null when getting item models!
 | 
			
		||||
     * @param side Which side of the turtle (left or right) the upgrade resides on.
 | 
			
		||||
     * @param side   Which side of the turtle (left or right) the upgrade resides on.
 | 
			
		||||
     * @return The model that you wish to be used to render your upgrade.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Environment (EnvType.CLIENT)
 | 
			
		||||
    TransformedModel getModel(@Nullable ITurtleAccess turtle, @Nonnull TurtleSide side);
 | 
			
		||||
    @Environment( EnvType.CLIENT )
 | 
			
		||||
    TransformedModel getModel( @Nullable ITurtleAccess turtle, @Nonnull TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called once per tick for each turtle which has the upgrade equipped.
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle that the upgrade resides on.
 | 
			
		||||
     * @param side Which side of the turtle (left or right) the upgrade resides on.
 | 
			
		||||
     * @param side   Which side of the turtle (left or right) the upgrade resides on.
 | 
			
		||||
     */
 | 
			
		||||
    default void update(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side) {
 | 
			
		||||
    default void update( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -13,7 +12,8 @@ package dan200.computercraft.api.turtle;
 | 
			
		||||
 *
 | 
			
		||||
 * @see ITurtleAccess#playAnimation(TurtleAnimation)
 | 
			
		||||
 */
 | 
			
		||||
public enum TurtleAnimation {
 | 
			
		||||
public enum TurtleAnimation
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * An animation which does nothing. This takes no time to complete.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -15,14 +14,16 @@ import javax.annotation.Nullable;
 | 
			
		||||
 * @see ITurtleCommand#execute(ITurtleAccess)
 | 
			
		||||
 * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)
 | 
			
		||||
 */
 | 
			
		||||
public final class TurtleCommandResult {
 | 
			
		||||
    private static final TurtleCommandResult EMPTY_SUCCESS = new TurtleCommandResult(true, null, null);
 | 
			
		||||
    private static final TurtleCommandResult EMPTY_FAILURE = new TurtleCommandResult(false, null, null);
 | 
			
		||||
public final class TurtleCommandResult
 | 
			
		||||
{
 | 
			
		||||
    private static final TurtleCommandResult EMPTY_SUCCESS = new TurtleCommandResult( true, null, null );
 | 
			
		||||
    private static final TurtleCommandResult EMPTY_FAILURE = new TurtleCommandResult( false, null, null );
 | 
			
		||||
    private final boolean success;
 | 
			
		||||
    private final String errorMessage;
 | 
			
		||||
    private final Object[] results;
 | 
			
		||||
 | 
			
		||||
    private TurtleCommandResult(boolean success, String errorMessage, Object[] results) {
 | 
			
		||||
    private TurtleCommandResult( boolean success, String errorMessage, Object[] results )
 | 
			
		||||
    {
 | 
			
		||||
        this.success = success;
 | 
			
		||||
        this.errorMessage = errorMessage;
 | 
			
		||||
        this.results = results;
 | 
			
		||||
@@ -34,7 +35,8 @@ public final class TurtleCommandResult {
 | 
			
		||||
     * @return A successful command result with no values.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static TurtleCommandResult success() {
 | 
			
		||||
    public static TurtleCommandResult success()
 | 
			
		||||
    {
 | 
			
		||||
        return EMPTY_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -45,11 +47,13 @@ public final class TurtleCommandResult {
 | 
			
		||||
     * @return A successful command result with the given values.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static TurtleCommandResult success(@Nullable Object[] results) {
 | 
			
		||||
        if (results == null || results.length == 0) {
 | 
			
		||||
    public static TurtleCommandResult success( @Nullable Object[] results )
 | 
			
		||||
    {
 | 
			
		||||
        if( results == null || results.length == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return EMPTY_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
        return new TurtleCommandResult(true, null, results);
 | 
			
		||||
        return new TurtleCommandResult( true, null, results );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -58,7 +62,8 @@ public final class TurtleCommandResult {
 | 
			
		||||
     * @return A failed command result with no message.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static TurtleCommandResult failure() {
 | 
			
		||||
    public static TurtleCommandResult failure()
 | 
			
		||||
    {
 | 
			
		||||
        return EMPTY_FAILURE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -69,11 +74,13 @@ public final class TurtleCommandResult {
 | 
			
		||||
     * @return A failed command result with a message.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static TurtleCommandResult failure(@Nullable String errorMessage) {
 | 
			
		||||
        if (errorMessage == null) {
 | 
			
		||||
    public static TurtleCommandResult failure( @Nullable String errorMessage )
 | 
			
		||||
    {
 | 
			
		||||
        if( errorMessage == null )
 | 
			
		||||
        {
 | 
			
		||||
            return EMPTY_FAILURE;
 | 
			
		||||
        }
 | 
			
		||||
        return new TurtleCommandResult(false, errorMessage, null);
 | 
			
		||||
        return new TurtleCommandResult( false, errorMessage, null );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -81,8 +88,9 @@ public final class TurtleCommandResult {
 | 
			
		||||
     *
 | 
			
		||||
     * @return If the command was successful.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isSuccess() {
 | 
			
		||||
        return this.success;
 | 
			
		||||
    public boolean isSuccess()
 | 
			
		||||
    {
 | 
			
		||||
        return success;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -91,8 +99,9 @@ public final class TurtleCommandResult {
 | 
			
		||||
     * @return The command's error message, or {@code null} if it was a success.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public String getErrorMessage() {
 | 
			
		||||
        return this.errorMessage;
 | 
			
		||||
    public String getErrorMessage()
 | 
			
		||||
    {
 | 
			
		||||
        return errorMessage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -101,7 +110,8 @@ public final class TurtleCommandResult {
 | 
			
		||||
     * @return The command's result, or {@code null} if it was a failure.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Object[] getResults() {
 | 
			
		||||
        return this.results;
 | 
			
		||||
    public Object[] getResults()
 | 
			
		||||
    {
 | 
			
		||||
        return results;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An enum representing the two sides of the turtle that a turtle turtle might reside.
 | 
			
		||||
 */
 | 
			
		||||
public enum TurtleSide {
 | 
			
		||||
public enum TurtleSide
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The turtle's left side (where the pickaxe usually is on a Wireless Mining Turtle).
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -11,7 +10,8 @@ package dan200.computercraft.api.turtle;
 | 
			
		||||
 *
 | 
			
		||||
 * @see ITurtleUpgrade#getType()
 | 
			
		||||
 */
 | 
			
		||||
public enum TurtleUpgradeType {
 | 
			
		||||
public enum TurtleUpgradeType
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * A tool is rendered as an item on the side of the turtle, and responds to the {@code turtle.dig()} and {@code turtle.attack()} methods (Such as
 | 
			
		||||
     * pickaxe or sword on Mining and Melee turtles).
 | 
			
		||||
@@ -30,11 +30,13 @@ public enum TurtleUpgradeType {
 | 
			
		||||
     */
 | 
			
		||||
    BOTH;
 | 
			
		||||
 | 
			
		||||
    public boolean isTool() {
 | 
			
		||||
    public boolean isTool()
 | 
			
		||||
    {
 | 
			
		||||
        return this == TOOL || this == BOTH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isPeripheral() {
 | 
			
		||||
    public boolean isPeripheral()
 | 
			
		||||
    {
 | 
			
		||||
        return this == PERIPHERAL || this == BOTH;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -12,7 +11,8 @@ package dan200.computercraft.api.turtle;
 | 
			
		||||
 * @see ITurtleUpgrade#getType()
 | 
			
		||||
 * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)
 | 
			
		||||
 */
 | 
			
		||||
public enum TurtleVerb {
 | 
			
		||||
public enum TurtleVerb
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The turtle called {@code turtle.dig()}, {@code turtle.digUp()} or {@code turtle.digDown()}.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -11,7 +10,8 @@ package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleActionEvent
 | 
			
		||||
 */
 | 
			
		||||
public enum TurtleAction {
 | 
			
		||||
public enum TurtleAction
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * A turtle moves to a new position.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,36 +1,37 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleCommandResult;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An event fired when a turtle is performing a known action.
 | 
			
		||||
 */
 | 
			
		||||
public class TurtleActionEvent extends TurtleEvent {
 | 
			
		||||
public class TurtleActionEvent extends TurtleEvent
 | 
			
		||||
{
 | 
			
		||||
    private final TurtleAction action;
 | 
			
		||||
    private String failureMessage;
 | 
			
		||||
    private boolean cancelled = false;
 | 
			
		||||
 | 
			
		||||
    public TurtleActionEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action) {
 | 
			
		||||
        super(turtle);
 | 
			
		||||
    public TurtleActionEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle );
 | 
			
		||||
 | 
			
		||||
        Objects.requireNonNull(action, "action cannot be null");
 | 
			
		||||
        Objects.requireNonNull( action, "action cannot be null" );
 | 
			
		||||
        this.action = action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TurtleAction getAction() {
 | 
			
		||||
        return this.action;
 | 
			
		||||
    public TurtleAction getAction()
 | 
			
		||||
    {
 | 
			
		||||
        return action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -43,8 +44,9 @@ public class TurtleActionEvent extends TurtleEvent {
 | 
			
		||||
     * @deprecated Use {@link #setCanceled(boolean, String)} instead.
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public void setCanceled(boolean cancel) {
 | 
			
		||||
        this.setCanceled(cancel, null);
 | 
			
		||||
    public void setCanceled( boolean cancel )
 | 
			
		||||
    {
 | 
			
		||||
        setCanceled( cancel, null );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -52,12 +54,13 @@ public class TurtleActionEvent extends TurtleEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * If {@code cancel} is {@code true}, this action will not be carried out.
 | 
			
		||||
     *
 | 
			
		||||
     * @param cancel The new canceled value.
 | 
			
		||||
     * @param cancel         The new canceled value.
 | 
			
		||||
     * @param failureMessage The message to return to the user explaining the failure.
 | 
			
		||||
     * @see TurtleCommandResult#failure(String)
 | 
			
		||||
     */
 | 
			
		||||
    public void setCanceled(boolean cancel, @Nullable String failureMessage) {
 | 
			
		||||
        this.cancelled = true;
 | 
			
		||||
    public void setCanceled( boolean cancel, @Nullable String failureMessage )
 | 
			
		||||
    {
 | 
			
		||||
        cancelled = true;
 | 
			
		||||
        this.failureMessage = cancel ? failureMessage : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -69,11 +72,13 @@ public class TurtleActionEvent extends TurtleEvent {
 | 
			
		||||
     * @see #setCanceled(boolean, String)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public String getFailureMessage() {
 | 
			
		||||
        return this.failureMessage;
 | 
			
		||||
    public String getFailureMessage()
 | 
			
		||||
    {
 | 
			
		||||
        return failureMessage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCancelled() {
 | 
			
		||||
        return this.cancelled;
 | 
			
		||||
    public boolean isCancelled()
 | 
			
		||||
    {
 | 
			
		||||
        return cancelled;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,38 +1,37 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.FakePlayer;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleSide;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fired when a turtle attempts to attack an entity.
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleAction#ATTACK
 | 
			
		||||
 */
 | 
			
		||||
public class TurtleAttackEvent extends TurtlePlayerEvent {
 | 
			
		||||
public class TurtleAttackEvent extends TurtlePlayerEvent
 | 
			
		||||
{
 | 
			
		||||
    private final Entity target;
 | 
			
		||||
    private final ITurtleUpgrade upgrade;
 | 
			
		||||
    private final TurtleSide side;
 | 
			
		||||
 | 
			
		||||
    public TurtleAttackEvent(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Entity target, @Nonnull ITurtleUpgrade upgrade,
 | 
			
		||||
                             @Nonnull TurtleSide side) {
 | 
			
		||||
        super(turtle, TurtleAction.ATTACK, player);
 | 
			
		||||
        Objects.requireNonNull(target, "target cannot be null");
 | 
			
		||||
        Objects.requireNonNull(upgrade, "upgrade cannot be null");
 | 
			
		||||
        Objects.requireNonNull(side, "side cannot be null");
 | 
			
		||||
    public TurtleAttackEvent( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Entity target, @Nonnull ITurtleUpgrade upgrade,
 | 
			
		||||
                              @Nonnull TurtleSide side )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, TurtleAction.ATTACK, player );
 | 
			
		||||
        Objects.requireNonNull( target, "target cannot be null" );
 | 
			
		||||
        Objects.requireNonNull( upgrade, "upgrade cannot be null" );
 | 
			
		||||
        Objects.requireNonNull( side, "side cannot be null" );
 | 
			
		||||
        this.target = target;
 | 
			
		||||
        this.upgrade = upgrade;
 | 
			
		||||
        this.side = side;
 | 
			
		||||
@@ -44,8 +43,9 @@ public class TurtleAttackEvent extends TurtlePlayerEvent {
 | 
			
		||||
     * @return The entity being attacked.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public Entity getTarget() {
 | 
			
		||||
        return this.target;
 | 
			
		||||
    public Entity getTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return target;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -54,8 +54,9 @@ public class TurtleAttackEvent extends TurtlePlayerEvent {
 | 
			
		||||
     * @return The upgrade responsible for attacking.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public ITurtleUpgrade getUpgrade() {
 | 
			
		||||
        return this.upgrade;
 | 
			
		||||
    public ITurtleUpgrade getUpgrade()
 | 
			
		||||
    {
 | 
			
		||||
        return upgrade;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -64,7 +65,8 @@ public class TurtleAttackEvent extends TurtlePlayerEvent {
 | 
			
		||||
     * @return The upgrade's side.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public TurtleSide getSide() {
 | 
			
		||||
        return this.side;
 | 
			
		||||
    public TurtleSide getSide()
 | 
			
		||||
    {
 | 
			
		||||
        return side;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,27 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
import dan200.computercraft.api.turtle.FakePlayer;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleSide;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A general event for when a turtle interacts with a block or region.
 | 
			
		||||
 *
 | 
			
		||||
@@ -31,16 +28,18 @@ import net.minecraft.world.World;
 | 
			
		||||
 *
 | 
			
		||||
 * Be aware that some events (such as {@link TurtleInventoryEvent}) do not necessarily interact with a block, simply objects within that block space.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
{
 | 
			
		||||
    private final World world;
 | 
			
		||||
    private final BlockPos pos;
 | 
			
		||||
 | 
			
		||||
    protected TurtleBlockEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
 | 
			
		||||
                               @Nonnull BlockPos pos) {
 | 
			
		||||
        super(turtle, action, player);
 | 
			
		||||
    protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
 | 
			
		||||
                                @Nonnull BlockPos pos )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, action, player );
 | 
			
		||||
 | 
			
		||||
        Objects.requireNonNull(world, "world cannot be null");
 | 
			
		||||
        Objects.requireNonNull(pos, "pos cannot be null");
 | 
			
		||||
        Objects.requireNonNull( world, "world cannot be null" );
 | 
			
		||||
        Objects.requireNonNull( pos, "pos cannot be null" );
 | 
			
		||||
        this.world = world;
 | 
			
		||||
        this.pos = pos;
 | 
			
		||||
    }
 | 
			
		||||
@@ -50,8 +49,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @return The world the turtle is interacting in.
 | 
			
		||||
     */
 | 
			
		||||
    public World getWorld() {
 | 
			
		||||
        return this.world;
 | 
			
		||||
    public World getWorld()
 | 
			
		||||
    {
 | 
			
		||||
        return world;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -59,8 +59,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @return The position the turtle is interacting with.
 | 
			
		||||
     */
 | 
			
		||||
    public BlockPos getPos() {
 | 
			
		||||
        return this.pos;
 | 
			
		||||
    public BlockPos getPos()
 | 
			
		||||
    {
 | 
			
		||||
        return pos;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -68,18 +69,20 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#DIG
 | 
			
		||||
     */
 | 
			
		||||
    public static class Dig extends TurtleBlockEvent {
 | 
			
		||||
    public static class Dig extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final BlockState block;
 | 
			
		||||
        private final ITurtleUpgrade upgrade;
 | 
			
		||||
        private final TurtleSide side;
 | 
			
		||||
 | 
			
		||||
        public Dig(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState block,
 | 
			
		||||
                   @Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side) {
 | 
			
		||||
            super(turtle, TurtleAction.DIG, player, world, pos);
 | 
			
		||||
        public Dig( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState block,
 | 
			
		||||
                    @Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side )
 | 
			
		||||
        {
 | 
			
		||||
            super( turtle, TurtleAction.DIG, player, world, pos );
 | 
			
		||||
 | 
			
		||||
            Objects.requireNonNull(block, "block cannot be null");
 | 
			
		||||
            Objects.requireNonNull(upgrade, "upgrade cannot be null");
 | 
			
		||||
            Objects.requireNonNull(side, "side cannot be null");
 | 
			
		||||
            Objects.requireNonNull( block, "block cannot be null" );
 | 
			
		||||
            Objects.requireNonNull( upgrade, "upgrade cannot be null" );
 | 
			
		||||
            Objects.requireNonNull( side, "side cannot be null" );
 | 
			
		||||
            this.block = block;
 | 
			
		||||
            this.upgrade = upgrade;
 | 
			
		||||
            this.side = side;
 | 
			
		||||
@@ -91,8 +94,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         * @return The block which is going to be broken.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public BlockState getBlock() {
 | 
			
		||||
            return this.block;
 | 
			
		||||
        public BlockState getBlock()
 | 
			
		||||
        {
 | 
			
		||||
            return block;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
@@ -101,8 +105,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         * @return The upgrade doing the digging.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public ITurtleUpgrade getUpgrade() {
 | 
			
		||||
            return this.upgrade;
 | 
			
		||||
        public ITurtleUpgrade getUpgrade()
 | 
			
		||||
        {
 | 
			
		||||
            return upgrade;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
@@ -111,8 +116,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         * @return The upgrade's side.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public TurtleSide getSide() {
 | 
			
		||||
            return this.side;
 | 
			
		||||
        public TurtleSide getSide()
 | 
			
		||||
        {
 | 
			
		||||
            return side;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -121,9 +127,11 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#MOVE
 | 
			
		||||
     */
 | 
			
		||||
    public static class Move extends TurtleBlockEvent {
 | 
			
		||||
        public Move(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos) {
 | 
			
		||||
            super(turtle, TurtleAction.MOVE, player, world, pos);
 | 
			
		||||
    public static class Move extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        public Move( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos )
 | 
			
		||||
        {
 | 
			
		||||
            super( turtle, TurtleAction.MOVE, player, world, pos );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -132,13 +140,15 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#PLACE
 | 
			
		||||
     */
 | 
			
		||||
    public static class Place extends TurtleBlockEvent {
 | 
			
		||||
    public static class Place extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
        public Place(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull ItemStack stack) {
 | 
			
		||||
            super(turtle, TurtleAction.PLACE, player, world, pos);
 | 
			
		||||
        public Place( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull ItemStack stack )
 | 
			
		||||
        {
 | 
			
		||||
            super( turtle, TurtleAction.PLACE, player, world, pos );
 | 
			
		||||
 | 
			
		||||
            Objects.requireNonNull(stack, "stack cannot be null");
 | 
			
		||||
            Objects.requireNonNull( stack, "stack cannot be null" );
 | 
			
		||||
            this.stack = stack;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -148,8 +158,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         * @return The item stack to be placed.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public ItemStack getStack() {
 | 
			
		||||
            return this.stack;
 | 
			
		||||
        public ItemStack getStack()
 | 
			
		||||
        {
 | 
			
		||||
            return stack;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -160,16 +171,18 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#INSPECT
 | 
			
		||||
     */
 | 
			
		||||
    public static class Inspect extends TurtleBlockEvent {
 | 
			
		||||
    public static class Inspect extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final BlockState state;
 | 
			
		||||
        private final Map<String, Object> data;
 | 
			
		||||
 | 
			
		||||
        public Inspect(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state,
 | 
			
		||||
                       @Nonnull Map<String, Object> data) {
 | 
			
		||||
            super(turtle, TurtleAction.INSPECT, player, world, pos);
 | 
			
		||||
        public Inspect( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state,
 | 
			
		||||
                        @Nonnull Map<String, Object> data )
 | 
			
		||||
        {
 | 
			
		||||
            super( turtle, TurtleAction.INSPECT, player, world, pos );
 | 
			
		||||
 | 
			
		||||
            Objects.requireNonNull(state, "state cannot be null");
 | 
			
		||||
            Objects.requireNonNull(data, "data cannot be null");
 | 
			
		||||
            Objects.requireNonNull( state, "state cannot be null" );
 | 
			
		||||
            Objects.requireNonNull( data, "data cannot be null" );
 | 
			
		||||
            this.data = data;
 | 
			
		||||
            this.state = state;
 | 
			
		||||
        }
 | 
			
		||||
@@ -180,8 +193,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         * @return The inspected block state.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public BlockState getState() {
 | 
			
		||||
            return this.state;
 | 
			
		||||
        public BlockState getState()
 | 
			
		||||
        {
 | 
			
		||||
            return state;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
@@ -190,8 +204,9 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         * @return This block's inspection data.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public Map<String, Object> getData() {
 | 
			
		||||
            return this.data;
 | 
			
		||||
        public Map<String, Object> getData()
 | 
			
		||||
        {
 | 
			
		||||
            return data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
@@ -199,9 +214,10 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
 | 
			
		||||
         *
 | 
			
		||||
         * @param newData The data to add. Note all values should be convertible to Lua (see {@link MethodResult#of(Object)}).
 | 
			
		||||
         */
 | 
			
		||||
        public void addData(@Nonnull Map<String, ?> newData) {
 | 
			
		||||
            Objects.requireNonNull(newData, "newData cannot be null");
 | 
			
		||||
            this.data.putAll(newData);
 | 
			
		||||
        public void addData( @Nonnull Map<String, ?> newData )
 | 
			
		||||
        {
 | 
			
		||||
            Objects.requireNonNull( newData, "newData cannot be null" );
 | 
			
		||||
            data.putAll( newData );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import com.google.common.eventbus.EventBus;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A base class for all events concerning a turtle. This will only ever constructed and fired on the server side, so sever specific methods on {@link
 | 
			
		||||
 * ITurtleAccess} are safe to use.
 | 
			
		||||
@@ -21,18 +19,21 @@ import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleActionEvent
 | 
			
		||||
 */
 | 
			
		||||
public abstract class TurtleEvent {
 | 
			
		||||
public abstract class TurtleEvent
 | 
			
		||||
{
 | 
			
		||||
    public static final EventBus EVENT_BUS = new EventBus();
 | 
			
		||||
 | 
			
		||||
    private final ITurtleAccess turtle;
 | 
			
		||||
 | 
			
		||||
    protected TurtleEvent(@Nonnull ITurtleAccess turtle) {
 | 
			
		||||
        Objects.requireNonNull(turtle, "turtle cannot be null");
 | 
			
		||||
    protected TurtleEvent( @Nonnull ITurtleAccess turtle )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( turtle, "turtle cannot be null" );
 | 
			
		||||
        this.turtle = turtle;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean post(TurtleActionEvent event) {
 | 
			
		||||
        EVENT_BUS.post(event);
 | 
			
		||||
    public static boolean post( TurtleActionEvent event )
 | 
			
		||||
    {
 | 
			
		||||
        EVENT_BUS.post( event );
 | 
			
		||||
        return event.isCancelled();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -42,8 +43,9 @@ public abstract class TurtleEvent {
 | 
			
		||||
     * @return The access for this turtle.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public ITurtleAccess getTurtle() {
 | 
			
		||||
        return this.turtle;
 | 
			
		||||
    public ITurtleAccess getTurtle()
 | 
			
		||||
    {
 | 
			
		||||
        return turtle;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,18 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fired when a turtle gathers data on an item in its inventory.
 | 
			
		||||
 *
 | 
			
		||||
@@ -24,21 +21,24 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleAction#INSPECT_ITEM
 | 
			
		||||
 */
 | 
			
		||||
public class TurtleInspectItemEvent extends TurtleActionEvent {
 | 
			
		||||
public class TurtleInspectItemEvent extends TurtleActionEvent
 | 
			
		||||
{
 | 
			
		||||
    private final ItemStack stack;
 | 
			
		||||
    private final Map<String, Object> data;
 | 
			
		||||
    private final boolean mainThread;
 | 
			
		||||
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public TurtleInspectItemEvent(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data) {
 | 
			
		||||
        this(turtle, stack, data, false);
 | 
			
		||||
    public TurtleInspectItemEvent( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data )
 | 
			
		||||
    {
 | 
			
		||||
        this( turtle, stack, data, false );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TurtleInspectItemEvent(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data, boolean mainThread) {
 | 
			
		||||
        super(turtle, TurtleAction.INSPECT_ITEM);
 | 
			
		||||
    public TurtleInspectItemEvent( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data, boolean mainThread )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, TurtleAction.INSPECT_ITEM );
 | 
			
		||||
 | 
			
		||||
        Objects.requireNonNull(stack, "stack cannot be null");
 | 
			
		||||
        Objects.requireNonNull(data, "data cannot be null");
 | 
			
		||||
        Objects.requireNonNull( stack, "stack cannot be null" );
 | 
			
		||||
        Objects.requireNonNull( data, "data cannot be null" );
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
        this.data = data;
 | 
			
		||||
        this.mainThread = mainThread;
 | 
			
		||||
@@ -50,8 +50,9 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
 | 
			
		||||
     * @return The item stack which is being inspected. This should <b>not</b> be modified.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public ItemStack getStack() {
 | 
			
		||||
        return this.stack;
 | 
			
		||||
    public ItemStack getStack()
 | 
			
		||||
    {
 | 
			
		||||
        return stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -60,8 +61,9 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
 | 
			
		||||
     * @return This items's inspection data.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public Map<String, Object> getData() {
 | 
			
		||||
        return this.data;
 | 
			
		||||
    public Map<String, Object> getData()
 | 
			
		||||
    {
 | 
			
		||||
        return data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -69,8 +71,9 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @return If this is run on the main thread.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean onMainThread() {
 | 
			
		||||
        return this.mainThread;
 | 
			
		||||
    public boolean onMainThread()
 | 
			
		||||
    {
 | 
			
		||||
        return mainThread;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -78,8 +81,9 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @param newData The data to add. Note all values should be convertible to Lua (see {@link MethodResult#of(Object)}).
 | 
			
		||||
     */
 | 
			
		||||
    public void addData(@Nonnull Map<String, ?> newData) {
 | 
			
		||||
        Objects.requireNonNull(newData, "newData cannot be null");
 | 
			
		||||
        this.data.putAll(newData);
 | 
			
		||||
    public void addData( @Nonnull Map<String, ?> newData )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( newData, "newData cannot be null" );
 | 
			
		||||
        data.putAll( newData );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.FakePlayer;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.inventory.Inventory;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fired when a turtle attempts to interact with an inventory.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
 | 
			
		||||
public abstract class TurtleInventoryEvent extends TurtleBlockEvent
 | 
			
		||||
{
 | 
			
		||||
    private final Inventory handler;
 | 
			
		||||
 | 
			
		||||
    protected TurtleInventoryEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
 | 
			
		||||
                                   @Nonnull BlockPos pos, @Nullable Inventory handler) {
 | 
			
		||||
        super(turtle, action, player, world, pos);
 | 
			
		||||
    protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
 | 
			
		||||
                                    @Nonnull BlockPos pos, @Nullable Inventory handler )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, action, player, world, pos );
 | 
			
		||||
        this.handler = handler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -37,8 +36,9 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
 | 
			
		||||
     * @return The inventory being interacted with, {@code null} if the item will be dropped to/sucked from the world.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Inventory getItemHandler() {
 | 
			
		||||
        return this.handler;
 | 
			
		||||
    public Inventory getItemHandler()
 | 
			
		||||
    {
 | 
			
		||||
        return handler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -46,9 +46,11 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#SUCK
 | 
			
		||||
     */
 | 
			
		||||
    public static class Suck extends TurtleInventoryEvent {
 | 
			
		||||
        public Suck(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler) {
 | 
			
		||||
            super(turtle, TurtleAction.SUCK, player, world, pos, handler);
 | 
			
		||||
    public static class Suck extends TurtleInventoryEvent
 | 
			
		||||
    {
 | 
			
		||||
        public Suck( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler )
 | 
			
		||||
        {
 | 
			
		||||
            super( turtle, TurtleAction.SUCK, player, world, pos, handler );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -57,14 +59,16 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#DROP
 | 
			
		||||
     */
 | 
			
		||||
    public static class Drop extends TurtleInventoryEvent {
 | 
			
		||||
    public static class Drop extends TurtleInventoryEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
        public Drop(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler,
 | 
			
		||||
                    @Nonnull ItemStack stack) {
 | 
			
		||||
            super(turtle, TurtleAction.DROP, player, world, pos, handler);
 | 
			
		||||
        public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler,
 | 
			
		||||
                     @Nonnull ItemStack stack )
 | 
			
		||||
        {
 | 
			
		||||
            super( turtle, TurtleAction.DROP, player, world, pos, handler );
 | 
			
		||||
 | 
			
		||||
            Objects.requireNonNull(stack, "stack cannot be null");
 | 
			
		||||
            Objects.requireNonNull( stack, "stack cannot be null" );
 | 
			
		||||
            this.stack = stack;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -74,8 +78,9 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
 | 
			
		||||
         * @return The item stack which will be dropped. This should <b>not</b> be modified.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public ItemStack getStack() {
 | 
			
		||||
            return this.stack;
 | 
			
		||||
        public ItemStack getStack()
 | 
			
		||||
        {
 | 
			
		||||
            return stack;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +1,30 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.FakePlayer;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An action done by a turtle which is normally done by a player.
 | 
			
		||||
 *
 | 
			
		||||
 * {@link #getPlayer()} may be used to modify the player's attributes or perform permission checks.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class TurtlePlayerEvent extends TurtleActionEvent {
 | 
			
		||||
public abstract class TurtlePlayerEvent extends TurtleActionEvent
 | 
			
		||||
{
 | 
			
		||||
    private final FakePlayer player;
 | 
			
		||||
 | 
			
		||||
    protected TurtlePlayerEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player) {
 | 
			
		||||
        super(turtle, action);
 | 
			
		||||
    protected TurtlePlayerEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, action );
 | 
			
		||||
 | 
			
		||||
        Objects.requireNonNull(player, "player cannot be null");
 | 
			
		||||
        Objects.requireNonNull( player, "player cannot be null" );
 | 
			
		||||
        this.player = player;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -36,7 +36,8 @@ public abstract class TurtlePlayerEvent extends TurtleActionEvent {
 | 
			
		||||
     * @return A {@link FakePlayer} representing this turtle.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public FakePlayer getPlayer() {
 | 
			
		||||
        return this.player;
 | 
			
		||||
    public FakePlayer getPlayer()
 | 
			
		||||
    {
 | 
			
		||||
        return player;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api.turtle.event;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fired when a turtle attempts to refuel from an item.
 | 
			
		||||
@@ -21,14 +18,16 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
 * One may use {@link #setCanceled(boolean, String)} to prevent refueling from this specific item. Additionally, you may use {@link #setHandler(Handler)} to
 | 
			
		||||
 * register a custom fuel provider.
 | 
			
		||||
 */
 | 
			
		||||
public class TurtleRefuelEvent extends TurtleActionEvent {
 | 
			
		||||
public class TurtleRefuelEvent extends TurtleActionEvent
 | 
			
		||||
{
 | 
			
		||||
    private final ItemStack stack;
 | 
			
		||||
    private Handler handler;
 | 
			
		||||
 | 
			
		||||
    public TurtleRefuelEvent(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack) {
 | 
			
		||||
        super(turtle, TurtleAction.REFUEL);
 | 
			
		||||
    public TurtleRefuelEvent( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, TurtleAction.REFUEL );
 | 
			
		||||
 | 
			
		||||
        Objects.requireNonNull(turtle, "turtle cannot be null");
 | 
			
		||||
        Objects.requireNonNull( turtle, "turtle cannot be null" );
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -39,8 +38,9 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
 | 
			
		||||
     *
 | 
			
		||||
     * @return The stack to refuel from.
 | 
			
		||||
     */
 | 
			
		||||
    public ItemStack getStack() {
 | 
			
		||||
        return this.stack;
 | 
			
		||||
    public ItemStack getStack()
 | 
			
		||||
    {
 | 
			
		||||
        return stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -50,8 +50,9 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
 | 
			
		||||
     * @see #setHandler(Handler)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Handler getHandler() {
 | 
			
		||||
        return this.handler;
 | 
			
		||||
    public Handler getHandler()
 | 
			
		||||
    {
 | 
			
		||||
        return handler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -62,7 +63,8 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
 | 
			
		||||
     * @param handler The new refuel handler.
 | 
			
		||||
     * @see #getHandler()
 | 
			
		||||
     */
 | 
			
		||||
    public void setHandler(@Nullable Handler handler) {
 | 
			
		||||
    public void setHandler( @Nullable Handler handler )
 | 
			
		||||
    {
 | 
			
		||||
        this.handler = handler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -70,16 +72,17 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
 | 
			
		||||
     * Handles refuelling a turtle from a specific item.
 | 
			
		||||
     */
 | 
			
		||||
    @FunctionalInterface
 | 
			
		||||
    public interface Handler {
 | 
			
		||||
    public interface Handler
 | 
			
		||||
    {
 | 
			
		||||
        /**
 | 
			
		||||
         * Refuel a turtle using an item.
 | 
			
		||||
         *
 | 
			
		||||
         * @param turtle The turtle to refuel.
 | 
			
		||||
         * @param stack The stack to refuel with.
 | 
			
		||||
         * @param slot The slot the stack resides within. This may be used to modify the inventory afterwards.
 | 
			
		||||
         * @param limit The maximum number of refuel operations to perform. This will often correspond to the number of items to consume.
 | 
			
		||||
         * @param stack  The stack to refuel with.
 | 
			
		||||
         * @param slot   The slot the stack resides within. This may be used to modify the inventory afterwards.
 | 
			
		||||
         * @param limit  The maximum number of refuel operations to perform. This will often correspond to the number of items to consume.
 | 
			
		||||
         * @return The amount of fuel gained.
 | 
			
		||||
         */
 | 
			
		||||
        int refuel(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, int slot, int limit);
 | 
			
		||||
        int refuel( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, int slot, int limit );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.ComputerCraftRegistry;
 | 
			
		||||
import dan200.computercraft.shared.common.IColouredItem;
 | 
			
		||||
@@ -16,7 +12,8 @@ import dan200.computercraft.shared.media.items.ItemDisk;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemTreasureDisk;
 | 
			
		||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
 | 
			
		||||
import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback;
 | 
			
		||||
import net.minecraft.client.MinecraftClient;
 | 
			
		||||
import net.minecraft.client.render.model.BakedModel;
 | 
			
		||||
import net.minecraft.client.render.model.ModelLoader;
 | 
			
		||||
@@ -27,17 +24,18 @@ import net.minecraft.client.util.ModelIdentifier;
 | 
			
		||||
import net.minecraft.resource.ResourceManager;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
 | 
			
		||||
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
 | 
			
		||||
import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Registers textures and models for items.
 | 
			
		||||
 */
 | 
			
		||||
@SuppressWarnings ({
 | 
			
		||||
@SuppressWarnings( {
 | 
			
		||||
    "MethodCallSideOnly",
 | 
			
		||||
    "LocalVariableDeclarationSideOnly"
 | 
			
		||||
})
 | 
			
		||||
public final class ClientRegistry {
 | 
			
		||||
} )
 | 
			
		||||
public final class ClientRegistry
 | 
			
		||||
{
 | 
			
		||||
    private static final String[] EXTRA_MODELS = new String[] {
 | 
			
		||||
        "turtle_modem_normal_off_left",
 | 
			
		||||
        "turtle_modem_normal_on_left",
 | 
			
		||||
@@ -56,7 +54,7 @@ public final class ClientRegistry {
 | 
			
		||||
 | 
			
		||||
        "turtle_colour",
 | 
			
		||||
        "turtle_elf_overlay",
 | 
			
		||||
        };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private static final String[] EXTRA_TEXTURES = new String[] {
 | 
			
		||||
        // TODO: Gather these automatically from the model. Sadly the model loader isn't available
 | 
			
		||||
@@ -65,59 +63,64 @@ public final class ClientRegistry {
 | 
			
		||||
        "block/turtle_elf_overlay",
 | 
			
		||||
        "block/turtle_crafty_face",
 | 
			
		||||
        "block/turtle_speaker_face",
 | 
			
		||||
        };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private ClientRegistry() {}
 | 
			
		||||
 | 
			
		||||
    public static void onTextureStitchEvent(SpriteAtlasTexture atlasTexture, ClientSpriteRegistryCallback.Registry registry) {
 | 
			
		||||
        for (String extra : EXTRA_TEXTURES) {
 | 
			
		||||
            registry.register(new Identifier(ComputerCraft.MOD_ID, extra));
 | 
			
		||||
    public static void onTextureStitchEvent( SpriteAtlasTexture atlasTexture, ClientSpriteRegistryCallback.Registry registry )
 | 
			
		||||
    {
 | 
			
		||||
        for( String extra : EXTRA_TEXTURES )
 | 
			
		||||
        {
 | 
			
		||||
            registry.register( new Identifier( ComputerCraft.MOD_ID, extra ) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings ("NewExpressionSideOnly")
 | 
			
		||||
    public static void onModelBakeEvent(ResourceManager manager, Consumer<ModelIdentifier> out) {
 | 
			
		||||
        for (String model : EXTRA_MODELS) {
 | 
			
		||||
            out.accept(new ModelIdentifier(new Identifier(ComputerCraft.MOD_ID, model), "inventory"));
 | 
			
		||||
    @SuppressWarnings( "NewExpressionSideOnly" )
 | 
			
		||||
    public static void onModelBakeEvent( ResourceManager manager, Consumer<ModelIdentifier> out )
 | 
			
		||||
    {
 | 
			
		||||
        for( String model : EXTRA_MODELS )
 | 
			
		||||
        {
 | 
			
		||||
            out.accept( new ModelIdentifier( new Identifier( ComputerCraft.MOD_ID, model ), "inventory" ) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void onItemColours() {
 | 
			
		||||
        ColorProviderRegistry.ITEM.register((stack, layer) -> {
 | 
			
		||||
            return layer == 1 ? ((ItemDisk) stack.getItem()).getColour(stack) : 0xFFFFFF;
 | 
			
		||||
        }, ComputerCraftRegistry.ModItems.DISK);
 | 
			
		||||
    public static void onItemColours()
 | 
			
		||||
    {
 | 
			
		||||
        ColorProviderRegistry.ITEM.register( ( stack, layer ) -> {
 | 
			
		||||
            return layer == 1 ? ((ItemDisk) stack.getItem()).getColour( stack ) : 0xFFFFFF;
 | 
			
		||||
        }, ComputerCraftRegistry.ModItems.DISK );
 | 
			
		||||
 | 
			
		||||
        ColorProviderRegistry.ITEM.register((stack, layer) -> layer == 1 ? ItemTreasureDisk.getColour(stack) : 0xFFFFFF,
 | 
			
		||||
                                            ComputerCraftRegistry.ModItems.TREASURE_DISK);
 | 
			
		||||
        ColorProviderRegistry.ITEM.register( ( stack, layer ) -> layer == 1 ? ItemTreasureDisk.getColour( stack ) : 0xFFFFFF,
 | 
			
		||||
            ComputerCraftRegistry.ModItems.TREASURE_DISK );
 | 
			
		||||
 | 
			
		||||
        ColorProviderRegistry.ITEM.register((stack, layer) -> {
 | 
			
		||||
            switch (layer) {
 | 
			
		||||
            case 0:
 | 
			
		||||
            default:
 | 
			
		||||
                return 0xFFFFFF;
 | 
			
		||||
            case 1: // Frame colour
 | 
			
		||||
                return IColouredItem.getColourBasic(stack);
 | 
			
		||||
            case 2: // Light colour
 | 
			
		||||
        ColorProviderRegistry.ITEM.register( ( stack, layer ) -> {
 | 
			
		||||
            switch( layer )
 | 
			
		||||
            {
 | 
			
		||||
                int light = ItemPocketComputer.getLightState(stack);
 | 
			
		||||
                return light == -1 ? Colour.BLACK.getHex() : light;
 | 
			
		||||
                case 0:
 | 
			
		||||
                default:
 | 
			
		||||
                    return 0xFFFFFF;
 | 
			
		||||
                case 1: // Frame colour
 | 
			
		||||
                    return IColouredItem.getColourBasic( stack );
 | 
			
		||||
                case 2: // Light colour
 | 
			
		||||
                    int light = ItemPocketComputer.getLightState( stack );
 | 
			
		||||
                    return light == -1 ? Colour.BLACK.getHex() : light;
 | 
			
		||||
            }
 | 
			
		||||
            }
 | 
			
		||||
        }, ComputerCraftRegistry.ModItems.POCKET_COMPUTER_NORMAL, ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED);
 | 
			
		||||
        }, ComputerCraftRegistry.ModItems.POCKET_COMPUTER_NORMAL, ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED );
 | 
			
		||||
 | 
			
		||||
        // Setup turtle colours
 | 
			
		||||
        ColorProviderRegistry.ITEM.register((stack, tintIndex) -> tintIndex == 0 ? ((IColouredItem) stack.getItem()).getColour(stack) : 0xFFFFFF,
 | 
			
		||||
                                            ComputerCraftRegistry.ModBlocks.TURTLE_NORMAL,
 | 
			
		||||
                                            ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED);
 | 
			
		||||
        ColorProviderRegistry.ITEM.register( ( stack, tintIndex ) -> tintIndex == 0 ? ((IColouredItem) stack.getItem()).getColour( stack ) : 0xFFFFFF,
 | 
			
		||||
            ComputerCraftRegistry.ModBlocks.TURTLE_NORMAL,
 | 
			
		||||
            ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static BakedModel bake(ModelLoader loader, UnbakedModel model, Identifier identifier) {
 | 
			
		||||
        model.getTextureDependencies(loader::getOrLoadModel, new HashSet<>());
 | 
			
		||||
        return model.bake(loader,
 | 
			
		||||
                          spriteIdentifier -> MinecraftClient.getInstance()
 | 
			
		||||
                                                             .getSpriteAtlas(spriteIdentifier.getAtlasId())
 | 
			
		||||
                                                             .apply(spriteIdentifier.getTextureId()),
 | 
			
		||||
                          ModelRotation.X0_Y0,
 | 
			
		||||
                          identifier);
 | 
			
		||||
    private static BakedModel bake( ModelLoader loader, UnbakedModel model, Identifier identifier )
 | 
			
		||||
    {
 | 
			
		||||
        model.getTextureDependencies( loader::getOrLoadModel, new HashSet<>() );
 | 
			
		||||
        return model.bake( loader,
 | 
			
		||||
            spriteIdentifier -> MinecraftClient.getInstance()
 | 
			
		||||
                .getSpriteAtlas( spriteIdentifier.getAtlasId() )
 | 
			
		||||
                .apply( spriteIdentifier.getTextureId() ),
 | 
			
		||||
            ModelRotation.X0_Y0,
 | 
			
		||||
            identifier );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,69 +1,74 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
 | 
			
		||||
 * Send enquiries to dratcliffe@gmail.com
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.client;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.mixin.ChatHudAccess;
 | 
			
		||||
import dan200.computercraft.fabric.mixin.ChatHudAccess;
 | 
			
		||||
import dan200.computercraft.shared.command.text.ChatHelpers;
 | 
			
		||||
import dan200.computercraft.shared.command.text.TableBuilder;
 | 
			
		||||
import dan200.computercraft.shared.command.text.TableFormatter;
 | 
			
		||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.client.MinecraftClient;
 | 
			
		||||
import net.minecraft.client.font.TextRenderer;
 | 
			
		||||
import net.minecraft.client.gui.hud.ChatHud;
 | 
			
		||||
import net.minecraft.text.Text;
 | 
			
		||||
import net.minecraft.util.Formatting;
 | 
			
		||||
import net.minecraft.util.math.MathHelper;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings ({
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings( {
 | 
			
		||||
    "MethodCallSideOnly",
 | 
			
		||||
    "LocalVariableDeclarationSideOnly"
 | 
			
		||||
})
 | 
			
		||||
public class ClientTableFormatter implements TableFormatter {
 | 
			
		||||
} )
 | 
			
		||||
public class ClientTableFormatter implements TableFormatter
 | 
			
		||||
{
 | 
			
		||||
    public static final ClientTableFormatter INSTANCE = new ClientTableFormatter();
 | 
			
		||||
 | 
			
		||||
    private static Int2IntOpenHashMap lastHeights = new Int2IntOpenHashMap();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Text getPadding(Text component, int width) {
 | 
			
		||||
        int extraWidth = width - this.getWidth(component);
 | 
			
		||||
        if (extraWidth <= 0) {
 | 
			
		||||
    public Text getPadding( Text component, int width )
 | 
			
		||||
    {
 | 
			
		||||
        int extraWidth = width - getWidth( component );
 | 
			
		||||
        if( extraWidth <= 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TextRenderer renderer = renderer();
 | 
			
		||||
 | 
			
		||||
        float spaceWidth = renderer.getWidth(" ");
 | 
			
		||||
        int spaces = MathHelper.floor(extraWidth / spaceWidth);
 | 
			
		||||
        float spaceWidth = renderer.getWidth( " " );
 | 
			
		||||
        int spaces = MathHelper.floor( extraWidth / spaceWidth );
 | 
			
		||||
        int extra = extraWidth - (int) (spaces * spaceWidth);
 | 
			
		||||
 | 
			
		||||
        return ChatHelpers.coloured(StringUtils.repeat(' ', spaces) + StringUtils.repeat((char) 712, extra), Formatting.GRAY);
 | 
			
		||||
        return ChatHelpers.coloured( StringUtils.repeat( ' ', spaces ) + StringUtils.repeat( (char) 712, extra ), Formatting.GRAY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static TextRenderer renderer() {
 | 
			
		||||
    private static TextRenderer renderer()
 | 
			
		||||
    {
 | 
			
		||||
        return MinecraftClient.getInstance().textRenderer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getColumnPadding() {
 | 
			
		||||
    public int getColumnPadding()
 | 
			
		||||
    {
 | 
			
		||||
        return 3;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getWidth(Text component) {
 | 
			
		||||
        return renderer().getWidth(component);
 | 
			
		||||
    public int getWidth( Text component )
 | 
			
		||||
    {
 | 
			
		||||
        return renderer().getWidth( component );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void writeLine(int id, Text component) {
 | 
			
		||||
    public void writeLine( int id, Text component )
 | 
			
		||||
    {
 | 
			
		||||
        MinecraftClient mc = MinecraftClient.getInstance();
 | 
			
		||||
        ChatHud chat = mc.inGameHud.getChatHud();
 | 
			
		||||
 | 
			
		||||
@@ -71,20 +76,22 @@ public class ClientTableFormatter implements TableFormatter {
 | 
			
		||||
        // int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() );
 | 
			
		||||
        // List<ITextProperties> list = RenderComponentsUtil.func_238505_a_( component, maxWidth, mc.fontRenderer );
 | 
			
		||||
        // if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id );
 | 
			
		||||
        ((ChatHudAccess)chat).callAddMessage(component, id);
 | 
			
		||||
        ((ChatHudAccess) chat).callAddMessage( component, id );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int display(TableBuilder table) {
 | 
			
		||||
    public int display( TableBuilder table )
 | 
			
		||||
    {
 | 
			
		||||
        ChatHud chat = MinecraftClient.getInstance().inGameHud.getChatHud();
 | 
			
		||||
 | 
			
		||||
        int lastHeight = lastHeights.get(table.getId());
 | 
			
		||||
        int lastHeight = lastHeights.get( table.getId() );
 | 
			
		||||
 | 
			
		||||
        int height = TableFormatter.super.display(table);
 | 
			
		||||
        lastHeights.put(table.getId(), height);
 | 
			
		||||
        int height = TableFormatter.super.display( table );
 | 
			
		||||
        lastHeights.put( table.getId(), height );
 | 
			
		||||
 | 
			
		||||
        for (int i = height; i < lastHeight; i++) {
 | 
			
		||||
            ((ChatHudAccess)chat).callRemoveMessage(i + table.getId());
 | 
			
		||||
        for( int i = height; i < lastHeight; i++ )
 | 
			
		||||
        {
 | 
			
		||||
            ((ChatHudAccess) chat).callRemoveMessage( i + table.getId() );
 | 
			
		||||
        }
 | 
			
		||||
        return height;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user