mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-03 23:22:59 +00:00 
			
		
		
		
	Compare commits
	
		
			378 Commits
		
	
	
		
			v1.20.1-1.
			...
			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 | ||
| 
						 | 
					5e31dcde83 | ||
| 
						 | 
					5184883af1 | ||
| 
						 | 
					0c45112262 | ||
| 
						 | 
					0bf1672f45 | ||
| 
						 | 
					e1b8ac1f84 | ||
| 
						 | 
					deea552d99 | ||
| 
						 | 
					54229c2ce1 | ||
| 
						 | 
					1346a26179 | ||
| 
						 | 
					14df44f09d | ||
| 
						 | 
					1a21529499 | ||
| 
						 | 
					2546990f41 | ||
| 
						 | 
					b39ca02464 | ||
| 
						 | 
					628618105c | ||
| 
						 | 
					075ba03f5d | ||
| 
						 | 
					10bf84b631 | ||
| 
						 | 
					c346e22a45 | ||
| 
						 | 
					418e1335b1 | ||
| 
						 | 
					d52372df31 | ||
| 
						 | 
					cc72e1c2bd | ||
| 
						 | 
					d28afcc6a9 | ||
| 
						 | 
					220ed21e6e | ||
| 
						 | 
					09d465774d | ||
| 
						 | 
					dfc8f48f12 | ||
| 
						 | 
					abe2ec4686 | ||
| 
						 | 
					5333cda44e | ||
| 
						 | 
					dc88fbeb12 | ||
| 
						 | 
					c5eb7a9501 | ||
| 
						 | 
					bc969db2be | ||
| 
						 | 
					50b7646178 | ||
| 
						 | 
					3fa6b5bc9d | ||
| 
						 | 
					33e65e39e3 | ||
| 
						 | 
					0380e60590 | ||
| 
						 | 
					2918892ee2 | ||
| 
						 | 
					e43dd9f7c6 | ||
| 
						 | 
					244fd95034 | ||
| 
						 | 
					14e98e2fcb | ||
| 
						 | 
					dcf5d59109 | ||
| 
						 | 
					b95083c77e | ||
| 
						 | 
					c54c8c3ea6 | ||
| 
						 | 
					f79c67e243 | ||
| 
						 | 
					6ec7ebe439 | ||
| 
						 | 
					76fe33760d | ||
| 
						 | 
					cb549d8f43 | ||
| 
						 | 
					7b400fdcdd | ||
| 
						 | 
					ab70d918b5 | ||
| 
						 | 
					c64644b9ec | ||
| 
						 | 
					afb12eb342 | ||
| 
						 | 
					64f5ca02b3 | ||
| 
						 | 
					84bca21b0c | ||
| 
						 | 
					b6757c416f | ||
| 
						 | 
					dc9d3f2d15 | ||
| 
						 | 
					807825d74e | ||
| 
						 | 
					14c17676c6 | ||
| 
						 | 
					324519575c | ||
| 
						 | 
					fbcf26bdc9 | ||
| 
						 | 
					30ab6bd045 | ||
| 
						 | 
					2ea816b78b | ||
| 
						 | 
					56dcc57755 | ||
| 
						 | 
					a4830aff86 | ||
| 
						 | 
					621bc526be | ||
| 
						 | 
					605e1f6b9b | ||
| 
						 | 
					cb66ef7e30 | ||
| 
						 | 
					fd2f6a38c1 | ||
| 
						 | 
					229821d398 | ||
| 
						 | 
					1f2e0c444d | ||
| 
						 | 
					429baa350c | ||
| 
						 | 
					7fe62485fa | ||
| 
						 | 
					fe10c68099 | ||
| 
						 | 
					06092cfddd | ||
| 
						 | 
					9967dc5740 | ||
| 
						 | 
					b920e04c59 | ||
| 
						 | 
					baa1b5a5c9 | ||
| 
						 | 
					e84663a5c5 | ||
| 
						 | 
					1c46220c42 | ||
| 
						 | 
					889b445855 | ||
| 
						 | 
					19553a981e | ||
| 
						 | 
					15f4dbd061 | ||
| 
						 | 
					98e12c7c3e | ||
| 
						 | 
					dfad319864 | ||
| 
						 | 
					111b58f533 | ||
| 
						 | 
					9345652808 | ||
| 
						 | 
					d40163b409 | ||
| 
						 | 
					96400966d7 | ||
| 
						 | 
					db83bd4f64 | ||
| 
						 | 
					579a38d366 | ||
| 
						 | 
					0e6797c7da | ||
| 
						 | 
					c935577768 | ||
| 
						 | 
					c2b4077aa1 | ||
| 
						 | 
					ac020859f3 | ||
| 
						 | 
					238be8955b | ||
| 
						 | 
					f997b02b8f | ||
| 
						 | 
					799bb77847 | ||
| 
						 | 
					2f66792a0d | ||
| 
						 | 
					6cae8e211e | ||
| 
						 | 
					48b1b2f01d | ||
| 
						 | 
					8c45fd362a | ||
| 
						 | 
					07b13dd2b4 | ||
| 
						 | 
					45e84e1ede | ||
| 
						 | 
					725dfa764f | ||
| 
						 | 
					c221502ec9 | ||
| 
						 | 
					234f18c228 | ||
| 
						 | 
					006ad109cb | ||
| 
						 | 
					0db080154c | ||
| 
						 | 
					200311033f | ||
| 
						 | 
					3192dc81ac | ||
| 
						 | 
					b11d4bb209 | ||
| 
						 | 
					2a716244e9 | ||
| 
						 | 
					19b7ed538a | ||
| 
						 | 
					b0d9dc0b88 | ||
| 
						 | 
					e6094a59fa | ||
| 
						 | 
					e8d7e6a562 | ||
| 
						 | 
					536c2d9b2d | ||
| 
						 | 
					f15a278f3b | ||
| 
						 | 
					26b73c2ff3 | ||
| 
						 | 
					c1e08fc3c7 | ||
| 
						 | 
					b9ec6f236d | ||
| 
						 | 
					b1fff97bff | ||
| 
						 | 
					c81bc70475 | ||
| 
						 | 
					55a7ee4acf | 
@@ -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"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								LICENSE
									
									
									
									
									
								
							@@ -19,14 +19,14 @@ Mod: The mod code designated by the present license, in source form, binary
 | 
			
		||||
form, as obtained standalone, as part of a wider distribution or resulting from
 | 
			
		||||
the compilation of the original or modified sources.
 | 
			
		||||
 | 
			
		||||
Dependency: Code required for the mod to work properly. This includes 
 | 
			
		||||
Dependency: Code required for the mod to work properly. This includes
 | 
			
		||||
dependencies required to compile the code as well as any file or modification
 | 
			
		||||
that is explicitly or implicitly required for the mod to be working.
 | 
			
		||||
 | 
			
		||||
1. Scope
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
The present license is granted to any user of the mod. As a prerequisite, 
 | 
			
		||||
The present license is granted to any user of the mod. As a prerequisite,
 | 
			
		||||
a user must own a legally acquired copy of Minecraft
 | 
			
		||||
 | 
			
		||||
2. Liability
 | 
			
		||||
@@ -41,13 +41,13 @@ or misuse of this mod fall on the user.
 | 
			
		||||
3. Play rights
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
The user is allowed to install this mod on a Minecraft client or server and to play 
 | 
			
		||||
The user is allowed to install this mod on a Minecraft client or server and to play
 | 
			
		||||
without restriction.
 | 
			
		||||
 | 
			
		||||
4. Modification rights
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
The user has the right to decompile the source code, look at either the 
 | 
			
		||||
The user has the right to decompile the source code, look at either the
 | 
			
		||||
decompiled version or the original source code, and to modify it.
 | 
			
		||||
 | 
			
		||||
5. Distribution of original or modified copy rights
 | 
			
		||||
@@ -61,10 +61,10 @@ include:
 | 
			
		||||
   - patch to its source or binary files
 | 
			
		||||
   - any copy of a portion of its binary source files
 | 
			
		||||
 | 
			
		||||
The user is allowed to redistribute this mod partially, in totality, or 
 | 
			
		||||
The user is allowed to redistribute this mod partially, in totality, or
 | 
			
		||||
included in a distribution.
 | 
			
		||||
 | 
			
		||||
When distributing binary files, the user must provide means to obtain its 
 | 
			
		||||
When distributing binary files, the user must provide means to obtain its
 | 
			
		||||
entire set of sources or modified sources at no cost.
 | 
			
		||||
 | 
			
		||||
All distributions of this mod must remain licensed under the CCPL.
 | 
			
		||||
@@ -92,7 +92,7 @@ must be made available at no cost and remain licensed under the CCPL.
 | 
			
		||||
---------------
 | 
			
		||||
 | 
			
		||||
If you choose to contribute code or assets to be included in this mod, you
 | 
			
		||||
agree that, if added to to the main repository at 
 | 
			
		||||
agree that, if added to to the main repository at
 | 
			
		||||
https://github.com/dan200/ComputerCraft, your contributions will be covered by
 | 
			
		||||
this license, and that Daniel Ratcliffe will retain the right to re-license the
 | 
			
		||||
mod, including your contributions, in part or in whole, under other licenses.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										120
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								README.md
									
									
									
									
									
								
							@@ -1,75 +1,71 @@
 | 
			
		||||
# 
 | 
			
		||||
[](https://travis-ci.org/SquidDev-CC/CC-Tweaked "Current build status") [](https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked on CurseForge")
 | 
			
		||||
<img src="logo.png" alt="CC: Restitched" width="100%"/>
 | 
			
		||||
 | 
			
		||||
CC: Tweaked is a fork of [ComputerCraft](https://github.com/dan200/ComputerCraft), adding programmable computers,
 | 
			
		||||
turtles and more to Minecraft.
 | 
			
		||||
[](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)
 | 
			
		||||
 | 
			
		||||
## What?
 | 
			
		||||
ComputerCraft has always held a fond place in my heart: it's the mod which really got me into Minecraft, and it's the
 | 
			
		||||
mod which has kept me playing it for many years. However, development of the original mod has slowed, as the original
 | 
			
		||||
developers have had less time to work on the mod, and moved onto other projects and commitments.
 | 
			
		||||
# CC: 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.
 | 
			
		||||
 | 
			
		||||
CC: Tweaked (or CC:T for short) is an attempt to continue ComputerCraft's legacy. It's not intended to be a competitor
 | 
			
		||||
to CC, nor do I want to take it in a vastly different direction to the original mod. Instead, CC:T focuses on making the
 | 
			
		||||
ComputerCraft experience as _solid_ as possible, ironing out any wrinkles that may have developed over time.
 | 
			
		||||
## 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.
 | 
			
		||||
 | 
			
		||||
## Features
 | 
			
		||||
CC: Tweaked contains all the features of the latest version of ComputerCraft, as well as numerous fixes, performance
 | 
			
		||||
improvements and several nifty additions. I'd recommend checking out [the releases page](https://github.com/SquidDev-CC/CC-Tweaked/releases)
 | 
			
		||||
to see the full set of changes, but here's a couple of the more interesting additions:
 | 
			
		||||
## 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.
 | 
			
		||||
 | 
			
		||||
 - Improvements to the `http` library, including websockets, support for other HTTP methods (`PUT`, `DELETE`, etc...)
 | 
			
		||||
   and configurable limits on HTTP usage.
 | 
			
		||||
 - Full-block wired modems, allowing one to wrap non-solid peripherals (such as turtles, or chests if Plethora is
 | 
			
		||||
   installed).
 | 
			
		||||
 - Pocket computers can be held like maps, allowing you to view the screen without entering a GUI.
 | 
			
		||||
 - Printed pages and books can be placed in item frames and held like maps.
 | 
			
		||||
 - Several profiling and administration tools for server owners, via the `/computercraft` command. This allows operators
 | 
			
		||||
   to track which computers are hogging resources, turn on and shutdown multiple computers at once and interact with
 | 
			
		||||
   computers remotely.
 | 
			
		||||
 - Closer emulation of standard Lua, adding the `debug` and `io` libraries. This also enables seeking within binary
 | 
			
		||||
   files, meaning you don't need to read large files into memory.
 | 
			
		||||
 - Allow running multiple computers on multiple threads, reducing latency on worlds with many computers.
 | 
			
		||||
 | 
			
		||||
## Relation to CCTweaks?
 | 
			
		||||
This mod has nothing to do with CCTweaks, though there is no denying the name is a throwback to it. That being said,
 | 
			
		||||
several features have been included, such as full block modems, the Cobalt runtime and map-like rendering for pocket
 | 
			
		||||
computers.
 | 
			
		||||
<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:T, you'll need to follow these steps:
 | 
			
		||||
 | 
			
		||||
 - **Clone the repository:** `git clone https://github.com/SquidDev-CC/CC-Tweaked.git && cd CC-Tweaked`
 | 
			
		||||
 - **Setup Forge:** `./gradlew setupDecompWorkspace`
 | 
			
		||||
 - **Test your changes:** `./gradlew runClient` (or run the `GradleStart` class from your IDE).
 | 
			
		||||
 | 
			
		||||
If you want to run CC:T in a normal Minecraft instance, run `./gradlew build` and copy the `.jar` from `build/libs`.
 | 
			
		||||
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: Tweaked, want to show off your latest project, or just want to chat about
 | 
			
		||||
ComputerCraft we have a [forum](https://forums.computercraft.cc/) and [Discord guild](https://discord.gg/H2UyJXe)!
 | 
			
		||||
There's also a fairly populated, albeit quiet [IRC channel](http://webchat.esper.net/?channels=#computercraft), if
 | 
			
		||||
that's more your cup of tea.
 | 
			
		||||
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).
 | 
			
		||||
 | 
			
		||||
I'd generally recommend you don't contact me directly (email, DM, etc...) unless absolutely necessary (i.e. in order to
 | 
			
		||||
report exploits). You'll get a far quicker response if you ask the whole community!
 | 
			
		||||
## 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.
 | 
			
		||||
 | 
			
		||||
## Using
 | 
			
		||||
If you want to depend on CC: Tweaked, we have a maven repo. However, you should be wary that some functionality is only
 | 
			
		||||
exposed by CC:T's API and not vanilla ComputerCraft. If you wish to support all variations of ComputerCraft, I recommend
 | 
			
		||||
using [cc.crzd.me's maven](https://cc.crzd.me/maven/) instead.
 | 
			
		||||
## 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!
 | 
			
		||||
 | 
			
		||||
```groovy
 | 
			
		||||
dependencies {
 | 
			
		||||
  maven { url 'https://squiddev.cc/maven/' }
 | 
			
		||||
}
 | 
			
		||||
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!
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
  implementation "org.squiddev:cc-tweaked-${mc_version}:${cct_version}"
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You should also be careful to only use classes within the `dan200.computercraft.api` package. Non-API classes are
 | 
			
		||||
subject to change at any point. If you depend on functionality outside the API, file an issue, and we can look into
 | 
			
		||||
exposing more features.
 | 
			
		||||
*  [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!
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										475
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										475
									
								
								build.gradle
									
									
									
									
									
								
							@@ -1,417 +1,158 @@
 | 
			
		||||
buildscript {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
        mavenCentral()
 | 
			
		||||
        maven {
 | 
			
		||||
            name = "forge"
 | 
			
		||||
            url = "http://files.minecraftforge.net/maven"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.google.code.gson:gson:2.8.1'
 | 
			
		||||
        classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.117'
 | 
			
		||||
        classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
 | 
			
		||||
        classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
plugins {
 | 
			
		||||
    id 'com.matthewprenger.cursegradle' version '1.2.0'
 | 
			
		||||
    id "com.github.breadmoirai.github-release" version "2.2.4"
 | 
			
		||||
    id 'fabric-loom' version '0.7-SNAPSHOT'
 | 
			
		||||
    id 'maven-publish'
 | 
			
		||||
    id "checkstyle"
 | 
			
		||||
    id "com.github.hierynomus.license" version "0.15.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
apply plugin: 'net.minecraftforge.gradle'
 | 
			
		||||
apply plugin: 'org.ajoberstar.grgit'
 | 
			
		||||
apply plugin: 'maven-publish'
 | 
			
		||||
apply plugin: 'maven'
 | 
			
		||||
java {
 | 
			
		||||
    toolchain {
 | 
			
		||||
        languageVersion = JavaLanguageVersion.of(8)
 | 
			
		||||
        vendor = JvmVendorSpec.ADOPTOPENJDK
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
version = mod_version
 | 
			
		||||
 | 
			
		||||
group = "org.squiddev"
 | 
			
		||||
archivesBaseName = "cc-tweaked-${mc_version}"
 | 
			
		||||
 | 
			
		||||
minecraft {
 | 
			
		||||
    runs {
 | 
			
		||||
        client {
 | 
			
		||||
            workingDirectory project.file('run')
 | 
			
		||||
            property 'forge.logging.markers', 'REGISTRIES'
 | 
			
		||||
            property 'forge.logging.console.level', 'debug'
 | 
			
		||||
 | 
			
		||||
            mods {
 | 
			
		||||
                computercraft {
 | 
			
		||||
                    source sourceSets.main
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        server {
 | 
			
		||||
            workingDirectory project.file('run')
 | 
			
		||||
            property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
 | 
			
		||||
            property 'forge.logging.console.level', 'debug'
 | 
			
		||||
 | 
			
		||||
            mods {
 | 
			
		||||
                computercraft {
 | 
			
		||||
                    source sourceSets.main
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mappings channel: 'snapshot', version: "${mappings_version}".toString()
 | 
			
		||||
 | 
			
		||||
    accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg')
 | 
			
		||||
}
 | 
			
		||||
group = "dan200.computercraft"
 | 
			
		||||
archivesBaseName = "cc-restiched"
 | 
			
		||||
 | 
			
		||||
repositories {
 | 
			
		||||
    maven {
 | 
			
		||||
        name "JEI"
 | 
			
		||||
        url  "http://dvs1.progwml6.com/files/maven"
 | 
			
		||||
    }
 | 
			
		||||
    mavenCentral()
 | 
			
		||||
    maven { url 'https://jitpack.io' }
 | 
			
		||||
    maven { url "https://maven.shedaniel.me/" }
 | 
			
		||||
    maven {
 | 
			
		||||
        name "SquidDev"
 | 
			
		||||
        url "https://squiddev.cc/maven"
 | 
			
		||||
    }
 | 
			
		||||
    ivy {
 | 
			
		||||
        name "Charset"
 | 
			
		||||
        artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]"
 | 
			
		||||
    }
 | 
			
		||||
    maven {
 | 
			
		||||
        name "Amadornes"
 | 
			
		||||
        url "http://maven.amadornes.com/"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
configurations {
 | 
			
		||||
    shade
 | 
			
		||||
    compile.extendsFrom shade
 | 
			
		||||
    deployerJars
 | 
			
		||||
    implementation.extendsFrom shade
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
 | 
			
		||||
    checkstyle "com.puppycrawl.tools:checkstyle:8.25"
 | 
			
		||||
 | 
			
		||||
    compileOnly fg.deobf("mezz.jei:jei-1.13.2:5.0.0.20:api")
 | 
			
		||||
    // deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
 | 
			
		||||
    // deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
 | 
			
		||||
    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}"
 | 
			
		||||
 | 
			
		||||
    runtimeOnly fg.deobf("mezz.jei:jei-1.13.2:5.0.0.20")
 | 
			
		||||
    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}"
 | 
			
		||||
 | 
			
		||||
    shade 'org.squiddev:Cobalt:0.5.0-SNAPSHOT'
 | 
			
		||||
    implementation 'com.electronwill.night-config:toml:3.6.3'
 | 
			
		||||
    implementation 'com.google.code.findbugs:jsr305:3.0.2'
 | 
			
		||||
 | 
			
		||||
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
 | 
			
		||||
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
 | 
			
		||||
    shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT'
 | 
			
		||||
 | 
			
		||||
    deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
 | 
			
		||||
    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}"
 | 
			
		||||
 | 
			
		||||
    modRuntime "me.shedaniel:RoughlyEnoughItems-api:5.12.248"
 | 
			
		||||
    modRuntime "me.shedaniel:RoughlyEnoughItems:5.12.248"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceSets {
 | 
			
		||||
    main {
 | 
			
		||||
        java {
 | 
			
		||||
            exclude 'dan200/computercraft/shared/integration/mcmp'
 | 
			
		||||
            exclude 'dan200/computercraft/shared/integration/charset'
 | 
			
		||||
        }
 | 
			
		||||
processResources {
 | 
			
		||||
    inputs.property "version", project.version
 | 
			
		||||
 | 
			
		||||
    from(sourceSets.main.resources.srcDirs) {
 | 
			
		||||
        include "fabric.mod.json"
 | 
			
		||||
        expand "version": project.version
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    from(sourceSets.main.resources.srcDirs) {
 | 
			
		||||
        exclude "fabric.mod.json"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
javadoc {
 | 
			
		||||
    include "dan200/computercraft/api/**/*.java"
 | 
			
		||||
// ensure that the encoding is set to UTF-8, no matter what the system default is
 | 
			
		||||
// this fixes some edge cases with special characters not displaying correctly
 | 
			
		||||
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
 | 
			
		||||
tasks.withType(JavaCompile) {
 | 
			
		||||
    options.encoding = "UTF-8"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
 | 
			
		||||
// if it is present.
 | 
			
		||||
// If you remove this task, sources will not be generated.
 | 
			
		||||
task sourcesJar(type: Jar, dependsOn: classes) {
 | 
			
		||||
    classifier = "sources"
 | 
			
		||||
    from sourceSets.main.allSource
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jar {
 | 
			
		||||
    dependsOn javadoc
 | 
			
		||||
 | 
			
		||||
    manifest {
 | 
			
		||||
        attributes(["Specification-Title": "computercraft",
 | 
			
		||||
                    "Specification-Vendor": "SquidDev",
 | 
			
		||||
                    "Specification-Version": "25.0",
 | 
			
		||||
                    "Implementation-Title": "CC: Tweaked",
 | 
			
		||||
                    "Implementation-Version": "${mod_version}",
 | 
			
		||||
                    "Implementation-Vendor" :"SquidDev",
 | 
			
		||||
                    "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    from (sourceSets.main.allSource) {
 | 
			
		||||
        include "dan200/computercraft/api/**/*.java"
 | 
			
		||||
    }
 | 
			
		||||
    from "LICENSE"
 | 
			
		||||
 | 
			
		||||
    from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
import java.nio.charset.StandardCharsets
 | 
			
		||||
import java.nio.file.*
 | 
			
		||||
import java.util.zip.*
 | 
			
		||||
 | 
			
		||||
import com.google.gson.GsonBuilder
 | 
			
		||||
import com.google.gson.JsonElement
 | 
			
		||||
import org.ajoberstar.grgit.Grgit
 | 
			
		||||
import proguard.gradle.ProGuardTask
 | 
			
		||||
import com.hierynomus.gradle.license.tasks.LicenseCheck
 | 
			
		||||
import com.hierynomus.gradle.license.tasks.LicenseFormat
 | 
			
		||||
 | 
			
		||||
task proguard(type: ProGuardTask, dependsOn: jar) {
 | 
			
		||||
    description "Removes unused shadowed classes from the jar"
 | 
			
		||||
    group "compact"
 | 
			
		||||
license {
 | 
			
		||||
    mapping("java", "SLASHSTAR_STYLE")
 | 
			
		||||
    strictCheck true
 | 
			
		||||
 | 
			
		||||
    injars jar.archivePath
 | 
			
		||||
    outjars "${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar"
 | 
			
		||||
 | 
			
		||||
    // Add the main runtime jar and all non-shadowed dependencies
 | 
			
		||||
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
 | 
			
		||||
    doFirst {
 | 
			
		||||
        sourceSets.main.compileClasspath
 | 
			
		||||
            .filter { !it.name.contains("Cobalt") }
 | 
			
		||||
            .each { libraryjars it }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // We want to avoid as much obfuscation as possible. We're only doing this to shrink code size.
 | 
			
		||||
    dontobfuscate; dontoptimize; keepattributes; keepparameternames
 | 
			
		||||
 | 
			
		||||
    // Proguard will remove directories by default, but that breaks JarMount.
 | 
			
		||||
    keepdirectories 'data/computercraft/lua**'
 | 
			
		||||
 | 
			
		||||
    // Preserve ComputerCraft classes - we only want to strip shadowed files.
 | 
			
		||||
    keep 'class dan200.computercraft.** { *; }'
 | 
			
		||||
 | 
			
		||||
    // Preserve the constructors in Cobalt library class, as we init them via reflection
 | 
			
		||||
    keepclassmembers 'class org.squiddev.cobalt.lib.** { <init>(...); }'
 | 
			
		||||
 | 
			
		||||
    // LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard
 | 
			
		||||
    dontwarn 'module-info'
 | 
			
		||||
    dontwarn 'org.apache.**,org.lwjgl.**'
 | 
			
		||||
    ext.year = Calendar.getInstance().get(Calendar.YEAR)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task proguardMove(dependsOn: proguard) {
 | 
			
		||||
    description "Replace the original jar with the minified version"
 | 
			
		||||
    group "compact"
 | 
			
		||||
 | 
			
		||||
    doLast {
 | 
			
		||||
        Files.move(
 | 
			
		||||
            file("${jar.archivePath.absolutePath.replace(".jar", "")}-min.jar").toPath(),
 | 
			
		||||
            file(jar.archivePath).toPath(),
 | 
			
		||||
            StandardCopyOption.REPLACE_EXISTING
 | 
			
		||||
        )
 | 
			
		||||
[licenseMain, licenseFormatMain].forEach {
 | 
			
		||||
    it.configure {
 | 
			
		||||
        include("**/*.java")
 | 
			
		||||
        exclude("dan200/computercraft/api/**")
 | 
			
		||||
        header file('config/license/main.txt')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
processResources {
 | 
			
		||||
    inputs.property "version", mod_version
 | 
			
		||||
    inputs.property "mcversion", mc_version
 | 
			
		||||
 | 
			
		||||
    def hash = 'none'
 | 
			
		||||
    Set<String> contributors = []
 | 
			
		||||
    try {
 | 
			
		||||
        def grgit = Grgit.open(dir: '.')
 | 
			
		||||
        hash = grgit.head().id
 | 
			
		||||
 | 
			
		||||
        def blacklist = ['GitHub', 'dan200', 'Daniel Ratcliffe']
 | 
			
		||||
        grgit.log().each {
 | 
			
		||||
            if (!blacklist.contains(it.author.name)) contributors.add(it.author.name)
 | 
			
		||||
            if (!blacklist.contains(it.committer.name)) contributors.add(it.committer.name)
 | 
			
		||||
        }
 | 
			
		||||
    } catch(Exception ignored) { }
 | 
			
		||||
 | 
			
		||||
    inputs.property "commithash", hash
 | 
			
		||||
 | 
			
		||||
    from(sourceSets.main.resources.srcDirs) {
 | 
			
		||||
        include 'META-INF/mods.toml'
 | 
			
		||||
        include 'data/computercraft/lua/rom/help/credits.txt'
 | 
			
		||||
 | 
			
		||||
        expand 'version': mod_version,
 | 
			
		||||
               'mcversion': mc_version,
 | 
			
		||||
               'gitcontributors': contributors.sort(false, String.CASE_INSENSITIVE_ORDER).join('\n')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    from(sourceSets.main.resources.srcDirs) {
 | 
			
		||||
        exclude 'META-INF/mods.toml'
 | 
			
		||||
        exclude 'data/computercraft/lua/rom/help/credits.txt'
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
task compressJson(dependsOn: jar) {
 | 
			
		||||
    group "compact"
 | 
			
		||||
    description "Minifies all JSON files, stripping whitespace"
 | 
			
		||||
 | 
			
		||||
    def jarPath = file(jar.archivePath)
 | 
			
		||||
 | 
			
		||||
    def tempPath = File.createTempFile("input", ".jar", temporaryDir)
 | 
			
		||||
    tempPath.deleteOnExit()
 | 
			
		||||
 | 
			
		||||
    def gson = new GsonBuilder().create()
 | 
			
		||||
 | 
			
		||||
    doLast {
 | 
			
		||||
        // Copy over all files in the current jar to the new one, running json files from GSON. As pretty printing
 | 
			
		||||
        // is turned off, they should be minified.
 | 
			
		||||
        new ZipFile(jarPath).withCloseable { inJar ->
 | 
			
		||||
            new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(tempPath))).withCloseable { outJar ->
 | 
			
		||||
                inJar.entries().each { entry ->
 | 
			
		||||
                    if(entry.directory) {
 | 
			
		||||
                        outJar.putNextEntry(entry)
 | 
			
		||||
                    } else if(!entry.name.endsWith(".json")) {
 | 
			
		||||
                        outJar.putNextEntry(entry)
 | 
			
		||||
                        inJar.getInputStream(entry).withCloseable { outJar << it }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        ZipEntry newEntry = new ZipEntry(entry.name)
 | 
			
		||||
                        newEntry.setTime(entry.time)
 | 
			
		||||
                        outJar.putNextEntry(newEntry)
 | 
			
		||||
 | 
			
		||||
                        def element = inJar.getInputStream(entry).withCloseable { gson.fromJson(it.newReader("UTF8"), JsonElement.class) }
 | 
			
		||||
                        outJar.write(gson.toJson(element).getBytes(StandardCharsets.UTF_8))
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // And replace the original jar again
 | 
			
		||||
        Files.move(tempPath.toPath(), jarPath.toPath(), StandardCopyOption.REPLACE_EXISTING)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
assemble.dependsOn compressJson
 | 
			
		||||
 | 
			
		||||
task checkRelease {
 | 
			
		||||
    group "upload"
 | 
			
		||||
    description "Verifies that everything is ready for a release"
 | 
			
		||||
 | 
			
		||||
    inputs.property "version", mod_version
 | 
			
		||||
    inputs.file("src/main/resources/data/computercraft/lua/rom/help/changelog.txt")
 | 
			
		||||
    inputs.file("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt")
 | 
			
		||||
 | 
			
		||||
    doLast {
 | 
			
		||||
        def ok = true
 | 
			
		||||
 | 
			
		||||
        // Check we're targetting the current version
 | 
			
		||||
        def whatsnew = new File("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt").readLines()
 | 
			
		||||
        if (whatsnew[0] != "New features in CC: Tweaked $mod_version") {
 | 
			
		||||
            ok = false
 | 
			
		||||
            project.logger.error("Expected `whatsnew.txt' to target $mod_version.")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check "read more" exists and trim it
 | 
			
		||||
        def idx = whatsnew.findIndexOf { it == 'Type "help changelog" to see the full version history.' }
 | 
			
		||||
        if (idx == -1) {
 | 
			
		||||
            ok = false
 | 
			
		||||
            project.logger.error("Must mention the changelog in whatsnew.txt")
 | 
			
		||||
        } else {
 | 
			
		||||
            whatsnew = whatsnew.getAt(0 ..< idx)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check whatsnew and changelog match.
 | 
			
		||||
        def versionChangelog = "# " + whatsnew.join("\n")
 | 
			
		||||
        def changelog = new File("src/main/resources/data/computercraft/lua/rom/help/changelog.txt").getText()
 | 
			
		||||
        if (!changelog.startsWith(versionChangelog)) {
 | 
			
		||||
            ok = false
 | 
			
		||||
            project.logger.error("whatsnew and changelog are not in sync")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!ok) throw new IllegalStateException("Could not check release")
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
curseforge {
 | 
			
		||||
    apiKey = project.hasProperty('curseForgeApiKey') ? project.curseForgeApiKey : ''
 | 
			
		||||
    project {
 | 
			
		||||
        id = '282001'
 | 
			
		||||
        releaseType = 'release'
 | 
			
		||||
        changelog = "Release notes can be found on the GitHub repository (https://github.com/SquidDev-CC/CC-Tweaked/releases/tag/v${mc_version}-${mod_version})."
 | 
			
		||||
 | 
			
		||||
        relations {
 | 
			
		||||
            incompatible "computercraft"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
publishing {
 | 
			
		||||
    publications {
 | 
			
		||||
        mavenJava(MavenPublication) {
 | 
			
		||||
            from components.java
 | 
			
		||||
            // artifact sourceJar
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uploadArchives {
 | 
			
		||||
    repositories {
 | 
			
		||||
        if(project.hasProperty('mavenUploadUrl')) {
 | 
			
		||||
            mavenDeployer {
 | 
			
		||||
                configuration = configurations.deployerJars
 | 
			
		||||
 | 
			
		||||
                repository(url: project.property('mavenUploadUrl')) {
 | 
			
		||||
                    authentication(
 | 
			
		||||
                        userName: project.property('mavenUploadUser'),
 | 
			
		||||
                        privateKey: project.property('mavenUploadKey'))
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                pom.project {
 | 
			
		||||
                    name 'CC: Tweaked'
 | 
			
		||||
                    packaging 'jar'
 | 
			
		||||
                    description 'CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles and more to Minecraft.'
 | 
			
		||||
                    url 'https://github.com/SquidDev-CC/CC-Tweaked'
 | 
			
		||||
 | 
			
		||||
                    scm {
 | 
			
		||||
                        url 'https://github.com/SquidDev-CC/CC-Tweaked.git'
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    issueManagement {
 | 
			
		||||
                        system 'github'
 | 
			
		||||
                        url 'https://github.com/SquidDev-CC/CC-Tweaked/issues'
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    licenses {
 | 
			
		||||
                        license {
 | 
			
		||||
                            name 'ComputerCraft Public License, Version 1.0'
 | 
			
		||||
                            url 'https://github.com/SquidDev-CC/CC-Tweaked/blob/master/LICENSE'
 | 
			
		||||
                            distribution 'repo'
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                pom.whenConfigured { pom ->
 | 
			
		||||
                    pom.dependencies.clear()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
githubRelease {
 | 
			
		||||
    token project.hasProperty('githubApiKey') ? project.githubApiKey : ''
 | 
			
		||||
    owner 'SquidDev-CC'
 | 
			
		||||
    repo 'CC-Tweaked'
 | 
			
		||||
    targetCommitish { Grgit.open(dir: '.').branch.current().name }
 | 
			
		||||
 | 
			
		||||
    tagName "v${mc_version}-${mod_version}"
 | 
			
		||||
    releaseName "[${mc_version}] ${mod_version}"
 | 
			
		||||
    body {
 | 
			
		||||
        "## " + new File("src/main/resources/data/computercraft/lua/rom/help/whatsnew.txt")
 | 
			
		||||
            .readLines()
 | 
			
		||||
            .takeWhile { it != 'Type "help changelog" to see the full version history.' }
 | 
			
		||||
            .join("\n").trim()
 | 
			
		||||
    }
 | 
			
		||||
    prerelease false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def uploadTasks = ["uploadArchives", "curseforge", "githubRelease"]
 | 
			
		||||
uploadTasks.forEach { tasks.getByName(it).dependsOn checkRelease }
 | 
			
		||||
 | 
			
		||||
task uploadAll(dependsOn: uploadTasks) {
 | 
			
		||||
    group "upload"
 | 
			
		||||
    description "Uploads to all repositories (Maven, Curse, GitHub release)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
test {
 | 
			
		||||
    useJUnitPlatform()
 | 
			
		||||
    testLogging {
 | 
			
		||||
        events "passed", "skipped", "failed"
 | 
			
		||||
[licenseTest, licenseFormatTest].forEach {
 | 
			
		||||
    it.configure {
 | 
			
		||||
        include("**/*.java")
 | 
			
		||||
        header file('config/license/main.txt')
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gradle.projectsEvaluated {
 | 
			
		||||
    reobfJar.dependsOn proguardMove
 | 
			
		||||
 | 
			
		||||
    tasks.withType(JavaCompile) {
 | 
			
		||||
        options.compilerArgs << "-Xlint" << "-Xlint:-processing" // Causes Forge build to fail << "-Werror"
 | 
			
		||||
    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 {
 | 
			
		||||
        mavenJava(MavenPublication) {
 | 
			
		||||
            // add all the jars that should be included when publishing to maven
 | 
			
		||||
            artifact(remapJar) {
 | 
			
		||||
                builtBy remapJar
 | 
			
		||||
            }
 | 
			
		||||
            artifact(sourcesJar) {
 | 
			
		||||
                builtBy remapSourcesJar
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // select the repositories you want to publish to
 | 
			
		||||
    repositories {
 | 
			
		||||
        // uncomment to publish to the local maven
 | 
			
		||||
        // mavenLocal()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2488,4 +2488,4 @@
 | 
			
		||||
      </option>
 | 
			
		||||
    </inspection_tool>
 | 
			
		||||
  </profile>
 | 
			
		||||
</component>
 | 
			
		||||
</component>
 | 
			
		||||
 
 | 
			
		||||
@@ -58,4 +58,4 @@
 | 
			
		||||
      <option name="CONTINUATION_INDENT_SIZE" value="4" />
 | 
			
		||||
    </indentOptions>
 | 
			
		||||
  </codeStyleSettings>
 | 
			
		||||
</code_scheme>
 | 
			
		||||
</code_scheme>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
@@ -1,7 +1,17 @@
 | 
			
		||||
# Done to increase the memory available to gradle.
 | 
			
		||||
org.gradle.jvmargs=-Xmx1G
 | 
			
		||||
 | 
			
		||||
# Mod properties
 | 
			
		||||
mod_version=1.83.1
 | 
			
		||||
mod_version=1.96.3
 | 
			
		||||
 | 
			
		||||
# Minecraft properties
 | 
			
		||||
mc_version=1.13.2
 | 
			
		||||
forge_version=25.0.219
 | 
			
		||||
mappings_version=20190530-1.13.2
 | 
			
		||||
mc_version=1.16.5
 | 
			
		||||
mappings_version=9
 | 
			
		||||
 | 
			
		||||
# Dependencies
 | 
			
		||||
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.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.
										
									
								
							
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
distributionBase=GRADLE_USER_HOME
 | 
			
		||||
distributionPath=wrapper/dists
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-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 +1,11 @@
 | 
			
		||||
rootProject.name = "cc-tweaked-${mc_version}"
 | 
			
		||||
pluginManagement {
 | 
			
		||||
    repositories {
 | 
			
		||||
        maven {
 | 
			
		||||
            name = 'Fabric'
 | 
			
		||||
            url = 'https://maven.fabricmc.net/'
 | 
			
		||||
        }
 | 
			
		||||
        gradlePluginPortal()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rootProject.name = "cc-restiched"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,97 +1,86 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. 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 dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleAction;
 | 
			
		||||
import dan200.computercraft.core.apis.AddressPredicate;
 | 
			
		||||
import dan200.computercraft.core.apis.http.websocket.Websocket;
 | 
			
		||||
import dan200.computercraft.core.filesystem.ResourceMount;
 | 
			
		||||
import dan200.computercraft.shared.Config;
 | 
			
		||||
import dan200.computercraft.shared.computer.blocks.BlockComputer;
 | 
			
		||||
import dan200.computercraft.core.apis.http.options.Action;
 | 
			
		||||
import dan200.computercraft.core.apis.http.options.AddressRule;
 | 
			
		||||
import dan200.computercraft.shared.common.ColourableRecipe;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ServerComputerRegistry;
 | 
			
		||||
import dan200.computercraft.shared.computer.items.ItemComputer;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemDisk;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemPrintout;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemTreasureDisk;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.diskdrive.BlockDiskDrive;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.BlockCable;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.BlockWiredModemFull;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wired.ItemBlockCable;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wireless.BlockWirelessModem;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.BlockMonitor;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.printer.BlockPrinter;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.speaker.BlockSpeaker;
 | 
			
		||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.pocket.peripherals.PocketModem;
 | 
			
		||||
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
 | 
			
		||||
import dan200.computercraft.shared.turtle.blocks.BlockTurtle;
 | 
			
		||||
import dan200.computercraft.shared.turtle.items.ItemTurtle;
 | 
			
		||||
import dan200.computercraft.shared.turtle.upgrades.*;
 | 
			
		||||
import net.minecraft.resources.IReloadableResourceManager;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
import net.minecraftforge.fml.server.ServerLifecycleHooks;
 | 
			
		||||
import dan200.computercraft.shared.computer.recipe.ComputerUpgradeRecipe;
 | 
			
		||||
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
 | 
			
		||||
import dan200.computercraft.shared.data.HasComputerIdLootCondition;
 | 
			
		||||
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.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.util.ImpostorRecipe;
 | 
			
		||||
import dan200.computercraft.shared.util.ImpostorShapelessRecipe;
 | 
			
		||||
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 java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.EnumSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
@Mod( ComputerCraft.MOD_ID )
 | 
			
		||||
public final class ComputerCraft
 | 
			
		||||
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";
 | 
			
		||||
 | 
			
		||||
    public static final int DATAFIXER_VERSION = 0;
 | 
			
		||||
 | 
			
		||||
    // 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",
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // 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 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 computer_threads = 1;
 | 
			
		||||
    public static int computerThreads = 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 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;
 | 
			
		||||
@@ -100,82 +89,16 @@ public final class ComputerCraft
 | 
			
		||||
    public static boolean turtlesCanPush = true;
 | 
			
		||||
    public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf( TurtleAction.class );
 | 
			
		||||
 | 
			
		||||
    public static final int terminalWidth_computer = 51;
 | 
			
		||||
    public static final int terminalHeight_computer = 19;
 | 
			
		||||
    public static int computerTermWidth = 51;
 | 
			
		||||
    public static int computerTermHeight = 19;
 | 
			
		||||
 | 
			
		||||
    public static final int terminalWidth_turtle = 39;
 | 
			
		||||
    public static final int terminalHeight_turtle = 13;
 | 
			
		||||
    public static final int turtleTermWidth = 39;
 | 
			
		||||
    public static final int turtleTermHeight = 13;
 | 
			
		||||
 | 
			
		||||
    public static final int terminalWidth_pocketComputer = 26;
 | 
			
		||||
    public static final int terminalHeight_pocketComputer = 20;
 | 
			
		||||
 | 
			
		||||
    // Blocks and Items
 | 
			
		||||
    public static final class Blocks
 | 
			
		||||
    {
 | 
			
		||||
        public static BlockComputer computerNormal;
 | 
			
		||||
        public static BlockComputer computerAdvanced;
 | 
			
		||||
        public static BlockComputer computerCommand;
 | 
			
		||||
 | 
			
		||||
        public static BlockTurtle turtleNormal;
 | 
			
		||||
        public static BlockTurtle turtleAdvanced;
 | 
			
		||||
 | 
			
		||||
        public static BlockSpeaker speaker;
 | 
			
		||||
        public static BlockDiskDrive diskDrive;
 | 
			
		||||
        public static BlockPrinter printer;
 | 
			
		||||
 | 
			
		||||
        public static BlockMonitor monitorNormal;
 | 
			
		||||
        public static BlockMonitor monitorAdvanced;
 | 
			
		||||
 | 
			
		||||
        public static BlockWirelessModem wirelessModemNormal;
 | 
			
		||||
        public static BlockWirelessModem wirelessModemAdvanced;
 | 
			
		||||
 | 
			
		||||
        public static BlockWiredModemFull wiredModemFull;
 | 
			
		||||
        public static BlockCable cable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static final class Items
 | 
			
		||||
    {
 | 
			
		||||
        public static ItemComputer computerNormal;
 | 
			
		||||
        public static ItemComputer computerAdvanced;
 | 
			
		||||
        public static ItemComputer computerCommand;
 | 
			
		||||
 | 
			
		||||
        public static ItemPocketComputer pocketComputerNormal;
 | 
			
		||||
        public static ItemPocketComputer pocketComputerAdvanced;
 | 
			
		||||
 | 
			
		||||
        public static ItemTurtle turtleNormal;
 | 
			
		||||
        public static ItemTurtle turtleAdvanced;
 | 
			
		||||
 | 
			
		||||
        public static ItemDisk disk;
 | 
			
		||||
        public static ItemTreasureDisk treasureDisk;
 | 
			
		||||
 | 
			
		||||
        public static ItemPrintout printedPage;
 | 
			
		||||
        public static ItemPrintout printedPages;
 | 
			
		||||
        public static ItemPrintout printedBook;
 | 
			
		||||
 | 
			
		||||
        public static ItemBlockCable.Cable cable;
 | 
			
		||||
        public static ItemBlockCable.WiredModem wiredModem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static final class TurtleUpgrades
 | 
			
		||||
    {
 | 
			
		||||
        public static TurtleModem wirelessModemNormal;
 | 
			
		||||
        public static TurtleModem wirelessModemAdvanced;
 | 
			
		||||
        public static TurtleSpeaker speaker;
 | 
			
		||||
 | 
			
		||||
        public static TurtleCraftingTable craftingTable;
 | 
			
		||||
        public static TurtleSword diamondSword;
 | 
			
		||||
        public static TurtleShovel diamondShovel;
 | 
			
		||||
        public static TurtleTool diamondPickaxe;
 | 
			
		||||
        public static TurtleAxe diamondAxe;
 | 
			
		||||
        public static TurtleHoe diamondHoe;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static final class PocketUpgrades
 | 
			
		||||
    {
 | 
			
		||||
        public static PocketModem wirelessModemNormal;
 | 
			
		||||
        public static PocketModem wirelessModemAdvanced;
 | 
			
		||||
        public static PocketSpeaker speaker;
 | 
			
		||||
    }
 | 
			
		||||
    public static int pocketTermWidth = 26;
 | 
			
		||||
    public static int pocketTermHeight = 20;
 | 
			
		||||
    public static int monitorWidth = 8;
 | 
			
		||||
    public static int monitorHeight = 6;
 | 
			
		||||
 | 
			
		||||
    // Registries
 | 
			
		||||
    public static final ClientComputerRegistry clientComputerRegistry = new ClientComputerRegistry();
 | 
			
		||||
@@ -184,33 +107,30 @@ public final class ComputerCraft
 | 
			
		||||
    // Logging
 | 
			
		||||
    public static final Logger log = LogManager.getLogger( MOD_ID );
 | 
			
		||||
 | 
			
		||||
    public ComputerCraft()
 | 
			
		||||
    {
 | 
			
		||||
        Config.load();
 | 
			
		||||
    }
 | 
			
		||||
    public static ItemGroup MAIN_GROUP = FabricItemGroupBuilder.build( new Identifier( MOD_ID, "main" ), () -> new ItemStack( ModBlocks.COMPUTER_NORMAL ) );
 | 
			
		||||
 | 
			
		||||
    public static String getVersion()
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onInitialize()
 | 
			
		||||
    {
 | 
			
		||||
        return "${version}";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static IMount createResourceMount( String domain, String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
        ResourceMount mount = new ResourceMount( domain, subPath, manager );
 | 
			
		||||
        return mount.exists( "" ) ? mount : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static InputStream getResourceFile( String domain, String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
 | 
			
		||||
        }
 | 
			
		||||
        catch( IOException ignored )
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        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 );
 | 
			
		||||
        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,14 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. 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 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;
 | 
			
		||||
@@ -19,35 +19,77 @@ 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.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.CapabilityWiredElement;
 | 
			
		||||
import dan200.computercraft.shared.wired.WiredNode;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
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;
 | 
			
		||||
import net.minecraft.world.IBlockReader;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.BlockView;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
 | 
			
		||||
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 static final ComputerCraftAPIImpl INSTANCE = new ComputerCraftAPIImpl();
 | 
			
		||||
 | 
			
		||||
    private String version;
 | 
			
		||||
 | 
			
		||||
    private ComputerCraftAPIImpl()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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 )
 | 
			
		||||
            {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getInstalledVersion()
 | 
			
		||||
    {
 | 
			
		||||
        return "${version}";
 | 
			
		||||
        if( version != null )
 | 
			
		||||
        {
 | 
			
		||||
            return version;
 | 
			
		||||
        }
 | 
			
		||||
        return version = FabricLoader.getInstance()
 | 
			
		||||
            .getModContainer( ComputerCraft.MOD_ID )
 | 
			
		||||
            .map( x -> x.getMetadata()
 | 
			
		||||
                .getVersion()
 | 
			
		||||
                .toString() )
 | 
			
		||||
            .orElse( "unknown" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -72,7 +114,14 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
    @Override
 | 
			
		||||
    public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        return ComputerCraft.createResourceMount( domain, subPath );
 | 
			
		||||
        MinecraftServer server = GameInstanceUtils.getServer();
 | 
			
		||||
        if( server != null )
 | 
			
		||||
        {
 | 
			
		||||
            ResourceManager manager = ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager();
 | 
			
		||||
            ResourceMount mount = ResourceMount.get( domain, subPath, manager );
 | 
			
		||||
            return mount.exists( "" ) ? mount : null;
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -94,7 +143,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
 | 
			
		||||
    public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        return BundledRedstone.getDefaultOutput( world, pos, side );
 | 
			
		||||
    }
 | 
			
		||||
@@ -111,6 +160,12 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
        PocketUpgrades.register( upgrade );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerGenericSource( @Nonnull GenericSource source )
 | 
			
		||||
    {
 | 
			
		||||
        GenericMethod.register( source );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPacketNetwork getWirelessNetwork()
 | 
			
		||||
@@ -131,11 +186,19 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
        return new WiredNode( element );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public LazyOptional<IWiredElement> getWiredElementAt( @Nonnull IBlockReader world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
 | 
			
		||||
    public IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        TileEntity tile = world.getTileEntity( pos );
 | 
			
		||||
        return tile == null ? LazyOptional.empty() : tile.getCapability( CapabilityWiredElement.CAPABILITY, 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,13 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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;
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
@@ -20,22 +20,30 @@ 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.EnumFacing;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.IBlockReader;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.BlockView;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
    private static IComputerCraftAPI instance;
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public static String getAPIVersion()
 | 
			
		||||
    {
 | 
			
		||||
        return getInstalledVersion();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static String getInstalledVersion()
 | 
			
		||||
    {
 | 
			
		||||
@@ -43,9 +51,23 @@ public final class ComputerCraftAPI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static String getAPIVersion()
 | 
			
		||||
    private static IComputerCraftAPI getInstance()
 | 
			
		||||
    {
 | 
			
		||||
        return "${version}";
 | 
			
		||||
        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 );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -57,8 +79,7 @@ public final class ComputerCraftAPI
 | 
			
		||||
     * @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 )
 | 
			
		||||
@@ -69,15 +90,15 @@ public final class ComputerCraftAPI
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a file system mount that maps to a subfolder of the save directory for a given world, and returns it.
 | 
			
		||||
     *
 | 
			
		||||
     * Use in conjunction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a folder from the
 | 
			
		||||
     * users save directory onto a computers file system.
 | 
			
		||||
     * 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 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @see #createUniqueNumberedSaveDir(World, String)
 | 
			
		||||
     * @see IComputerAccess#mount(String, IMount)
 | 
			
		||||
     * @see IComputerAccess#mountWritable(String, IWritableMount)
 | 
			
		||||
@@ -93,11 +114,13 @@ public final class ComputerCraftAPI
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a file system mount to a resource folder, and returns it.
 | 
			
		||||
     *
 | 
			
		||||
     * Use in conjunction with {@link IComputerAccess#mount} or {@link IComputerAccess#mountWritable} to mount a
 | 
			
		||||
     * resource folder onto a computer's file system.
 | 
			
		||||
     * 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.
 | 
			
		||||
     * 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 subPath The subPath under which to look for resources. eg: "lua/myfiles".
 | 
			
		||||
@@ -112,31 +135,6 @@ public final class ComputerCraftAPI
 | 
			
		||||
        return getInstance().createResourceMount( domain, subPath );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a file system mount to a resource folder, and returns it.
 | 
			
		||||
     *
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * @param klass   The mod class to which the files belong.
 | 
			
		||||
     * @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)
 | 
			
		||||
     * @see IComputerAccess#mountWritable(String, IWritableMount)
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     * @deprecated Use {@link #createResourceMount(String, String)} instead.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public static IMount createResourceMount( Class<?> klass, @Nonnull String domain, @Nonnull String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().createResourceMount( domain, subPath );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a peripheral provider to convert blocks into {@link IPeripheral} implementations.
 | 
			
		||||
     *
 | 
			
		||||
@@ -150,9 +148,19 @@ public final class ComputerCraftAPI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a new turtle turtle for use in ComputerCraft. After calling this,
 | 
			
		||||
     * users should be able to craft Turtles with your new turtle. It is recommended to call
 | 
			
		||||
     * this during the load() method of your mod.
 | 
			
		||||
     * 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 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a new turtle turtle for use in ComputerCraft. After calling this, users should be able to craft Turtles with your new turtle. It is
 | 
			
		||||
     * recommended to call this during the load() method of your mod.
 | 
			
		||||
     *
 | 
			
		||||
     * @param upgrade The turtle upgrade to register.
 | 
			
		||||
     * @see ITurtleUpgrade
 | 
			
		||||
@@ -179,17 +187,17 @@ public final class ComputerCraftAPI
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @see IBundledRedstoneProvider
 | 
			
		||||
     */
 | 
			
		||||
    public static int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
 | 
			
		||||
    public static int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().getBundledRedstoneOutput( world, pos, side );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a media provider to provide {@link IMedia} implementations for Items
 | 
			
		||||
     * Registers a media provider to provide {@link IMedia} implementations for Items.
 | 
			
		||||
     *
 | 
			
		||||
     * @param provider The media provider to register.
 | 
			
		||||
     * @see IMediaProvider
 | 
			
		||||
@@ -220,7 +228,7 @@ public final class ComputerCraftAPI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Construct a new wired node for a given wired element
 | 
			
		||||
     * Construct a new wired node for a given wired element.
 | 
			
		||||
     *
 | 
			
		||||
     * @param element The element to construct it for
 | 
			
		||||
     * @return The element's node
 | 
			
		||||
@@ -233,7 +241,7 @@ public final class ComputerCraftAPI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the wired network element for a block in world
 | 
			
		||||
     * 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
 | 
			
		||||
@@ -241,30 +249,12 @@ public final class ComputerCraftAPI
 | 
			
		||||
     * @return The element's node
 | 
			
		||||
     * @see IWiredElement#getNode()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static LazyOptional<IWiredElement> getWiredElementAt( @Nonnull IBlockReader world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public static IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
 | 
			
		||||
    {
 | 
			
		||||
        return getInstance().getWiredElementAt( world, pos, side );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static IComputerCraftAPI instance;
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    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 );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface IComputerCraftAPI
 | 
			
		||||
    {
 | 
			
		||||
        @Nonnull
 | 
			
		||||
@@ -280,11 +270,13 @@ public final class ComputerCraftAPI
 | 
			
		||||
 | 
			
		||||
        void registerPeripheralProvider( @Nonnull IPeripheralProvider provider );
 | 
			
		||||
 | 
			
		||||
        void registerGenericSource( @Nonnull GenericSource source );
 | 
			
		||||
 | 
			
		||||
        void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade );
 | 
			
		||||
 | 
			
		||||
        void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider );
 | 
			
		||||
 | 
			
		||||
        int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side );
 | 
			
		||||
        int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
 | 
			
		||||
        void registerMediaProvider( @Nonnull IMediaProvider provider );
 | 
			
		||||
 | 
			
		||||
@@ -298,7 +290,7 @@ public final class ComputerCraftAPI
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element );
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        LazyOptional<IWiredElement> getWiredElementAt( @Nonnull IBlockReader world, @Nonnull BlockPos pos, @Nonnull EnumFacing side );
 | 
			
		||||
        @Nullable
 | 
			
		||||
        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 );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,93 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.client;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.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;
 | 
			
		||||
import net.minecraft.client.util.ModelIdentifier;
 | 
			
		||||
import net.minecraft.client.util.math.AffineTransformation;
 | 
			
		||||
import net.minecraft.client.util.math.MatrixStack;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
    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 )
 | 
			
		||||
    {
 | 
			
		||||
        this.model = Objects.requireNonNull( model );
 | 
			
		||||
        matrix = AffineTransformation.identity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static TransformedModel of( @Nonnull ModelIdentifier location )
 | 
			
		||||
    {
 | 
			
		||||
        BakedModelManager modelManager = MinecraftClient.getInstance()
 | 
			
		||||
            .getBakedModelManager();
 | 
			
		||||
        return new TransformedModel( modelManager.getModel( location ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static TransformedModel of( @Nonnull ItemStack item, @Nonnull AffineTransformation transform )
 | 
			
		||||
    {
 | 
			
		||||
        BakedModel model = MinecraftClient.getInstance()
 | 
			
		||||
            .getItemRenderer()
 | 
			
		||||
            .getModels()
 | 
			
		||||
            .getModel( item );
 | 
			
		||||
        return new TransformedModel( model, transform );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public BakedModel getModel()
 | 
			
		||||
    {
 | 
			
		||||
        return model;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public AffineTransformation getMatrix()
 | 
			
		||||
    {
 | 
			
		||||
        return matrix;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void push( MatrixStack matrixStack )
 | 
			
		||||
    {
 | 
			
		||||
        matrixStack.push();
 | 
			
		||||
 | 
			
		||||
        AffineTransformationAccess access = (AffineTransformationAccess) (Object) matrix;
 | 
			
		||||
        if( access.getTranslation() != null )
 | 
			
		||||
        {
 | 
			
		||||
            matrixStack.translate( access.getTranslation().getX(), access.getTranslation().getY(), access.getTranslation().getZ() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        matrixStack.multiply( matrix.getRotation2() );
 | 
			
		||||
 | 
			
		||||
        if( access.getScale() != null )
 | 
			
		||||
        {
 | 
			
		||||
            matrixStack.scale( access.getScale().getX(), access.getScale().getY(), access.getScale().getZ() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( access.getRotation1() != null )
 | 
			
		||||
        {
 | 
			
		||||
            matrixStack.multiply( access.getRotation1() );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,81 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.filesystem;
 | 
			
		||||
 | 
			
		||||
import java.nio.file.attribute.BasicFileAttributes;
 | 
			
		||||
import java.nio.file.attribute.FileTime;
 | 
			
		||||
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 );
 | 
			
		||||
 | 
			
		||||
    private final boolean isDirectory;
 | 
			
		||||
    private final long size;
 | 
			
		||||
 | 
			
		||||
    FileAttributes( boolean isDirectory, long size )
 | 
			
		||||
    {
 | 
			
		||||
        this.isDirectory = isDirectory;
 | 
			
		||||
        this.size = size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileTime lastModifiedTime()
 | 
			
		||||
    {
 | 
			
		||||
        return EPOCH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileTime lastAccessTime()
 | 
			
		||||
    {
 | 
			
		||||
        return EPOCH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileTime creationTime()
 | 
			
		||||
    {
 | 
			
		||||
        return EPOCH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isRegularFile()
 | 
			
		||||
    {
 | 
			
		||||
        return !isDirectory;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isDirectory()
 | 
			
		||||
    {
 | 
			
		||||
        return isDirectory;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isSymbolicLink()
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isOther()
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public long size()
 | 
			
		||||
    {
 | 
			
		||||
        return size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object fileKey()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.filesystem;
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
    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" ) );
 | 
			
		||||
        this.filename = filename;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public FileOperationException( @Nonnull String message )
 | 
			
		||||
    {
 | 
			
		||||
        super( Objects.requireNonNull( message, "message cannot be null" ) );
 | 
			
		||||
        filename = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    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-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.filesystem;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.filesystem;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
@@ -12,26 +11,60 @@ import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.nio.channels.Channels;
 | 
			
		||||
import java.nio.channels.ReadableByteChannel;
 | 
			
		||||
import java.nio.file.attribute.BasicFileAttributes;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a read only part of a virtual filesystem that can be mounted onto a computer using
 | 
			
		||||
 * {@link IComputerAccess#mount(String, IMount)}
 | 
			
		||||
 * Represents a read only part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)}.
 | 
			
		||||
 *
 | 
			
		||||
 * Ready made implementations of this interface can be created using
 | 
			
		||||
 * {@link ComputerCraftAPI#createSaveDirMount(World, String, long)} or
 | 
			
		||||
 * {@link ComputerCraftAPI#createResourceMount(Class, String, String)}, or you're free to implement it yourselves!
 | 
			
		||||
 * Ready made implementations of this interface can be created using {@link ComputerCraftAPI#createSaveDirMount(World, String, long)} or {@link
 | 
			
		||||
 * ComputerCraftAPI#createResourceMount(String, String)}, or you're free to implement it yourselves!
 | 
			
		||||
 *
 | 
			
		||||
 * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
 * @see ComputerCraftAPI#createResourceMount(Class, String, String)
 | 
			
		||||
 * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
 * @see IComputerAccess#mount(String, IMount)
 | 
			
		||||
 * @see IWritableMount
 | 
			
		||||
 */
 | 
			
		||||
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 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;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @throws IOException If the file does not exist, or could not be opened.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ReadableByteChannel openForRead( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get attributes about the given file.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path The path to query.
 | 
			
		||||
     * @return File attributes for the given file.
 | 
			
		||||
     * @throws IOException If the file does not exist, or attributes could not be fetched.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default BasicFileAttributes getAttributes( @Nonnull String path ) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        if( !exists( path ) )
 | 
			
		||||
        {
 | 
			
		||||
            throw new FileOperationException( path, "No such file" );
 | 
			
		||||
        }
 | 
			
		||||
        return new FileAttributes( isDirectory( path ), getSize( path ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns whether a file with a given path exists or not.
 | 
			
		||||
     *
 | 
			
		||||
@@ -51,48 +84,11 @@ public interface IMount
 | 
			
		||||
    boolean isDirectory( @Nonnull String path ) throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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 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;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the size of a file with a given path, in bytes
 | 
			
		||||
     * Returns the size of a file with a given path, in bytes.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram".
 | 
			
		||||
     * @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;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens a file with a given path, and returns an {@link InputStream} representing its contents.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram".
 | 
			
		||||
     * @return A stream representing the contents of the file.
 | 
			
		||||
     * @throws IOException If the file does not exist, or could not be opened.
 | 
			
		||||
     * @deprecated Use {@link #openChannelForRead(String)} instead
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    InputStream openForRead( @Nonnull String path ) 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.
 | 
			
		||||
     * @throws IOException If the file does not exist, or could not be opened.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @SuppressWarnings( "deprecation" )
 | 
			
		||||
    default ReadableByteChannel openChannelForRead( @Nonnull String path ) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        return Channels.newChannel( openForRead( path ) );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.filesystem;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
@@ -13,15 +12,15 @@ import net.minecraft.world.World;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
import java.nio.channels.Channels;
 | 
			
		||||
import java.nio.channels.WritableByteChannel;
 | 
			
		||||
import java.util.OptionalLong;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Ready made implementations of this interface can be created using
 | 
			
		||||
 * {@link ComputerCraftAPI#createSaveDirMount(World, String, long)}, or you're free to implement it yourselves!
 | 
			
		||||
 * Ready made implementations of this interface can be created using {@link ComputerCraftAPI#createSaveDirMount(World, String, long)}, or you're free to
 | 
			
		||||
 * implement it yourselves!
 | 
			
		||||
 *
 | 
			
		||||
 * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
 * @see IComputerAccess#mount(String, IMount)
 | 
			
		||||
@@ -50,62 +49,41 @@ public interface IWritableMount extends IMount
 | 
			
		||||
     * 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
 | 
			
		||||
     * @throws IOException If the file could not be opened for writing.
 | 
			
		||||
     * @deprecated Use {@link #openChannelForWrite(String)} instead.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    OutputStream openForWrite( @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws IOException If the file could not be opened for writing.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @SuppressWarnings( "deprecation" )
 | 
			
		||||
    default WritableByteChannel openChannelForWrite( @Nonnull String path ) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        return Channels.newChannel( openForWrite( path ) );
 | 
			
		||||
    }
 | 
			
		||||
    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.
 | 
			
		||||
     * @throws IOException If the file could not be opened for writing.
 | 
			
		||||
     * @deprecated Use {@link #openChannelForAppend(String)} instead.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    OutputStream openForAppend( @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws IOException If the file could not be opened for writing.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @SuppressWarnings( "deprecation" )
 | 
			
		||||
    default WritableByteChannel openChannelForAppend( @Nonnull String path ) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        return Channels.newChannel( openForAppend( path ) );
 | 
			
		||||
    }
 | 
			
		||||
    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 once it reaches zero.
 | 
			
		||||
     * 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
 | 
			
		||||
     * once it reaches zero.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The amount of free space, in bytes.
 | 
			
		||||
     * @throws IOException If the remaining space could not be computed.
 | 
			
		||||
     */
 | 
			
		||||
    long getRemainingSpace() throws IOException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the capacity of this mount. This should be equal to the size of all files/directories on this mount, minus the {@link #getRemainingSpace()}.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The capacity of this mount, in bytes.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    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();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										460
									
								
								src/main/java/dan200/computercraft/api/lua/IArguments.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										460
									
								
								src/main/java/dan200/computercraft/api/lua/IArguments.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,460 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.nio.ByteBuffer;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.api.lua.LuaValues.checkFinite;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The arguments passed to a function.
 | 
			
		||||
 */
 | 
			
		||||
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.
 | 
			
		||||
     *
 | 
			
		||||
     * @param count The number of arguments to drop.
 | 
			
		||||
     * @return The new {@link IArguments} instance.
 | 
			
		||||
     */
 | 
			
		||||
    IArguments drop( int count );
 | 
			
		||||
 | 
			
		||||
    default Object[] getAll()
 | 
			
		||||
    {
 | 
			
		||||
        Object[] result = new Object[count()];
 | 
			
		||||
        for( int i = 0; i < result.length; i++ )
 | 
			
		||||
        {
 | 
			
		||||
            result[i] = get( i );
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the number of arguments passed to this function.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The number of passed arguments.
 | 
			
		||||
     */
 | 
			
		||||
    int count();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the argument at the specific index. The returned value must obey the following conversion rules:
 | 
			
		||||
     *
 | 
			
		||||
     * <ul>
 | 
			
		||||
     *   <li>Lua values of type "string" will be represented by a {@link String}.</li>
 | 
			
		||||
     *   <li>Lua values of type "number" will be represented by a {@link Number}.</li>
 | 
			
		||||
     *   <li>Lua values of type "boolean" will be represented by a {@link Boolean}.</li>
 | 
			
		||||
     *   <li>Lua values of type "table" will be represented by a {@link Map}.</li>
 | 
			
		||||
     *   <li>Lua values of any other type will be represented by a {@code null} value.</li>
 | 
			
		||||
     * </ul>
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value, or {@code null} if not present.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object get( int index );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as an integer.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not an integer.
 | 
			
		||||
     */
 | 
			
		||||
    default int getInt( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return (int) getLong( index );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a long.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a long.
 | 
			
		||||
     */
 | 
			
		||||
    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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a finite number (not infinite or NaN).
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not finite.
 | 
			
		||||
     */
 | 
			
		||||
    default double getFiniteDouble( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return checkFinite( index, getDouble( index ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a double.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @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 = get( index );
 | 
			
		||||
        if( !(value instanceof Number) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "number", value );
 | 
			
		||||
        }
 | 
			
		||||
        return ((Number) value).doubleValue();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a boolean.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a boolean.
 | 
			
		||||
     */
 | 
			
		||||
    default boolean getBoolean( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof Boolean) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "boolean", value );
 | 
			
		||||
        }
 | 
			
		||||
        return (Boolean) value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string argument as a byte array.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value. This is a <em>read only</em> buffer.
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default ByteBuffer getBytes( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return LuaValues.encode( getString( index ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a string.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a string.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default String getString( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof String) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "string", value );
 | 
			
		||||
        }
 | 
			
		||||
        return (String) value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string argument as an enum value.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param klass 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, getString( index ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a table.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value.
 | 
			
		||||
     * @throws LuaException If the value is not a table.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Map<?, ?> getTable( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        Object value = get( index );
 | 
			
		||||
        if( !(value instanceof Map) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "table", value );
 | 
			
		||||
        }
 | 
			
		||||
        return (Map<?, ?>) value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string argument as a byte array.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 optString( index ).map( LuaValues::encode );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a string.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if( !(value instanceof String) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "string", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of( (String) value );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string argument as an enum value.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @param klass 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 = 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.
 | 
			
		||||
     * @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 optDouble( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a double.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    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 );
 | 
			
		||||
        }
 | 
			
		||||
        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.
 | 
			
		||||
     * @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 optInt( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as an int.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @return The argument's value, or {@link Optional#empty()} if not present.
 | 
			
		||||
     * @throws LuaException If the value is not a number.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Optional<Integer> optInt( int index ) throws LuaException
 | 
			
		||||
    {
 | 
			
		||||
        return optLong( index ).map( Long::intValue );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a long.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if( !(value instanceof Number) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "number", value );
 | 
			
		||||
        }
 | 
			
		||||
        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.
 | 
			
		||||
     * @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 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.
 | 
			
		||||
     * @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 optFiniteDouble( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a finite number (not infinite or NaN).
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 = optDouble( index );
 | 
			
		||||
        if( value.isPresent() )
 | 
			
		||||
        {
 | 
			
		||||
            LuaValues.checkFiniteNum( index, value.get() );
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a boolean.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 optBoolean( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a boolean.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if( !(value instanceof Boolean) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "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.
 | 
			
		||||
     * @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 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.
 | 
			
		||||
     * @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 optTable( index ).orElse( def );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an argument as a table.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument number.
 | 
			
		||||
     * @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 = get( index );
 | 
			
		||||
        if( value == null )
 | 
			
		||||
        {
 | 
			
		||||
            return Optional.empty();
 | 
			
		||||
        }
 | 
			
		||||
        if( !(value instanceof Map) )
 | 
			
		||||
        {
 | 
			
		||||
            throw LuaValues.badArgumentOf( index, "map", value );
 | 
			
		||||
        }
 | 
			
		||||
        return Optional.of( (Map<?, ?>) value );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 dan200.computercraft.api.filesystem.IFileSystem;
 | 
			
		||||
@@ -12,8 +11,7 @@ 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.
 | 
			
		||||
 * An interface passed to {@link ILuaAPIFactory} in order to provide additional information about a computer.
 | 
			
		||||
 */
 | 
			
		||||
public interface IComputerSystem extends IComputerAccess
 | 
			
		||||
{
 | 
			
		||||
@@ -26,7 +24,7 @@ public interface IComputerSystem extends IComputerAccess
 | 
			
		||||
    IFileSystem getFileSystem();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the label for this computer
 | 
			
		||||
     * Get the label for this computer.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This computer's label, or {@code null} if it is not set.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.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
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the names of the methods that this object implements. This should not change over the course of the object's lifetime.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The method names this object provides.
 | 
			
		||||
     * @see IDynamicPeripheral#getMethodNames()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String[] getMethodNames();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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 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;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,23 +1,23 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a {@link ILuaObject} which is stored as a global variable on computer startup.
 | 
			
		||||
 * Represents a Lua object which is stored as a global variable on computer startup. This must either provide {@link LuaFunction} annotated functions or
 | 
			
		||||
 * implement {@link IDynamicLuaObject}.
 | 
			
		||||
 *
 | 
			
		||||
 * Before implementing this interface, consider alternative methods of providing methods. It is generally preferred
 | 
			
		||||
 * to use peripherals to provide functionality to users.
 | 
			
		||||
 * Before implementing this interface, consider alternative methods of providing methods. It is generally preferred to use peripherals to provide
 | 
			
		||||
 * functionality to users.
 | 
			
		||||
 *
 | 
			
		||||
 * @see ILuaAPIFactory
 | 
			
		||||
 * @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory)
 | 
			
		||||
 */
 | 
			
		||||
public interface ILuaAPI extends ILuaObject
 | 
			
		||||
public interface ILuaAPI
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the globals this API will be assigned to. This will override any other global, so you should
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								src/main/java/dan200/computercraft/api/lua/ILuaCallback.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/main/java/dan200/computercraft/api/lua/ILuaCallback.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A continuation which is called when this coroutine is resumed.
 | 
			
		||||
 *
 | 
			
		||||
 * @see MethodResult#yield(Object[], ILuaCallback)
 | 
			
		||||
 */
 | 
			
		||||
public interface ILuaCallback
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Resume this coroutine.
 | 
			
		||||
     *
 | 
			
		||||
     * @param args The result of resuming this coroutine. These will have the same form as described in {@link LuaFunction}.
 | 
			
		||||
     * @return The result of this continuation. Either the result to return to the callee, or another yield.
 | 
			
		||||
     * @throws LuaException On an error.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult resume( Object[] args ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,105 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An interface passed to peripherals and {@link ILuaObject}s by computers or turtles, providing methods
 | 
			
		||||
 * that allow the peripheral call to wait for events before returning, just like in lua. This is very useful if you need
 | 
			
		||||
 * to signal work to be performed on the main thread, and don't want to return until the work has been completed.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filter A specific event to wait for, or null to wait for any event.
 | 
			
		||||
     * @return An object array containing the name of the event that occurred, and any event parameters.
 | 
			
		||||
     * @throws LuaException         If the user presses CTRL+T to terminate the current program while pullEvent() is
 | 
			
		||||
     *                              waiting for an event, a "Terminated" exception will be thrown here.
 | 
			
		||||
     *
 | 
			
		||||
     *                              Do not attempt to catch this exception. You should use {@link #pullEventRaw(String)}
 | 
			
		||||
     *                              should you wish to disable termination.
 | 
			
		||||
     * @throws InterruptedException If the user shuts down or reboots the computer while pullEvent() is waiting for an
 | 
			
		||||
     *                              event, InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                              intercepted, or the computer will leak memory and end up in a broken state.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Object[] pullEvent( @Nullable String filter ) throws LuaException, InterruptedException
 | 
			
		||||
    {
 | 
			
		||||
        Object[] results = pullEventRaw( filter );
 | 
			
		||||
        if( results.length >= 1 && results[0].equals( "terminate" ) ) throw new LuaException( "Terminated", 0 );
 | 
			
		||||
        return results;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The same as {@link #pullEvent(String)}, 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.
 | 
			
		||||
     * @return An object array containing the name of the event that occurred, and any event parameters.
 | 
			
		||||
     * @throws InterruptedException If the user shuts down or reboots the computer while pullEventRaw() is waiting for
 | 
			
		||||
     *                              an event, InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                              intercepted, or the computer will leak memory and end up in a broken state.
 | 
			
		||||
     * @see #pullEvent(String)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Object[] pullEventRaw( @Nullable String filter ) throws InterruptedException
 | 
			
		||||
    {
 | 
			
		||||
        return yield( new Object[] { filter } );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Yield the current coroutine with some arguments until it is resumed. This method is exactly equivalent to
 | 
			
		||||
     * {@code coroutine.yield()} in lua. Use {@code pullEvent()} if you wish to wait for events.
 | 
			
		||||
     *
 | 
			
		||||
     * @param arguments An object array containing the arguments to pass to coroutine.yield()
 | 
			
		||||
     * @return An object array containing the return values from coroutine.yield()
 | 
			
		||||
     * @throws InterruptedException If the user shuts down or reboots the computer the coroutine is suspended,
 | 
			
		||||
     *                              InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                              intercepted, or the computer will leak memory and end up in a broken state.
 | 
			
		||||
     * @see #pullEvent(String)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Object[] yield( @Nullable Object[] arguments ) throws InterruptedException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Queue a task to be executed on the main server thread at the beginning of next tick, waiting for it to complete.
 | 
			
		||||
     * This should be used when you need to interact with the world in a thread-safe manner.
 | 
			
		||||
     *
 | 
			
		||||
     * Note that the return values of your task are handled as events, meaning more complex objects such as maps or
 | 
			
		||||
     * {@link ILuaObject} will not preserve their identities.
 | 
			
		||||
     *
 | 
			
		||||
     * @param task The task to execute on the main thread.
 | 
			
		||||
     * @return The objects returned by {@code task}.
 | 
			
		||||
     * @throws LuaException         If the task could not be queued, or if the task threw an exception.
 | 
			
		||||
     * @throws InterruptedException If the user shuts down or reboots the computer the coroutine is suspended,
 | 
			
		||||
     *                              InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                              intercepted, or the computer will leak memory and end up in a broken state.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object[] executeMainThreadTask( @Nonnull ILuaTask task ) throws LuaException, InterruptedException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * When the task has finished, it will enqueue a {@code task_completed} event, which takes the task id, a success
 | 
			
		||||
     * value and the return values, or an error message if it failed. If you need to wait on this event, it may be
 | 
			
		||||
     * better to use {@link #executeMainThreadTask(ILuaTask)}.
 | 
			
		||||
     * When the task has finished, it will enqueue a {@code task_completed} event, which takes the task id, a success value and the return values, or an
 | 
			
		||||
     * error message if it failed.
 | 
			
		||||
     *
 | 
			
		||||
     * @param task The task to execute on the main thread.
 | 
			
		||||
     * @return The "id" of the task. This will be the first argument to the {@code task_completed} event.
 | 
			
		||||
     * @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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								src/main/java/dan200/computercraft/api/lua/ILuaFunction.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/main/java/dan200/computercraft/api/lua/ILuaFunction.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A function, which can be called from Lua. If you need to return a table of functions, it is recommended to use an object with {@link LuaFunction}
 | 
			
		||||
 * methods, or implement {@link IDynamicLuaObject}.
 | 
			
		||||
 *
 | 
			
		||||
 * @see MethodResult#of(Object)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
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.
 | 
			
		||||
     *
 | 
			
		||||
     * @param arguments The arguments for this function
 | 
			
		||||
     * @return The result of calling this function.
 | 
			
		||||
     * @throws LuaException Upon Lua errors.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult call( @Nonnull IArguments arguments ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,56 +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 dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An interface for representing custom objects returned by {@link IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])}
 | 
			
		||||
 * calls.
 | 
			
		||||
 *
 | 
			
		||||
 * Return objects implementing this interface to expose objects with methods to lua.
 | 
			
		||||
 */
 | 
			
		||||
public interface ILuaObject
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the names of the methods that this object implements. This works the same as {@link IPeripheral#getMethodNames()}.
 | 
			
		||||
     * See that method for detailed documentation.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The method names this object provides.
 | 
			
		||||
     * @see IPeripheral#getMethodNames()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String[] getMethodNames();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when a user calls one of the methods that this object implements. This works the same as
 | 
			
		||||
     * {@link IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])}}. See that method for detailed
 | 
			
		||||
     * documentation.
 | 
			
		||||
     *
 | 
			
		||||
     * @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. See {@link IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])}
 | 
			
		||||
     *                  the possible values and conversion rules.
 | 
			
		||||
     * @return An array of objects, representing the values you wish to return to the Lua program.
 | 
			
		||||
     * See {@link IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])} for the valid values and
 | 
			
		||||
     * conversion rules.
 | 
			
		||||
     * @throws LuaException         If the task could not be queued, or if the task threw an exception.
 | 
			
		||||
     * @throws InterruptedException If the user shuts down or reboots the computer the coroutine is suspended,
 | 
			
		||||
     *                              InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                              intercepted, or the computer will leak memory and end up in a broken state.w
 | 
			
		||||
     * @see IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object[] callMethod( @Nonnull ILuaContext context, int method, @Nonnull Object[] arguments ) throws LuaException, InterruptedException;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A task which can be executed via {@link ILuaContext#executeMainThreadTask(ILuaTask)} or
 | 
			
		||||
 * {@link ILuaContext#issueMainThreadTask(ILuaTask)}. This will be run on the main thread, at the beginning of the
 | 
			
		||||
 * next tick.
 | 
			
		||||
 * A task which can be executed via {@link ILuaContext#issueMainThreadTask(ILuaTask)} This will be run on the main thread, at the beginning of the next
 | 
			
		||||
 * tick.
 | 
			
		||||
 *
 | 
			
		||||
 * @see ILuaContext#executeMainThreadTask(ILuaTask)
 | 
			
		||||
 * @see ILuaContext#issueMainThreadTask(ILuaTask)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
@@ -22,11 +19,9 @@ public interface ILuaTask
 | 
			
		||||
    /**
 | 
			
		||||
     * Execute this task.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The arguments to add to the {@code task_completed} event. These will be returned by
 | 
			
		||||
     * {@link ILuaContext#executeMainThreadTask(ILuaTask)}.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     */
 | 
			
		||||
    @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-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.Nullable;
 | 
			
		||||
@@ -14,27 +13,35 @@ import javax.annotation.Nullable;
 | 
			
		||||
public class LuaException extends Exception
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = -6136063076818512651L;
 | 
			
		||||
    private final boolean hasLevel;
 | 
			
		||||
    private final int level;
 | 
			
		||||
 | 
			
		||||
    public LuaException()
 | 
			
		||||
    {
 | 
			
		||||
        this( "error", 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LuaException( @Nullable String message )
 | 
			
		||||
    {
 | 
			
		||||
        this( message, 1 );
 | 
			
		||||
        super( message );
 | 
			
		||||
        hasLevel = false;
 | 
			
		||||
        level = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LuaException( @Nullable String message, int level )
 | 
			
		||||
    {
 | 
			
		||||
        super( message );
 | 
			
		||||
        hasLevel = true;
 | 
			
		||||
        this.level = level;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The level this error is raised at. Level 1 is the function's caller, level 2 is that function's caller, and so
 | 
			
		||||
     * on.
 | 
			
		||||
     * Whether a level was explicitly specified when constructing. This is used to determine
 | 
			
		||||
     *
 | 
			
		||||
     * @return Whether this has an explicit level.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean hasLevel()
 | 
			
		||||
    {
 | 
			
		||||
        return hasLevel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The level this error is raised at. Level 1 is the function's caller, level 2 is that function's caller, and so on.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The level to raise the error at.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								src/main/java/dan200/computercraft/api/lua/LuaFunction.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/main/java/dan200/computercraft/api/lua/LuaFunction.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the public ComputerCraft API - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only.
 | 
			
		||||
 * For help using the API, and posting your mods, visit the forums at computercraft.info.
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.lua;
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 *
 | 
			
		||||
 * Methods annotated with {@link LuaFunction} must be public final instance methods. They can have any number of parameters, but they must be of the
 | 
			
		||||
 * following types:
 | 
			
		||||
 *
 | 
			
		||||
 * <ul>
 | 
			
		||||
 *   <li>{@link ILuaContext} (and {@link IComputerAccess} if on a {@link IPeripheral})</li>
 | 
			
		||||
 *   <li>{@link IArguments}: The arguments supplied to this function.</li>
 | 
			
		||||
 *   <li>
 | 
			
		||||
 *     Alternatively, one may specify the desired arguments as normal parameters and the argument parsing code will
 | 
			
		||||
 *     be generated automatically.
 | 
			
		||||
 *
 | 
			
		||||
 *     Each parameter must be one of the given types supported by {@link IArguments} (for instance, {@link int} or
 | 
			
		||||
 *     {@link Map}). Optional values are supported by accepting a parameter of type {@link Optional}.
 | 
			
		||||
 *   </li>
 | 
			
		||||
 * </ul>
 | 
			
		||||
 *
 | 
			
		||||
 * This function may return {@link MethodResult}. However, if you simply return a value (rather than having to yield),
 | 
			
		||||
 * you may return {@code void}, a single value (either an object or a primitive like {@code int}) or array of objects.
 | 
			
		||||
 * These will be treated the same as {@link MethodResult#of()}, {@link MethodResult#of(Object)} and
 | 
			
		||||
 * {@link MethodResult#of(Object...)}.
 | 
			
		||||
 */
 | 
			
		||||
@Documented
 | 
			
		||||
@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.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This function's name(s).
 | 
			
		||||
     */
 | 
			
		||||
    String[] value() default {};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Run this function on the main server thread. This should be specified for any method which interacts with Minecraft in a thread-unsafe manner.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Whether this functi
 | 
			
		||||
     * @see ILuaContext#issueMainThreadTask(ILuaTask)
 | 
			
		||||
     */
 | 
			
		||||
    boolean mainThread() default false;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										183
									
								
								src/main/java/dan200/computercraft/api/lua/LuaValues.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								src/main/java/dan200/computercraft/api/lua/LuaValues.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,183 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 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()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Encode a Lua string into a read-only {@link ByteBuffer}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string The string to encode.
 | 
			
		||||
     * @return The encoded string.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    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 );
 | 
			
		||||
            chars[i] = c < 256 ? (byte) c : 63;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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 expected The expected type 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 ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Construct a "bad argument" exception, from an expected and actual type.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index    The argument number, starting from 0.
 | 
			
		||||
     * @param expected The expected 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 + ")" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string representation of the given value's type.
 | 
			
		||||
     *
 | 
			
		||||
     * @param value The value whose type we are trying to compute.
 | 
			
		||||
     * @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 )
 | 
			
		||||
        {
 | 
			
		||||
            return "nil";
 | 
			
		||||
        }
 | 
			
		||||
        if( value instanceof String )
 | 
			
		||||
        {
 | 
			
		||||
            return "string";
 | 
			
		||||
        }
 | 
			
		||||
        if( value instanceof Boolean )
 | 
			
		||||
        {
 | 
			
		||||
            return "boolean";
 | 
			
		||||
        }
 | 
			
		||||
        if( value instanceof Number )
 | 
			
		||||
        {
 | 
			
		||||
            return "number";
 | 
			
		||||
        }
 | 
			
		||||
        if( value instanceof Map )
 | 
			
		||||
        {
 | 
			
		||||
            return "table";
 | 
			
		||||
        }
 | 
			
		||||
        return "userdata";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Ensure a numeric argument is finite (i.e. not infinite or {@link Double#NaN}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument index to check.
 | 
			
		||||
     * @param value The value to check.
 | 
			
		||||
     * @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() );
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Ensure a numeric argument is finite (i.e. not infinite or {@link Double#NaN}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param index The argument index to check.
 | 
			
		||||
     * @param value The value to check.
 | 
			
		||||
     * @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 ) );
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a more detailed representation of this number's type. If this is finite, it will just return "number", otherwise it returns whether it is
 | 
			
		||||
     * infinite or NaN.
 | 
			
		||||
     *
 | 
			
		||||
     * @param value The value to extract the type for.
 | 
			
		||||
     * @return This value's numeric type.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static String getNumericType( double value )
 | 
			
		||||
    {
 | 
			
		||||
        if( Double.isNaN( value ) )
 | 
			
		||||
        {
 | 
			
		||||
            return "nan";
 | 
			
		||||
        }
 | 
			
		||||
        if( value == Double.POSITIVE_INFINITY )
 | 
			
		||||
        {
 | 
			
		||||
            return "inf";
 | 
			
		||||
        }
 | 
			
		||||
        if( value == Double.NEGATIVE_INFINITY )
 | 
			
		||||
        {
 | 
			
		||||
            return "-inf";
 | 
			
		||||
        }
 | 
			
		||||
        return "number";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Ensure a string is a valid enum value.
 | 
			
		||||
     *
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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 ) )
 | 
			
		||||
            {
 | 
			
		||||
                return possibility;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new LuaException( "bad argument #" + (index + 1) + " (unknown option " + value + ")" );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										176
									
								
								src/main/java/dan200/computercraft/api/lua/MethodResult.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								src/main/java/dan200/computercraft/api/lua/MethodResult.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,176 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 );
 | 
			
		||||
 | 
			
		||||
    private final Object[] result;
 | 
			
		||||
    private final ILuaCallback callback;
 | 
			
		||||
    private final int adjust;
 | 
			
		||||
 | 
			
		||||
    private MethodResult( Object[] arguments, ILuaCallback callback )
 | 
			
		||||
    {
 | 
			
		||||
        result = arguments;
 | 
			
		||||
        this.callback = callback;
 | 
			
		||||
        adjust = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MethodResult( Object[] arguments, ILuaCallback callback, int adjust )
 | 
			
		||||
    {
 | 
			
		||||
        result = arguments;
 | 
			
		||||
        this.callback = callback;
 | 
			
		||||
        this.adjust = adjust;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return no values immediately.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A method result which returns immediately with no values.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static MethodResult of()
 | 
			
		||||
    {
 | 
			
		||||
        return empty;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a single value immediately.
 | 
			
		||||
     *
 | 
			
		||||
     * Integers, doubles, floats, strings, booleans, {@link Map}, {@link Collection}s, arrays and {@code null} will be converted to their corresponding Lua
 | 
			
		||||
     * type. {@code byte[]} and {@link ByteBuffer} will be treated as binary strings. {@link ILuaFunction} will be treated as a function.
 | 
			
		||||
     *
 | 
			
		||||
     * In order to provide a custom object with methods, one may return a {@link IDynamicLuaObject}, or an arbitrary class with {@link LuaFunction}
 | 
			
		||||
     * annotations. Anything else will be converted to {@code nil}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param value The value to return to the calling Lua function.
 | 
			
		||||
     * @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 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return any number of values immediately.
 | 
			
		||||
     *
 | 
			
		||||
     * @param values The values to return. See {@link #of(Object)} for acceptable values.
 | 
			
		||||
     * @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 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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 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 );
 | 
			
		||||
            }
 | 
			
		||||
            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 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 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Yield the current coroutine with some arguments until it is resumed. This method is exactly equivalent to {@code coroutine.yield()} in lua. Use
 | 
			
		||||
     * {@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()
 | 
			
		||||
     * @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 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public Object[] getResult()
 | 
			
		||||
    {
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public ILuaCallback getCallback()
 | 
			
		||||
    {
 | 
			
		||||
        return callback;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getErrorAdjust()
 | 
			
		||||
    {
 | 
			
		||||
        return adjust;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Increase the Lua error by a specific amount. One should never need to use this function - it largely exists for some CC internal code.
 | 
			
		||||
     *
 | 
			
		||||
     * @param adjust The amount to increase the level by.
 | 
			
		||||
     * @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" );
 | 
			
		||||
        }
 | 
			
		||||
        if( adjust == 0 || callback == null )
 | 
			
		||||
        {
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        return new MethodResult( result, callback, this.adjust + adjust );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,75 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 javax.annotation.Nullable;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An implementation of {@link IArguments} which wraps an array of {@link Object}.
 | 
			
		||||
 */
 | 
			
		||||
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 )
 | 
			
		||||
    {
 | 
			
		||||
        throw new IllegalStateException();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ObjectArguments( Object... args )
 | 
			
		||||
    {
 | 
			
		||||
        this.args = Arrays.asList( 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" );
 | 
			
		||||
        }
 | 
			
		||||
        if( count == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        if( count >= args.size() )
 | 
			
		||||
        {
 | 
			
		||||
            return EMPTY;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return new ObjectArguments( args.subList( count, args.size() ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object[] getAll()
 | 
			
		||||
    {
 | 
			
		||||
        return args.toArray();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int count()
 | 
			
		||||
    {
 | 
			
		||||
        return args.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object get( int index )
 | 
			
		||||
    {
 | 
			
		||||
        return index >= args.size() ? null : args.get( index );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,15 +1,14 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.media;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.SoundEvent;
 | 
			
		||||
import net.minecraft.sound.SoundEvent;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -18,8 +17,7 @@ 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}.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
@@ -45,8 +43,7 @@ public interface IMedia
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If this disk represents an item with audio (like a record), get the readable name of the audio track. ie:
 | 
			
		||||
     * "Jonathan Coulton - Still Alive"
 | 
			
		||||
     * If this disk represents an item with audio (like a record), get the readable name of the audio track. ie: "Jonathan Coulton - Still Alive"
 | 
			
		||||
     *
 | 
			
		||||
     * @param stack The {@link ItemStack} to modify.
 | 
			
		||||
     * @return The name, or null if this item does not represent an item with audio.
 | 
			
		||||
@@ -70,17 +67,17 @@ public interface IMedia
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If this disk represents an item with data (like a floppy disk), get a mount representing it's contents. This will
 | 
			
		||||
     * be mounted onto the filesystem of the computer while the media is in the disk drive.
 | 
			
		||||
     * If this disk represents an item with data (like a floppy disk), get a mount representing it's contents. This will be mounted onto the filesystem of
 | 
			
		||||
     * the computer while the media is in the disk drive.
 | 
			
		||||
     *
 | 
			
		||||
     * @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()
 | 
			
		||||
     * @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()
 | 
			
		||||
     * @see IMount
 | 
			
		||||
     * @see dan200.computercraft.api.filesystem.IWritableMount
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String)
 | 
			
		||||
     * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world )
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.media;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network;
 | 
			
		||||
@@ -37,8 +37,8 @@ public interface IPacketNetwork
 | 
			
		||||
    boolean isWireless();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Submit a packet for transmitting across the network. This will route the packet through the network, sending it
 | 
			
		||||
     * to all receivers within range (or any interdimensional ones).
 | 
			
		||||
     * Submit a packet for transmitting across the network. This will route the packet through the network, sending it to all receivers within range (or any
 | 
			
		||||
     * interdimensional ones).
 | 
			
		||||
     *
 | 
			
		||||
     * @param packet The packet to send.
 | 
			
		||||
     * @param range  The maximum distance this packet will be sent.
 | 
			
		||||
@@ -48,8 +48,8 @@ public interface IPacketNetwork
 | 
			
		||||
    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 dimensions.
 | 
			
		||||
     * Submit a packet for transmitting across the network. This will route the packet through the network, sending it to all receivers across all
 | 
			
		||||
     * dimensions.
 | 
			
		||||
     *
 | 
			
		||||
     * @param packet The packet to send.
 | 
			
		||||
     * @see #transmitSameDimension(Packet, double)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network;
 | 
			
		||||
@@ -34,9 +34,8 @@ public interface IPacketReceiver
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the maximum distance this receiver can send and receive messages.
 | 
			
		||||
     *
 | 
			
		||||
     * When determining whether a receiver can receive a message, the largest distance of the packet and receiver is
 | 
			
		||||
     * used - ensuring it is within range. If the packet or receiver is inter-dimensional, then the packet will always
 | 
			
		||||
     * be received.
 | 
			
		||||
     * When determining whether a receiver can receive a message, the largest distance of the packet and receiver is used - ensuring it is within range. If
 | 
			
		||||
     * the packet or receiver is inter-dimensional, then the packet will always be received.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The maximum distance this device can send and receive messages.
 | 
			
		||||
     * @see #isInterdimensional()
 | 
			
		||||
@@ -60,8 +59,8 @@ 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()
 | 
			
		||||
@@ -73,8 +72,8 @@ public interface IPacketReceiver
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @see Packet
 | 
			
		||||
     * @see IPacketNetwork#transmitInterdimensional(Packet)
 | 
			
		||||
     * @see IPacketNetwork#transmitSameDimension(Packet, double)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network;
 | 
			
		||||
@@ -32,8 +32,8 @@ public interface IPacketSender
 | 
			
		||||
    Vec3d getPosition();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get some sort of identification string for this sender. This does not strictly need to be unique, but you
 | 
			
		||||
     * should be able to extract some identifiable information from it.
 | 
			
		||||
     * Get some sort of identification string for this sender. This does not strictly need to be unique, but you should be able to extract some identifiable
 | 
			
		||||
     * information from it.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This device's id.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network;
 | 
			
		||||
@@ -29,11 +29,10 @@ 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 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 )
 | 
			
		||||
@@ -47,8 +46,7 @@ public class Packet
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the channel this packet is sent along. Receivers should generally only process packets from on channels they
 | 
			
		||||
     * are listening to.
 | 
			
		||||
     * Get the channel this packet is sent along. Receivers should generally only process packets from on channels they are listening to.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This packet's channel.
 | 
			
		||||
     */
 | 
			
		||||
@@ -68,8 +66,7 @@ public class Packet
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The actual data of this packet. This should be a "valid" Lua object, safe for queuing as an
 | 
			
		||||
     * event or returning from a peripheral call.
 | 
			
		||||
     * The actual data of this packet. This should be a "valid" Lua object, safe for queuing as an event or returning from a peripheral call.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The packet's payload
 | 
			
		||||
     */
 | 
			
		||||
@@ -90,20 +87,6 @@ public class Packet
 | 
			
		||||
        return sender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals( Object o )
 | 
			
		||||
    {
 | 
			
		||||
        if( this == o ) return true;
 | 
			
		||||
        if( o == null || getClass() != o.getClass() ) return false;
 | 
			
		||||
 | 
			
		||||
        Packet packet = (Packet) o;
 | 
			
		||||
 | 
			
		||||
        if( channel != packet.channel ) return false;
 | 
			
		||||
        if( replyChannel != packet.replyChannel ) return false;
 | 
			
		||||
        if( !Objects.equals( payload, packet.payload ) ) return false;
 | 
			
		||||
        return sender.equals( packet.sender );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
@@ -114,4 +97,33 @@ public class Packet
 | 
			
		||||
        result = 31 * result + sender.hashCode();
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals( Object o )
 | 
			
		||||
    {
 | 
			
		||||
        if( this == o )
 | 
			
		||||
        {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if( o == null || getClass() != o.getClass() )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Packet packet = (Packet) o;
 | 
			
		||||
 | 
			
		||||
        if( channel != packet.channel )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if( replyChannel != packet.replyChannel )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if( !Objects.equals( payload, packet.payload ) )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return sender.equals( packet.sender );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
@@ -13,18 +12,16 @@ import javax.annotation.Nonnull;
 | 
			
		||||
/**
 | 
			
		||||
 * An object which may be part of a wired network.
 | 
			
		||||
 *
 | 
			
		||||
 * Elements should construct a node using {@link ComputerCraftAPI#createWiredNodeForElement(IWiredElement)}. This acts
 | 
			
		||||
 * as a proxy for all network objects. Whilst the node may change networks, an element's node should remain constant
 | 
			
		||||
 * for its lifespan.
 | 
			
		||||
 * Elements should construct a node using {@link ComputerCraftAPI#createWiredNodeForElement(IWiredElement)}. This acts as a proxy for all network objects.
 | 
			
		||||
 * Whilst the node may change networks, an element's node should remain constant for its lifespan.
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when objects on the network change. This may occur when network nodes are added or removed, or when
 | 
			
		||||
     * peripherals change.
 | 
			
		||||
     * 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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
@@ -12,16 +11,14 @@ import javax.annotation.Nonnull;
 | 
			
		||||
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.
 | 
			
		||||
 * A wired network is composed of one of more {@link IWiredNode}s, a set of connections between them, and a series of peripherals.
 | 
			
		||||
 *
 | 
			
		||||
 * Networks from a connected graph. This means there is some path between all nodes on the network. Further more, if
 | 
			
		||||
 * there is some path between two nodes then they must be on the same network. {@link IWiredNetwork} will automatically
 | 
			
		||||
 * handle the merging and splitting of networks (and thus changing of available nodes and peripherals) as connections
 | 
			
		||||
 * change.
 | 
			
		||||
 * Networks from a connected graph. This means there is some path between all nodes on the network. Further more, if there is some path between two nodes
 | 
			
		||||
 * then they must be on the same network. {@link IWiredNetwork} will automatically handle the merging and splitting of networks (and thus changing of
 | 
			
		||||
 * available nodes and peripherals) as connections change.
 | 
			
		||||
 *
 | 
			
		||||
 * This does mean one can not rely on the network remaining consistent between subsequent operations. Consequently,
 | 
			
		||||
 * it is generally preferred to use the methods provided by {@link IWiredNode}.
 | 
			
		||||
 * This does mean one can not rely on the network remaining consistent between subsequent operations. Consequently, it is generally preferred to use the
 | 
			
		||||
 * methods provided by {@link IWiredNode}.
 | 
			
		||||
 *
 | 
			
		||||
 * @see IWiredNode#getNetwork()
 | 
			
		||||
 */
 | 
			
		||||
@@ -60,12 +57,10 @@ public interface IWiredNetwork
 | 
			
		||||
    /**
 | 
			
		||||
     * Sever all connections this node has, removing it from this network.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread. You should only call this on nodes
 | 
			
		||||
     * that your network element owns.
 | 
			
		||||
     * 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 remove
 | 
			
		||||
     * @return Whether this node was removed from the network. One cannot remove a node from a network where it is the
 | 
			
		||||
     * only element.
 | 
			
		||||
     * @return Whether this node was removed from the network. One cannot remove a node from a network where it is the only element.
 | 
			
		||||
     * @throws IllegalArgumentException If the node is not in the network.
 | 
			
		||||
     * @see IWiredNode#remove()
 | 
			
		||||
     */
 | 
			
		||||
@@ -74,8 +69,7 @@ public interface IWiredNetwork
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * 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 peripherals The new peripherals for this node.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
@@ -19,8 +18,8 @@ import java.util.Map;
 | 
			
		||||
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.
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The set of removed peripherals.
 | 
			
		||||
     */
 | 
			
		||||
@@ -28,8 +27,8 @@ public interface IWiredNetworkChange
 | 
			
		||||
    Map<String, IPeripheral> peripheralsRemoved();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A set of peripherals which have been added. Note that there may be entries with the same name
 | 
			
		||||
     * in the added and removed set, but with a different peripheral.
 | 
			
		||||
     * A set of peripherals which have been added. Note that there may be entries with the same name in the added and removed set, but with a different
 | 
			
		||||
     * peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The set of added peripherals.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.network.IPacketNetwork;
 | 
			
		||||
@@ -15,15 +14,14 @@ import java.util.Map;
 | 
			
		||||
/**
 | 
			
		||||
 * Wired nodes act as a layer between {@link IWiredElement}s and {@link IWiredNetwork}s.
 | 
			
		||||
 *
 | 
			
		||||
 * Firstly, a node acts as a packet network, capable of sending and receiving modem messages to connected nodes. These
 | 
			
		||||
 * methods may be safely used on any thread.
 | 
			
		||||
 * Firstly, a node acts as a packet network, capable of sending and receiving modem messages to connected nodes. These methods may be safely used on any
 | 
			
		||||
 * thread.
 | 
			
		||||
 *
 | 
			
		||||
 * When sending a packet, the system will attempt to find the shortest path between the two nodes based on their
 | 
			
		||||
 * element's position. Note that packet senders and receivers can have different locations from their associated
 | 
			
		||||
 * element: the distance between the two will be added to the total packet's distance.
 | 
			
		||||
 * When sending a packet, the system will attempt to find the shortest path between the two nodes based on their element's position. Note that packet
 | 
			
		||||
 * senders and receivers can have different locations from their associated element: the distance between the two will be added to the total packet's
 | 
			
		||||
 * distance.
 | 
			
		||||
 *
 | 
			
		||||
 * Wired nodes also provide several convenience methods for interacting with a wired network. These should only ever
 | 
			
		||||
 * be used on the main server thread.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
@@ -35,17 +33,6 @@ public interface IWiredNode extends IPacketNetwork
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IWiredElement getElement();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The network this node is currently connected to. Note that this may change
 | 
			
		||||
     * after any network operation, so it should not be cached.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This node's network.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IWiredNetwork getNetwork();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a connection from this node to another.
 | 
			
		||||
     *
 | 
			
		||||
@@ -61,6 +48,16 @@ public interface IWiredNode extends IPacketNetwork
 | 
			
		||||
        return getNetwork().connect( this, node );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The network this node is currently connected to. Note that this may change after any network operation, so it should not be cached.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This node's network.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IWiredNetwork getNetwork();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Destroy a connection between this node and another.
 | 
			
		||||
     *
 | 
			
		||||
@@ -80,11 +77,9 @@ public interface IWiredNode extends IPacketNetwork
 | 
			
		||||
    /**
 | 
			
		||||
     * Sever all connections this node has, removing it from this network.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread. You should only call this on nodes
 | 
			
		||||
     * that your network element owns.
 | 
			
		||||
     * This should only be used on the server thread. You should only call this on nodes that your network element owns.
 | 
			
		||||
     *
 | 
			
		||||
     * @return Whether this node was removed from the network. One cannot remove a node from a network where it is the
 | 
			
		||||
     * only element.
 | 
			
		||||
     * @return Whether this node was removed from the network. One cannot remove a node from a network where it is the only element.
 | 
			
		||||
     * @throws IllegalArgumentException If the node is not in the network.
 | 
			
		||||
     * @see IWiredNetwork#remove(IWiredNode)
 | 
			
		||||
     */
 | 
			
		||||
@@ -96,8 +91,7 @@ public interface IWiredNode extends IPacketNetwork
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark this node's peripherals as having changed.
 | 
			
		||||
     *
 | 
			
		||||
     * This should only be used on the server thread. You should only call this on nodes
 | 
			
		||||
     * that your network element owns.
 | 
			
		||||
     * This should only be used on the server thread. You should only call this on nodes that your network element owns.
 | 
			
		||||
     *
 | 
			
		||||
     * @param peripherals The new peripherals for this node.
 | 
			
		||||
     * @see IWiredNetwork#updatePeripherals(IWiredNode, Map)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.network.wired;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.network.IPacketSender;
 | 
			
		||||
@@ -13,16 +12,14 @@ 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.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The node in the network representing this object.
 | 
			
		||||
     *
 | 
			
		||||
     * This should be used as a proxy for the main network. One should send packets
 | 
			
		||||
     * and register receivers through this object.
 | 
			
		||||
     * This should be used as a proxy for the main network. One should send packets and register receivers through this object.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The node for this element.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,27 +1,26 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IMount;
 | 
			
		||||
import dan200.computercraft.api.filesystem.IWritableMount;
 | 
			
		||||
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.Collections;
 | 
			
		||||
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.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
@@ -30,11 +29,11 @@ public interface IComputerAccess
 | 
			
		||||
     *
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws RuntimeException If the peripheral has been detached.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(Class, String, String)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
     * @see #mount(String, IMount, String)
 | 
			
		||||
     * @see #mountWritable(String, IWritableMount)
 | 
			
		||||
     * @see #unmount(String)
 | 
			
		||||
@@ -52,11 +51,11 @@ public interface IComputerAccess
 | 
			
		||||
     * @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()}.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws RuntimeException If the peripheral has been detached.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(Class, String, String)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
     * @see #mount(String, IMount)
 | 
			
		||||
     * @see #mountWritable(String, IWritableMount)
 | 
			
		||||
     * @see #unmount(String)
 | 
			
		||||
@@ -65,16 +64,27 @@ public interface IComputerAccess
 | 
			
		||||
    @Nullable
 | 
			
		||||
    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
 | 
			
		||||
     * "left","right","front","back",etc, but for peripherals attached remotely it will be different. It is good practice to supply this string when raising
 | 
			
		||||
     * events to the computer, so that the computer knows from which peripheral the event came.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A string unique to the computer, but not globally.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws RuntimeException If the peripheral has been detached.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(Class, String, String)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
     * @see #mount(String, IMount)
 | 
			
		||||
     * @see #unmount(String)
 | 
			
		||||
     * @see IMount
 | 
			
		||||
@@ -91,11 +101,11 @@ public interface IComputerAccess
 | 
			
		||||
     * @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()}.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws RuntimeException If the peripheral has been detached.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see ComputerCraftAPI#createSaveDirMount(World, String, long)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(Class, String, String)
 | 
			
		||||
     * @see ComputerCraftAPI#createResourceMount(String, String)
 | 
			
		||||
     * @see #mount(String, IMount)
 | 
			
		||||
     * @see #unmount(String)
 | 
			
		||||
     * @see IMount
 | 
			
		||||
@@ -103,20 +113,18 @@ public interface IComputerAccess
 | 
			
		||||
    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, IWritableMount)}.
 | 
			
		||||
     * Unmounts a directory previously mounted onto the computers file system by {@link #mount(String, IMount)} or {@link #mountWritable(String,
 | 
			
		||||
     * IWritableMount)}.
 | 
			
		||||
     *
 | 
			
		||||
     * When a directory is unmounted, it will disappear from the computers file system, and the user will no longer be
 | 
			
		||||
     * able to access it. All directories mounted by a mount or mountWritable are automatically unmounted when the
 | 
			
		||||
     * peripheral is attached if they have not been explicitly unmounted.
 | 
			
		||||
     * When a directory is unmounted, it will disappear from the computers file system, and the user will no longer be able to access it. All directories
 | 
			
		||||
     * mounted by a mount or mountWritable are automatically unmounted when the peripheral is attached if they have not been explicitly unmounted.
 | 
			
		||||
     *
 | 
			
		||||
     * 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 RuntimeException If the peripheral has been detached.
 | 
			
		||||
     * @throws RuntimeException If the mount does not exist, or was mounted by another peripheral.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws IllegalStateException If the mount does not exist, or was mounted by another peripheral.
 | 
			
		||||
     * @see #mount(String, IMount)
 | 
			
		||||
     * @see #mountWritable(String, IWritableMount)
 | 
			
		||||
     */
 | 
			
		||||
@@ -125,45 +133,28 @@ public interface IComputerAccess
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the numerical ID of this computer.
 | 
			
		||||
     *
 | 
			
		||||
     * This is the same number obtained by calling {@code os.getComputerID()} or running the "id" program from lua,
 | 
			
		||||
     * and is guaranteed unique. This number will be positive.
 | 
			
		||||
     * This is the same number obtained by calling {@code os.getComputerID()} or running the "id" program from lua, and is guaranteed unique. This number
 | 
			
		||||
     * will be positive.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The identifier.
 | 
			
		||||
     */
 | 
			
		||||
    int getID();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * 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 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().
 | 
			
		||||
     * @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().
 | 
			
		||||
     *
 | 
			
		||||
     *                  You may supply {@code null} to indicate that no arguments are to be supplied.
 | 
			
		||||
     * @throws RuntimeException If the peripheral has been detached.
 | 
			
		||||
     * @see IPeripheral#callMethod
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see MethodResult#pullEvent(String, ILuaCallback)
 | 
			
		||||
     */
 | 
			
		||||
    void queueEvent( @Nonnull String event, @Nullable Object[] arguments );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a string, unique to the computer, by which the computer refers to this peripheral.
 | 
			
		||||
     * For directly attached peripherals this will be "left","right","front","back",etc, but
 | 
			
		||||
     * for peripherals attached remotely it will be different. It is good practice to supply
 | 
			
		||||
     * this string when raising events to the computer, so that the computer knows from
 | 
			
		||||
     * which peripheral the event came.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A string unique to the computer, but not globally.
 | 
			
		||||
     * @throws RuntimeException If the peripheral has been detached.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String getAttachmentName();
 | 
			
		||||
    void queueEvent( @Nonnull String event, @Nullable Object... arguments );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a set of peripherals that this computer access can "see", along with their attachment name.
 | 
			
		||||
@@ -171,45 +162,36 @@ public interface IComputerAccess
 | 
			
		||||
     * This may include other peripherals on the wired network or peripherals on other sides of the computer.
 | 
			
		||||
     *
 | 
			
		||||
     * @return All reachable peripherals
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     * @see #getAttachmentName()
 | 
			
		||||
     * @see #getAvailablePeripheral(String)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default Map<String, IPeripheral> getAvailablePeripherals()
 | 
			
		||||
    {
 | 
			
		||||
        return Collections.emptyMap();
 | 
			
		||||
    }
 | 
			
		||||
    Map<String, IPeripheral> getAvailablePeripherals();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a reachable peripheral with the given attachment name. This is a equivalent to
 | 
			
		||||
     * {@link #getAvailablePeripherals()}{@code .get(name)}, though may be more efficient.
 | 
			
		||||
     * Get a reachable peripheral with the given attachment name. This is a equivalent to {@link #getAvailablePeripherals()}{@code .get(name)}, though may
 | 
			
		||||
     * be more efficient.
 | 
			
		||||
     *
 | 
			
		||||
     * @param name The peripheral's attached name
 | 
			
		||||
     * @return The reachable peripheral, or {@code null} if none can be found.
 | 
			
		||||
     * @see #getAvailablePeripherals()
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default IPeripheral getAvailablePeripheral( @Nonnull String name )
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
    IPeripheral getAvailablePeripheral( @Nonnull String name );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a {@link IWorkMonitor} for tasks your peripheral might execute on the main (server) thread.
 | 
			
		||||
     *
 | 
			
		||||
     * This should be used to ensure your peripheral integrates with ComputerCraft's monitoring and limiting of how much
 | 
			
		||||
     * server time each computer consumes. You should not need to use this if you use
 | 
			
		||||
     * {@link ILuaContext#issueMainThreadTask(ILuaTask)} - this is intended for mods with their own system for running
 | 
			
		||||
     * work on the main thread.
 | 
			
		||||
     * This should be used to ensure your peripheral integrates with ComputerCraft's monitoring and limiting of how much server time each computer consumes.
 | 
			
		||||
     * You should not need to use this if you use {@link ILuaContext#issueMainThreadTask(ILuaTask)} - this is intended for mods with their own system for
 | 
			
		||||
     * running work on the main thread.
 | 
			
		||||
     *
 | 
			
		||||
     * Please note that the returned implementation is <em>not</em> thread-safe, and should only be used from the main
 | 
			
		||||
     * thread.
 | 
			
		||||
     * Please note that the returned implementation is <em>not</em> thread-safe, and should only be used from the main thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The work monitor for the main thread, or {@code null} if this computer does not have one.
 | 
			
		||||
     * @throws NotAttachedException If the peripheral has been detached.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default IWorkMonitor getMainThreadMonitor()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IWorkMonitor getMainThreadMonitor();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,48 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.peripheral;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A peripheral whose methods are not known at runtime.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * @return An array of strings representing method names.
 | 
			
		||||
     * @see #callMethod
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String[] getMethodNames();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This is called when a lua program on an attached computer calls {@code peripheral.call()} with one of the methods exposed by {@link
 | 
			
		||||
     * #getMethodNames()}.
 | 
			
		||||
     *
 | 
			
		||||
     * 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 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.
 | 
			
		||||
     * @see #getMethodNames()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    MethodResult callMethod( @Nonnull IComputerAccess computer, @Nonnull ILuaContext context, int method, @Nonnull IArguments arguments ) throws LuaException;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,95 +1,45 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
import dan200.computercraft.api.lua.LuaFunction;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The interface that defines a peripheral. See {@link IPeripheralProvider} for how to associate blocks with peripherals.
 | 
			
		||||
 * The interface that defines a peripheral.
 | 
			
		||||
 *
 | 
			
		||||
 * In order to expose a peripheral for your block or tile entity, you register a {@link IPeripheralProvider}. This <em>cannot</em> be implemented {@link
 | 
			
		||||
 * IPeripheral} directly on the tile.
 | 
			
		||||
 *
 | 
			
		||||
 * Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing {@link IDynamicPeripheral}.
 | 
			
		||||
 */
 | 
			
		||||
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()}
 | 
			
		||||
     * Should return a string that uniquely identifies this type of peripheral. This can be queried from lua by calling {@code peripheral.getType()}
 | 
			
		||||
     *
 | 
			
		||||
     * @return A string identifying the type of peripheral.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String getType();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * @return An array of strings representing method names.
 | 
			
		||||
     * @see #callMethod
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String[] getMethodNames();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This is called when a lua program on an attached computer calls {@code peripheral.call()} with
 | 
			
		||||
     * one of the methods exposed by {@link #getMethodNames()}.
 | 
			
		||||
     *
 | 
			
		||||
     * 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 arguments An array of objects, representing the arguments passed into {@code peripheral.call()}.<br>
 | 
			
		||||
     *                  Lua values of type "string" will be represented by Object type String.<br>
 | 
			
		||||
     *                  Lua values of type "number" will be represented by Object type Double.<br>
 | 
			
		||||
     *                  Lua values of type "boolean" will be represented by Object type Boolean.<br>
 | 
			
		||||
     *                  Lua values of type "table" will be represented by Object type Map.<br>
 | 
			
		||||
     *                  Lua values of any other type will be represented by a null object.<br>
 | 
			
		||||
     *                  This array will be empty if no arguments are passed.
 | 
			
		||||
     * @return An array of objects, representing values you wish to return to the lua program. Integers, Doubles, Floats,
 | 
			
		||||
     * Strings, Booleans, Maps and ILuaObject and null be converted to their corresponding lua type. All other types
 | 
			
		||||
     * will be converted to nil.
 | 
			
		||||
     *
 | 
			
		||||
     * You may return null to indicate no values should be returned.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws InterruptedException If the user shuts down or reboots the computer the coroutine is suspended,
 | 
			
		||||
     *                              InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                              intercepted, or the computer will leak memory and end up in a broken state.
 | 
			
		||||
     * @see #getMethodNames
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Object[] callMethod( @Nonnull IComputerAccess computer, @Nonnull ILuaContext context, int method, @Nonnull Object[] arguments ) throws LuaException, InterruptedException;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Is called when when a computer is attaching to the peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * This will occur when a peripheral is placed next to an active computer, when a computer is turned on next to a
 | 
			
		||||
     * peripheral, when a turtle travels into a square next to a peripheral, or when a wired modem adjacent to this
 | 
			
		||||
     * peripheral is does any of the above.
 | 
			
		||||
     * This will occur when a peripheral is placed next to an active computer, when a computer is turned on next to a peripheral, when a turtle travels into
 | 
			
		||||
     * a square next to a peripheral, or when a wired modem adjacent to this peripheral is does any of the above.
 | 
			
		||||
     *
 | 
			
		||||
     * Between calls to attach and {@link #detach}, the attached computer can make method calls on the peripheral using
 | 
			
		||||
     * {@code peripheral.call()}. This method can be used to keep track of which computers are attached to the
 | 
			
		||||
     * peripheral, or to take action when attachment occurs.
 | 
			
		||||
     * Between calls to attach and {@link #detach}, the attached computer can make method calls on the peripheral using {@code peripheral.call()}. This
 | 
			
		||||
     * method can be used to keep track of which computers are attached to the peripheral, or to take action when attachment occurs.
 | 
			
		||||
     *
 | 
			
		||||
     * Be aware that will be called from both the server thread and ComputerCraft Lua thread, and so must be thread-safe
 | 
			
		||||
     * and reentrant.
 | 
			
		||||
     * Be aware that will be called from both the server thread and ComputerCraft Lua thread, and so must be thread-safe and reentrant.
 | 
			
		||||
     *
 | 
			
		||||
     * @param computer The interface to the computer that is being attached. Remember that multiple computers can be
 | 
			
		||||
     *                 attached to a peripheral at once.
 | 
			
		||||
     * @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 )
 | 
			
		||||
@@ -99,18 +49,14 @@ public interface IPeripheral
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when a computer is detaching from the peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * This will occur when a computer shuts down, when the peripheral is removed while attached to computers, when a
 | 
			
		||||
     * turtle moves away from a block attached to a peripheral, or when a wired modem adjacent to this peripheral is
 | 
			
		||||
     * detached.
 | 
			
		||||
     * This will occur when a computer shuts down, when the peripheral is removed while attached to computers, when a turtle moves away from a block
 | 
			
		||||
     * attached to a peripheral, or when a wired modem adjacent to this peripheral is detached.
 | 
			
		||||
     *
 | 
			
		||||
     * This method can be used to keep track of which computers are attached to the peripheral, or to take action when
 | 
			
		||||
     * detachment occurs.
 | 
			
		||||
     * This method can be used to keep track of which computers are attached to the peripheral, or to take action when detachment occurs.
 | 
			
		||||
     *
 | 
			
		||||
     * Be aware that this will be called from both the server and ComputerCraft Lua thread, and must be thread-safe
 | 
			
		||||
     * and reentrant.
 | 
			
		||||
     * Be aware that this will be called from both the server and ComputerCraft Lua thread, and must be thread-safe and reentrant.
 | 
			
		||||
     *
 | 
			
		||||
     * @param computer The interface to the computer that is being detached. Remember that multiple computers can be
 | 
			
		||||
     *                 attached to a peripheral at once.
 | 
			
		||||
     * @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 )
 | 
			
		||||
@@ -118,22 +64,21 @@ public interface IPeripheral
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the object that this peripheral provides methods for. This will generally be the tile entity
 | 
			
		||||
     * or block, but may be an inventory, entity, etc...
 | 
			
		||||
     * Get the object that this peripheral provides methods for. This will generally be the tile entity or block, but may be an inventory, entity, etc...
 | 
			
		||||
     *
 | 
			
		||||
     * @return The object this peripheral targets
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Nullable
 | 
			
		||||
    default Object getTarget()
 | 
			
		||||
    {
 | 
			
		||||
        return this;
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine whether this peripheral is equivalent to another one.
 | 
			
		||||
     *
 | 
			
		||||
     * The minimal example should at least check whether they are the same object. However, you may wish to check if
 | 
			
		||||
     * they point to the same block or tile entity.
 | 
			
		||||
     * The minimal example should at least check whether they are the same object. However, you may wish to check if they point to the same block or tile
 | 
			
		||||
     * entity.
 | 
			
		||||
     *
 | 
			
		||||
     * @param other The peripheral to compare against. This may be {@code null}.
 | 
			
		||||
     * @return Whether these peripherals are equivalent.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,22 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
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 javax.annotation.Nullable;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is used to create peripheral implementations for blocks.
 | 
			
		||||
 *
 | 
			
		||||
 * If you have a {@link TileEntity} which acts as a peripheral, you may alternatively implement {@link IPeripheralTile}.
 | 
			
		||||
 * If you have a {@link BlockEntity} which acts as a peripheral, you may alternatively expose the {@link IPeripheral} capability.
 | 
			
		||||
 *
 | 
			
		||||
 * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider)
 | 
			
		||||
 */
 | 
			
		||||
@@ -30,9 +29,9 @@ public interface IPeripheralProvider
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @return A peripheral, or {@code null} if there is not a peripheral here you'd like to handle.
 | 
			
		||||
     * @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)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side );
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,21 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 net.minecraft.util.EnumFacing;
 | 
			
		||||
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.tileentity.TileEntity} which may act as a peripheral.
 | 
			
		||||
 * 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}.
 | 
			
		||||
 * If you need more complex capabilities (such as handling TEs not belonging to your mod), you should use {@link IPeripheralProvider}.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPeripheralTile
 | 
			
		||||
{
 | 
			
		||||
@@ -25,8 +24,8 @@ public interface IPeripheralTile
 | 
			
		||||
     *
 | 
			
		||||
     * @param side The side to get the peripheral from.
 | 
			
		||||
     * @return A peripheral, or {@code null} if there is not a peripheral here.
 | 
			
		||||
     * @see IPeripheralProvider#getPeripheral(World, BlockPos, EnumFacing)
 | 
			
		||||
     * @see IPeripheralProvider#getPeripheral(World, BlockPos, Direction)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull EnumFacing side );
 | 
			
		||||
    IPeripheral getPeripheral( @Nonnull Direction side );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. 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.peripheral;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -11,15 +10,14 @@ import java.util.Objects;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * This is primarily intended for work done by peripherals on the main thread (such as on a tile entity's tick), but
 | 
			
		||||
 * could be used for other purposes (such as complex computations done on another thread).
 | 
			
		||||
 * This is primarily intended for work done by peripherals on the main thread (such as on a tile entity's tick), but could be used for other purposes (such
 | 
			
		||||
 * as complex computations done on another thread).
 | 
			
		||||
 *
 | 
			
		||||
 * Before running a task, one should call {@link #canWork()} to determine if the computer is currently allowed to
 | 
			
		||||
 * execute work. If that returns true, you should execute the task and use {@link #trackWork(long, TimeUnit)} to inform
 | 
			
		||||
 * the monitor how long that task took.
 | 
			
		||||
 * Before running a task, one should call {@link #canWork()} to determine if the computer is currently allowed to execute work. If that returns true, you
 | 
			
		||||
 * should execute the task and use {@link #trackWork(long, TimeUnit)} to inform the monitor how long that task took.
 | 
			
		||||
 *
 | 
			
		||||
 * Alternatively, use {@link #runWork(Runnable)} to run and keep track of work.
 | 
			
		||||
 *
 | 
			
		||||
@@ -27,31 +25,16 @@ import java.util.concurrent.TimeUnit;
 | 
			
		||||
 */
 | 
			
		||||
public interface IWorkMonitor
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * If the owning computer is currently allowed to execute work.
 | 
			
		||||
     *
 | 
			
		||||
     * @return If we can execute work right now.
 | 
			
		||||
     */
 | 
			
		||||
    boolean canWork();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If the owning computer is currently allowed to execute work, and has ample time to do so.
 | 
			
		||||
     *
 | 
			
		||||
     * This is effectively a more restrictive form of {@link #canWork()}. One should use that in order to determine if
 | 
			
		||||
     * you may do an initial piece of work, and shouldWork to determine if any additional task may be performed.
 | 
			
		||||
     * This is effectively a more restrictive form of {@link #canWork()}. One should use that in order to determine if you may do an initial piece of work,
 | 
			
		||||
     * and shouldWork to determine if any additional task may be performed.
 | 
			
		||||
     *
 | 
			
		||||
     * @return If we should execute work right now.
 | 
			
		||||
     */
 | 
			
		||||
    boolean shouldWork();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inform the monitor how long some piece of work took to execute.
 | 
			
		||||
     *
 | 
			
		||||
     * @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 );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Run a task if possible, and inform the monitor of how long it took.
 | 
			
		||||
     *
 | 
			
		||||
@@ -61,7 +44,10 @@ public interface IWorkMonitor
 | 
			
		||||
    default boolean runWork( @Nonnull Runnable runnable )
 | 
			
		||||
    {
 | 
			
		||||
        Objects.requireNonNull( runnable, "runnable should not be null" );
 | 
			
		||||
        if( !canWork() ) return false;
 | 
			
		||||
        if( !canWork() )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        long start = System.nanoTime();
 | 
			
		||||
        try
 | 
			
		||||
@@ -75,4 +61,19 @@ public interface IWorkMonitor
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If the owning computer is currently allowed to execute work.
 | 
			
		||||
     *
 | 
			
		||||
     * @return If we can execute work right now.
 | 
			
		||||
     */
 | 
			
		||||
    boolean canWork();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inform the monitor how long some piece of work took to execute.
 | 
			
		||||
     *
 | 
			
		||||
     * @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 );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.peripheral;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Thrown when performing operations on {@link IComputerAccess} when the current peripheral is no longer attached to the computer.
 | 
			
		||||
 */
 | 
			
		||||
public class NotAttachedException extends IllegalStateException
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 1221244785535553536L;
 | 
			
		||||
 | 
			
		||||
    public NotAttachedException()
 | 
			
		||||
    {
 | 
			
		||||
        super( "You are not attached to this computer" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NotAttachedException( String s )
 | 
			
		||||
    {
 | 
			
		||||
        super( s );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. 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.pocket;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemConvertible;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.IItemProvider;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.Util;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -20,30 +19,33 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractPocketUpgrade implements IPocketUpgrade
 | 
			
		||||
{
 | 
			
		||||
    private final ResourceLocation id;
 | 
			
		||||
    private final Identifier id;
 | 
			
		||||
    private final String adjective;
 | 
			
		||||
    private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade( ResourceLocation id, String adjective, ItemStack stack )
 | 
			
		||||
    protected AbstractPocketUpgrade( Identifier id, ItemConvertible item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, Util.createTranslationKey( "upgrade", id ) + ".adjective", item );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade( Identifier id, String adjective, ItemConvertible item )
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.adjective = adjective;
 | 
			
		||||
        stack = new ItemStack( item );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade( Identifier id, String adjective, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.adjective = adjective;
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade( ResourceLocation id, String adjective, IItemProvider item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, adjective, new ItemStack( item ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractPocketUpgrade( ResourceLocation id, IItemProvider item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, Util.makeTranslationKey( "upgrade", id ) + ".adjective", new ItemStack( item ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final ResourceLocation getUpgradeID()
 | 
			
		||||
    public final Identifier getUpgradeID()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,21 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.pocket;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
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
 | 
			
		||||
 * Wrapper class for pocket computers.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPocketAccess
 | 
			
		||||
{
 | 
			
		||||
@@ -33,8 +32,7 @@ public interface IPocketAccess
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the colour of this pocket computer as a RGB number.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The colour this pocket computer is. This will be a RGB colour between {@code 0x000000} and
 | 
			
		||||
     * {@code 0xFFFFFF} or -1 if it has no colour.
 | 
			
		||||
     * @return The colour this pocket computer is. This will be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or -1 if it has no colour.
 | 
			
		||||
     * @see #setColour(int)
 | 
			
		||||
     */
 | 
			
		||||
    int getColour();
 | 
			
		||||
@@ -42,8 +40,8 @@ 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @see #getColour()
 | 
			
		||||
     */
 | 
			
		||||
    void setColour( int colour );
 | 
			
		||||
@@ -51,8 +49,7 @@ public interface IPocketAccess
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the colour of this pocket computer's light as a RGB number.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The colour this light is. This will be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or
 | 
			
		||||
     * -1 if it has no colour.
 | 
			
		||||
     * @return The colour this light is. This will be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or -1 if it has no colour.
 | 
			
		||||
     * @see #setLight(int)
 | 
			
		||||
     */
 | 
			
		||||
    int getLight();
 | 
			
		||||
@@ -60,8 +57,8 @@ 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @see #getLight()
 | 
			
		||||
     */
 | 
			
		||||
    void setLight( int colour );
 | 
			
		||||
@@ -75,7 +72,7 @@ public interface IPocketAccess
 | 
			
		||||
     * @see #updateUpgradeNBTData()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    NBTTagCompound getUpgradeNBTData();
 | 
			
		||||
    CompoundTag getUpgradeNBTData();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark the upgrade-specific NBT as dirty.
 | 
			
		||||
@@ -95,5 +92,5 @@ public interface IPocketAccess
 | 
			
		||||
     * @return A collection of all upgrade names.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Map<ResourceLocation, IPeripheral> getUpgrades();
 | 
			
		||||
    Map<Identifier, IPeripheral> getUpgrades();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.pocket;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.IUpgradeBase;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -19,55 +16,15 @@ import javax.annotation.Nullable;
 | 
			
		||||
/**
 | 
			
		||||
 * Additional peripherals for pocket computers.
 | 
			
		||||
 *
 | 
			
		||||
 * This is similar to {@link ITurtleUpgrade}.
 | 
			
		||||
 * @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade)
 | 
			
		||||
 */
 | 
			
		||||
public interface IPocketUpgrade
 | 
			
		||||
public interface IPocketUpgrade extends 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 upgrade's id.
 | 
			
		||||
     * @see IPocketUpgrade#getUpgradeID()
 | 
			
		||||
     * @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ResourceLocation 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();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a peripheral for the pocket computer.
 | 
			
		||||
     *
 | 
			
		||||
     * The peripheral created will be stored for the lifetime of the upgrade, will be passed an argument to
 | 
			
		||||
     * {@link #update(IPocketAccess, IPeripheral)} and will be attached, detached and have methods called in the same
 | 
			
		||||
     * manner as an ordinary peripheral.
 | 
			
		||||
     * The peripheral created will be stored for the lifetime of the upgrade, will be passed an argument to {@link #update(IPocketAccess, IPeripheral)} and
 | 
			
		||||
     * will be attached, detached and have methods called in the same manner as an ordinary peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @param access The access object for the pocket item stack.
 | 
			
		||||
     * @return The newly created peripheral.
 | 
			
		||||
@@ -93,9 +50,8 @@ public interface IPocketUpgrade
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @see #createPeripheral(IPocketAccess)
 | 
			
		||||
     */
 | 
			
		||||
    default boolean onRightClick( @Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.redstone;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -26,9 +25,8 @@ public interface IBundledRedstoneProvider
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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 EnumFacing side );
 | 
			
		||||
    int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. 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;
 | 
			
		||||
 | 
			
		||||
package dan200.computercraft.api;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleUpgradeType;
 | 
			
		||||
import net.minecraft.item.ItemConvertible;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.IItemProvider;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.Identifier;
 | 
			
		||||
import net.minecraft.util.Util;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -22,12 +19,17 @@ import javax.annotation.Nonnull;
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade
 | 
			
		||||
{
 | 
			
		||||
    private final ResourceLocation id;
 | 
			
		||||
    private final Identifier id;
 | 
			
		||||
    private final TurtleUpgradeType type;
 | 
			
		||||
    private final String adjective;
 | 
			
		||||
    private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, String adjective, 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, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.type = type;
 | 
			
		||||
@@ -35,24 +37,20 @@ public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, String adjective, IItemProvider item )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, type, adjective, new ItemStack( item ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        this( id, type, Util.makeTranslationKey( "upgrade", id ) + ".adjective", stack );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, IItemProvider 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 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public final ResourceLocation getUpgradeID()
 | 
			
		||||
    public final Identifier getUpgradeID()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
							
								
								
									
										356
									
								
								src/main/java/dan200/computercraft/api/turtle/FakePlayer.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										356
									
								
								src/main/java/dan200/computercraft/api/turtle/FakePlayer.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,356 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 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;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.entity.damage.DamageSource;
 | 
			
		||||
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.*;
 | 
			
		||||
import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket;
 | 
			
		||||
import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket;
 | 
			
		||||
import net.minecraft.recipe.Recipe;
 | 
			
		||||
import net.minecraft.screen.NamedScreenHandlerFactory;
 | 
			
		||||
import net.minecraft.screen.ScreenHandler;
 | 
			
		||||
import net.minecraft.server.network.ServerPlayNetworkHandler;
 | 
			
		||||
import net.minecraft.server.network.ServerPlayerEntity;
 | 
			
		||||
import net.minecraft.server.network.ServerPlayerInteractionManager;
 | 
			
		||||
import net.minecraft.server.world.ServerWorld;
 | 
			
		||||
import net.minecraft.sound.SoundCategory;
 | 
			
		||||
import net.minecraft.sound.SoundEvent;
 | 
			
		||||
import net.minecraft.text.Text;
 | 
			
		||||
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.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 ) );
 | 
			
		||||
        networkHandler = new FakeNetHandler( this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // region Direct networkHandler access
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enterCombat()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void endCombat()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void tick()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playerTick()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDeath( DamageSource damage )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Entity moveToWorld( ServerWorld destination )
 | 
			
		||||
    {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void wakeUp( boolean bl, boolean updateSleepingPlayers )
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean startRiding( Entity entity, boolean flag )
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stopRiding()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openEditSignScreen( SignBlockEntity tile )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public OptionalInt openHandledScreen( @Nullable NamedScreenHandlerFactory container )
 | 
			
		||||
    {
 | 
			
		||||
        return OptionalInt.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendTradeOffers( int id, TradeOfferList list, int level, int experience, boolean levelled, boolean refreshable )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openHorseInventory( HorseBaseEntity horse, Inventory inventory )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openEditBookScreen( ItemStack stack, Hand hand )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void openCommandBlockScreen( CommandBlockBlockEntity block )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onSlotUpdate( ScreenHandler container, int slot, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onHandlerRegistered( ScreenHandler container, DefaultedList<ItemStack> defaultedList )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onPropertyUpdate( ScreenHandler container, int key, int value )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void closeHandledScreen()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateCursorStack()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int unlockRecipes( Collection<Recipe<?>> recipes )
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Indirect
 | 
			
		||||
    @Override
 | 
			
		||||
    public int lockRecipes( Collection<Recipe<?>> recipes )
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage( Text textComponent, boolean status )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void consumeItem()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void lookAt( EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void method_14222( EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onStatusEffectApplied( StatusEffectInstance statusEffectInstance )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onStatusEffectUpgraded( StatusEffectInstance statusEffectInstance, boolean particles )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onStatusEffectRemoved( StatusEffectInstance statusEffectInstance )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void requestTeleport( double x, double y, double z )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setGameMode( GameMode gameMode )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendMessage( Text message, MessageType type, UUID senderUuid )
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    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 )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class FakeConnection extends ClientConnection
 | 
			
		||||
    {
 | 
			
		||||
        FakeConnection()
 | 
			
		||||
        {
 | 
			
		||||
            super( NetworkSide.CLIENTBOUND );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void channelActive( ChannelHandlerContext active )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void setState( NetworkState state )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void exceptionCaught( ChannelHandlerContext context, Throwable err )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected void channelRead0( ChannelHandlerContext context, Packet<?> packet )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void send( Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        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,22 +1,21 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
import com.mojang.authlib.GameProfile;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaCallback;
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import net.minecraft.inventory.IInventory;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
import dan200.computercraft.shared.util.ItemStorage;
 | 
			
		||||
import net.minecraft.inventory.Inventory;
 | 
			
		||||
import net.minecraft.nbt.CompoundTag;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Direction;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.items.IItemHandlerModifiable;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -24,8 +23,7 @@ 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}.
 | 
			
		||||
 * This should not be implemented by your classes. Do not interact with turtles except via this interface and {@link ITurtleUpgrade}.
 | 
			
		||||
 */
 | 
			
		||||
public interface ITurtleAccess
 | 
			
		||||
{
 | 
			
		||||
@@ -48,20 +46,18 @@ public interface ITurtleAccess
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempt to move this turtle to a new position.
 | 
			
		||||
     *
 | 
			
		||||
     * This will preserve the turtle's internal state, such as it's inventory, computer and upgrades. It should
 | 
			
		||||
     * be used before playing a movement animation using {@link #playAnimation(TurtleAnimation)}.
 | 
			
		||||
     * This will preserve the turtle's internal state, such as it's inventory, computer and upgrades. It should be used before playing a movement animation
 | 
			
		||||
     * using {@link #playAnimation(TurtleAnimation)}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world The new world 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.
 | 
			
		||||
     * @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 );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a vector containing the floating point co-ordinates at which the turtle is rendered.
 | 
			
		||||
     * This will shift when the turtle is moving.
 | 
			
		||||
     * Returns a vector containing the floating point co-ordinates at which the turtle is rendered. This will shift when the turtle is moving.
 | 
			
		||||
     *
 | 
			
		||||
     * @param f The subframe fraction.
 | 
			
		||||
     * @return A vector containing the floating point co-ordinates at which the turtle resides.
 | 
			
		||||
@@ -83,19 +79,19 @@ public interface ITurtleAccess
 | 
			
		||||
     * Returns the world direction the turtle is currently facing.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The world direction the turtle is currently facing.
 | 
			
		||||
     * @see #setDirection(EnumFacing)
 | 
			
		||||
     * @see #setDirection(Direction)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    EnumFacing getDirection();
 | 
			
		||||
    Direction getDirection();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the direction the turtle is facing. Note that this will not play a rotation animation, you will also need to
 | 
			
		||||
     * call {@link #playAnimation(TurtleAnimation)} to do so.
 | 
			
		||||
     * Set the direction the turtle is facing. Note that this will not play a rotation animation, you will also need to call {@link
 | 
			
		||||
     * #playAnimation(TurtleAnimation)} to do so.
 | 
			
		||||
     *
 | 
			
		||||
     * @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 EnumFacing dir );
 | 
			
		||||
    void setDirection( @Nonnull Direction dir );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the currently selected slot in the turtle's inventory.
 | 
			
		||||
@@ -109,60 +105,38 @@ public interface ITurtleAccess
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the currently selected slot in the turtle's inventory.
 | 
			
		||||
     *
 | 
			
		||||
     * @param slot The slot to set. This must be greater or equal to 0 and less than the inventory size. Otherwise no
 | 
			
		||||
     *             action will be taken.
 | 
			
		||||
     * @param slot The slot to set. This must be greater or equal to 0 and less than the inventory size. Otherwise no action will be taken.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to change the slot on the client side.
 | 
			
		||||
     * @see #getInventory()
 | 
			
		||||
     * @see #getSelectedSlot()
 | 
			
		||||
     */
 | 
			
		||||
    void setSelectedSlot( int slot );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @see #getColour()
 | 
			
		||||
     */
 | 
			
		||||
    void setColour( int colour );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the colour of this turtle as a RGB number.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The colour this turtle is. This will be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or
 | 
			
		||||
     * -1 if it has no colour.
 | 
			
		||||
     * @return The colour this turtle is. This will be a RGB colour between {@code 0x000000} and {@code 0xFFFFFF} or -1 if it has no colour.
 | 
			
		||||
     * @see #setColour(int)
 | 
			
		||||
     */
 | 
			
		||||
    int getColour();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @see #getColour()
 | 
			
		||||
     */
 | 
			
		||||
    void setColour( int colour );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the player who owns this turtle, namely whoever placed it.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This turtle's owner.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Nullable
 | 
			
		||||
    GameProfile getOwningPlayer();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the inventory of this turtle
 | 
			
		||||
     *
 | 
			
		||||
     * @return This turtle's inventory
 | 
			
		||||
     * @see #getItemHandler()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IInventory getInventory();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the inventory of this turtle as an {@link IItemHandlerModifiable}.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This turtle's inventory
 | 
			
		||||
     * @see #getInventory()
 | 
			
		||||
     * @see IItemHandlerModifiable
 | 
			
		||||
     * @see net.minecraftforge.items.CapabilityItemHandler#ITEM_HANDLER_CAPABILITY
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    IItemHandlerModifiable getItemHandler();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine whether this turtle will require fuel when performing actions.
 | 
			
		||||
     *
 | 
			
		||||
@@ -182,8 +156,7 @@ public interface ITurtleAccess
 | 
			
		||||
    int getFuelLevel();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the fuel level to a new value. It is generally preferred to use {@link #consumeFuel(int)}} or {@link #addFuel(int)}
 | 
			
		||||
     * instead.
 | 
			
		||||
     * Set the fuel level to a new value. It is generally preferred to use {@link #consumeFuel(int)}} or {@link #addFuel(int)} instead.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fuel The new amount of fuel. This must be between 0 and the fuel limit.
 | 
			
		||||
     * @see #getFuelLevel()
 | 
			
		||||
@@ -204,8 +177,8 @@ public interface ITurtleAccess
 | 
			
		||||
     * Removes some fuel from the turtles fuel supply. Negative numbers can be passed in to INCREASE the fuel level of the turtle.
 | 
			
		||||
     *
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to consume fuel on the client side.
 | 
			
		||||
     */
 | 
			
		||||
    boolean consumeFuel( int fuel );
 | 
			
		||||
@@ -219,31 +192,22 @@ public interface ITurtleAccess
 | 
			
		||||
    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 guaranteed to be able to access Minecraft objects safely, and will be queued up
 | 
			
		||||
     * with the turtles standard movement and tool commands. An issued command will return an unique integer, which will
 | 
			
		||||
     * be supplied as a parameter to a "turtle_response" event issued to the turtle after the command has completed. Look at the
 | 
			
		||||
     * lua source code for "rom/apis/turtle" for how to build a lua wrapper around this functionality.
 | 
			
		||||
     * Adds a custom command to the turtles command queue. Unlike peripheral methods, these custom commands will be executed on the main thread, so are
 | 
			
		||||
     * guaranteed to be able to access Minecraft objects safely, and will be queued up with the turtles standard movement and tool commands. An issued
 | 
			
		||||
     * command will return an unique integer, which will be supplied as a parameter to a "turtle_response" event issued to the turtle after the command has
 | 
			
		||||
     * completed. Look at the lua source code for "rom/apis/turtle" for how to build a lua wrapper around this functionality.
 | 
			
		||||
     *
 | 
			
		||||
     * @param context The Lua context to pull events from.
 | 
			
		||||
     * @param command An object which will execute the custom command when its point in the queue is reached
 | 
			
		||||
     * @return The objects the command returned when executed. you should probably return these to the player
 | 
			
		||||
     * unchanged if called from a peripheral method.
 | 
			
		||||
     * @return The objects the command returned when executed. you should probably return these to the player unchanged if called from a peripheral method.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to execute a command on the client side.
 | 
			
		||||
     * @throws LuaException                  If the user presses CTRL+T to terminate the current program while {@code executeCommand()} is
 | 
			
		||||
     *                                       waiting for an event, a "Terminated" exception will be thrown here.
 | 
			
		||||
     * @throws InterruptedException          If the user shuts down or reboots the computer while pullEvent() is waiting for an
 | 
			
		||||
     *                                       event, InterruptedException will be thrown. This exception must not be caught or
 | 
			
		||||
     *                                       intercepted, or the computer will leak memory and end up in a broken state.
 | 
			
		||||
     * @see ITurtleCommand
 | 
			
		||||
     * @see ILuaContext#pullEvent(String)
 | 
			
		||||
     * @see MethodResult#pullEvent(String, ILuaCallback)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Object[] executeCommand( @Nonnull ILuaContext context, @Nonnull ITurtleCommand command ) throws LuaException, InterruptedException;
 | 
			
		||||
    MethodResult executeCommand( @Nonnull ITurtleCommand command );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Start playing a specific animation. This will prevent other turtle commands from executing until
 | 
			
		||||
     * it is finished.
 | 
			
		||||
     * Start playing a specific animation. This will prevent other turtle commands from executing until it is finished.
 | 
			
		||||
     *
 | 
			
		||||
     * @param animation The animation to play.
 | 
			
		||||
     * @throws UnsupportedOperationException When attempting to execute play an animation on the client side.
 | 
			
		||||
@@ -282,22 +246,36 @@ public interface ITurtleAccess
 | 
			
		||||
    /**
 | 
			
		||||
     * Get an upgrade-specific NBT compound, which can be used to store arbitrary data.
 | 
			
		||||
     *
 | 
			
		||||
     * This will be persisted across turtle restarts and chunk loads, as well as being synced to the client. You must
 | 
			
		||||
     * call {@link #updateUpgradeNBTData(TurtleSide)} after modifying it.
 | 
			
		||||
     * This will be persisted across turtle restarts and chunk loads, as well as being synced to the client. You must call {@link
 | 
			
		||||
     * #updateUpgradeNBTData(TurtleSide)} after modifying it.
 | 
			
		||||
     *
 | 
			
		||||
     * @param side The side to get the upgrade data for.
 | 
			
		||||
     * @return The upgrade-specific data.
 | 
			
		||||
     * @see #updateUpgradeNBTData(TurtleSide)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    NBTTagCompound 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.
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * @param side The side to mark dirty.
 | 
			
		||||
     * @see #updateUpgradeNBTData(TurtleSide)
 | 
			
		||||
     */
 | 
			
		||||
    void updateUpgradeNBTData( @Nonnull TurtleSide side );
 | 
			
		||||
 | 
			
		||||
    default ItemStorage getItemHandler()
 | 
			
		||||
    {
 | 
			
		||||
        return ItemStorage.wrap( getInventory() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the inventory of this turtle.
 | 
			
		||||
     *
 | 
			
		||||
     * Note: this inventory should only be accessed and modified on the server thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @return This turtle's inventory
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Inventory getInventory();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An interface for objects executing custom turtle commands, used with {@link ITurtleAccess#executeCommand(ILuaContext, ITurtleCommand)}.
 | 
			
		||||
 * An interface for objects executing custom turtle commands, used with {@link ITurtleAccess#executeCommand(ITurtleCommand)}.
 | 
			
		||||
 *
 | 
			
		||||
 * @see ITurtleAccess#executeCommand(ILuaContext, ITurtleCommand)
 | 
			
		||||
 * @see ITurtleAccess#executeCommand(ITurtleCommand)
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
public interface ITurtleCommand
 | 
			
		||||
@@ -21,12 +18,12 @@ public interface ITurtleCommand
 | 
			
		||||
    /**
 | 
			
		||||
     * Will be called by the turtle on the main thread when it is time to execute the custom command.
 | 
			
		||||
     *
 | 
			
		||||
     * The handler should either perform the work of the command, and return success, or return
 | 
			
		||||
     * failure with an error message to indicate the command cannot be executed at this time.
 | 
			
		||||
     * The handler should either perform the work of the command, and return success, or return failure with an error message to indicate the command cannot
 | 
			
		||||
     * be executed at this time.
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle for whom the command was issued.
 | 
			
		||||
     * @return A result, indicating whether this action succeeded or not.
 | 
			
		||||
     * @see ITurtleAccess#executeCommand(ILuaContext, ITurtleCommand)
 | 
			
		||||
     * @see ITurtleAccess#executeCommand(ITurtleCommand)
 | 
			
		||||
     * @see TurtleCommandResult#success()
 | 
			
		||||
     * @see TurtleCommandResult#failure(String)
 | 
			
		||||
     * @see TurtleCommandResult
 | 
			
		||||
 
 | 
			
		||||
@@ -1,59 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.IUpgradeBase;
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleAttackEvent;
 | 
			
		||||
import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.api.distmarker.OnlyIn;
 | 
			
		||||
import net.minecraftforge.event.entity.player.AttackEntityEvent;
 | 
			
		||||
import net.minecraftforge.event.world.BlockEvent;
 | 
			
		||||
import org.apache.commons.lang3.tuple.Pair;
 | 
			
		||||
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 javax.vecmath.Matrix4f;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The primary interface for defining an update for Turtles. A turtle update
 | 
			
		||||
 * can either be a new tool, or a new peripheral.
 | 
			
		||||
 * 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
 | 
			
		||||
public interface ITurtleUpgrade extends 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 turtle will fail registration if an already used ID is specified.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The unique ID for this upgrade.
 | 
			
		||||
     * @see ComputerCraftAPI#registerTurtleUpgrade(ITurtleUpgrade)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ResourceLocation 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();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return whether this turtle adds a tool or a peripheral to the turtle.
 | 
			
		||||
     *
 | 
			
		||||
@@ -63,30 +32,15 @@ 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.
 | 
			
		||||
     *
 | 
			
		||||
     * The peripheral created will be stored for the lifetime of the upgrade and will be passed as an argument to
 | 
			
		||||
     * {@link #update(ITurtleAccess, TurtleSide)}. It will be attached, detached and have methods called in the same
 | 
			
		||||
     * manner as a Computer peripheral.
 | 
			
		||||
     * The peripheral created will be stored for the lifetime of the upgrade and will be passed as an argument to {@link #update(ITurtleAccess,
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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 )
 | 
			
		||||
@@ -95,25 +49,19 @@ public interface ITurtleUpgrade
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
     *
 | 
			
		||||
     * Conforming implementations should fire {@link BlockEvent.BreakEvent} and {@link TurtleBlockEvent.Dig}for digging,
 | 
			
		||||
     * {@link AttackEntityEvent} and {@link TurtleAttackEvent} for attacking.
 | 
			
		||||
     * 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 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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     * @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.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    default TurtleCommandResult useTool( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side, @Nonnull TurtleVerb verb, @Nonnull EnumFacing direction )
 | 
			
		||||
    default TurtleCommandResult useTool( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side, @Nonnull TurtleVerb verb, @Nonnull Direction direction )
 | 
			
		||||
    {
 | 
			
		||||
        return TurtleCommandResult.failure();
 | 
			
		||||
    }
 | 
			
		||||
@@ -121,18 +69,13 @@ public interface ITurtleUpgrade
 | 
			
		||||
    /**
 | 
			
		||||
     * Called to obtain the model to be used when rendering a turtle peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * This can be obtained from {@link net.minecraft.client.renderer.ItemModelMesher#getItemModel(ItemStack)},
 | 
			
		||||
     * {@link net.minecraft.client.renderer.model.ModelManager#getModel(ModelResourceLocation)} or any other
 | 
			
		||||
     * source.
 | 
			
		||||
     *
 | 
			
		||||
     * @param turtle Access to the turtle that the upgrade resides on. This will be null when getting item models!
 | 
			
		||||
     * @param side   Which side of the turtle (left or right) the upgrade resides on.
 | 
			
		||||
     * @return The model that you wish to be used to render your upgrade, and a transformation to apply to it. Returning
 | 
			
		||||
     * a transformation of {@code null} has the same effect as the identify matrix.
 | 
			
		||||
     * @return The model that you wish to be used to render your upgrade.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @OnlyIn( Dist.CLIENT )
 | 
			
		||||
    Pair<IBakedModel, Matrix4f> 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.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -18,70 +17,66 @@ public enum TurtleAnimation
 | 
			
		||||
    /**
 | 
			
		||||
     * An animation which does nothing. This takes no time to complete.
 | 
			
		||||
     *
 | 
			
		||||
     * @see #Wait
 | 
			
		||||
     * @see #ShortWait
 | 
			
		||||
     * @see #WAIT
 | 
			
		||||
     * @see #SHORT_WAIT
 | 
			
		||||
     */
 | 
			
		||||
    None,
 | 
			
		||||
    NONE,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Make the turtle move forward. Note that the animation starts from the block <em>behind</em> it, and
 | 
			
		||||
     * moves into this one.
 | 
			
		||||
     * Make the turtle move forward. Note that the animation starts from the block <em>behind</em> it, and moves into this one.
 | 
			
		||||
     */
 | 
			
		||||
    MoveForward,
 | 
			
		||||
    MOVE_FORWARD,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Make the turtle move backwards. Note that the animation starts from the block <em>in front</em> it, and
 | 
			
		||||
     * moves into this one.
 | 
			
		||||
     * Make the turtle move backwards. Note that the animation starts from the block <em>in front</em> it, and moves into this one.
 | 
			
		||||
     */
 | 
			
		||||
    MoveBack,
 | 
			
		||||
    MOVE_BACK,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Make the turtle move backwards. Note that the animation starts from the block <em>above</em> it, and
 | 
			
		||||
     * moves into this one.
 | 
			
		||||
     * Make the turtle move backwards. Note that the animation starts from the block <em>above</em> it, and moves into this one.
 | 
			
		||||
     */
 | 
			
		||||
    MoveUp,
 | 
			
		||||
    MOVE_UP,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Make the turtle move backwards. Note that the animation starts from the block <em>below</em> it, and
 | 
			
		||||
     * moves into this one.
 | 
			
		||||
     * Make the turtle move backwards. Note that the animation starts from the block <em>below</em> it, and moves into this one.
 | 
			
		||||
     */
 | 
			
		||||
    MoveDown,
 | 
			
		||||
    MOVE_DOWN,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Turn the turtle to the left. Note that the animation starts with the turtle facing <em>right</em>, and
 | 
			
		||||
     * the turtle turns to face in the current direction.
 | 
			
		||||
     * Turn the turtle to the left. Note that the animation starts with the turtle facing <em>right</em>, and the turtle turns to face in the current
 | 
			
		||||
     * direction.
 | 
			
		||||
     */
 | 
			
		||||
    TurnLeft,
 | 
			
		||||
    TURN_LEFT,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Turn the turtle to the left. Note that the animation starts with the turtle facing <em>right</em>, and
 | 
			
		||||
     * the turtle turns to face in the current direction.
 | 
			
		||||
     * Turn the turtle to the left. Note that the animation starts with the turtle facing <em>right</em>, and the turtle turns to face in the current
 | 
			
		||||
     * direction.
 | 
			
		||||
     */
 | 
			
		||||
    TurnRight,
 | 
			
		||||
    TURN_RIGHT,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Swing the tool on the left.
 | 
			
		||||
     */
 | 
			
		||||
    SwingLeftTool,
 | 
			
		||||
    SWING_LEFT_TOOL,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Swing the tool on the right.
 | 
			
		||||
     */
 | 
			
		||||
    SwingRightTool,
 | 
			
		||||
    SWING_RIGHT_TOOL,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Wait until the animation has finished, performing no movement.
 | 
			
		||||
     *
 | 
			
		||||
     * @see #ShortWait
 | 
			
		||||
     * @see #None
 | 
			
		||||
     * @see #SHORT_WAIT
 | 
			
		||||
     * @see #NONE
 | 
			
		||||
     */
 | 
			
		||||
    Wait,
 | 
			
		||||
    WAIT,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Wait until the animation has finished, performing no movement. This takes 4 ticks to complete.
 | 
			
		||||
     *
 | 
			
		||||
     * @see #Wait
 | 
			
		||||
     * @see #None
 | 
			
		||||
     * @see #WAIT
 | 
			
		||||
     * @see #NONE
 | 
			
		||||
     */
 | 
			
		||||
    ShortWait,
 | 
			
		||||
    SHORT_WAIT,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
@@ -15,12 +12,22 @@ import javax.annotation.Nullable;
 | 
			
		||||
 * Used to indicate the result of executing a turtle command.
 | 
			
		||||
 *
 | 
			
		||||
 * @see ITurtleCommand#execute(ITurtleAccess)
 | 
			
		||||
 * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, EnumFacing)
 | 
			
		||||
 * @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 );
 | 
			
		||||
    private final boolean success;
 | 
			
		||||
    private final String errorMessage;
 | 
			
		||||
    private final Object[] results;
 | 
			
		||||
 | 
			
		||||
    private TurtleCommandResult( boolean success, String errorMessage, Object[] results )
 | 
			
		||||
    {
 | 
			
		||||
        this.success = success;
 | 
			
		||||
        this.errorMessage = errorMessage;
 | 
			
		||||
        this.results = results;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a successful command result with no result.
 | 
			
		||||
@@ -42,7 +49,10 @@ public final class TurtleCommandResult
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static TurtleCommandResult success( @Nullable Object[] results )
 | 
			
		||||
    {
 | 
			
		||||
        if( results == null || results.length == 0 ) return EMPTY_SUCCESS;
 | 
			
		||||
        if( results == null || results.length == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return EMPTY_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
        return new TurtleCommandResult( true, null, results );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -66,21 +76,13 @@ public final class TurtleCommandResult
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public static TurtleCommandResult failure( @Nullable String errorMessage )
 | 
			
		||||
    {
 | 
			
		||||
        if( errorMessage == null ) return EMPTY_FAILURE;
 | 
			
		||||
        if( errorMessage == null )
 | 
			
		||||
        {
 | 
			
		||||
            return EMPTY_FAILURE;
 | 
			
		||||
        }
 | 
			
		||||
        return new TurtleCommandResult( false, errorMessage, null );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private final boolean success;
 | 
			
		||||
    private final String errorMessage;
 | 
			
		||||
    private final Object[] results;
 | 
			
		||||
 | 
			
		||||
    private TurtleCommandResult( boolean success, String errorMessage, Object[] results )
 | 
			
		||||
    {
 | 
			
		||||
        this.success = success;
 | 
			
		||||
        this.errorMessage = errorMessage;
 | 
			
		||||
        this.results = results;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Determine whether the command executed successfully.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -12,12 +11,12 @@ package dan200.computercraft.api.turtle;
 | 
			
		||||
public enum TurtleSide
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The turtle's left side (where the pickaxe usually is on a Wireless Mining Turtle)
 | 
			
		||||
     * The turtle's left side (where the pickaxe usually is on a Wireless Mining Turtle).
 | 
			
		||||
     */
 | 
			
		||||
    Left,
 | 
			
		||||
    LEFT,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The turtle's right side (where the modem usually is on a Wireless Mining Turtle)
 | 
			
		||||
     * The turtle's right side (where the modem usually is on a Wireless Mining Turtle).
 | 
			
		||||
     */
 | 
			
		||||
    Right,
 | 
			
		||||
    RIGHT,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -14,31 +13,30 @@ package dan200.computercraft.api.turtle;
 | 
			
		||||
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).
 | 
			
		||||
     * 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).
 | 
			
		||||
     */
 | 
			
		||||
    Tool,
 | 
			
		||||
    TOOL,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A peripheral adds a special peripheral which is attached to the side of the turtle,
 | 
			
		||||
     * and can be interacted with the {@code peripheral} API (Such as the modem on Wireless Turtles).
 | 
			
		||||
     * A peripheral adds a special peripheral which is attached to the side of the turtle, and can be interacted with the {@code peripheral} API (Such as
 | 
			
		||||
     * the modem on Wireless Turtles).
 | 
			
		||||
     */
 | 
			
		||||
    Peripheral,
 | 
			
		||||
    PERIPHERAL,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * An upgrade which provides both a tool and a peripheral. This can be used when you wish
 | 
			
		||||
     * your upgrade to also provide methods. For example, a pickaxe could provide methods
 | 
			
		||||
     * determining whether it can break the given block or not.
 | 
			
		||||
     * An upgrade which provides both a tool and a peripheral. This can be used when you wish your upgrade to also provide methods. For example, a pickaxe
 | 
			
		||||
     * could provide methods determining whether it can break the given block or not.
 | 
			
		||||
     */
 | 
			
		||||
    Both;
 | 
			
		||||
    BOTH;
 | 
			
		||||
 | 
			
		||||
    public boolean isTool()
 | 
			
		||||
    {
 | 
			
		||||
        return this == Tool || this == Both;
 | 
			
		||||
        return this == TOOL || this == BOTH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isPeripheral()
 | 
			
		||||
    {
 | 
			
		||||
        return this == Peripheral || this == Both;
 | 
			
		||||
        return this == PERIPHERAL || this == BOTH;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,25 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * An enum representing the different actions that an {@link ITurtleUpgrade} of type Tool may be called on to perform by
 | 
			
		||||
 * a turtle.
 | 
			
		||||
 * An enum representing the different actions that an {@link ITurtleUpgrade} of type Tool may be called on to perform by a turtle.
 | 
			
		||||
 *
 | 
			
		||||
 * @see ITurtleUpgrade#getType()
 | 
			
		||||
 * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, EnumFacing)
 | 
			
		||||
 * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)
 | 
			
		||||
 */
 | 
			
		||||
public enum TurtleVerb
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * The turtle called {@code turtle.dig()}, {@code turtle.digUp()} or {@code turtle.digDown()}
 | 
			
		||||
     * The turtle called {@code turtle.dig()}, {@code turtle.digUp()} or {@code turtle.digDown()}.
 | 
			
		||||
     */
 | 
			
		||||
    Dig,
 | 
			
		||||
    DIG,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The turtle called {@code turtle.attack()}, {@code turtle.attackUp()} or {@code turtle.attackDown()}
 | 
			
		||||
     * The turtle called {@code turtle.attack()}, {@code turtle.attackUp()} or {@code turtle.attackDown()}.
 | 
			
		||||
     */
 | 
			
		||||
    Attack,
 | 
			
		||||
    ATTACK,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -71,7 +70,7 @@ public enum TurtleAction
 | 
			
		||||
    EQUIP,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inspect a block in world
 | 
			
		||||
     * Inspect a block in world.
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleBlockEvent.Inspect
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleCommandResult;
 | 
			
		||||
import net.minecraftforge.eventbus.api.Cancelable;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -17,11 +15,11 @@ import java.util.Objects;
 | 
			
		||||
/**
 | 
			
		||||
 * An event fired when a turtle is performing a known action.
 | 
			
		||||
 */
 | 
			
		||||
@Cancelable
 | 
			
		||||
public class TurtleActionEvent extends TurtleEvent
 | 
			
		||||
{
 | 
			
		||||
    private final TurtleAction action;
 | 
			
		||||
    private String failureMessage;
 | 
			
		||||
    private boolean cancelled = false;
 | 
			
		||||
 | 
			
		||||
    public TurtleActionEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action )
 | 
			
		||||
    {
 | 
			
		||||
@@ -45,7 +43,6 @@ public class TurtleActionEvent extends TurtleEvent
 | 
			
		||||
     * @see TurtleCommandResult#failure()
 | 
			
		||||
     * @deprecated Use {@link #setCanceled(boolean, String)} instead.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public void setCanceled( boolean cancel )
 | 
			
		||||
    {
 | 
			
		||||
@@ -63,7 +60,7 @@ public class TurtleActionEvent extends TurtleEvent
 | 
			
		||||
     */
 | 
			
		||||
    public void setCanceled( boolean cancel, @Nullable String failureMessage )
 | 
			
		||||
    {
 | 
			
		||||
        super.setCanceled( cancel );
 | 
			
		||||
        cancelled = true;
 | 
			
		||||
        this.failureMessage = cancel ? failureMessage : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -79,4 +76,9 @@ public class TurtleActionEvent extends TurtleEvent
 | 
			
		||||
    {
 | 
			
		||||
        return failureMessage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isCancelled()
 | 
			
		||||
    {
 | 
			
		||||
        return cancelled;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
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 dan200.computercraft.api.turtle.TurtleVerb;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
import net.minecraftforge.common.util.FakePlayer;
 | 
			
		||||
import net.minecraftforge.event.entity.player.AttackEntityEvent;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
@@ -21,11 +17,6 @@ import java.util.Objects;
 | 
			
		||||
/**
 | 
			
		||||
 * Fired when a turtle attempts to attack an entity.
 | 
			
		||||
 *
 | 
			
		||||
 * This must be fired by {@link ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, EnumFacing)},
 | 
			
		||||
 * as the base {@code turtle.attack()} command does not fire it.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that such commands should also fire {@link AttackEntityEvent}, so you do not need to listen to both.
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleAction#ATTACK
 | 
			
		||||
 */
 | 
			
		||||
public class TurtleAttackEvent extends TurtlePlayerEvent
 | 
			
		||||
@@ -34,7 +25,8 @@ public class TurtleAttackEvent extends TurtlePlayerEvent
 | 
			
		||||
    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 )
 | 
			
		||||
    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" );
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,19 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
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 dan200.computercraft.api.turtle.TurtleVerb;
 | 
			
		||||
import net.minecraft.block.state.IBlockState;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.FakePlayer;
 | 
			
		||||
import net.minecraftforge.event.world.BlockEvent;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
@@ -27,21 +22,19 @@ import java.util.Objects;
 | 
			
		||||
/**
 | 
			
		||||
 * A general event for when a turtle interacts with a block or region.
 | 
			
		||||
 *
 | 
			
		||||
 * You should generally listen to one of the sub-events instead, cancelling them where
 | 
			
		||||
 * appropriate.
 | 
			
		||||
 * You should generally listen to one of the sub-events instead, cancelling them where appropriate.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that you are not guaranteed to receive this event, if it has been cancelled by other
 | 
			
		||||
 * mechanisms, such as block protection systems.
 | 
			
		||||
 * Note that you are not guaranteed to receive this event, if it has been cancelled by other mechanisms, such as block protection systems.
 | 
			
		||||
 *
 | 
			
		||||
 * Be aware that some events (such as {@link TurtleInventoryEvent}) do not necessarily interact
 | 
			
		||||
 * with a block, simply objects within that block space.
 | 
			
		||||
 * 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
 | 
			
		||||
{
 | 
			
		||||
    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 )
 | 
			
		||||
    protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
 | 
			
		||||
                                @Nonnull BlockPos pos )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, action, player );
 | 
			
		||||
 | 
			
		||||
@@ -62,8 +55,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the position the turtle is interacting with. Note that this is different
 | 
			
		||||
     * to {@link ITurtleAccess#getPosition()}.
 | 
			
		||||
     * Get the position the turtle is interacting with. Note that this is different to {@link ITurtleAccess#getPosition()}.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The position the turtle is interacting with.
 | 
			
		||||
     */
 | 
			
		||||
@@ -75,20 +67,16 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
    /**
 | 
			
		||||
     * Fired when a turtle attempts to dig a block.
 | 
			
		||||
     *
 | 
			
		||||
     * This must be fired by {@link ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, EnumFacing)},
 | 
			
		||||
     * as the base {@code turtle.dig()} command does not fire it.
 | 
			
		||||
     *
 | 
			
		||||
     * Note that such commands should also fire {@link BlockEvent.BreakEvent}, so you do not need to listen to both.
 | 
			
		||||
     *
 | 
			
		||||
     * @see TurtleAction#DIG
 | 
			
		||||
     */
 | 
			
		||||
    public static class Dig extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final IBlockState block;
 | 
			
		||||
        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 IBlockState block, @Nonnull ITurtleUpgrade upgrade, @Nonnull 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 );
 | 
			
		||||
 | 
			
		||||
@@ -106,13 +94,13 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
         * @return The block which is going to be broken.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public IBlockState getBlock()
 | 
			
		||||
        public BlockState getBlock()
 | 
			
		||||
        {
 | 
			
		||||
            return block;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Get the upgrade doing the digging
 | 
			
		||||
         * Get the upgrade doing the digging.
 | 
			
		||||
         *
 | 
			
		||||
         * @return The upgrade doing the digging.
 | 
			
		||||
         */
 | 
			
		||||
@@ -185,10 +173,11 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
     */
 | 
			
		||||
    public static class Inspect extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final IBlockState state;
 | 
			
		||||
        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 IBlockState state, @Nonnull 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 );
 | 
			
		||||
 | 
			
		||||
@@ -204,7 +193,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
         * @return The inspected block state.
 | 
			
		||||
         */
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        public IBlockState getState()
 | 
			
		||||
        public BlockState getState()
 | 
			
		||||
        {
 | 
			
		||||
            return state;
 | 
			
		||||
        }
 | 
			
		||||
@@ -223,8 +212,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent
 | 
			
		||||
        /**
 | 
			
		||||
         * Add new information to the inspection result. Note this will override fields with the same name.
 | 
			
		||||
         *
 | 
			
		||||
         * @param newData The data to add. Note all values should be convertible to Lua (see
 | 
			
		||||
         *                {@link dan200.computercraft.api.peripheral.IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])}).
 | 
			
		||||
         * @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 )
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,27 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
import com.google.common.eventbus.EventBus;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import net.minecraftforge.eventbus.api.Event;
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * You should generally not need to subscribe to this event, preferring one of the more specific classes.
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleActionEvent
 | 
			
		||||
 */
 | 
			
		||||
public abstract class TurtleEvent extends Event
 | 
			
		||||
public abstract class TurtleEvent
 | 
			
		||||
{
 | 
			
		||||
    public static final EventBus EVENT_BUS = new EventBus();
 | 
			
		||||
 | 
			
		||||
    private final ITurtleAccess turtle;
 | 
			
		||||
 | 
			
		||||
    protected TurtleEvent( @Nonnull ITurtleAccess turtle )
 | 
			
		||||
@@ -30,6 +31,12 @@ public abstract class TurtleEvent extends Event
 | 
			
		||||
        this.turtle = turtle;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean post( TurtleActionEvent event )
 | 
			
		||||
    {
 | 
			
		||||
        EVENT_BUS.post( event );
 | 
			
		||||
        return event.isCancelled();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the turtle which is performing this action.
 | 
			
		||||
     *
 | 
			
		||||
@@ -40,4 +47,5 @@ public abstract class TurtleEvent extends Event
 | 
			
		||||
    {
 | 
			
		||||
        return turtle;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of ComputerCraft - http://www.computercraft.info
 | 
			
		||||
 * Copyright Daniel Ratcliffe, 2011-2019. 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.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
import dan200.computercraft.api.lua.MethodResult;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
@@ -18,8 +16,8 @@ import java.util.Objects;
 | 
			
		||||
/**
 | 
			
		||||
 * Fired when a turtle gathers data on an item in its inventory.
 | 
			
		||||
 *
 | 
			
		||||
 * You may prevent items being inspected, or add additional information to the result. Be aware that this is fired on
 | 
			
		||||
 * the computer thread, and so any operations on it must be thread safe.
 | 
			
		||||
 * You may prevent items being inspected, or add additional information to the result. Be aware that this may be fired on the computer thread, and so any
 | 
			
		||||
 * operations on it must be thread safe.
 | 
			
		||||
 *
 | 
			
		||||
 * @see TurtleAction#INSPECT_ITEM
 | 
			
		||||
 */
 | 
			
		||||
@@ -27,8 +25,15 @@ 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, boolean mainThread )
 | 
			
		||||
    {
 | 
			
		||||
        super( turtle, TurtleAction.INSPECT_ITEM );
 | 
			
		||||
 | 
			
		||||
@@ -36,6 +41,7 @@ public class TurtleInspectItemEvent extends TurtleActionEvent
 | 
			
		||||
        Objects.requireNonNull( data, "data cannot be null" );
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
        this.data = data;
 | 
			
		||||
        this.mainThread = mainThread;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -60,11 +66,20 @@ public class TurtleInspectItemEvent extends TurtleActionEvent
 | 
			
		||||
        return data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If this event is being fired on the server thread. When true, information which relies on server state may be exposed.
 | 
			
		||||
     *
 | 
			
		||||
     * @return If this is run on the main thread.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean onMainThread()
 | 
			
		||||
    {
 | 
			
		||||
        return mainThread;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add new information to the inspection result. Note this will override fields with the same name.
 | 
			
		||||
     *
 | 
			
		||||
     * @param newData The data to add. Note all values should be convertible to Lua (see
 | 
			
		||||
     *                {@link dan200.computercraft.api.peripheral.IPeripheral#callMethod(IComputerAccess, ILuaContext, int, Object[])}).
 | 
			
		||||
     * @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 )
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,16 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
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 net.minecraftforge.common.util.FakePlayer;
 | 
			
		||||
import net.minecraftforge.items.IItemHandler;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -22,21 +21,22 @@ import java.util.Objects;
 | 
			
		||||
 */
 | 
			
		||||
public abstract class TurtleInventoryEvent extends TurtleBlockEvent
 | 
			
		||||
{
 | 
			
		||||
    private final IItemHandler handler;
 | 
			
		||||
    private final Inventory handler;
 | 
			
		||||
 | 
			
		||||
    protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable IItemHandler 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 );
 | 
			
		||||
        this.handler = handler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the inventory being interacted with
 | 
			
		||||
     * Get the inventory being interacted with.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The inventory being interacted with, {@code null} if the item will be dropped to/sucked from the world.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public IItemHandler getItemHandler()
 | 
			
		||||
    public Inventory getItemHandler()
 | 
			
		||||
    {
 | 
			
		||||
        return handler;
 | 
			
		||||
    }
 | 
			
		||||
@@ -48,7 +48,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent
 | 
			
		||||
     */
 | 
			
		||||
    public static class Suck extends TurtleInventoryEvent
 | 
			
		||||
    {
 | 
			
		||||
        public Suck( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable IItemHandler handler )
 | 
			
		||||
        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 );
 | 
			
		||||
        }
 | 
			
		||||
@@ -63,7 +63,8 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent
 | 
			
		||||
    {
 | 
			
		||||
        private final ItemStack stack;
 | 
			
		||||
 | 
			
		||||
        public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable IItemHandler handler, @Nonnull 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 );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.turtle.event;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.turtle.FakePlayer;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import net.minecraftforge.common.util.FakePlayer;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user