1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-10-20 08:27:38 +00:00

Compare commits

...

159 Commits

Author SHA1 Message Date
Merith-TK
84a1f63445 fix build env, beta-build
update REI so it doesnt have a stroke with newer CC:R config, and update the gradle properties for 1.96.1-beta,
2021-06-09 09:25:03 -07:00
Merith
dbe98ac270 Merge pull request #54 from SquidDev-CC/feature/squid-breaks-everything
Squid breaks everything (not really lol)
2021-06-09 09:21:14 -07:00
Merith
a00775dcbb Merge pull request #53 from Toad-Dev/config
Mimic CC:T config file structure
2021-06-09 09:18:06 -07:00
Jonathan Coates
2279f5044d Nuke treasure disks
They're datapacks now. Right???
2021-06-09 09:19:21 +01:00
Jonathan Coates
e8d90b94ec Woops 2021-06-09 09:13:37 +01:00
Jonathan Coates
0bf7f3de89 Final checkstyle cleanup 2021-06-09 09:04:40 +01:00
Jonathan Coates
59266fe6e9 No more m_ nice guy 2021-06-09 08:55:11 +01:00
Jonathan Coates
a198a5241d Use CC:T's version of dan200.computercraft.core 2021-06-09 08:29:44 +01:00
Jonathan Coates
b429095f88 Reformat everything 2021-06-09 08:28:06 +01:00
Jonathan Coates
a6c7236fa0 ./gradlew licenseFormat 2021-06-09 08:24:01 +01:00
Jonathan Coates
69deb0c947 Copy across some config from CC:T 2021-06-09 08:24:00 +01:00
ToadDev
b0d7f690eb Fix: Mimic CC:T config file structure
Replaces the jankson implementation with night-config. Night config is
what the forge api uses so it's easy to produce .toml files in the same
structure as CC:Tweaked.

All config options and comments from CC:Tweaked are implemented. Some
of these options are ignored in various bits of implementation but that
is another problem :)

Also splits the config into a client and server file. The server file is
saved per-world. Names and locations are consistent with CC:T.
2021-06-08 23:45:50 -07:00
Merith
62f93f1b4b Merge pull request #52 from Merith-TK/gitpod
Gitpod Support
2021-06-08 21:07:48 -07:00
Merith
7fe322a93a Merge branch 'fabric' into gitpod 2021-06-08 21:07:11 -07:00
Merith
de97fa35a8 update configs for more minimalisting environment 2021-06-07 22:08:29 +00:00
Merith-TK
25ce9b9bea fix typo 2021-06-07 12:06:32 -07:00
Merith-TK
59048b3f30 update overhaul textures 2021-06-07 11:36:05 -07:00
Merith
a960db7ced update configs with java setup 2021-06-06 17:34:52 +00:00
Merith
6a4f09e7b1 Update Readme, add gitpod support 2021-06-06 04:07:49 +00:00
ToadDev
19d1cc0320 Fix inventories not showing up as peripherals.
An upstream commit changed the way these are registered and that got
overlooked in the merge.
2021-06-04 18:38:15 -07:00
Merith-TK
1a52275dcb release 1.96.0 2021-06-04 16:09:43 -07:00
Merith
2fc2cf2e29 Merge pull request #49 from Toad-Dev/fabric-fix-48
Fix crash while playing a music disk in a drive on server.
2021-06-04 14:29:21 -07:00
ToadDev
80c2fc68aa Fix crash playing a music disc from drive on server.
#48
2021-06-03 21:54:28 -07:00
ToadDev
7c0664b9f2 Fix mixin from latest PR getting left behind in refactor.
I refactored the mixin package to be within a fabric package so other
fabric specific code could be kept nearby. But a mixin from a recent PR
got left behind in the merge. Github's empty merge conflict might have
been about this.
2021-06-03 21:32:37 -07:00
Merith
4d1a950fbf Merge pull request #42 from Toad-Dev/merith-buffer-fix
Fix: Monitor render buffers not being released properly.
2021-06-03 15:28:23 -07:00
ToadDev
135a3f56a5 Refactor: Begin consolidating fabric only classes.
Made a top-level fabric package so mixins and their ancillary classes
can be grouped together. Also removed a stub duck interface that got
left behind somewhere along the line (MixedFirstPersonRenderer).
2021-06-03 13:48:34 -07:00
ToadDev
1f117b7c47 Fix: Inform block entities when chunk is unloaded.
Forge's ITileEntity interface adds a onChunkUnloaded handler method into
block entities. The fabric port doesn't have a re-implementation of this
feature, which meant TileMonitors weren't releasing their buffers when
unloaded. This commit adds that handler method back into TileGeneric,
which all CC block entities inherit from. Handler logic for the four
block entities that use this feature were copied over from the forge
repo.
2021-06-03 13:48:34 -07:00
ToadDev
c820e051b3 Fix: Release monitor buffers on *client* thread
These buffers were being released on the server thread, causing the
logical server in a single player session to crash just before shutting
down. It seems the crash happened late enough to not cause world
corruption issues, and so went unnoticed. It was however causing a
memory leak when quitting/rejoining worlds, and it left the save file
lock in limbo.
2021-06-03 13:48:34 -07:00
Merith
01d7aaf062 Merge pull request #38 from Jummit/port-10
Port all recent commits
2021-06-03 07:58:58 -07:00
Merith-TK
1e75e4ff6e update issue templates, remove travis.yml
issue templates needed a revamp,
2021-06-03 06:45:32 -07:00
Merith
f967a70121 Merge pull request #45 from hugeblank/disk-use
Fix Disk Drive & Disk Interaction
2021-06-02 19:24:25 -07:00
Merith
ac5150a664 Merge pull request #46 from hugeblank/implement-details
Properly implement turtle.getItemDetails()
2021-06-02 18:03:32 -07:00
hugeblank
0318e62524 Implement tag functionality 2021-06-02 17:58:04 -07:00
hugeblank
ca69d755e6 Re-implement turtle.getItemDetails() detailed mode
Incomplete - Missing item "tags", otherwise fully functional.

- Fixes #41
2021-06-02 17:29:06 -07:00
Merith
3ba7acc414 Merge pull request #43 from Toad-Dev/merith-chat-fix
Fix: Display peripheral chat messages in multiplayer and improve /computercraft command.
2021-06-02 15:59:09 -07:00
hugeblank
4c27eea73b Fix Disk Drive & Disk Interaction
Inject Special case into ServerPlayerInteractionManager that handles disks being sneak + right clicked onto disk drives.

Fixes  #12
2021-06-02 14:23:19 -07:00
ToadDev
225a64dd6b Send terminal state with /computercraft view 2021-05-31 16:40:09 -07:00
Jonathan Coates
1831e81dd4 Add button to view computer's folder
Implementation is a little awkward, as we can't send OPEN_FILE links
from the server, so we ensure the client runs a
/computercraft open-computer ID command instead. We then intercept this
on the client side and use that to open the folder.
2021-05-30 23:59:39 -07:00
Merith
a4dd6c24e5 Update README.md 2021-05-29 07:17:19 -07:00
Jonathan Coates
936742895b Bump version to 1.94.0 2021-05-25 22:16:57 +02:00
Jonathan Coates
b5d1e618b9 Set stack size when crafting coloured items
Fixes #793
2021-05-25 22:16:57 +02:00
JackMacWindows
10aa6c5297 Add the ability to call cc.expect directly 2021-05-25 22:16:57 +02:00
Jonathan Coates
010ebacd1a Fix mount suggestion always being printed out 2021-05-25 22:16:57 +02:00
Lupus590
9e002beed7 Add cc.expect.range (#790) 2021-05-25 22:16:57 +02:00
Jonathan Coates
6029defb20 Use a separate region for the bottom pocket computer border
This is definitely not a good solution, but it's probably the best we
can do right now given resizable computers are a thing.

Fixes #775, closes #776
2021-05-25 22:16:57 +02:00
Jonathan Coates
c16aa5f247 Fix build failures
- Add license headers. Also check these during pre-commit.
 - Fix javadoc issue.
2021-05-25 22:16:57 +02:00
Jummit
8d27bdca7b Expose GenericSource to the public API
- Remove the service provider code and require people to explicitly
   register these. This is definitely more ugly, but easier than people
   pulling in AutoService or similar!
 - Add an API for registering capabilities.
 - Expand the doc comments a little. Not sure how useful they'll be, but
   let's see!

There's still so much work to be done on this, but it's a "good enough"
first step.
2021-05-25 22:16:57 +02:00
Jonathan Coates
41aa8fa163 Add example to turtle.inspect
A pretty common but non-trivial API, so worth having something. Even if
not perfect.
2021-05-25 22:16:57 +02:00
Jummit
e40fb67b50 Add inventory.getItemLimit
Closes #781
2021-05-25 22:16:57 +02:00
Jonathan Coates
96d46ffd2c Bump Cobalt version 2021-05-25 22:16:57 +02:00
Jonathan Coates
652b7ebba6 Use lightGrey for folders on normal computers
This way we still get some differences between files and folders on
normal computers. I did try with just green, but I think the contrast is
too low.

Closes #656
2021-05-25 22:16:57 +02:00
Jonathan Coates
f0d7a1165d Don't close file handles from ResourceMounts
Unlike short handles, we don't read these immediately, and so we can't
close it right away. Otherwise the file is considered empty!

Fixes SquidDev-CC/treasure-programs#1
2021-05-25 22:16:57 +02:00
Euric
4a20eea852 Defer monitor tile update when placed by another TE 2021-05-25 22:16:57 +02:00
Jonathan Coates
ccdd2bf477 Add some examples to inventory methods
Closes #761. It's not perfect, but it's a little better. Maybe??
2021-05-25 22:16:57 +02:00
Jonathan Coates
8d8f41a50b Simplify our overrides of load/loadstring
- Remove auto-prefixing of load/loadstring
 - Use Cobalt's normal load implementation, with a simple hook to
   set _ENV on the environment.
2021-05-25 22:16:57 +02:00
Jonathan Coates
72c78db28b Correctly handle sparse arrays in cc.pretty
This also swaps the order we display mixed array/maps in, so that the
array part comes first. I think this is more sensible.

Closes #777
2021-05-25 22:16:57 +02:00
Merith-TK
bf8a992273 update readme with tasks to be done 2021-05-25 12:24:50 -07:00
Merith
9c214fcd8a Merge pull request #40 from Jummit/remove-test
Remove the Java and Lua test suites
2021-05-25 12:08:48 -07:00
Merith
082cc9d2d8 Merge pull request #39 from o-iM-nI/readme
Merge 3prm3 Readme into repo
2021-05-25 12:07:23 -07:00
Jummit
bff2e81713 remove partial java and lua test suites 2021-05-25 18:17:44 +02:00
Merith
63aa3d8877 add known issue "file not found" 2021-05-24 11:15:48 -07:00
ƐqɿmƐ
74c5d7e719 Readme update
readme sourced from https://github.com/3prm3/cc-restitched
2021-05-23 09:06:34 -07:00
Merith-TK
78a685c2cb Fix Github Actions
Make github actions pull submodules
2021-05-16 14:01:28 -07:00
Merith
a475f55b9c Merge pull request #10 from Toad-Dev/fabric-merith
Bugfixes
2021-05-16 13:00:47 -07:00
David Queneau
9353ded2d5 Update readme to reflect bugfix. 2021-05-16 12:54:23 -07:00
Merith
d197268e53 Merge pull request #32 from Jummit/remove-docs
Remove docs folder
2021-05-16 11:19:02 -07:00
David Queneau
9648265056 Fix github actions 2021-05-16 11:16:01 -07:00
David Queneau
264dbc570f Fixed turtle tool upgrades not rendering in GUI. 2021-05-16 11:16:01 -07:00
David Queneau
e4ad8bc117 Fixed turtle ability to feed/breed passive mobs. 2021-05-16 11:16:01 -07:00
David Queneau
1b31972092 Fixed turtle ability to place signs with text. 2021-05-16 11:16:01 -07:00
David Queneau
6cd9fa9fb2 Fixed turtle bone meal usage 2021-05-16 11:16:01 -07:00
David Queneau
d10f297ca0 Turtles handle double chest inventories correctly. Cleaned up generic inventory code. 2021-05-16 11:16:01 -07:00
Merith-TK
9ae5636d41 update readme, add overhaul resourcepack as submodule 2021-05-16 11:12:12 -07:00
Jummit
a60daf78cf remove docs folder 2021-05-16 19:39:57 +02:00
Merith
76e0507c3b Merge pull request #31 from Jummit/new-textures
Update the textures to fit Jappa's style
2021-05-16 09:58:11 -07:00
Jummit
d8e2fab2b1 Update the textures and add an optional programmer art texturepack 2021-05-16 18:51:40 +02:00
Merith
5c5e510075 Merge pull request #24 from Toad-Dev/merith-1.16.5-pr
Merith 1.16.5 pr
2021-05-16 09:44:21 -07:00
Merith
5a309258af Merge branch 'fabric' into merith-1.16.5-pr 2021-05-16 09:42:11 -07:00
Merith
b0782ec38b Merge pull request #29 from Jummit/port-9
Brings us to CC:T 8494ba8ce2 so... who is gonna complain?
2021-05-16 09:21:31 -07:00
Jonathan Coates
46846a4fde Improve UX when a resource mount cannot be found
- Add a full example of the docs. Hopefully is a little more explicit.
 - Print a warning when the mount is empty.

Closes #762
2021-05-16 14:25:09 +02:00
Jonathan Coates
d955443b21 Add citation to cc.pretty
ust to look extra pretentious.
2021-05-16 14:18:48 +02:00
Jonathan Coates
57e6c49844 Make the peripheral API examples a little clearer 2021-05-16 14:18:43 +02:00
Jonathan Coates
66dbab7a6b "Finish" documentation for several modules
- Add remaining docs for the turtle API
 - Add documentation for the fluid storage peripheral.
 - Enforce undocumented warning for most modules (only io and window
   remaining).

"Finish" in quotes, because these are clearly a long way from perfect.
I'm bad at writing docs, OK!
2021-05-16 14:17:57 +02:00
lily
558976e4ca Fixed sortCoords for draw functions (#749) 2021-05-16 14:17:01 +02:00
Jonathan Coates
3a7470a108 Add documentation for io.setvbuf
Fixes #746.

Love how "good first issue" guarantees that nobody will do it. Not
actually true, and thank you for those people who have contributed!
2021-05-16 14:16:55 +02:00
Wojbie
cf2b332c3c Fix missing term.setCursorBlink(true) in edit.lua 2021-05-16 14:15:41 +02:00
Ronan Hanley
8984ebcf80 Refactor and add tests for TextBuffer (#738) 2021-05-16 14:15:35 +02:00
Jonathan Coates
a28e7e2db3 Bump version to 1.95.3 2021-05-16 14:14:31 +02:00
Jonathan Coates
3860e2466c Add User-Agent to Websockets
I think, haven't actually tested this :D:. Closes #730.
2021-05-16 14:13:19 +02:00
Wojbie
5b31c2536a Make edit display errors/results of execution and handle require. (#723) 2021-05-16 14:10:53 +02:00
Weblate
98dc7a6e58 Translations for Portuguese (Brazil)
Co-authored-by: Matheus Medeiros Souza <mmedeiros.cbp@gmail.com>
2021-05-16 14:10:48 +02:00
Jonathan Coates
5e0ceda7ce Clarify the turtle.place docs a little
Closes #714
2021-05-16 14:10:43 +02:00
SkyTheCodeMaster
7fe3ac9222 Fix redstone.getBundledInput(side) returning the output of said side. 2021-05-16 14:09:10 +02:00
Jonathan Coates
a65b8ed04c Migrate all examples to use tweaked.cc
Might as well, I've got the server capacity to spare. Hopefully.
2021-05-16 14:08:25 +02:00
JackMacWindows
3e14b84c23 Finish the rest of the event documentation (#683) 2021-05-16 14:01:59 +02:00
FensieRenaud
1710ad9861 Serialise sparse arrays into JSON (#685) 2021-05-16 14:00:29 +02:00
Jonathan Coates
9c48c99be7 Bump version to 1.95.2 2021-05-16 13:57:43 +02:00
Jonathan Coates
d10d1b45fe Bump several action versions 2021-05-16 13:54:37 +02:00
Wojbie
70a1cf5c5a id.lua now handles more disk types (#677)
Co-authored-by: Lupus590 <lupussolitarius590@gmail.com>
2021-05-16 13:53:00 +02:00
Jonathan Coates
b546a10bd6 Preserve registration order of upgrades
Makes them display in a more reasonable order within JEI. Closes #647
(note, the title is an entirley separate issue)!
2021-05-16 13:51:01 +02:00
SquidDev
2f35bbb538 Add some initial documentation for events
Credit to @BradyFromDiscord for writing these. See #640 and #565.

Co-authored-by: Brady <bradyakent@gmail.com
2021-05-16 13:25:17 +02:00
Jonathan Coates
891dde43a9 Clarify the cc.strings.wrap docs a little
Also make the example a bit more "useful". Hopefully this should clarify
that the function returns a table rather than a single string.

Closes #678.
2021-05-16 13:24:54 +02:00
Jonathan Coates
094e0d4f33 Fix mounts being usable after a disk is ejected
This probably fails "responsible disclosure", but it's not an RCE and
frankly the whole bug is utterly hilarious so here we are...

It's possible to open a file on a disk drive and continue to read/write
to them after the disk has been removed:

    local disk = peripheral.find("drive")
    local input = fs.open(fs.combine(disk.getMountPath(), "stream"), "rb")
    local output = fs.open(fs.combine(disk.getMountPath(), "stream"), "wb")
    disk.ejectDisk()

    -- input/output can still be interacted with.

This is pretty amusing, as now it allows us to move the disk somewhere
else and repeat - we've now got a private tunnel which two computers can
use to communicate.

Fixing this is intuitively quite simple - just close any open files
belonging to this mount. However, this is where things get messy thanks
to the wonderful joy of how CC's streams are handled.

As things stand, the filesystem effectively does the following flow::
 - There is a function `open : String -> Channel' (file modes are
   irrelevant here).

 - Once a file is opened, we transform it into some <T extends
   Closeable>. This is, for instance, a BufferedReader.

 - We generate a "token" (i.e. FileSystemWrapper<T>), which we generate
   a week reference to and map it to a tuple of our Channel and T. If
   this token is ever garbage collected (someone forgot to call close()
   on a file), then we close our T and Channel.

 - This token and T are returned to the calling function, which then
   constructs a Lua object.

The problem here is that if we close the underlying Channel+T before the
Lua object calls .close(), then it won't know the underlying channel is
closed, and you get some pretty ugly errors (e.g. "Stream Closed"). So
we've moved the "is open" state into the FileSystemWrapper<T>.

The whole system is incredibly complex at this point, and I'd really
like to clean it up. Ideally we could treat the HandleGeneric as the
token instead - this way we could potentially also clean up
FileSystemWrapperMount.

BBut something to play with in the future, and not when it's 10:30pm.

---

All this wall of text, and this isn't the only bug I've found with disks
today :/.
2021-05-16 13:23:37 +02:00
Wojbie
df40adce20 Make rightAlt only close menu, never open it. (#672)
Fixes #669
2021-05-16 09:22:11 +02:00
Jummit
e12ce95b2d Update to 1.16.4 2021-05-16 09:18:02 +02:00
Jonathan Coates
bcc0effd00 Fix impostor recipes for disks
Well, this is embarrassing. See #652
2021-05-16 07:57:06 +02:00
Jonathan Coates
64f3aa2dba Fix problem with RepeatArgumentType
The whole "flatten" thing can probably be dropped TBH. We don't use it
anywhere. Fixes #661
2021-05-16 07:48:07 +02:00
Wojbie
515ccfebd3 Added Numpad Enter Support in rom lua programs. (#657) 2021-05-16 07:43:06 +02:00
Lupus590
0b6dbe7778 Add isReadOnly to fs.attributes (#639) 2021-05-16 07:42:55 +02:00
Jonathan Coates
19054684c6 Merge branch 'mc-1.15.x' into mc-1.16.x 2021-05-16 07:42:39 +02:00
Jonathan Coates
a72a5e6deb Fix disk recipes
Closes #652. This has been broken since the 1.13 update. Not filling
myself with confidence here.
2021-05-16 07:42:12 +02:00
Jonathan Coates
eb2d9482a2 Prevent reflection errors crashing the game
.getMethods() may throw if a method references classes which don't exist
(such as client-only classes on a server). This is an Error, and so is
unchecked - hence us not handling it before.

Fixes #645
2021-05-16 07:41:22 +02:00
Jummit
95794fdaf3 Add back command computer block drops
This has been broken for almost a year (28th Jan 2020), and I never
noticed. Good job me.

Fixes #641, closes #648 (basically the same, but targetting 1.15.x)
2021-05-16 07:40:43 +02:00
David Queneau
af477a401a Update to loom 0.6 2021-05-15 11:06:35 -07:00
David Queneau
27531c161d Update to mc 1.16.5 and latest yarn mappings. 2021-05-15 11:06:35 -07:00
Merith-TK
a8f208c394 Update banner with cooler banner 2021-05-15 10:31:59 -07:00
Merith
148d9e9dda Merge pull request #22 from Jummit/update-mod-json
Update fabric.mod.json
2021-05-15 09:37:40 -07:00
Jummit
67fc21271b Add Jummit to authors and fix dead links 2021-05-16 02:34:53 +02:00
Merith-TK
ce28e2659a Update Readme from 3prm3 2021-05-15 09:36:26 -07:00
Merith
47e4826f2b Merge pull request #14 from Jummit/fix-mouse-up-events
fix mouse_up events not being emitted
2021-05-15 09:04:35 -07:00
Merith
9bde2d8d13 Merge Commits from Jummit/cc-restitched PR21 2021-05-15 08:45:21 -07:00
Jummit
46acb6866e 2020 -> 2021
Oh, the most useless part of my build process.
2021-05-16 01:27:46 +02:00
Jummit
c0506108f9 Fixed missing argument names in file handle docs (#632) 2021-05-16 01:27:44 +02:00
Jummit
0dd7c3695f Add explicit @module annotation
This feels like a bug - it should be inferred automatically.
2021-05-16 01:27:31 +02:00
Jummit
2a290be248 Bump version to 1.95.0
As is tradition.
2021-05-16 01:26:56 +02:00
Jummit
c4a6c16330 Manually wrap strings for help (#602)
This saves us writing to a buffer multiple times, and so makes things much,
much faster.
2021-05-16 01:26:43 +02:00
Jummit
f8b3b544d1 Add functions to wrap text 2021-05-16 01:26:32 +02:00
Jonathan Coates
53ae689468 Fix licence issues
I knew I shouldn't do modding on things which aren't my main computer.

I actually did run checkstyleMain before committing, but entirely forgot
about this one. Go me.
2021-05-16 01:26:21 +02:00
Merith
73e460e533 Merge Commits from Jummit/cc-restitched PR20 2021-05-15 08:05:59 -07:00
Jummit
a4e68d637a Make upgrade recipe requirements a little more lax
- Move some common upgrade code to IUpgradeBase. 99% sure this this
   preserves binary compatibility (on the JVM at least).

 - Instead of requiring the share tag to match, allow upgrades to
   specify their own predicate. IMO this is a little ugly, but required
   to fix #614 as other mods chuck their own NBT on items.
2021-05-16 00:50:24 +02:00
Jonathan Coates
1f1b20c81e Fix overflow in os.epoch
Closes #611
2021-05-16 00:10:49 +02:00
Jonathan Coates
20a9ff7a3f Fix double URL decode
Closes #613
2021-05-16 00:10:40 +02:00
Jonathan Coates
58cd5e3df7 Fix copy-paste error in inventory docs
I'm a very silly squid.
2021-05-16 00:10:19 +02:00
Jonathan Coates
5922d7548c Merge pull request #606 from TheWireLord/numpadenter-support
Added Numpad Enter Support - bios.lua
2021-05-16 00:06:13 +02:00
Merith
386e01364e Merge Commits from Jummit/cc-restitched PR19 2021-05-15 06:53:14 -07:00
Jummit
70eff6aa63 Skip "Docs for energy and inventory methods" 2021-05-15 20:34:30 +02:00
SquidDev
45ac601946 Generate docs for generic peripherals
This was the easy bit. Now I've got to write them!
2021-05-15 20:21:15 +02:00
SquidDev
d6c5a5bd27 Some sanity checks for get{Direction,Orientation}
Silly bodge, but should fix #600.
2021-05-15 20:18:04 +02:00
SquidDev
02c7903cb7 Remove a couple of todos 2021-05-15 20:06:21 +02:00
Jummit
37e856efdc Skip 737b3cb5
Don't use capabilities for generic peripherals
2021-05-15 20:04:51 +02:00
Merith-TK
8a38097887 [Patchwork] fix github workflow 2021-05-15 06:46:23 -07:00
Merith
884b417ec2 Merge Commits from Jummit/cc-restitched
SquidDev-CC/CC-Tweaked@511eea3
SquidDev-CC/CC-Tweaked@826797c
SquidDev-CC/CC-Tweaked@24d3777
SquidDev-CC/CC-Tweaked@d83a68f
2021-05-14 06:16:56 -07:00
JackMacWindows
1d1d6227eb Added improved help viewer (#595)
- Pagination, with (page) up/down, q(uit) and scrolling support.
 - Render markdown style bullets ('-'/'*') using a '•' instead.
2021-05-14 21:36:08 +02:00
Jummit
d5eb82db60 Allow $private HTTP rule to block any private IP
This is a little magic compared with our previous approach of "list
every private IP range", but given then the sheer number we were
missing[1][2] this feels more reasonable.

Also refactor out some of the logic into separate classes, hopefully to
make things a little cleaner.
2021-05-14 21:31:03 +02:00
JackMacWindows
3575654d02 Added documentation for global functions (#592) 2021-05-14 19:37:54 +02:00
Jonathan Coates
79fcc7241b Remove <!-- -->s in usages
We fixed the bug in illuaminate, so this should be redundant now.
2021-05-14 18:51:10 +02:00
Merith-TK
b203d3aa0a Try to handle a turtle being broken while ticked
Hopefully fixes #585. Hopefully.
2021-05-07 15:05:00 -07:00
Merith-TK
f1176af9d1 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.
2021-05-07 13:27:04 -07:00
Merith-TK
717686d855 Allow strings or numbers in textutils.*tabulate
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
2021-05-07 11:26:24 -07:00
Jummit
92811ca0bc fix mouse_up events not being emitted
fixes #11
2021-04-24 19:03:35 +02:00
Merith-TK
f8a58dbcb1 Fixed length check on function name in expect (#589) 2021-04-22 11:54:56 -07:00
Merith-TK
98aabe2cfb Remove extra space (#586) 2021-04-22 11:43:58 -07:00
Merith-TK
f938ed9779 Strict Globals (#583) 2021-04-22 11:35:15 -07:00
Merith-TK
03c9274b27 More examples
Yay!
2021-04-22 11:23:31 -07:00
Merith-TK
92c94ac039 Cleanup examples for the various modules 2021-04-21 19:32:03 -07:00
Merith-TK
5c6fd80b0c Use term.blit on original paint render
This makes it super speedy, meaning an initial refresh doesn't take ages to load.
2021-04-21 08:57:32 -07:00
Merith-TK
f1ec59df15 Clear gets an option to reset the palette (#582)
Fixes #555.
2021-04-21 08:32:34 -07:00
Merith-TK
624b23c7ac Fix epoch documentation to use milliseconds (#580) 2021-04-09 20:45:59 -07:00
Merith-TK
9b77a4aaee Update Readme with Known Issues 2021-04-09 20:03:14 -07:00
1032 changed files with 31291 additions and 39765 deletions

View File

@@ -10,6 +10,3 @@ insert_final_newline = true
[*.md] [*.md]
trim_trailing_whitespace = false trim_trailing_whitespace = false
[*.properties]
insert_final_newline = false

View File

@@ -11,5 +11,6 @@ labels: bug
## Useful information to include: ## Useful information to include:
- Minecraft version - 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. - Detailed reproduction steps: sometimes I can spot a bug pretty easily, but often it's much more obscure. The more information I have to help reproduce it, the quicker it'll get fixed.

View File

@@ -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
View 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
View 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
View File

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

View File

@@ -9,6 +9,9 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Set up Java 8 - name: Set up Java 8
uses: actions/setup-java@v1 uses: actions/setup-java@v1
@@ -16,35 +19,42 @@ jobs:
java-version: 8 java-version: 8
- name: Cache gradle dependencies - name: Cache gradle dependencies
uses: actions/cache@v1 uses: actions/cache@v2
with: with:
path: ~/.gradle/caches path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('gradle.properties') }} key: ${{ runner.os }}-gradle-${{ hashFiles('gradle.properties') }}
restore-keys: | restore-keys: |
${{ runner.os }}-gradle- ${{ runner.os }}-gradle-
- name: Disable Gradle daemon
run: |
mkdir -p ~/.gradle
echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties
- name: Build with Gradle - name: Build with Gradle
run: ./gradlew build --no-daemon || ./gradlew build --no-daemon run: |
./gradlew assemble || ./gradlew assemble
./gradlew build
- name: Upload Jar - name: Upload Jar
uses: actions/upload-artifact@v1 uses: actions/upload-artifact@v2
with: with:
name: cc-restiched name: cc-restitched
path: build/libs path: build/libs
- name: Upload Coverage - name: Parse test reports
run: bash <(curl -s https://codecov.io/bash) run: ./tools/parse-reports.py
continue-on-error: true if: ${{ failure() }}
- name: Generate Java documentation stubs - name: Cache pre-commit
run: ./gradlew luaJavadoc --no-daemon 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: Lint Lua code - name: Run linters
run: | run: |
test -d bin || mkdir bin pip install pre-commit
test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/linux-x86-64/illuaminate pre-commit run --config config/pre-commit/config.yml --show-diff-on-failure --all --color=always
chmod +x bin/illuaminate
bin/illuaminate lint
- name: Check whitespace
run: python3 tools/check-lines.py

3
.gitmodules vendored Normal file
View 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
View 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
View 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

View File

@@ -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

12
.vscode/settings.json vendored
View File

@@ -1,3 +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" "java.configuration.updateBuildConfiguration": "automatic"
} }

View File

@@ -1,5 +1,66 @@
# CC:Restitched Patchwork # CC:Restitched
# This is a Work In Progress Port # CC:R Version VS CC:T Version
*it runs and works-ish* 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
PRs welcome <img src="logo.png" alt="CC: Restitched" width="100%"/>
[![Current build status](https://github.com/Merith-TK/cc-restitched/workflows/Build/badge.svg)](https://github.com/Merith-TK/cc-restitched/actions "Current build status") [![Download CC: Restitched on CurseForge](http://cf.way2muchnoise.eu/title/cc-restitched.svg)](https://www.curseforge.com/minecraft/mc-mods/cc-restitched-updated "Download CC: Restitched on CurseForge")
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/Merith-TK/cc-restitched/)
## 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, admitted they had gotten lethargic so I picked it up to make it equal with CC:T
## Resource Packs
This mod includes textures that are more in-line with the style of Mojang's new texture-artist, Jappa. If you prefer the original textures, enable the "Classic" resource pack provided by the mod.
<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!
## Major Tasks Planned
* Rewrite the config system
* **Planned for 1.96.3 release**
* it currently sets the values that would normally be read from `config/computercraft.json` to the default values, because it does not read the file at all
## Contributing
Any contribution is welcome, be that using the mod, reporting bugs or contributing code. In order to start helping develop CC:R there are a few rules
1) Any updates that port commits from CC:T, ***MUST*** follow the format defined in [patchwork.md](patchwork.md) otherwise they will not be accepted,
* Commit Message must be the same as it is in CC:T,
* patchwork.md must be updated in the following format
> Comments, optional but useful if you had to do something differently than in CC:T outside of [Fabric](https://fabricmc.net/)/[Forge](https://mcforge.readthedocs.io/en/1.16.x/) differences
>
> \`\`\`
>
>commitID
>
> commit title
>
> commit desc
>
> \`\`\`
2) Follow the [Fabric](https://fabricmc.net/) programming guidelines as close as possible. This means you have to use [`loom`](https://fabricmc.net/wiki/tutorial:mappings) mappings,
3) You cannot intentionally implement bugs and security vulnerabilities
4) Unless the commit is a ["patchwork"](https://github.com/Merith-TK/cc-restitched/blob/fabric/patchwork.md) compliant commit, (IE: taken from CC:T), the lua code is off limits
## Bleeding Edge Builds
Bleeding edge builds can be found [here](https://github.com/Merith-TK/cc-restitched/actions) at Github Actions.
## Community
If you need help getting started with CC: Tweaked, want to show off your latest project, or just want to chat about ComputerCraft, here is the [Forum](https://forums.computercraft.cc/) and the [Discord](https://discord.gg/H2UyJXe)
## Known Issues
Main Known issue
* Mods that add blocks that can be used as peripherals for CC:T On forge, don't work with CC:R.
* This is because of the differences between forge and fabric, and that mod devs, to my knowledge have not agreed upon a standard method in which to implement cross compatibility between mods,
* [Fixed (d10f297c): please report if bug persists]</br> ~~Storage Peripherals throw a java "StackOverflowError" when using `pushItems()`,~~
* ~~Work around, you are probably using `pushItems(chest, 1)` or similar. please use `pushItems(chest, 1, nil, 1)`.~~
* Computers will not run built in commands, saying "File not found"
* This is a know bug, dont know what causes it, but just restart the computer (`ctrl+r` for one second) and it will work again
* Occurs when server runs `/reload` or a datapack is updated
## Perpherals
Unfortunately, unlike the original CC:Tweaked project, CC:Restitched, does not have any actual peripheral mods, currently the only one we have is an example for mod devs to get started with making/adding the peripheral API to their mods!
If your a mod dev made a mod with CC:R peripheral support, OR if your a player who found a mod with CC:R support, please open an [issue here](https://github.com/Merith-TK/cc-restitched/issues/new?assignees=&labels=peripheralShoutout&template=peripheral_shoutout.md) to let us know so we can add it to the list!
* ![icon](https://raw.githubusercontent.com/Toad-Dev/cc-peripheral-test/master/src/main/resources/assets/cc_test/textures/block/test_peripheral.png) [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!

View File

@@ -1,6 +1,8 @@
plugins { plugins {
id 'fabric-loom' version '0.5-SNAPSHOT' id 'fabric-loom' version '0.7-SNAPSHOT'
id 'maven-publish' id 'maven-publish'
id "checkstyle"
id "com.github.hierynomus.license" version "0.15.0"
} }
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
@@ -13,6 +15,8 @@ archivesBaseName = "cc-restiched"
repositories { repositories {
mavenCentral() mavenCentral()
maven { url 'https://jitpack.io' }
maven { url "https://maven.shedaniel.me/" }
maven { maven {
name "SquidDev" name "SquidDev"
url "https://squiddev.cc/maven" url "https://squiddev.cc/maven"
@@ -20,50 +24,35 @@ repositories {
} }
configurations { configurations {
compile.extendsFrom shade implementation.extendsFrom shade
} }
dependencies { dependencies {
checkstyle "com.puppycrawl.tools:checkstyle:8.25"
minecraft "com.mojang:minecraft:${mc_version}" minecraft "com.mojang:minecraft:${mc_version}"
mappings "net.fabricmc:yarn:${mc_version}+build.${mappings_version}:v2" mappings "net.fabricmc:yarn:${mc_version}+build.${mappings_version}:v2"
modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}"
compile 'com.electronwill.night-config:json:3.6.0' modApi("me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}") {
exclude(group: "net.fabricmc.fabric-api")
modImplementation "me.shedaniel.cloth:config-2:${cloth_config_version}" }
modImplementation "io.github.prospector:modmenu:${modmenu_version}" modImplementation "io.github.prospector:modmenu:${modmenu_version}"
modImplementation "me.shedaniel.cloth.api:cloth-utils-v1:${cloth_api_version}"
modApi "me.shedaniel.cloth.api:cloth-utils-v1:${project.cloth_api_version}" implementation 'com.electronwill.night-config:toml:3.6.3'
include "me.shedaniel.cloth.api:cloth-utils-v1:${project.cloth_api_version}"
implementation "blue.endless:jankson:${jankson_version}"
implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation 'com.google.code.findbugs:jsr305:3.0.2'
compileOnly 'com.google.auto.service:auto-service:1.0-rc7' shade 'org.squiddev:Cobalt:0.5.2-SNAPSHOT'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
include "me.shedaniel.cloth:config-2:${cloth_config_version}" include "me.shedaniel.cloth.api:cloth-utils-v1:${cloth_api_version}"
include "blue.endless:jankson:${jankson_version}" include 'com.electronwill.night-config:core:3.6.3'
include 'javax.vecmath:vecmath:1.5.2' include 'com.electronwill.night-config:toml:3.6.3'
include "me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}"
compile 'javax.vecmath:vecmath:1.5.2' modRuntime "me.shedaniel:RoughlyEnoughItems-api:5.12.248"
modRuntime "me.shedaniel:RoughlyEnoughItems:5.12.248"
shade 'org.squiddev:Cobalt:0.5.1-SNAPSHOT'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
modRuntime "me.shedaniel:RoughlyEnoughItems-api:5.2.10"
modRuntime "me.shedaniel:RoughlyEnoughItems:5.2.10"
}
sourceSets {
main {
java {
exclude 'dan200/computercraft/shared/integration'
}
}
} }
processResources { processResources {
@@ -100,6 +89,49 @@ jar {
from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) } from configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }
} }
import com.hierynomus.gradle.license.tasks.LicenseCheck
import com.hierynomus.gradle.license.tasks.LicenseFormat
license {
mapping("java", "SLASHSTAR_STYLE")
strictCheck true
ext.year = Calendar.getInstance().get(Calendar.YEAR)
}
[licenseMain, licenseFormatMain].forEach {
it.configure {
include("**/*.java")
exclude("dan200/computercraft/api/**")
header file('config/license/main.txt')
}
}
[licenseTest, licenseFormatTest].forEach {
it.configure {
include("**/*.java")
header file('config/license/main.txt')
}
}
gradle.projectsEvaluated {
tasks.withType(LicenseFormat) {
outputs.upToDateWhen { false }
}
}
task licenseAPI(type: LicenseCheck);
task licenseFormatAPI(type: LicenseFormat);
[licenseAPI, licenseFormatAPI].forEach {
it.configure {
source = sourceSets.main.java
include("dan200/computercraft/api/**")
header file('config/license/api.txt')
}
}
// configure the maven publication // configure the maven publication
publishing { publishing {
publications { publications {

View 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>

View File

@@ -0,0 +1,12 @@
<?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" />
<!-- The commands API is documented in Lua. -->
<suppress checks="SummaryJavadocCheck" files=".*[\\/]CommandAPI.java" />
</suppressions>

File diff suppressed because it is too large Load Diff

View 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
View 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
View 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

View 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/
)

View 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

View File

@@ -2,16 +2,16 @@
org.gradle.jvmargs=-Xmx1G org.gradle.jvmargs=-Xmx1G
# Mod properties # Mod properties
mod_version=1.94.1-beta mod_version=1.96.1-beta
# Minecraft properties # Minecraft properties
mc_version=1.16.2 mc_version=1.16.5
mappings_version=31 mappings_version=9
# Dependencies # Dependencies
cloth_config_version=4.8.1 cloth_config_version=4.11.26
fabric_api_version=0.19.0+build.398-1.16 fabric_loader_version=0.11.3
fabric_loader_version=0.9.2+build.206 fabric_api_version=0.32.0+1.16
jankson_version=1.2.0 jankson_version=1.2.0
modmenu_version=1.14.6+ modmenu_version=1.16.9
cloth_api_version=1.4.5 cloth_api_version=1.4.5

Binary file not shown.

View File

@@ -1,6 +1,5 @@
#Tue Jul 07 13:15:43 EDT 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

53
gradlew vendored
View File

@@ -1,5 +1,21 @@
#!/usr/bin/env sh #!/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 ## Gradle start up script for UN*X
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"` 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. # 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. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD="maximum"
@@ -66,6 +82,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; 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\"" GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi fi
# For Cygwin, switch paths to Windows format before running java # For Cygwin or MSYS, switch paths to Windows format before running java
if $cygwin ; then if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"` APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"` JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath # We build the pattern for arguments to be converted via cygpath
@@ -138,19 +156,19 @@ if $cygwin ; then
else else
eval `echo args$i`="\"$arg\"" eval `echo args$i`="\"$arg\""
fi fi
i=$((i+1)) i=`expr $i + 1`
done done
case $i in case $i in
(0) set -- ;; 0) set -- ;;
(1) set -- "$args0" ;; 1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;; 2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;; 3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;; 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac esac
fi fi
@@ -159,14 +177,9 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " " echo " "
} }
APP_ARGS=$(save "$@") APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules # 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" 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" "$@" exec "$JAVACMD" "$@"

43
gradlew.bat vendored
View File

@@ -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 @if "%DEBUG%" == "" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% 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. @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 @rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init if "%ERRORLEVEL%" == "0" goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 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_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init if exist "%JAVA_EXE%" goto execute
echo. echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,28 +64,14 @@ echo location of your Java installation.
goto fail 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 :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle @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 :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell

BIN
logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -305,9 +305,323 @@ little more detail.
[1] https://github.com/SquidDev-CC/CC-Tweaked/wiki/Monitor-texture-reference [1] https://github.com/SquidDev-CC/CC-Tweaked/wiki/Monitor-texture-reference
``` ```
7f90f2f7cadce0d5b9177b16626979591bce8137
``` ```
7f90f2f7cadce0d5b9177b16626979591bce8137
Clean up some examples a little bit Clean up some examples a little bit
Would be good if they didn't crash and burn on entry :). 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
```

View File

@@ -1,27 +1,14 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft; package dan200.computercraft;
import static dan200.computercraft.shared.ComputerCraftRegistry.ModBlocks;
import static dan200.computercraft.shared.ComputerCraftRegistry.init;
import java.nio.file.Paths;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import dan200.computercraft.api.turtle.event.TurtleAction; import dan200.computercraft.api.turtle.event.TurtleAction;
import dan200.computercraft.core.apis.http.options.Action; import dan200.computercraft.core.apis.http.options.Action;
import dan200.computercraft.core.apis.http.options.AddressRule; import dan200.computercraft.core.apis.http.options.AddressRule;
import dan200.computercraft.core.apis.http.websocket.Websocket;
import dan200.computercraft.core.asm.GenericSource;
import dan200.computercraft.shared.common.ColourableRecipe; import dan200.computercraft.shared.common.ColourableRecipe;
import dan200.computercraft.shared.computer.core.ClientComputerRegistry; import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
import dan200.computercraft.shared.computer.core.ServerComputerRegistry; import dan200.computercraft.shared.computer.core.ServerComputerRegistry;
@@ -32,114 +19,100 @@ import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
import dan200.computercraft.shared.media.recipes.DiskRecipe; import dan200.computercraft.shared.media.recipes.DiskRecipe;
import dan200.computercraft.shared.media.recipes.PrintoutRecipe; import dan200.computercraft.shared.media.recipes.PrintoutRecipe;
import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer; import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
import dan200.computercraft.shared.pocket.peripherals.PocketModem;
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe; import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe;
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon; import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
import dan200.computercraft.shared.turtle.recipes.TurtleRecipe; import dan200.computercraft.shared.turtle.recipes.TurtleRecipe;
import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe; import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe;
import dan200.computercraft.shared.turtle.upgrades.TurtleAxe;
import dan200.computercraft.shared.turtle.upgrades.TurtleCraftingTable;
import dan200.computercraft.shared.turtle.upgrades.TurtleHoe;
import dan200.computercraft.shared.turtle.upgrades.TurtleModem;
import dan200.computercraft.shared.turtle.upgrades.TurtleShovel;
import dan200.computercraft.shared.turtle.upgrades.TurtleSpeaker;
import dan200.computercraft.shared.turtle.upgrades.TurtleSword;
import dan200.computercraft.shared.turtle.upgrades.TurtleTool;
import dan200.computercraft.shared.util.Config;
import dan200.computercraft.shared.util.ImpostorRecipe; import dan200.computercraft.shared.util.ImpostorRecipe;
import dan200.computercraft.shared.util.ImpostorShapelessRecipe; import dan200.computercraft.shared.util.ImpostorShapelessRecipe;
import dan200.computercraft.shared.util.ServiceUtil; import net.fabricmc.api.ModInitializer;
import org.apache.logging.log4j.LogManager; import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
import org.apache.logging.log4j.Logger; 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.ItemGroup;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.fabricmc.api.ModInitializer; import java.util.Arrays;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; import java.util.Collections;
import net.fabricmc.loader.api.FabricLoader; import java.util.EnumSet;
import java.util.List;
import java.util.concurrent.TimeUnit;
public final class ComputerCraft implements ModInitializer { import static dan200.computercraft.shared.ComputerCraftRegistry.ModBlocks;
import static dan200.computercraft.shared.ComputerCraftRegistry.init;
public final class ComputerCraft implements ModInitializer
{
public static final String MOD_ID = "computercraft"; public static final String MOD_ID = "computercraft";
// Configuration options
public static final String[] DEFAULT_HTTP_WHITELIST = new String[] {"*"}; // Configuration fields
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",
"0.0.0.0/8"
};
public static final int terminalWidth_computer = 51;
public static final int terminalHeight_computer = 19;
public static final int terminalWidth_turtle = 39;
public static final int terminalHeight_turtle = 13;
public static final int terminalWidth_pocketComputer = 26;
public static final int terminalHeight_pocketComputer = 20;
// Registries
public static final ClientComputerRegistry clientComputerRegistry = new ClientComputerRegistry();
public static final ServerComputerRegistry serverComputerRegistry = new ServerComputerRegistry();
// Logging
public static final Logger log = LogManager.getLogger(MOD_ID);
public static ItemGroup MAIN_GROUP = FabricItemGroupBuilder.build(new Identifier(MOD_ID, "main"), () -> new ItemStack(ModBlocks.COMPUTER_NORMAL));
public static boolean commandRequireCreative = false;
public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST;
public static int computerSpaceLimit = 1000 * 1000; public static int computerSpaceLimit = 1000 * 1000;
public static int floppySpaceLimit = 125 * 1000; public static int floppySpaceLimit = 125 * 1000;
public static int maximumFilesOpen = 128; public static int maximumFilesOpen = 128;
public static boolean disable_lua51_features = false; public static boolean disableLua51Features = false;
public static String default_computer_settings = ""; public static String defaultComputerSettings = "";
public static boolean debug_enable = true; public static boolean debugEnable = true;
public static boolean logPeripheralErrors = false; public static boolean logComputerErrors = true;
public static int computer_threads = 1; public static boolean commandRequireCreative = true;
public static int computerThreads = 1;
public static long maxMainGlobalTime = TimeUnit.MILLISECONDS.toNanos( 10 ); public static long maxMainGlobalTime = TimeUnit.MILLISECONDS.toNanos( 10 );
public static long maxMainComputerTime = TimeUnit.MILLISECONDS.toNanos( 5 ); public static long maxMainComputerTime = TimeUnit.MILLISECONDS.toNanos( 5 );
public static boolean http_enable = true;
public static boolean http_websocket_enable = true; public static boolean httpEnabled = true;
public static int httpTimeout = 30000; 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 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 httpMaxWebsockets = 4;
public static int httpMaxWebsocketMessage = Websocket.MAX_MESSAGE_SIZE;
public static boolean enableCommandBlock = false; public static boolean enableCommandBlock = false;
public static int modem_range = 64; public static int modemRange = 64;
public static int modem_highAltitudeRange = 384; public static int modemHighAltitudeRange = 384;
public static int modem_rangeDuringStorm = 64; public static int modemRangeDuringStorm = 64;
public static int modem_highAltitudeRangeDuringStorm = 384; public static int modemHighAltitudeRangeDuringStorm = 384;
public static int maxNotesPerTick = 8; 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 boolean turtlesNeedFuel = true;
public static int turtleFuelLimit = 20000; public static int turtleFuelLimit = 20000;
public static int advancedTurtleFuelLimit = 100000; public static int advancedTurtleFuelLimit = 100000;
public static boolean turtlesObeyBlockProtection = true; public static boolean turtlesObeyBlockProtection = true;
public static boolean turtlesCanPush = true; public static boolean turtlesCanPush = true;
public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf( TurtleAction.class ); public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf( TurtleAction.class );
public static int computerTermWidth = 51;
public static int computerTermHeight = 19;
public static final int turtleTermWidth = 39;
public static final int turtleTermHeight = 13;
public static int pocketTermWidth = 26;
public static int pocketTermHeight = 20;
public static int monitorWidth = 8; public static int monitorWidth = 8;
public static int monitorHeight = 6; public static int monitorHeight = 6;
public static double monitorDistanceSq = 4096;
public static List<AddressRule> httpRules = buildHttpRulesFromConfig(DEFAULT_HTTP_BLACKLIST, DEFAULT_HTTP_WHITELIST); // Registries
public static final ClientComputerRegistry clientComputerRegistry = new ClientComputerRegistry();
public static final ServerComputerRegistry serverComputerRegistry = new ServerComputerRegistry();
public static List<AddressRule> buildHttpRulesFromConfig(String[] blacklist, String[] whitelist) { // Logging
return Stream.concat(Stream.of(blacklist) public static final Logger log = LogManager.getLogger( MOD_ID );
.map( x -> AddressRule.parse( x, null, Action.DENY.toPartial()))
.filter(Objects::nonNull), public static ItemGroup MAIN_GROUP = FabricItemGroupBuilder.build( new Identifier( MOD_ID, "main" ), () -> new ItemStack( ModBlocks.COMPUTER_NORMAL ) );
Stream.of(whitelist)
.map( x -> AddressRule.parse( x, null, Action.ALLOW.toPartial()))
.filter(Objects::nonNull))
.collect(Collectors.toList());
}
@Override @Override
public void onInitialize() { public void onInitialize()
Config.load(Paths.get(FabricLoader.getInstance() {
.getConfigDir()
.toFile()
.getPath(), MOD_ID + ".json5"));
ComputerCraftProxyCommon.init(); 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, "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, "computer_upgrade" ), ComputerUpgradeRecipe.SERIALIZER );
@@ -156,7 +129,9 @@ public final class ComputerCraft implements ModInitializer {
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, "player_creative" ), PlayerCreativeLootCondition.TYPE );
Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "has_id" ), HasComputerIdLootCondition.TYPE ); Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "has_id" ), HasComputerIdLootCondition.TYPE );
init(); init();
GenericSource.setup( () -> ServiceUtil.loadServices( GenericSource.class )); 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 );
} );
} }
} }

View File

@@ -1,21 +1,15 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft; package dan200.computercraft;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.ComputerCraftAPI.IComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI.IComputerCraftAPI;
import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.filesystem.IWritableMount;
import dan200.computercraft.api.lua.GenericSource;
import dan200.computercraft.api.lua.ILuaAPIFactory; import dan200.computercraft.api.lua.ILuaAPIFactory;
import dan200.computercraft.api.media.IMediaProvider; import dan200.computercraft.api.media.IMediaProvider;
import dan200.computercraft.api.network.IPacketNetwork; import dan200.computercraft.api.network.IPacketNetwork;
@@ -26,21 +20,18 @@ import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.api.redstone.IBundledRedstoneProvider; import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.core.apis.ApiFactories; import dan200.computercraft.core.apis.ApiFactories;
import dan200.computercraft.core.asm.GenericMethod;
import dan200.computercraft.core.filesystem.FileMount; import dan200.computercraft.core.filesystem.FileMount;
import dan200.computercraft.core.filesystem.ResourceMount; import dan200.computercraft.core.filesystem.ResourceMount;
import dan200.computercraft.mixin.MinecraftServerAccess; import dan200.computercraft.fabric.mixin.MinecraftServerAccess;
import dan200.computercraft.shared.BundledRedstone; import dan200.computercraft.shared.*;
import dan200.computercraft.shared.MediaProviders;
import dan200.computercraft.shared.Peripherals;
import dan200.computercraft.shared.PocketUpgrades;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.peripheral.modem.wired.TileCable; import dan200.computercraft.shared.peripheral.modem.wired.TileCable;
import dan200.computercraft.shared.peripheral.modem.wired.TileWiredModemFull; import dan200.computercraft.shared.peripheral.modem.wired.TileWiredModemFull;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.util.IDAssigner;
import dan200.computercraft.shared.wired.WiredNode; import dan200.computercraft.shared.wired.WiredNode;
import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.resource.ReloadableResourceManager; import net.minecraft.resource.ReloadableResourceManager;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
@@ -50,24 +41,35 @@ import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.fabricmc.loader.api.FabricLoader; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public final class ComputerCraftAPIImpl implements IComputerCraftAPI { public final class ComputerCraftAPIImpl implements IComputerCraftAPI
{
public static final ComputerCraftAPIImpl INSTANCE = new ComputerCraftAPIImpl(); public static final ComputerCraftAPIImpl INSTANCE = new ComputerCraftAPIImpl();
private String version; private String version;
private ComputerCraftAPIImpl() { private ComputerCraftAPIImpl()
{
} }
public static InputStream getResourceFile(String domain, String subPath) { public static InputStream getResourceFile( String domain, String subPath )
{
MinecraftServer server = GameInstanceUtils.getServer(); MinecraftServer server = GameInstanceUtils.getServer();
if (server != null) { if( server != null )
{
ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager(); ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager();
try { try
{
return manager.getResource( new Identifier( domain, subPath ) ) return manager.getResource( new Identifier( domain, subPath ) )
.getInputStream(); .getInputStream();
} catch (IOException ignored) { }
catch( IOException ignored )
{
return null; return null;
} }
} }
@@ -76,8 +78,10 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
@Nonnull @Nonnull
@Override @Override
public String getInstalledVersion() { public String getInstalledVersion()
if (this.version != null) { {
if( this.version != null )
{
return this.version; return this.version;
} }
return this.version = FabricLoader.getInstance() return this.version = FabricLoader.getInstance()
@@ -89,23 +93,30 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
} }
@Override @Override
public int createUniqueNumberedSaveDir(@Nonnull World world, @Nonnull String parentSubPath) { public int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath )
{
return IDAssigner.getNextId( parentSubPath ); return IDAssigner.getNextId( parentSubPath );
} }
@Override @Override
public IWritableMount createSaveDirMount(@Nonnull World world, @Nonnull String subPath, long capacity) { public IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity )
try { {
try
{
return new FileMount( new File( IDAssigner.getDir(), subPath ), capacity ); return new FileMount( new File( IDAssigner.getDir(), subPath ), capacity );
} catch (Exception e) { }
catch( Exception e )
{
return null; return null;
} }
} }
@Override @Override
public IMount createResourceMount(@Nonnull String domain, @Nonnull String subPath) { public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
{
MinecraftServer server = GameInstanceUtils.getServer(); MinecraftServer server = GameInstanceUtils.getServer();
if (server != null) { if( server != null )
{
ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager(); ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager();
ResourceMount mount = ResourceMount.get( domain, subPath, manager ); ResourceMount mount = ResourceMount.get( domain, subPath, manager );
return mount.exists( "" ) ? mount : null; return mount.exists( "" ) ? mount : null;
@@ -114,59 +125,78 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI {
} }
@Override @Override
public void registerPeripheralProvider(@Nonnull IPeripheralProvider provider) { public void registerPeripheralProvider( @Nonnull IPeripheralProvider provider )
{
Peripherals.register( provider ); Peripherals.register( provider );
} }
@Override @Override
public void registerTurtleUpgrade(@Nonnull ITurtleUpgrade upgrade) { public void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade )
{
TurtleUpgrades.register( upgrade ); TurtleUpgrades.register( upgrade );
} }
@Override @Override
public void registerBundledRedstoneProvider(@Nonnull IBundledRedstoneProvider provider) { public void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider )
{
BundledRedstone.register( provider ); BundledRedstone.register( provider );
} }
@Override @Override
public int getBundledRedstoneOutput(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side) { public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
{
return BundledRedstone.getDefaultOutput( world, pos, side ); return BundledRedstone.getDefaultOutput( world, pos, side );
} }
@Override @Override
public void registerMediaProvider(@Nonnull IMediaProvider provider) { public void registerMediaProvider( @Nonnull IMediaProvider provider )
{
MediaProviders.register( provider ); MediaProviders.register( provider );
} }
@Override @Override
public void registerPocketUpgrade(@Nonnull IPocketUpgrade upgrade) { public void registerPocketUpgrade( @Nonnull IPocketUpgrade upgrade )
{
PocketUpgrades.register( upgrade ); PocketUpgrades.register( upgrade );
} }
@Override
public void registerGenericSource( @Nonnull GenericSource source )
{
GenericMethod.register( source );
}
@Nonnull @Nonnull
@Override @Override
public IPacketNetwork getWirelessNetwork() { public IPacketNetwork getWirelessNetwork()
{
return WirelessNetwork.getUniversal(); return WirelessNetwork.getUniversal();
} }
@Override @Override
public void registerAPIFactory(@Nonnull ILuaAPIFactory factory) { public void registerAPIFactory( @Nonnull ILuaAPIFactory factory )
{
ApiFactories.register( factory ); ApiFactories.register( factory );
} }
@Nonnull @Nonnull
@Override @Override
public IWiredNode createWiredNodeForElement(@Nonnull IWiredElement element) { public IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element )
{
return new WiredNode( element ); return new WiredNode( element );
} }
@Nullable @Nullable
@Override @Override
public IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side) { public IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
{
BlockEntity tile = world.getBlockEntity( pos ); BlockEntity tile = world.getBlockEntity( pos );
if (tile instanceof TileCable) { if( tile instanceof TileCable )
{
return ((TileCable) tile).getElement( side ); return ((TileCable) tile).getElement( side );
} else if (tile instanceof TileWiredModemFull) { }
else if( tile instanceof TileWiredModemFull )
{
return ((TileWiredModemFull) tile).getElement(); return ((TileWiredModemFull) tile).getElement();
} }
return null; return null;

View File

@@ -1,16 +1,14 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api; package dan200.computercraft.api;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.filesystem.IWritableMount;
import dan200.computercraft.api.lua.GenericSource;
import dan200.computercraft.api.lua.ILuaAPIFactory; import dan200.computercraft.api.lua.ILuaAPIFactory;
import dan200.computercraft.api.media.IMedia; import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.media.IMediaProvider; import dan200.computercraft.api.media.IMediaProvider;
@@ -23,42 +21,52 @@ import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.api.redstone.IBundledRedstoneProvider; import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** /**
* The static entry point to the ComputerCraft API. * 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 { public final class ComputerCraftAPI
{
private static IComputerCraftAPI instance; private static IComputerCraftAPI instance;
@Nonnull @Nonnull
@Deprecated @Deprecated
public static String getAPIVersion() { public static String getAPIVersion()
{
return getInstalledVersion(); return getInstalledVersion();
} }
@Nonnull @Nonnull
public static String getInstalledVersion() { public static String getInstalledVersion()
{
return getInstance().getInstalledVersion(); return getInstance().getInstalledVersion();
} }
@Nonnull @Nonnull
private static IComputerCraftAPI getInstance() { private static IComputerCraftAPI getInstance()
if (instance != null) { {
if( instance != null )
{
return instance; return instance;
} }
try { try
{
return instance = (IComputerCraftAPI) Class.forName( "dan200.computercraft.ComputerCraftAPIImpl" ) return instance = (IComputerCraftAPI) Class.forName( "dan200.computercraft.ComputerCraftAPIImpl" )
.getField( "INSTANCE" ) .getField( "INSTANCE" )
.get( null ); .get( null );
} catch (ReflectiveOperationException e) { }
catch( ReflectiveOperationException e )
{
throw new IllegalStateException( "Cannot find ComputerCraft API", e ); throw new IllegalStateException( "Cannot find ComputerCraft API", e );
} }
} }
@@ -75,7 +83,8 @@ public final class ComputerCraftAPI {
* 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) * @see #createSaveDirMount(World, String, long)
*/ */
public static int createUniqueNumberedSaveDir(@Nonnull World world, @Nonnull String parentSubPath) { public static int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath )
{
return getInstance().createUniqueNumberedSaveDir( world, parentSubPath ); return getInstance().createUniqueNumberedSaveDir( world, parentSubPath );
} }
@@ -98,7 +107,8 @@ public final class ComputerCraftAPI {
* @see IWritableMount * @see IWritableMount
*/ */
@Nullable @Nullable
public static IWritableMount createSaveDirMount(@Nonnull World world, @Nonnull String subPath, long capacity) { public static IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity )
{
return getInstance().createSaveDirMount( world, subPath, capacity ); return getInstance().createSaveDirMount( world, subPath, capacity );
} }
@@ -108,7 +118,10 @@ public final class ComputerCraftAPI {
* Use in conjunction with {@link IComputerAccess#mount} or {@link IComputerAccess#mountWritable} to mount a resource folder onto a computer's file * Use in conjunction with {@link IComputerAccess#mount} or {@link IComputerAccess#mountWritable} to mount a resource folder onto a computer's file
* system. * system.
* *
* The files in this mount will be a combination of files in all mod jar, and data packs that contain resources with the same domain and path. * The files in this mount will be a combination of files in all mod jar, and data packs that contain
* resources with the same domain and path. For instance, ComputerCraft's resources are stored in
* "/data/computercraft/lua/rom". We construct a mount for that with
* {@code createResourceMount("computercraft", "lua/rom")}.
* *
* @param domain The domain under which to look for resources. eg: "mymod". * @param domain The domain under which to look for resources. eg: "mymod".
* @param subPath The subPath under which to look for resources. eg: "lua/myfiles". * @param subPath The subPath under which to look for resources. eg: "lua/myfiles".
@@ -118,7 +131,8 @@ public final class ComputerCraftAPI {
* @see IMount * @see IMount
*/ */
@Nullable @Nullable
public static IMount createResourceMount(@Nonnull String domain, @Nonnull String subPath) { public static IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
{
return getInstance().createResourceMount( domain, subPath ); return getInstance().createResourceMount( domain, subPath );
} }
@@ -129,10 +143,22 @@ public final class ComputerCraftAPI {
* @see IPeripheral * @see IPeripheral
* @see IPeripheralProvider * @see IPeripheralProvider
*/ */
public static void registerPeripheralProvider(@Nonnull IPeripheralProvider provider) { public static void registerPeripheralProvider( @Nonnull IPeripheralProvider provider )
{
getInstance().registerPeripheralProvider( provider ); getInstance().registerPeripheralProvider( provider );
} }
/**
* Registers a method source for generic peripherals.
*
* @param source The method source to register.
* @see GenericSource
*/
public static void registerGenericSource( @Nonnull GenericSource source )
{
getInstance().registerGenericSource( source );
}
/** /**
* 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 * 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. * recommended to call this during the load() method of your mod.
@@ -140,7 +166,8 @@ public final class ComputerCraftAPI {
* @param upgrade The turtle upgrade to register. * @param upgrade The turtle upgrade to register.
* @see ITurtleUpgrade * @see ITurtleUpgrade
*/ */
public static void registerTurtleUpgrade(@Nonnull ITurtleUpgrade upgrade) { public static void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade )
{
getInstance().registerTurtleUpgrade( upgrade ); getInstance().registerTurtleUpgrade( upgrade );
} }
@@ -150,7 +177,8 @@ public final class ComputerCraftAPI {
* @param provider The bundled redstone provider to register. * @param provider The bundled redstone provider to register.
* @see IBundledRedstoneProvider * @see IBundledRedstoneProvider
*/ */
public static void registerBundledRedstoneProvider(@Nonnull IBundledRedstoneProvider provider) { public static void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider )
{
getInstance().registerBundledRedstoneProvider( provider ); getInstance().registerBundledRedstoneProvider( provider );
} }
@@ -164,7 +192,8 @@ public final class ComputerCraftAPI {
* capable of emitting bundled redstone at the location, -1 will be returned. * capable of emitting bundled redstone at the location, -1 will be returned.
* @see IBundledRedstoneProvider * @see IBundledRedstoneProvider
*/ */
public static int getBundledRedstoneOutput(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side) { public static int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
{
return getInstance().getBundledRedstoneOutput( world, pos, side ); return getInstance().getBundledRedstoneOutput( world, pos, side );
} }
@@ -174,11 +203,13 @@ public final class ComputerCraftAPI {
* @param provider The media provider to register. * @param provider The media provider to register.
* @see IMediaProvider * @see IMediaProvider
*/ */
public static void registerMediaProvider(@Nonnull IMediaProvider provider) { public static void registerMediaProvider( @Nonnull IMediaProvider provider )
{
getInstance().registerMediaProvider( provider ); getInstance().registerMediaProvider( provider );
} }
public static void registerPocketUpgrade(@Nonnull IPocketUpgrade upgrade) { public static void registerPocketUpgrade( @Nonnull IPocketUpgrade upgrade )
{
getInstance().registerPocketUpgrade( upgrade ); getInstance().registerPocketUpgrade( upgrade );
} }
@@ -187,11 +218,13 @@ public final class ComputerCraftAPI {
* *
* @return The global wireless network, or {@code null} if it could not be fetched. * @return The global wireless network, or {@code null} if it could not be fetched.
*/ */
public static IPacketNetwork getWirelessNetwork() { public static IPacketNetwork getWirelessNetwork()
{
return getInstance().getWirelessNetwork(); return getInstance().getWirelessNetwork();
} }
public static void registerAPIFactory(@Nonnull ILuaAPIFactory factory) { public static void registerAPIFactory( @Nonnull ILuaAPIFactory factory )
{
getInstance().registerAPIFactory( factory ); getInstance().registerAPIFactory( factory );
} }
@@ -203,7 +236,8 @@ public final class ComputerCraftAPI {
* @see IWiredElement#getNode() * @see IWiredElement#getNode()
*/ */
@Nonnull @Nonnull
public static IWiredNode createWiredNodeForElement(@Nonnull IWiredElement element) { public static IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element )
{
return getInstance().createWiredNodeForElement( element ); return getInstance().createWiredNodeForElement( element );
} }
@@ -217,11 +251,13 @@ public final class ComputerCraftAPI {
* @see IWiredElement#getNode() * @see IWiredElement#getNode()
*/ */
@Nullable @Nullable
public static IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side) { public static IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side )
{
return getInstance().getWiredElementAt( world, pos, side ); return getInstance().getWiredElementAt( world, pos, side );
} }
public interface IComputerCraftAPI { public interface IComputerCraftAPI
{
@Nonnull @Nonnull
String getInstalledVersion(); String getInstalledVersion();
@@ -235,6 +271,8 @@ public final class ComputerCraftAPI {
void registerPeripheralProvider( @Nonnull IPeripheralProvider provider ); void registerPeripheralProvider( @Nonnull IPeripheralProvider provider );
void registerGenericSource( @Nonnull GenericSource source );
void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade ); void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade );
void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider ); void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider );

View File

@@ -0,0 +1,86 @@
/*
* This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2021. 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 );
}
}

View File

@@ -1,17 +1,14 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.client; package dan200.computercraft.api.client;
import java.util.Objects; import dan200.computercraft.fabric.mixin.AffineTransformationAccess;
import net.fabricmc.api.EnvType;
import javax.annotation.Nonnull; import net.fabricmc.api.Environment;
import dan200.computercraft.mixin.AffineTransformationAccess;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.BakedModelManager; import net.minecraft.client.render.model.BakedModelManager;
@@ -20,34 +17,39 @@ import net.minecraft.client.util.math.AffineTransformation;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.fabricmc.api.EnvType; import javax.annotation.Nonnull;
import net.fabricmc.api.Environment; import java.util.Objects;
/** /**
* A model to render, combined with a transformation matrix to apply. * A model to render, combined with a transformation matrix to apply.
*/ */
@Environment( EnvType.CLIENT ) @Environment( EnvType.CLIENT )
public final class TransformedModel { public final class TransformedModel
{
private final BakedModel model; private final BakedModel model;
private final AffineTransformation matrix; private final AffineTransformation matrix;
public TransformedModel(@Nonnull BakedModel model, @Nonnull AffineTransformation matrix) { public TransformedModel( @Nonnull BakedModel model, @Nonnull AffineTransformation matrix )
{
this.model = Objects.requireNonNull( model ); this.model = Objects.requireNonNull( model );
this.matrix = Objects.requireNonNull( matrix ); this.matrix = Objects.requireNonNull( matrix );
} }
public TransformedModel(@Nonnull BakedModel model) { public TransformedModel( @Nonnull BakedModel model )
{
this.model = Objects.requireNonNull( model ); this.model = Objects.requireNonNull( model );
this.matrix = AffineTransformation.identity(); this.matrix = AffineTransformation.identity();
} }
public static TransformedModel of(@Nonnull ModelIdentifier location) { public static TransformedModel of( @Nonnull ModelIdentifier location )
{
BakedModelManager modelManager = MinecraftClient.getInstance() BakedModelManager modelManager = MinecraftClient.getInstance()
.getBakedModelManager(); .getBakedModelManager();
return new TransformedModel( modelManager.getModel( location ) ); return new TransformedModel( modelManager.getModel( location ) );
} }
public static TransformedModel of(@Nonnull ItemStack item, @Nonnull AffineTransformation transform) { public static TransformedModel of( @Nonnull ItemStack item, @Nonnull AffineTransformation transform )
{
BakedModel model = MinecraftClient.getInstance() BakedModel model = MinecraftClient.getInstance()
.getItemRenderer() .getItemRenderer()
.getModels() .getModels()
@@ -56,28 +58,37 @@ public final class TransformedModel {
} }
@Nonnull @Nonnull
public BakedModel getModel() { public BakedModel getModel()
{
return this.model; return this.model;
} }
@Nonnull @Nonnull
public AffineTransformation getMatrix() { public AffineTransformation getMatrix()
{
return this.matrix; return this.matrix;
} }
public void push(MatrixStack matrixStack) { public void push( MatrixStack matrixStack )
{
matrixStack.push(); matrixStack.push();
AffineTransformationAccess access = (AffineTransformationAccess) (Object) this.matrix; AffineTransformationAccess access = (AffineTransformationAccess) (Object) this.matrix;
if( access.getTranslation() != null ) if( access.getTranslation() != null )
{
matrixStack.translate( access.getTranslation().getX(), access.getTranslation().getY(), access.getTranslation().getZ() ); matrixStack.translate( access.getTranslation().getX(), access.getTranslation().getY(), access.getTranslation().getZ() );
}
matrixStack.multiply( this.matrix.getRotation2() ); matrixStack.multiply( this.matrix.getRotation2() );
if( access.getScale() != null ) if( access.getScale() != null )
{
matrixStack.scale( access.getScale().getX(), access.getScale().getY(), access.getScale().getZ() ); matrixStack.scale( access.getScale().getX(), access.getScale().getY(), access.getScale().getZ() );
}
if( access.getRotation1() != null ) if( access.getRotation1() != null )
{
matrixStack.multiply( access.getRotation1() ); matrixStack.multiply( access.getRotation1() );
} }
} }
}

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -13,59 +13,70 @@ import java.time.Instant;
/** /**
* A simple version of {@link BasicFileAttributes}, which provides what information a {@link IMount} already exposes. * A simple version of {@link BasicFileAttributes}, which provides what information a {@link IMount} already exposes.
*/ */
final class FileAttributes implements BasicFileAttributes { final class FileAttributes implements BasicFileAttributes
{
private static final FileTime EPOCH = FileTime.from( Instant.EPOCH ); private static final FileTime EPOCH = FileTime.from( Instant.EPOCH );
private final boolean isDirectory; private final boolean isDirectory;
private final long size; private final long size;
FileAttributes(boolean isDirectory, long size) { FileAttributes( boolean isDirectory, long size )
{
this.isDirectory = isDirectory; this.isDirectory = isDirectory;
this.size = size; this.size = size;
} }
@Override @Override
public FileTime lastModifiedTime() { public FileTime lastModifiedTime()
{
return EPOCH; return EPOCH;
} }
@Override @Override
public FileTime lastAccessTime() { public FileTime lastAccessTime()
{
return EPOCH; return EPOCH;
} }
@Override @Override
public FileTime creationTime() { public FileTime creationTime()
{
return EPOCH; return EPOCH;
} }
@Override @Override
public boolean isRegularFile() { public boolean isRegularFile()
{
return !this.isDirectory; return !this.isDirectory;
} }
@Override @Override
public boolean isDirectory() { public boolean isDirectory()
{
return this.isDirectory; return this.isDirectory;
} }
@Override @Override
public boolean isSymbolicLink() { public boolean isSymbolicLink()
{
return false; return false;
} }
@Override @Override
public boolean isOther() { public boolean isOther()
{
return false; return false;
} }
@Override @Override
public long size() { public long size()
{
return this.size; return this.size;
} }
@Override @Override
public Object fileKey() { public Object fileKey()
{
return null; return null;
} }
} }

View File

@@ -1,39 +1,42 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.filesystem; package dan200.computercraft.api.filesystem;
import java.io.IOException;
import java.util.Objects;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.IOException;
import java.util.Objects;
/** /**
* An {@link IOException} which occurred on a specific file. * 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. * This may be thrown from a {@link IMount} or {@link IWritableMount} to give more information about a failure.
*/ */
public class FileOperationException extends IOException { public class FileOperationException extends IOException
{
private static final long serialVersionUID = -8809108200853029849L; private static final long serialVersionUID = -8809108200853029849L;
private final String filename; private final String filename;
public FileOperationException(@Nullable String filename, @Nonnull String message) { public FileOperationException( @Nullable String filename, @Nonnull String message )
{
super( Objects.requireNonNull( message, "message cannot be null" ) ); super( Objects.requireNonNull( message, "message cannot be null" ) );
this.filename = filename; this.filename = filename;
} }
public FileOperationException(@Nonnull String message) { public FileOperationException( @Nonnull String message )
{
super( Objects.requireNonNull( message, "message cannot be null" ) ); super( Objects.requireNonNull( message, "message cannot be null" ) );
this.filename = null; this.filename = null;
} }
@Nullable @Nullable
public String getFilename() { public String getFilename()
{
return this.filename; return this.filename;
} }
} }

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -13,7 +13,8 @@ import java.io.IOException;
* *
* This exists for use by various APIs - one should not attempt to mount it. * This exists for use by various APIs - one should not attempt to mount it.
*/ */
public interface IFileSystem extends IWritableMount { public interface IFileSystem extends IWritableMount
{
/** /**
* Combine two paths together, reducing them into a normalised form. * Combine two paths together, reducing them into a normalised form.
* *

View File

@@ -1,23 +1,21 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.filesystem; package dan200.computercraft.api.filesystem;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IComputerAccess;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.io.IOException; import java.io.IOException;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IComputerAccess;
import net.minecraft.world.World;
/** /**
* Represents a read only part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)}. * Represents a read only part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)}.
* *
@@ -29,7 +27,8 @@ import net.minecraft.world.World;
* @see IComputerAccess#mount(String, IMount) * @see IComputerAccess#mount(String, IMount)
* @see IWritableMount * @see IWritableMount
*/ */
public interface IMount { public interface IMount
{
/** /**
* Returns the file names of all the files in a directory. * Returns the file names of all the files in a directory.
* *
@@ -58,8 +57,10 @@ public interface IMount {
* @throws IOException If the file does not exist, or attributes could not be fetched. * @throws IOException If the file does not exist, or attributes could not be fetched.
*/ */
@Nonnull @Nonnull
default BasicFileAttributes getAttributes(@Nonnull String path) throws IOException { default BasicFileAttributes getAttributes( @Nonnull String path ) throws IOException
if (!this.exists(path)) { {
if( !this.exists( path ) )
{
throw new FileOperationException( path, "No such file" ); throw new FileOperationException( path, "No such file" );
} }
return new FileAttributes( this.isDirectory( path ), this.getSize( path ) ); return new FileAttributes( this.isDirectory( path ), this.getSize( path ) );

View File

@@ -1,23 +1,21 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.filesystem; package dan200.computercraft.api.filesystem;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IComputerAccess;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.util.OptionalLong; import java.util.OptionalLong;
import javax.annotation.Nonnull;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IComputerAccess;
import net.minecraft.world.World;
/** /**
* Represents a part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)} or {@link * 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. * IComputerAccess#mountWritable(String, IWritableMount)}, that can also be written to.
@@ -30,7 +28,8 @@ import net.minecraft.world.World;
* @see IComputerAccess#mountWritable(String, IWritableMount) * @see IComputerAccess#mountWritable(String, IWritableMount)
* @see IMount * @see IMount
*/ */
public interface IWritableMount extends IMount { public interface IWritableMount extends IMount
{
/** /**
* Creates a directory at a given path inside the virtual file system. * Creates a directory at a given path inside the virtual file system.
* *
@@ -84,7 +83,8 @@ public interface IWritableMount extends IMount {
* @return The capacity of this mount, in bytes. * @return The capacity of this mount, in bytes.
*/ */
@Nonnull @Nonnull
default OptionalLong getCapacity() { default OptionalLong getCapacity()
{
return OptionalLong.empty(); return OptionalLong.empty();
} }
} }

View File

@@ -0,0 +1,58 @@
/*
* This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2021. 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();
}

View File

@@ -1,24 +1,24 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import static dan200.computercraft.api.lua.LuaValues.checkFinite; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nonnull; import static dan200.computercraft.api.lua.LuaValues.checkFinite;
import javax.annotation.Nullable;
/** /**
* The arguments passed to a function. * The arguments passed to a function.
*/ */
public interface IArguments { public interface IArguments
{
/** /**
* Drop a number of arguments. The returned arguments instance will access arguments at position {@code i + count}, rather than {@code i}. However, * 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. * errors will still use the given argument index.
@@ -28,9 +28,11 @@ public interface IArguments {
*/ */
IArguments drop( int count ); IArguments drop( int count );
default Object[] getAll() { default Object[] getAll()
{
Object[] result = new Object[this.count()]; Object[] result = new Object[this.count()];
for (int i = 0; i < result.length; i++) { for( int i = 0; i < result.length; i++ )
{
result[i] = this.get( i ); result[i] = this.get( i );
} }
return result; return result;
@@ -67,7 +69,8 @@ public interface IArguments {
* @return The argument's value. * @return The argument's value.
* @throws LuaException If the value is not an integer. * @throws LuaException If the value is not an integer.
*/ */
default int getInt(int index) throws LuaException { default int getInt( int index ) throws LuaException
{
return (int) this.getLong( index ); return (int) this.getLong( index );
} }
@@ -78,9 +81,11 @@ public interface IArguments {
* @return The argument's value. * @return The argument's value.
* @throws LuaException If the value is not a long. * @throws LuaException If the value is not a long.
*/ */
default long getLong(int index) throws LuaException { default long getLong( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (!(value instanceof Number)) { if( !(value instanceof Number) )
{
throw LuaValues.badArgumentOf( index, "number", value ); throw LuaValues.badArgumentOf( index, "number", value );
} }
return LuaValues.checkFiniteNum( index, (Number) value ) return LuaValues.checkFiniteNum( index, (Number) value )
@@ -94,7 +99,8 @@ public interface IArguments {
* @return The argument's value. * @return The argument's value.
* @throws LuaException If the value is not finite. * @throws LuaException If the value is not finite.
*/ */
default double getFiniteDouble(int index) throws LuaException { default double getFiniteDouble( int index ) throws LuaException
{
return checkFinite( index, this.getDouble( index ) ); return checkFinite( index, this.getDouble( index ) );
} }
@@ -106,9 +112,11 @@ public interface IArguments {
* @throws LuaException If the value is not a number. * @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). * @see #getFiniteDouble(int) if you require this to be finite (i.e. not infinite or NaN).
*/ */
default double getDouble(int index) throws LuaException { default double getDouble( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (!(value instanceof Number)) { if( !(value instanceof Number) )
{
throw LuaValues.badArgumentOf( index, "number", value ); throw LuaValues.badArgumentOf( index, "number", value );
} }
return ((Number) value).doubleValue(); return ((Number) value).doubleValue();
@@ -121,9 +129,11 @@ public interface IArguments {
* @return The argument's value. * @return The argument's value.
* @throws LuaException If the value is not a boolean. * @throws LuaException If the value is not a boolean.
*/ */
default boolean getBoolean(int index) throws LuaException { default boolean getBoolean( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (!(value instanceof Boolean)) { if( !(value instanceof Boolean) )
{
throw LuaValues.badArgumentOf( index, "boolean", value ); throw LuaValues.badArgumentOf( index, "boolean", value );
} }
return (Boolean) value; return (Boolean) value;
@@ -137,7 +147,8 @@ public interface IArguments {
* @throws LuaException If the value is not a string. * @throws LuaException If the value is not a string.
*/ */
@Nonnull @Nonnull
default ByteBuffer getBytes(int index) throws LuaException { default ByteBuffer getBytes( int index ) throws LuaException
{
return LuaValues.encode( this.getString( index ) ); return LuaValues.encode( this.getString( index ) );
} }
@@ -149,9 +160,11 @@ public interface IArguments {
* @throws LuaException If the value is not a string. * @throws LuaException If the value is not a string.
*/ */
@Nonnull @Nonnull
default String getString(int index) throws LuaException { default String getString( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (!(value instanceof String)) { if( !(value instanceof String) )
{
throw LuaValues.badArgumentOf( index, "string", value ); throw LuaValues.badArgumentOf( index, "string", value );
} }
return (String) value; return (String) value;
@@ -167,7 +180,8 @@ public interface IArguments {
* @throws LuaException If the value is not a string or not a valid option for this enum. * @throws LuaException If the value is not a string or not a valid option for this enum.
*/ */
@Nonnull @Nonnull
default <T extends Enum<T>> T getEnum(int index, Class<T> klass) throws LuaException { default <T extends Enum<T>> T getEnum( int index, Class<T> klass ) throws LuaException
{
return LuaValues.checkEnum( index, klass, this.getString( index ) ); return LuaValues.checkEnum( index, klass, this.getString( index ) );
} }
@@ -179,9 +193,11 @@ public interface IArguments {
* @throws LuaException If the value is not a table. * @throws LuaException If the value is not a table.
*/ */
@Nonnull @Nonnull
default Map<?, ?> getTable(int index) throws LuaException { default Map<?, ?> getTable( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (!(value instanceof Map)) { if( !(value instanceof Map) )
{
throw LuaValues.badArgumentOf( index, "table", value ); throw LuaValues.badArgumentOf( index, "table", value );
} }
return (Map<?, ?>) value; return (Map<?, ?>) value;
@@ -194,7 +210,8 @@ public interface IArguments {
* @return The argument's value, or {@link Optional#empty()} if not present. This is a <em>read only</em> buffer. * @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. * @throws LuaException If the value is not a string.
*/ */
default Optional<ByteBuffer> optBytes(int index) throws LuaException { default Optional<ByteBuffer> optBytes( int index ) throws LuaException
{
return this.optString( index ).map( LuaValues::encode ); return this.optString( index ).map( LuaValues::encode );
} }
@@ -205,12 +222,15 @@ public interface IArguments {
* @return The argument's value, or {@link Optional#empty()} if not present. * @return The argument's value, or {@link Optional#empty()} if not present.
* @throws LuaException If the value is not a string. * @throws LuaException If the value is not a string.
*/ */
default Optional<String> optString(int index) throws LuaException { default Optional<String> optString( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (value == null) { if( value == null )
{
return Optional.empty(); return Optional.empty();
} }
if (!(value instanceof String)) { if( !(value instanceof String) )
{
throw LuaValues.badArgumentOf( index, "string", value ); throw LuaValues.badArgumentOf( index, "string", value );
} }
return Optional.of( (String) value ); return Optional.of( (String) value );
@@ -226,7 +246,8 @@ public interface IArguments {
* @throws LuaException If the value is not a string or not a valid option for this enum. * @throws LuaException If the value is not a string or not a valid option for this enum.
*/ */
@Nonnull @Nonnull
default <T extends Enum<T>> Optional<T> optEnum(int index, Class<T> klass) throws LuaException { default <T extends Enum<T>> Optional<T> optEnum( int index, Class<T> klass ) throws LuaException
{
Optional<String> str = this.optString( index ); Optional<String> str = this.optString( index );
return str.isPresent() ? Optional.of( LuaValues.checkEnum( index, klass, str.get() ) ) : Optional.empty(); return str.isPresent() ? Optional.of( LuaValues.checkEnum( index, klass, str.get() ) ) : Optional.empty();
} }
@@ -239,7 +260,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not a number. * @throws LuaException If the value is not a number.
*/ */
default double optDouble(int index, double def) throws LuaException { default double optDouble( int index, double def ) throws LuaException
{
return this.optDouble( index ).orElse( def ); return this.optDouble( index ).orElse( def );
} }
@@ -251,12 +273,15 @@ public interface IArguments {
* @throws LuaException If the value is not a number. * @throws LuaException If the value is not a number.
*/ */
@Nonnull @Nonnull
default Optional<Double> optDouble(int index) throws LuaException { default Optional<Double> optDouble( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (value == null) { if( value == null )
{
return Optional.empty(); return Optional.empty();
} }
if (!(value instanceof Number)) { if( !(value instanceof Number) )
{
throw LuaValues.badArgumentOf( index, "number", value ); throw LuaValues.badArgumentOf( index, "number", value );
} }
return Optional.of( ((Number) value).doubleValue() ); return Optional.of( ((Number) value).doubleValue() );
@@ -270,7 +295,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not a number. * @throws LuaException If the value is not a number.
*/ */
default int optInt(int index, int def) throws LuaException { default int optInt( int index, int def ) throws LuaException
{
return this.optInt( index ).orElse( def ); return this.optInt( index ).orElse( def );
} }
@@ -282,7 +308,8 @@ public interface IArguments {
* @throws LuaException If the value is not a number. * @throws LuaException If the value is not a number.
*/ */
@Nonnull @Nonnull
default Optional<Integer> optInt(int index) throws LuaException { default Optional<Integer> optInt( int index ) throws LuaException
{
return this.optLong( index ).map( Long::intValue ); return this.optLong( index ).map( Long::intValue );
} }
@@ -293,12 +320,15 @@ public interface IArguments {
* @return The argument's value, or {@link Optional#empty()} if not present. * @return The argument's value, or {@link Optional#empty()} if not present.
* @throws LuaException If the value is not a number. * @throws LuaException If the value is not a number.
*/ */
default Optional<Long> optLong(int index) throws LuaException { default Optional<Long> optLong( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (value == null) { if( value == null )
{
return Optional.empty(); return Optional.empty();
} }
if (!(value instanceof Number)) { if( !(value instanceof Number) )
{
throw LuaValues.badArgumentOf( index, "number", value ); throw LuaValues.badArgumentOf( index, "number", value );
} }
return Optional.of( LuaValues.checkFiniteNum( index, (Number) value ) return Optional.of( LuaValues.checkFiniteNum( index, (Number) value )
@@ -313,7 +343,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not a number. * @throws LuaException If the value is not a number.
*/ */
default long optLong(int index, long def) throws LuaException { default long optLong( int index, long def ) throws LuaException
{
return this.optLong( index ).orElse( def ); return this.optLong( index ).orElse( def );
} }
@@ -325,7 +356,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not finite. * @throws LuaException If the value is not finite.
*/ */
default double optFiniteDouble(int index, double def) throws LuaException { default double optFiniteDouble( int index, double def ) throws LuaException
{
return this.optFiniteDouble( index ).orElse( def ); return this.optFiniteDouble( index ).orElse( def );
} }
@@ -336,9 +368,11 @@ public interface IArguments {
* @return The argument's value, or {@link Optional#empty()} if not present. * @return The argument's value, or {@link Optional#empty()} if not present.
* @throws LuaException If the value is not finite. * @throws LuaException If the value is not finite.
*/ */
default Optional<Double> optFiniteDouble(int index) throws LuaException { default Optional<Double> optFiniteDouble( int index ) throws LuaException
{
Optional<Double> value = this.optDouble( index ); Optional<Double> value = this.optDouble( index );
if (value.isPresent()) { if( value.isPresent() )
{
LuaValues.checkFiniteNum( index, value.get() ); LuaValues.checkFiniteNum( index, value.get() );
} }
return value; return value;
@@ -352,7 +386,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not a boolean. * @throws LuaException If the value is not a boolean.
*/ */
default boolean optBoolean(int index, boolean def) throws LuaException { default boolean optBoolean( int index, boolean def ) throws LuaException
{
return this.optBoolean( index ).orElse( def ); return this.optBoolean( index ).orElse( def );
} }
@@ -363,12 +398,15 @@ public interface IArguments {
* @return The argument's value, or {@link Optional#empty()} if not present. * @return The argument's value, or {@link Optional#empty()} if not present.
* @throws LuaException If the value is not a boolean. * @throws LuaException If the value is not a boolean.
*/ */
default Optional<Boolean> optBoolean(int index) throws LuaException { default Optional<Boolean> optBoolean( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (value == null) { if( value == null )
{
return Optional.empty(); return Optional.empty();
} }
if (!(value instanceof Boolean)) { if( !(value instanceof Boolean) )
{
throw LuaValues.badArgumentOf( index, "boolean", value ); throw LuaValues.badArgumentOf( index, "boolean", value );
} }
return Optional.of( (Boolean) value ); return Optional.of( (Boolean) value );
@@ -382,7 +420,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not a string. * @throws LuaException If the value is not a string.
*/ */
default String optString(int index, String def) throws LuaException { default String optString( int index, String def ) throws LuaException
{
return this.optString( index ).orElse( def ); return this.optString( index ).orElse( def );
} }
@@ -394,7 +433,8 @@ public interface IArguments {
* @return The argument's value, or {@code def} if none was provided. * @return The argument's value, or {@code def} if none was provided.
* @throws LuaException If the value is not a table. * @throws LuaException If the value is not a table.
*/ */
default Map<?, ?> optTable(int index, Map<Object, Object> def) throws LuaException { default Map<?, ?> optTable( int index, Map<Object, Object> def ) throws LuaException
{
return this.optTable( index ).orElse( def ); return this.optTable( index ).orElse( def );
} }
@@ -405,12 +445,15 @@ public interface IArguments {
* @return The argument's value, or {@link Optional#empty()} if not present. * @return The argument's value, or {@link Optional#empty()} if not present.
* @throws LuaException If the value is not a table. * @throws LuaException If the value is not a table.
*/ */
default Optional<Map<?, ?>> optTable(int index) throws LuaException { default Optional<Map<?, ?>> optTable( int index ) throws LuaException
{
Object value = this.get( index ); Object value = this.get( index );
if (value == null) { if( value == null )
{
return Optional.empty(); return Optional.empty();
} }
if (!(value instanceof Map)) { if( !(value instanceof Map) )
{
throw LuaValues.badArgumentOf( index, "map", value ); throw LuaValues.badArgumentOf( index, "map", value );
} }
return Optional.of( (Map<?, ?>) value ); return Optional.of( (Map<?, ?>) value );

View File

@@ -1,20 +1,21 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import javax.annotation.Nullable;
import dan200.computercraft.api.filesystem.IFileSystem; import dan200.computercraft.api.filesystem.IFileSystem;
import dan200.computercraft.api.peripheral.IComputerAccess; 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 { public interface IComputerSystem extends IComputerAccess
{
/** /**
* Get the file system for this computer. * Get the file system for this computer.
* *

View File

@@ -1,22 +1,23 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import javax.annotation.Nonnull;
import dan200.computercraft.api.peripheral.IDynamicPeripheral; import dan200.computercraft.api.peripheral.IDynamicPeripheral;
import javax.annotation.Nonnull;
/** /**
* An interface for representing custom objects returned by peripherals or other Lua objects. * 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 * 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. * IDynamicLuaObject} is useful when you wish your available methods to change at runtime.
*/ */
public interface IDynamicLuaObject { public interface IDynamicLuaObject
{
/** /**
* Get the names of the methods that this object implements. This should not change over the course of the object's lifetime. * Get the names of the methods that this object implements. This should not change over the course of the object's lifetime.
* *

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -18,7 +18,8 @@ import dan200.computercraft.api.ComputerCraftAPI;
* @see ILuaAPIFactory * @see ILuaAPIFactory
* @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory) * @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory)
*/ */
public interface ILuaAPI { public interface ILuaAPI
{
/** /**
* Get the globals this API will be assigned to. This will override any other global, so you should * Get the globals this API will be assigned to. This will override any other global, so you should
* *
@@ -31,13 +32,15 @@ public interface ILuaAPI {
* *
* One should only interact with the file system. * One should only interact with the file system.
*/ */
default void startup() { default void startup()
{
} }
/** /**
* Called every time the computer is ticked. This can be used to process various. * Called every time the computer is ticked. This can be used to process various.
*/ */
default void update() { default void update()
{
} }
/** /**
@@ -45,6 +48,7 @@ public interface ILuaAPI {
* *
* This should reset the state of the object, disposing any remaining file handles, or other resources. * This should reset the state of the object, disposing any remaining file handles, or other resources.
*/ */
default void shutdown() { default void shutdown()
{
} }
} }

View File

@@ -1,16 +1,16 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import dan200.computercraft.api.ComputerCraftAPI;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import dan200.computercraft.api.ComputerCraftAPI;
/** /**
* Construct an {@link ILuaAPI} for a specific computer. * Construct an {@link ILuaAPI} for a specific computer.
* *
@@ -18,7 +18,8 @@ import dan200.computercraft.api.ComputerCraftAPI;
* @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory) * @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory)
*/ */
@FunctionalInterface @FunctionalInterface
public interface ILuaAPIFactory { public interface ILuaAPIFactory
{
/** /**
* Create a new API instance for a given computer. * Create a new API instance for a given computer.
* *

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -13,7 +13,8 @@ import javax.annotation.Nonnull;
* *
* @see MethodResult#yield(Object[], ILuaCallback) * @see MethodResult#yield(Object[], ILuaCallback)
*/ */
public interface ILuaCallback { public interface ILuaCallback
{
/** /**
* Resume this coroutine. * Resume this coroutine.
* *

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -12,7 +12,8 @@ import javax.annotation.Nonnull;
* An interface passed to peripherals and {@link IDynamicLuaObject}s by computers or turtles, providing methods that allow the peripheral call to interface * 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. * with the computer.
*/ */
public interface ILuaContext { public interface ILuaContext
{
/** /**
* Queue a task to be executed on the main server thread at the beginning of next tick, but do not wait for it to complete. This should be used when you * 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. * need to interact with the world in a thread-safe manner but do not care about the result or you wish to run asynchronously.

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -15,7 +15,8 @@ import javax.annotation.Nonnull;
* @see MethodResult#of(Object) * @see MethodResult#of(Object)
*/ */
@FunctionalInterface @FunctionalInterface
public interface ILuaFunction { public interface ILuaFunction
{
/** /**
* Call this function with a series of arguments. Note, this will <em>always</em> be called on the computer thread, and so its implementation must be * 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. * thread-safe.

View File

@@ -1,15 +1,15 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * 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-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public interface ILuaObject { public interface ILuaObject
{
@Nonnull @Nonnull
String[] getMethodNames(); String[] getMethodNames();

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -15,7 +15,8 @@ import javax.annotation.Nullable;
* @see ILuaContext#issueMainThreadTask(ILuaTask) * @see ILuaContext#issueMainThreadTask(ILuaTask)
*/ */
@FunctionalInterface @FunctionalInterface
public interface ILuaTask { public interface ILuaTask
{
/** /**
* Execute this task. * Execute this task.
* *

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -11,18 +11,21 @@ import javax.annotation.Nullable;
/** /**
* An exception representing an error in Lua, like that raised by the {@code error()} function. * An exception representing an error in Lua, like that raised by the {@code error()} function.
*/ */
public class LuaException extends Exception { public class LuaException extends Exception
{
private static final long serialVersionUID = -6136063076818512651L; private static final long serialVersionUID = -6136063076818512651L;
private final boolean hasLevel; private final boolean hasLevel;
private final int level; private final int level;
public LuaException(@Nullable String message) { public LuaException( @Nullable String message )
{
super( message ); super( message );
this.hasLevel = false; this.hasLevel = false;
this.level = 1; this.level = 1;
} }
public LuaException(@Nullable String message, int level) { public LuaException( @Nullable String message, int level )
{
super( message ); super( message );
this.hasLevel = true; this.hasLevel = true;
this.level = level; this.level = level;
@@ -33,7 +36,8 @@ public class LuaException extends Exception {
* *
* @return Whether this has an explicit level. * @return Whether this has an explicit level.
*/ */
public boolean hasLevel() { public boolean hasLevel()
{
return this.hasLevel; return this.hasLevel;
} }
@@ -42,7 +46,8 @@ public class LuaException extends Exception {
* *
* @return The level to raise the error at. * @return The level to raise the error at.
*/ */
public int getLevel() { public int getLevel()
{
return this.level; return this.level;
} }
} }

View File

@@ -1,22 +1,18 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Map;
import java.util.Optional;
import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral; 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. * Used to mark a Java function which is callable from Lua.
* *
@@ -43,7 +39,8 @@ import dan200.computercraft.api.peripheral.IPeripheral;
@Documented @Documented
@Retention( RetentionPolicy.RUNTIME ) @Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.METHOD ) @Target( ElementType.METHOD )
public @interface LuaFunction { public @interface LuaFunction
{
/** /**
* Explicitly specify the method names of this function. If not given, it uses the name of the annotated method. * Explicitly specify the method names of this function. If not given, it uses the name of the annotated method.
* *

View File

@@ -1,24 +1,25 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import java.nio.ByteBuffer;
import java.util.Map;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Map;
/** /**
* Various utility functions for operating with Lua values. * Various utility functions for operating with Lua values.
* *
* @see IArguments * @see IArguments
*/ */
public final class LuaValues { public final class LuaValues
private LuaValues() { {
private LuaValues()
{
} }
/** /**
@@ -28,9 +29,11 @@ public final class LuaValues {
* @return The encoded string. * @return The encoded string.
*/ */
@Nonnull @Nonnull
public static ByteBuffer encode(@Nonnull String string) { public static ByteBuffer encode( @Nonnull String string )
{
byte[] chars = new byte[string.length()]; byte[] chars = new byte[string.length()];
for (int i = 0; i < chars.length; i++) { for( int i = 0; i < chars.length; i++ )
{
char c = string.charAt( i ); char c = string.charAt( i );
chars[i] = c < 256 ? (byte) c : 63; chars[i] = c < 256 ? (byte) c : 63;
} }
@@ -48,7 +51,8 @@ public final class LuaValues {
* @return The constructed exception, which should be thrown immediately. * @return The constructed exception, which should be thrown immediately.
*/ */
@Nonnull @Nonnull
public static LuaException badArgumentOf(int index, @Nonnull String expected, @Nullable Object actual) { public static LuaException badArgumentOf( int index, @Nonnull String expected, @Nullable Object actual )
{
return badArgument( index, expected, getType( actual ) ); return badArgument( index, expected, getType( actual ) );
} }
@@ -61,7 +65,8 @@ public final class LuaValues {
* @return The constructed exception, which should be thrown immediately. * @return The constructed exception, which should be thrown immediately.
*/ */
@Nonnull @Nonnull
public static LuaException badArgument(int index, @Nonnull String expected, @Nonnull String actual) { public static LuaException badArgument( int index, @Nonnull String expected, @Nonnull String actual )
{
return new LuaException( "bad argument #" + (index + 1) + " (" + expected + " expected, got " + actual + ")" ); return new LuaException( "bad argument #" + (index + 1) + " (" + expected + " expected, got " + actual + ")" );
} }
@@ -72,20 +77,26 @@ public final class LuaValues {
* @return A string representation of the given value's type, in a similar format to that provided by Lua's {@code type} function. * @return A string representation of the given value's type, in a similar format to that provided by Lua's {@code type} function.
*/ */
@Nonnull @Nonnull
public static String getType(@Nullable Object value) { public static String getType( @Nullable Object value )
if (value == null) { {
if( value == null )
{
return "nil"; return "nil";
} }
if (value instanceof String) { if( value instanceof String )
{
return "string"; return "string";
} }
if (value instanceof Boolean) { if( value instanceof Boolean )
{
return "boolean"; return "boolean";
} }
if (value instanceof Number) { if( value instanceof Number )
{
return "number"; return "number";
} }
if (value instanceof Map) { if( value instanceof Map )
{
return "table"; return "table";
} }
return "userdata"; return "userdata";
@@ -99,7 +110,8 @@ public final class LuaValues {
* @return The input {@code value}. * @return The input {@code value}.
* @throws LuaException If this is not a finite number. * @throws LuaException If this is not a finite number.
*/ */
public static Number checkFiniteNum(int index, Number value) throws LuaException { public static Number checkFiniteNum( int index, Number value ) throws LuaException
{
checkFinite( index, value.doubleValue() ); checkFinite( index, value.doubleValue() );
return value; return value;
} }
@@ -112,8 +124,10 @@ public final class LuaValues {
* @return The input {@code value}. * @return The input {@code value}.
* @throws LuaException If this is not a finite number. * @throws LuaException If this is not a finite number.
*/ */
public static double checkFinite(int index, double value) throws LuaException { public static double checkFinite( int index, double value ) throws LuaException
if (!Double.isFinite(value)) { {
if( !Double.isFinite( value ) )
{
throw badArgument( index, "number", getNumericType( value ) ); throw badArgument( index, "number", getNumericType( value ) );
} }
return value; return value;
@@ -127,14 +141,18 @@ public final class LuaValues {
* @return This value's numeric type. * @return This value's numeric type.
*/ */
@Nonnull @Nonnull
public static String getNumericType(double value) { public static String getNumericType( double value )
if (Double.isNaN(value)) { {
if( Double.isNaN( value ) )
{
return "nan"; return "nan";
} }
if (value == Double.POSITIVE_INFINITY) { if( value == Double.POSITIVE_INFINITY )
{
return "inf"; return "inf";
} }
if (value == Double.NEGATIVE_INFINITY) { if( value == Double.NEGATIVE_INFINITY )
{
return "-inf"; return "-inf";
} }
return "number"; return "number";
@@ -150,10 +168,13 @@ public final class LuaValues {
* @return The parsed enum value. * @return The parsed enum value.
* @throws LuaException If this is not a known 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 { public static <T extends Enum<T>> T checkEnum( int index, Class<T> klass, String value ) throws LuaException
for (T possibility : klass.getEnumConstants()) { {
for( T possibility : klass.getEnumConstants() )
{
if( possibility.name() if( possibility.name()
.equalsIgnoreCase(value)) { .equalsIgnoreCase( value ) )
{
return possibility; return possibility;
} }
} }

View File

@@ -1,41 +1,43 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; 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.nio.ByteBuffer;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.peripheral.IComputerAccess;
/** /**
* The result of invoking a Lua method. * 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, * 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. * we invoke the provided {@link ILuaCallback#resume(Object[])} callback.
*/ */
public final class MethodResult { public final class MethodResult
{
private static final MethodResult empty = new MethodResult( null, null ); private static final MethodResult empty = new MethodResult( null, null );
private final Object[] result; private final Object[] result;
private final ILuaCallback callback; private final ILuaCallback callback;
private final int adjust; private final int adjust;
private MethodResult(Object[] arguments, ILuaCallback callback) { private MethodResult( Object[] arguments, ILuaCallback callback )
{
this.result = arguments; this.result = arguments;
this.callback = callback; this.callback = callback;
this.adjust = 0; this.adjust = 0;
} }
private MethodResult(Object[] arguments, ILuaCallback callback, int adjust) { private MethodResult( Object[] arguments, ILuaCallback callback, int adjust )
{
this.result = arguments; this.result = arguments;
this.callback = callback; this.callback = callback;
this.adjust = adjust; this.adjust = adjust;
@@ -47,7 +49,8 @@ public final class MethodResult {
* @return A method result which returns immediately with no values. * @return A method result which returns immediately with no values.
*/ */
@Nonnull @Nonnull
public static MethodResult of() { public static MethodResult of()
{
return empty; return empty;
} }
@@ -64,7 +67,8 @@ public final class MethodResult {
* @return A method result which returns immediately with the given value. * @return A method result which returns immediately with the given value.
*/ */
@Nonnull @Nonnull
public static MethodResult of(@Nullable Object value) { public static MethodResult of( @Nullable Object value )
{
return new MethodResult( new Object[] { value }, null ); return new MethodResult( new Object[] { value }, null );
} }
@@ -75,7 +79,8 @@ public final class MethodResult {
* @return A method result which returns immediately with the given values. * @return A method result which returns immediately with the given values.
*/ */
@Nonnull @Nonnull
public static MethodResult of(@Nullable Object... values) { public static MethodResult of( @Nullable Object... values )
{
return values == null || values.length == 0 ? empty : new MethodResult( values, null ); return values == null || values.length == 0 ? empty : new MethodResult( values, null );
} }
@@ -89,10 +94,12 @@ public final class MethodResult {
* @see IComputerAccess#queueEvent(String, Object[]) * @see IComputerAccess#queueEvent(String, Object[])
*/ */
@Nonnull @Nonnull
public static MethodResult pullEvent(@Nullable String filter, @Nonnull ILuaCallback callback) { public static MethodResult pullEvent( @Nullable String filter, @Nonnull ILuaCallback callback )
{
Objects.requireNonNull( callback, "callback cannot be null" ); Objects.requireNonNull( callback, "callback cannot be null" );
return new MethodResult( new Object[] { filter }, results -> { return new MethodResult( new Object[] { filter }, results -> {
if (results.length >= 1 && results[0].equals("terminate")) { if( results.length >= 1 && results[0].equals( "terminate" ) )
{
throw new LuaException( "Terminated", 0 ); throw new LuaException( "Terminated", 0 );
} }
return callback.resume( results ); return callback.resume( results );
@@ -109,7 +116,8 @@ public final class MethodResult {
* @see #pullEvent(String, ILuaCallback) * @see #pullEvent(String, ILuaCallback)
*/ */
@Nonnull @Nonnull
public static MethodResult pullEventRaw(@Nullable String filter, @Nonnull ILuaCallback callback) { public static MethodResult pullEventRaw( @Nullable String filter, @Nonnull ILuaCallback callback )
{
Objects.requireNonNull( callback, "callback cannot be null" ); Objects.requireNonNull( callback, "callback cannot be null" );
return new MethodResult( new Object[] { filter }, callback ); return new MethodResult( new Object[] { filter }, callback );
} }
@@ -124,22 +132,26 @@ public final class MethodResult {
* @see #pullEvent(String, ILuaCallback) * @see #pullEvent(String, ILuaCallback)
*/ */
@Nonnull @Nonnull
public static MethodResult yield(@Nullable Object[] arguments, @Nonnull ILuaCallback callback) { public static MethodResult yield( @Nullable Object[] arguments, @Nonnull ILuaCallback callback )
{
Objects.requireNonNull( callback, "callback cannot be null" ); Objects.requireNonNull( callback, "callback cannot be null" );
return new MethodResult( arguments, callback ); return new MethodResult( arguments, callback );
} }
@Nullable @Nullable
public Object[] getResult() { public Object[] getResult()
{
return this.result; return this.result;
} }
@Nullable @Nullable
public ILuaCallback getCallback() { public ILuaCallback getCallback()
{
return this.callback; return this.callback;
} }
public int getErrorAdjust() { public int getErrorAdjust()
{
return this.adjust; return this.adjust;
} }
@@ -150,11 +162,14 @@ public final class MethodResult {
* @return The new {@link MethodResult} with an adjusted error. This has no effect on immediate results. * @return The new {@link MethodResult} with an adjusted error. This has no effect on immediate results.
*/ */
@Nonnull @Nonnull
public MethodResult adjustError(int adjust) { public MethodResult adjustError( int adjust )
if (adjust < 0) { {
if( adjust < 0 )
{
throw new IllegalArgumentException( "cannot adjust by a negative amount" ); throw new IllegalArgumentException( "cannot adjust by a negative amount" );
} }
if (adjust == 0 || this.callback == null) { if( adjust == 0 || this.callback == null )
{
return this; return this;
} }
return new MethodResult( this.result, this.callback, this.adjust + adjust ); return new MethodResult( this.result, this.callback, this.adjust + adjust );

View File

@@ -1,47 +1,54 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.lua; package dan200.computercraft.api.lua;
import javax.annotation.Nullable;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Nullable;
/** /**
* An implementation of {@link IArguments} which wraps an array of {@link Object}. * An implementation of {@link IArguments} which wraps an array of {@link Object}.
*/ */
public final class ObjectArguments implements IArguments { public final class ObjectArguments implements IArguments
{
private static final IArguments EMPTY = new ObjectArguments(); private static final IArguments EMPTY = new ObjectArguments();
private final List<Object> args; private final List<Object> args;
@Deprecated @Deprecated
@SuppressWarnings( "unused" ) @SuppressWarnings( "unused" )
public ObjectArguments(IArguments arguments) { public ObjectArguments( IArguments arguments )
{
throw new IllegalStateException(); throw new IllegalStateException();
} }
public ObjectArguments(Object... args) { public ObjectArguments( Object... args )
{
this.args = Arrays.asList( args ); this.args = Arrays.asList( args );
} }
public ObjectArguments(List<Object> args) { public ObjectArguments( List<Object> args )
{
this.args = Objects.requireNonNull( args ); this.args = Objects.requireNonNull( args );
} }
@Override @Override
public IArguments drop(int count) { public IArguments drop( int count )
if (count < 0) { {
if( count < 0 )
{
throw new IllegalStateException( "count cannot be negative" ); throw new IllegalStateException( "count cannot be negative" );
} }
if (count == 0) { if( count == 0 )
{
return this; return this;
} }
if (count >= this.args.size()) { if( count >= this.args.size() )
{
return EMPTY; return EMPTY;
} }
@@ -49,18 +56,21 @@ public final class ObjectArguments implements IArguments {
} }
@Override @Override
public Object[] getAll() { public Object[] getAll()
{
return this.args.toArray(); return this.args.toArray();
} }
@Override @Override
public int count() { public int count()
{
return this.args.size(); return this.args.size();
} }
@Nullable @Nullable
@Override @Override
public Object get(int index) { public Object get( int index )
{
return index >= this.args.size() ? null : this.args.get( index ); return index >= this.args.size() ? null : this.args.get( index );
} }
} }

View File

@@ -1,27 +1,27 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.media; package dan200.computercraft.api.media;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.api.filesystem.IMount;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** /**
* Represents an item that can be placed in a disk drive and used by a Computer. * 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 { public interface IMedia
{
/** /**
* Get a string representing the label of this item. Will be called via {@code disk.getLabel()} in lua. * Get a string representing the label of this item. Will be called via {@code disk.getLabel()} in lua.
* *
@@ -38,7 +38,8 @@ public interface IMedia {
* @param label The string to set the label to. * @param label The string to set the label to.
* @return true if the label was updated, false if the label may not be modified. * @return true if the label was updated, false if the label may not be modified.
*/ */
default boolean setLabel(@Nonnull ItemStack stack, @Nullable String label) { default boolean setLabel( @Nonnull ItemStack stack, @Nullable String label )
{
return false; return false;
} }
@@ -49,7 +50,8 @@ public interface IMedia {
* @return The name, or null if this item does not represent an item with audio. * @return The name, or null if this item does not represent an item with audio.
*/ */
@Nullable @Nullable
default String getAudioTitle(@Nonnull ItemStack stack) { default String getAudioTitle( @Nonnull ItemStack stack )
{
return null; return null;
} }
@@ -60,7 +62,8 @@ public interface IMedia {
* @return The name, or null if this item does not represent an item with audio. * @return The name, or null if this item does not represent an item with audio.
*/ */
@Nullable @Nullable
default SoundEvent getAudio(@Nonnull ItemStack stack) { default SoundEvent getAudio( @Nonnull ItemStack stack )
{
return null; return null;
} }
@@ -78,7 +81,8 @@ public interface IMedia {
* @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(String, String) * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(String, String)
*/ */
@Nullable @Nullable
default IMount createDataMount(@Nonnull ItemStack stack, @Nonnull World world) { default IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world )
{
return null; return null;
} }
} }

View File

@@ -1,23 +1,24 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.media; package dan200.computercraft.api.media;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
/** /**
* This interface is used to provide {@link IMedia} implementations for {@link ItemStack}. * This interface is used to provide {@link IMedia} implementations for {@link ItemStack}.
* *
* @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider) * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider)
*/ */
@FunctionalInterface @FunctionalInterface
public interface IMediaProvider { public interface IMediaProvider
{
/** /**
* Produce an IMedia implementation from an ItemStack. * Produce an IMedia implementation from an ItemStack.
* *

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -14,7 +14,8 @@ import javax.annotation.Nonnull;
* @see Packet * @see Packet
* @see IPacketReceiver * @see IPacketReceiver
*/ */
public interface IPacketNetwork { public interface IPacketNetwork
{
/** /**
* Add a receiver to the network. * Add a receiver to the network.
* *

View File

@@ -1,20 +1,21 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import javax.annotation.Nonnull;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
/** /**
* An object on an {@link IPacketNetwork}, capable of receiving packets. * An object on an {@link IPacketNetwork}, capable of receiving packets.
*/ */
public interface IPacketReceiver { public interface IPacketReceiver
{
/** /**
* Get the world in which this packet receiver exists. * Get the world in which this packet receiver exists.
* *

View File

@@ -1,20 +1,21 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import javax.annotation.Nonnull;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
/** /**
* An object on a {@link IPacketNetwork}, capable of sending packets. * An object on a {@link IPacketNetwork}, capable of sending packets.
*/ */
public interface IPacketSender { public interface IPacketSender
{
/** /**
* Get the world in which this packet sender exists. * Get the world in which this packet sender exists.
* *

View File

@@ -1,15 +1,14 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import java.util.Objects;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Objects;
/** /**
* Represents a packet which may be sent across a {@link IPacketNetwork}. * Represents a packet which may be sent across a {@link IPacketNetwork}.
@@ -20,7 +19,8 @@ import javax.annotation.Nullable;
* @see IPacketReceiver#receiveDifferentDimension(Packet) * @see IPacketReceiver#receiveDifferentDimension(Packet)
* @see IPacketReceiver#receiveSameDimension(Packet, double) * @see IPacketReceiver#receiveSameDimension(Packet, double)
*/ */
public class Packet { public class Packet
{
private final int channel; private final int channel;
private final int replyChannel; private final int replyChannel;
private final Object payload; private final Object payload;
@@ -36,7 +36,8 @@ public class Packet {
* call. * call.
* @param sender The object which sent this packet. * @param sender The object which sent this packet.
*/ */
public Packet(int channel, int replyChannel, @Nullable Object payload, @Nonnull IPacketSender sender) { public Packet( int channel, int replyChannel, @Nullable Object payload, @Nonnull IPacketSender sender )
{
Objects.requireNonNull( sender, "sender cannot be null" ); Objects.requireNonNull( sender, "sender cannot be null" );
this.channel = channel; this.channel = channel;
@@ -50,7 +51,8 @@ public class Packet {
* *
* @return This packet's channel. * @return This packet's channel.
*/ */
public int getChannel() { public int getChannel()
{
return this.channel; return this.channel;
} }
@@ -59,7 +61,8 @@ public class Packet {
* *
* @return This channel to reply on. * @return This channel to reply on.
*/ */
public int getReplyChannel() { public int getReplyChannel()
{
return this.replyChannel; return this.replyChannel;
} }
@@ -69,7 +72,8 @@ public class Packet {
* @return The packet's payload * @return The packet's payload
*/ */
@Nullable @Nullable
public Object getPayload() { public Object getPayload()
{
return this.payload; return this.payload;
} }
@@ -79,12 +83,14 @@ public class Packet {
* @return The sending object. * @return The sending object.
*/ */
@Nonnull @Nonnull
public IPacketSender getSender() { public IPacketSender getSender()
{
return this.sender; return this.sender;
} }
@Override @Override
public int hashCode() { public int hashCode()
{
int result; int result;
result = this.channel; result = this.channel;
result = 31 * result + this.replyChannel; result = 31 * result + this.replyChannel;
@@ -94,23 +100,29 @@ public class Packet {
} }
@Override @Override
public boolean equals(Object o) { public boolean equals( Object o )
if (this == o) { {
if( this == o )
{
return true; return true;
} }
if (o == null || this.getClass() != o.getClass()) { if( o == null || this.getClass() != o.getClass() )
{
return false; return false;
} }
Packet packet = (Packet) o; Packet packet = (Packet) o;
if (this.channel != packet.channel) { if( this.channel != packet.channel )
{
return false; return false;
} }
if (this.replyChannel != packet.replyChannel) { if( this.replyChannel != packet.replyChannel )
{
return false; return false;
} }
if (!Objects.equals(this.payload, packet.payload)) { if( !Objects.equals( this.payload, packet.payload ) )
{
return false; return false;
} }
return this.sender.equals( packet.sender ); return this.sender.equals( packet.sender );

View File

@@ -1,15 +1,15 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network.wired; package dan200.computercraft.api.network.wired;
import javax.annotation.Nonnull;
import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI;
import javax.annotation.Nonnull;
/** /**
* An object which may be part of a wired network. * An object which may be part of a wired network.
* *
@@ -19,13 +19,15 @@ import dan200.computercraft.api.ComputerCraftAPI;
* Elements are generally tied to a block or tile entity in world. In such as case, one should provide the {@link IWiredElement} capability for the * 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. * appropriate sides.
*/ */
public interface IWiredElement extends IWiredSender { public interface IWiredElement extends IWiredSender
{
/** /**
* Called when objects on the network change. This may occur when network nodes are added or removed, or when peripherals change. * 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. * @param change The change which occurred.
* @see IWiredNetworkChange * @see IWiredNetworkChange
*/ */
default void networkChanged(@Nonnull IWiredNetworkChange change) { default void networkChanged( @Nonnull IWiredNetworkChange change )
{
} }
} }

View File

@@ -1,16 +1,15 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network.wired; package dan200.computercraft.api.network.wired;
import java.util.Map; import dan200.computercraft.api.peripheral.IPeripheral;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Map;
import dan200.computercraft.api.peripheral.IPeripheral;
/** /**
* 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.
@@ -24,7 +23,8 @@ import dan200.computercraft.api.peripheral.IPeripheral;
* *
* @see IWiredNode#getNetwork() * @see IWiredNode#getNetwork()
*/ */
public interface IWiredNetwork { public interface IWiredNetwork
{
/** /**
* Create a connection between two nodes. * Create a connection between two nodes.
* *

View File

@@ -1,23 +1,23 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network.wired; package dan200.computercraft.api.network.wired;
import java.util.Map; import dan200.computercraft.api.peripheral.IPeripheral;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Map;
import dan200.computercraft.api.peripheral.IPeripheral;
/** /**
* Represents a change to the objects on a wired network. * Represents a change to the objects on a wired network.
* *
* @see IWiredElement#networkChanged(IWiredNetworkChange) * @see IWiredElement#networkChanged(IWiredNetworkChange)
*/ */
public interface IWiredNetworkChange { public interface IWiredNetworkChange
{
/** /**
* A set of peripherals which have been removed. Note that there may be entries with the same name in the added and removed set, but with a different * 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. * peripheral.

View File

@@ -1,18 +1,17 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network.wired; package dan200.computercraft.api.network.wired;
import java.util.Map;
import javax.annotation.Nonnull;
import dan200.computercraft.api.network.IPacketNetwork; import dan200.computercraft.api.network.IPacketNetwork;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import javax.annotation.Nonnull;
import java.util.Map;
/** /**
* Wired nodes act as a layer between {@link IWiredElement}s and {@link IWiredNetwork}s. * Wired nodes act as a layer between {@link IWiredElement}s and {@link IWiredNetwork}s.
* *
@@ -25,7 +24,8 @@ import dan200.computercraft.api.peripheral.IPeripheral;
* *
* Wired nodes also provide several convenience methods for interacting with a wired network. These should only ever be used on the main server thread. * Wired nodes also provide several convenience methods for interacting with a wired network. These should only ever be used on the main server thread.
*/ */
public interface IWiredNode extends IPacketNetwork { public interface IWiredNode extends IPacketNetwork
{
/** /**
* The associated element for this network node. * The associated element for this network node.
* *
@@ -44,7 +44,8 @@ public interface IWiredNode extends IPacketNetwork {
* @see IWiredNetwork#connect(IWiredNode, IWiredNode) * @see IWiredNetwork#connect(IWiredNode, IWiredNode)
* @see IWiredNode#disconnectFrom(IWiredNode) * @see IWiredNode#disconnectFrom(IWiredNode)
*/ */
default boolean connectTo(@Nonnull IWiredNode node) { default boolean connectTo( @Nonnull IWiredNode node )
{
return this.getNetwork().connect( this, node ); return this.getNetwork().connect( this, node );
} }
@@ -69,7 +70,8 @@ public interface IWiredNode extends IPacketNetwork {
* @see IWiredNetwork#disconnect(IWiredNode, IWiredNode) * @see IWiredNetwork#disconnect(IWiredNode, IWiredNode)
* @see IWiredNode#connectTo(IWiredNode) * @see IWiredNode#connectTo(IWiredNode)
*/ */
default boolean disconnectFrom(@Nonnull IWiredNode node) { default boolean disconnectFrom( @Nonnull IWiredNode node )
{
return this.getNetwork().disconnect( this, node ); return this.getNetwork().disconnect( this, node );
} }
@@ -82,7 +84,8 @@ public interface IWiredNode extends IPacketNetwork {
* @throws IllegalArgumentException If the node is not in the network. * @throws IllegalArgumentException If the node is not in the network.
* @see IWiredNetwork#remove(IWiredNode) * @see IWiredNetwork#remove(IWiredNode)
*/ */
default boolean remove() { default boolean remove()
{
return this.getNetwork().remove( this ); return this.getNetwork().remove( this );
} }
@@ -94,7 +97,8 @@ public interface IWiredNode extends IPacketNetwork {
* @param peripherals The new peripherals for this node. * @param peripherals The new peripherals for this node.
* @see IWiredNetwork#updatePeripherals(IWiredNode, Map) * @see IWiredNetwork#updatePeripherals(IWiredNode, Map)
*/ */
default void updatePeripherals(@Nonnull Map<String, IPeripheral> peripherals) { default void updatePeripherals( @Nonnull Map<String, IPeripheral> peripherals )
{
this.getNetwork().updatePeripherals( this, peripherals ); this.getNetwork().updatePeripherals( this, peripherals );
} }
} }

View File

@@ -1,21 +1,22 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.network.wired; package dan200.computercraft.api.network.wired;
import javax.annotation.Nonnull;
import dan200.computercraft.api.network.IPacketSender; import dan200.computercraft.api.network.IPacketSender;
import javax.annotation.Nonnull;
/** /**
* An object on a {@link IWiredNetwork} capable of sending packets. * 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 { public interface IWiredSender extends IPacketSender
{
/** /**
* The node in the network representing this object. * The node in the network representing this object.
* *

View File

@@ -1,16 +1,11 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.peripheral; package dan200.computercraft.api.peripheral;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.filesystem.IWritableMount;
@@ -18,14 +13,18 @@ import dan200.computercraft.api.lua.ILuaCallback;
import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.ILuaTask; import dan200.computercraft.api.lua.ILuaTask;
import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.lua.MethodResult;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Map;
/** /**
* The interface passed to peripherals by computers or turtles, providing methods that they can call. This should not be implemented by your classes. Do not * 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. * interact with computers except via this interface.
*/ */
public interface IComputerAccess { public interface IComputerAccess
{
/** /**
* Mount a mount onto the computer's file system in a read only mode. * Mount a mount onto the computer's file system in a read only mode.
* *
@@ -42,7 +41,8 @@ public interface IComputerAccess {
* @see IMount * @see IMount
*/ */
@Nullable @Nullable
default String mount(@Nonnull String desiredLocation, @Nonnull IMount mount) { default String mount( @Nonnull String desiredLocation, @Nonnull IMount mount )
{
return this.mount( desiredLocation, mount, this.getAttachmentName() ); return this.mount( desiredLocation, mount, this.getAttachmentName() );
} }
@@ -91,7 +91,8 @@ public interface IComputerAccess {
* @see IMount * @see IMount
*/ */
@Nullable @Nullable
default String mountWritable(@Nonnull String desiredLocation, @Nonnull IWritableMount mount) { default String mountWritable( @Nonnull String desiredLocation, @Nonnull IWritableMount mount )
{
return this.mountWritable( desiredLocation, mount, this.getAttachmentName() ); return this.mountWritable( desiredLocation, mount, this.getAttachmentName() );
} }

View File

@@ -1,19 +1,14 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.peripheral; package dan200.computercraft.api.peripheral;
import javax.annotation.Nonnull; import dan200.computercraft.api.lua.*;
import dan200.computercraft.api.lua.IArguments; import javax.annotation.Nonnull;
import dan200.computercraft.api.lua.IDynamicLuaObject;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.MethodResult;
/** /**
* A peripheral whose methods are not known at runtime. * A peripheral whose methods are not known at runtime.
@@ -21,7 +16,8 @@ import dan200.computercraft.api.lua.MethodResult;
* This behaves similarly to {@link IDynamicLuaObject}, though also accepting the current {@link IComputerAccess}. Generally one may use {@link LuaFunction} * This behaves similarly to {@link IDynamicLuaObject}, though also accepting the current {@link IComputerAccess}. Generally one may use {@link LuaFunction}
* instead of implementing this interface. * instead of implementing this interface.
*/ */
public interface IDynamicPeripheral extends IPeripheral { public interface IDynamicPeripheral extends IPeripheral
{
/** /**
* Should return an array of strings that identify the methods that this peripheral exposes to Lua. This will be called once before each attachment, and * Should 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. * should not change when called multiple times.

View File

@@ -1,16 +1,16 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.peripheral; package dan200.computercraft.api.peripheral;
import dan200.computercraft.api.lua.LuaFunction;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import dan200.computercraft.api.lua.LuaFunction;
/** /**
* The interface that defines a peripheral. * The interface that defines a peripheral.
* *
@@ -19,7 +19,8 @@ import dan200.computercraft.api.lua.LuaFunction;
* *
* Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing {@link IDynamicPeripheral}. * Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing {@link IDynamicPeripheral}.
*/ */
public interface IPeripheral { public interface IPeripheral
{
/** /**
* Should return a string that uniquely identifies this type of peripheral. This can be queried from lua by calling {@code peripheral.getType()} * Should return a string that uniquely identifies this type of peripheral. This can be queried from lua by calling {@code peripheral.getType()}
* *
@@ -42,7 +43,8 @@ public interface IPeripheral {
* @param computer The interface to the computer that is being attached. Remember that multiple computers can be attached to a peripheral at once. * @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 * @see #detach
*/ */
default void attach(@Nonnull IComputerAccess computer) { default void attach( @Nonnull IComputerAccess computer )
{
} }
/** /**
@@ -58,7 +60,8 @@ public interface IPeripheral {
* @param computer The interface to the computer that is being detached. Remember that multiple computers can be attached to a peripheral at once. * @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 * @see #attach
*/ */
default void detach(@Nonnull IComputerAccess computer) { default void detach( @Nonnull IComputerAccess computer )
{
} }
/** /**
@@ -67,7 +70,8 @@ public interface IPeripheral {
* @return The object this peripheral targets * @return The object this peripheral targets
*/ */
@Nullable @Nullable
default Object getTarget() { default Object getTarget()
{
return null; return null;
} }

View File

@@ -1,20 +1,19 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.peripheral; package dan200.computercraft.api.peripheral;
import java.util.Optional;
import javax.annotation.Nonnull;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.Optional;
/** /**
* This interface is used to create peripheral implementations for blocks. * This interface is used to create peripheral implementations for blocks.
* *
@@ -23,7 +22,8 @@ import net.minecraft.world.World;
* @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider)
*/ */
@FunctionalInterface @FunctionalInterface
public interface IPeripheralProvider { public interface IPeripheralProvider
{
/** /**
* Produce an peripheral implementation from a block location. * Produce an peripheral implementation from a block location.
* *

View File

@@ -1,24 +1,24 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * 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-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.peripheral; package dan200.computercraft.api.peripheral;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** /**
* A {@link net.minecraft.block.entity.BlockEntity} which may act as a peripheral. * 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 { public interface IPeripheralTile
{
/** /**
* Get the peripheral on the given {@code side}. * Get the peripheral on the given {@code side}.
* *

View File

@@ -1,16 +1,15 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.peripheral; package dan200.computercraft.api.peripheral;
import javax.annotation.Nonnull;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
/** /**
* Monitors "work" associated with a computer, keeping track of how much a computer has done, and ensuring every computer receives a fair share of any * 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. * processing time.
@@ -25,7 +24,8 @@ import javax.annotation.Nonnull;
* *
* @see IComputerAccess#getMainThreadMonitor() * @see IComputerAccess#getMainThreadMonitor()
*/ */
public interface IWorkMonitor { public interface IWorkMonitor
{
/** /**
* If the owning computer is currently allowed to execute work, and has ample time to do so. * If the owning computer is currently allowed to execute work, and has ample time to do so.
* *
@@ -42,16 +42,21 @@ public interface IWorkMonitor {
* @param runnable The task to run. * @param runnable The task to run.
* @return If the task was actually run (namely, {@link #canWork()} returned {@code true}). * @return If the task was actually run (namely, {@link #canWork()} returned {@code true}).
*/ */
default boolean runWork(@Nonnull Runnable runnable) { default boolean runWork( @Nonnull Runnable runnable )
{
Objects.requireNonNull( runnable, "runnable should not be null" ); Objects.requireNonNull( runnable, "runnable should not be null" );
if (!this.canWork()) { if( !this.canWork() )
{
return false; return false;
} }
long start = System.nanoTime(); long start = System.nanoTime();
try { try
{
runnable.run(); runnable.run();
} finally { }
finally
{
this.trackWork( System.nanoTime() - start, TimeUnit.NANOSECONDS ); this.trackWork( System.nanoTime() - start, TimeUnit.NANOSECONDS );
} }

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -9,14 +9,17 @@ package dan200.computercraft.api.peripheral;
/** /**
* Thrown when performing operations on {@link IComputerAccess} when the current peripheral is no longer attached to the computer. * Thrown when performing operations on {@link IComputerAccess} when the current peripheral is no longer attached to the computer.
*/ */
public class NotAttachedException extends IllegalStateException { public class NotAttachedException extends IllegalStateException
{
private static final long serialVersionUID = 1221244785535553536L; private static final long serialVersionUID = 1221244785535553536L;
public NotAttachedException() { public NotAttachedException()
{
super( "You are not attached to this computer" ); super( "You are not attached to this computer" );
} }
public NotAttachedException(String s) { public NotAttachedException( String s )
{
super( s ); super( s );
} }
} }

View File

@@ -1,39 +1,43 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.pocket; package dan200.computercraft.api.pocket;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import javax.annotation.Nonnull;
/** /**
* A base class for {@link IPocketUpgrade}s. * A base class for {@link IPocketUpgrade}s.
* *
* One does not have to use this, but it does provide a convenient template. * One does not have to use this, but it does provide a convenient template.
*/ */
public abstract class AbstractPocketUpgrade implements IPocketUpgrade { public abstract class AbstractPocketUpgrade implements IPocketUpgrade
{
private final Identifier id; private final Identifier id;
private final String adjective; private final String adjective;
private final ItemStack stack; private final ItemStack stack;
protected AbstractPocketUpgrade(Identifier id, ItemConvertible item) { protected AbstractPocketUpgrade( Identifier id, ItemConvertible item )
{
this( id, Util.createTranslationKey( "upgrade", id ) + ".adjective", item ); this( id, Util.createTranslationKey( "upgrade", id ) + ".adjective", item );
} }
protected AbstractPocketUpgrade(Identifier id, String adjective, ItemConvertible item) { protected AbstractPocketUpgrade( Identifier id, String adjective, ItemConvertible item )
{
this.id = id; this.id = id;
this.adjective = adjective; this.adjective = adjective;
this.stack = new ItemStack( item ); this.stack = new ItemStack( item );
} }
protected AbstractPocketUpgrade(Identifier id, String adjective, ItemStack stack) { protected AbstractPocketUpgrade( Identifier id, String adjective, ItemStack stack )
{
this.id = id; this.id = id;
this.adjective = adjective; this.adjective = adjective;
this.stack = stack; this.stack = stack;
@@ -42,19 +46,22 @@ public abstract class AbstractPocketUpgrade implements IPocketUpgrade {
@Nonnull @Nonnull
@Override @Override
public final Identifier getUpgradeID() { public final Identifier getUpgradeID()
{
return this.id; return this.id;
} }
@Nonnull @Nonnull
@Override @Override
public final String getUnlocalisedAdjective() { public final String getUnlocalisedAdjective()
{
return this.adjective; return this.adjective;
} }
@Nonnull @Nonnull
@Override @Override
public final ItemStack getCraftingItem() { public final ItemStack getCraftingItem()
{
return this.stack; return this.stack;
} }
} }

View File

@@ -1,26 +1,25 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.pocket; package dan200.computercraft.api.pocket;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Identifier; 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 { public interface IPocketAccess
{
/** /**
* Gets the entity holding this item. * Gets the entity holding this item.
* *

View File

@@ -1,65 +1,26 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.pocket; package dan200.computercraft.api.pocket;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.IUpgradeBase;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
/** /**
* Additional peripherals for pocket computers. * Additional peripherals for pocket computers.
* *
* This is similar to {@link ITurtleUpgrade}.
*/
public interface IPocketUpgrade {
/**
* Gets a unique identifier representing this type of turtle upgrade. eg: "computercraft:wireless_modem" or "my_mod:my_upgrade".
*
* You should use a unique resource domain to ensure this upgrade is uniquely identified. The upgrade will fail registration if an already used ID is
* specified.
*
* @return The upgrade's id.
* @see IPocketUpgrade#getUpgradeID()
* @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade) * @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade)
*/ */
@Nonnull public interface IPocketUpgrade extends IUpgradeBase
Identifier getUpgradeID(); {
/**
* Return an unlocalised string to describe the type of pocket computer this upgrade provides.
*
* An example of a built-in adjectives is "Wireless" - this is converted to "Wireless Pocket Computer".
*
* @return The unlocalised adjective.
* @see ITurtleUpgrade#getUnlocalisedAdjective()
*/
@Nonnull
String getUnlocalisedAdjective();
/**
* Return an item stack representing the type of item that a pocket computer must be crafted with to create a pocket computer which holds this upgrade.
* This item stack is also used to determine the upgrade given by {@code pocket.equip()}/{@code pocket.unequip()}.
*
* Ideally this should be constant over a session. It is recommended that you cache the item too, in order to prevent constructing it every time the
* method is called.
*
* @return The item stack used for crafting. This can be {@link ItemStack#EMPTY} if crafting is disabled.
*/
@Nonnull
ItemStack getCraftingItem();
/** /**
* Creates a peripheral for the pocket computer. * Creates a peripheral for the pocket computer.
* *
@@ -80,7 +41,8 @@ public interface IPocketUpgrade {
* @param peripheral The peripheral for this upgrade. * @param peripheral The peripheral for this upgrade.
* @see #createPeripheral(IPocketAccess) * @see #createPeripheral(IPocketAccess)
*/ */
default void update(@Nonnull IPocketAccess access, @Nullable IPeripheral peripheral) { default void update( @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
{
} }
/** /**
@@ -93,7 +55,8 @@ public interface IPocketUpgrade {
* requiring the player to be sneaking - otherwise they will be unable to access the GUI. * requiring the player to be sneaking - otherwise they will be unable to access the GUI.
* @see #createPeripheral(IPocketAccess) * @see #createPeripheral(IPocketAccess)
*/ */
default boolean onRightClick(@Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral) { default boolean onRightClick( @Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
{
return false; return false;
} }
} }

View File

@@ -1,24 +1,25 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.redstone; package dan200.computercraft.api.redstone;
import javax.annotation.Nonnull;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
/** /**
* This interface is used to provide bundled redstone output for blocks. * This interface is used to provide bundled redstone output for blocks.
* *
* @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider) * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider)
*/ */
@FunctionalInterface @FunctionalInterface
public interface IBundledRedstoneProvider { public interface IBundledRedstoneProvider
{
/** /**
* Produce an bundled redstone output from a block location. * Produce an bundled redstone output from a block location.
* *

View File

@@ -1,70 +1,79 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle; package dan200.computercraft.api.turtle;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import javax.annotation.Nonnull;
/** /**
* A base class for {@link ITurtleUpgrade}s. * A base class for {@link ITurtleUpgrade}s.
* *
* One does not have to use this, but it does provide a convenient template. * One does not have to use this, but it does provide a convenient template.
*/ */
public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade { public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade
{
private final Identifier id; private final Identifier id;
private final TurtleUpgradeType type; private final TurtleUpgradeType type;
private final String adjective; private final String adjective;
private final ItemStack stack; private final ItemStack stack;
protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item) { protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item )
{
this( id, type, adjective, new ItemStack( item ) ); this( id, type, adjective, new ItemStack( item ) );
} }
protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack) { protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack )
{
this.id = id; this.id = id;
this.type = type; this.type = type;
this.adjective = adjective; this.adjective = adjective;
this.stack = stack; this.stack = stack;
} }
protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, ItemConvertible item) { protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemConvertible item )
{
this( id, type, new ItemStack( item ) ); this( id, type, new ItemStack( item ) );
} }
protected AbstractTurtleUpgrade(Identifier id, TurtleUpgradeType type, ItemStack stack) { protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemStack stack )
{
this( id, type, Util.createTranslationKey( "upgrade", id ) + ".adjective", stack ); this( id, type, Util.createTranslationKey( "upgrade", id ) + ".adjective", stack );
} }
@Nonnull @Nonnull
@Override @Override
public final Identifier getUpgradeID() { public final Identifier getUpgradeID()
{
return this.id; return this.id;
} }
@Nonnull @Nonnull
@Override @Override
public final String getUnlocalisedAdjective() { public final String getUnlocalisedAdjective()
{
return this.adjective; return this.adjective;
} }
@Nonnull @Nonnull
@Override @Override
public final TurtleUpgradeType getType() { public final TurtleUpgradeType getType()
{
return this.type; return this.type;
} }
@Nonnull @Nonnull
@Override @Override
public final ItemStack getCraftingItem() { public final ItemStack getCraftingItem()
{
return this.stack; return this.stack;
} }
} }

View File

@@ -1,23 +1,14 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. This API may be redistributed unmodified and in full only.
* Send enquiries to dratcliffe@gmail.com * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle; package dan200.computercraft.api.turtle;
import java.util.Collection;
import java.util.OptionalInt;
import java.util.UUID;
import javax.annotation.Nullable;
import javax.crypto.SecretKey;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.util.concurrent.Future; import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener; import io.netty.util.concurrent.GenericFutureListener;
import net.minecraft.block.entity.CommandBlockBlockEntity; import net.minecraft.block.entity.CommandBlockBlockEntity;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.command.argument.EntityAnchorArgumentType; import net.minecraft.command.argument.EntityAnchorArgumentType;
@@ -27,11 +18,7 @@ import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.passive.HorseBaseEntity; import net.minecraft.entity.passive.HorseBaseEntity;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.ClientConnection; import net.minecraft.network.*;
import net.minecraft.network.MessageType;
import net.minecraft.network.NetworkSide;
import net.minecraft.network.NetworkState;
import net.minecraft.network.Packet;
import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket;
import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket;
import net.minecraft.recipe.Recipe; import net.minecraft.recipe.Recipe;
@@ -48,219 +35,322 @@ import net.minecraft.util.Hand;
import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.village.TraderOfferList; import net.minecraft.village.TradeOfferList;
import net.minecraft.world.GameMode; 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. * 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. * 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 class FakePlayer extends ServerPlayerEntity
public FakePlayer(ServerWorld world, GameProfile gameProfile) { {
public FakePlayer( ServerWorld world, GameProfile gameProfile )
{
super( world.getServer(), world, gameProfile, new ServerPlayerInteractionManager( world ) ); super( world.getServer(), world, gameProfile, new ServerPlayerInteractionManager( world ) );
this.networkHandler = new FakeNetHandler( this ); this.networkHandler = new FakeNetHandler( this );
} }
// region Direct networkHandler access // region Direct networkHandler access
@Override @Override
public void enterCombat() { } public void enterCombat()
{
}
@Override @Override
public void endCombat() { } public void endCombat()
{
}
@Override @Override
public void tick() { } public void tick()
{
}
@Override @Override
public void playerTick() { } public void playerTick()
{
}
@Override @Override
public void onDeath(DamageSource damage) { } public void onDeath( DamageSource damage )
{
}
@Override @Override
public Entity moveToWorld(ServerWorld destination) { public Entity moveToWorld( ServerWorld destination )
{
return this; return this;
} }
@Override @Override
public void wakeUp(boolean bl, boolean updateSleepingPlayers) { public void wakeUp( boolean bl, boolean updateSleepingPlayers )
{
} }
@Override @Override
public boolean startRiding(Entity entity, boolean flag) { public boolean startRiding( Entity entity, boolean flag )
{
return false; return false;
} }
@Override @Override
public void stopRiding() { } public void stopRiding()
{
}
@Override @Override
public void openEditSignScreen(SignBlockEntity tile) { } public void openEditSignScreen( SignBlockEntity tile )
{
}
@Override @Override
public OptionalInt openHandledScreen(@Nullable NamedScreenHandlerFactory container) { public OptionalInt openHandledScreen( @Nullable NamedScreenHandlerFactory container )
{
return OptionalInt.empty(); return OptionalInt.empty();
} }
@Override @Override
public void sendTradeOffers(int id, TraderOfferList list, int level, int experience, boolean levelled, boolean refreshable) { } public void sendTradeOffers( int id, TradeOfferList list, int level, int experience, boolean levelled, boolean refreshable )
{
}
@Override @Override
public void openHorseInventory(HorseBaseEntity horse, Inventory inventory) { } public void openHorseInventory( HorseBaseEntity horse, Inventory inventory )
{
}
@Override @Override
public void openEditBookScreen(ItemStack stack, Hand hand) { } public void openEditBookScreen( ItemStack stack, Hand hand )
{
}
@Override @Override
public void openCommandBlockScreen(CommandBlockBlockEntity block) { } public void openCommandBlockScreen( CommandBlockBlockEntity block )
{
}
@Override @Override
public void onSlotUpdate(ScreenHandler container, int slot, ItemStack stack) { } public void onSlotUpdate( ScreenHandler container, int slot, ItemStack stack )
{
}
@Override @Override
public void onHandlerRegistered(ScreenHandler container, DefaultedList<ItemStack> defaultedList) { } public void onHandlerRegistered( ScreenHandler container, DefaultedList<ItemStack> defaultedList )
{
}
@Override @Override
public void onPropertyUpdate(ScreenHandler container, int key, int value) { } public void onPropertyUpdate( ScreenHandler container, int key, int value )
{
}
@Override @Override
public void closeHandledScreen() { } public void closeHandledScreen()
{
}
@Override @Override
public void updateCursorStack() { } public void updateCursorStack()
{
}
@Override @Override
public int unlockRecipes(Collection<Recipe<?>> recipes) { public int unlockRecipes( Collection<Recipe<?>> recipes )
{
return 0; return 0;
} }
// Indirect // Indirect
@Override @Override
public int lockRecipes(Collection<Recipe<?>> recipes) { public int lockRecipes( Collection<Recipe<?>> recipes )
{
return 0; return 0;
} }
@Override @Override
public void sendMessage(Text textComponent, boolean status) { } public void sendMessage( Text textComponent, boolean status )
{
}
@Override @Override
protected void consumeItem() { } protected void consumeItem()
{
}
@Override @Override
public void lookAt(EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d) {} public void lookAt( EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d )
{
}
@Override @Override
public void method_14222(EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target) { } public void method_14222( EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target )
{
}
@Override @Override
protected void onStatusEffectApplied(StatusEffectInstance statusEffectInstance) { } protected void onStatusEffectApplied( StatusEffectInstance statusEffectInstance )
{
}
@Override @Override
protected void onStatusEffectUpgraded(StatusEffectInstance statusEffectInstance, boolean particles) { } protected void onStatusEffectUpgraded( StatusEffectInstance statusEffectInstance, boolean particles )
{
}
@Override @Override
protected void onStatusEffectRemoved(StatusEffectInstance statusEffectInstance) { } protected void onStatusEffectRemoved( StatusEffectInstance statusEffectInstance )
{
}
@Override @Override
public void requestTeleport(double x, double y, double z) { } public void requestTeleport( double x, double y, double z )
{
}
@Override @Override
public void setGameMode(GameMode gameMode) { } public void setGameMode( GameMode gameMode )
{
}
@Override @Override
public void sendMessage(Text message, MessageType type, UUID senderUuid) { public void sendMessage( Text message, MessageType type, UUID senderUuid )
{
} }
@Override @Override
public String getIp() { public String getIp()
{
return "[Fake Player]"; return "[Fake Player]";
} }
@Override @Override
public void sendResourcePackUrl(String url, String hash) { } public void sendResourcePackUrl( String url, String hash )
{
}
@Override @Override
public void onStoppedTracking(Entity entity) { } public void onStoppedTracking( Entity entity )
{
}
@Override @Override
public void setCameraEntity(Entity entity) { } public void setCameraEntity( Entity entity )
{
}
@Override @Override
public void teleport(ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw) { } public void teleport( ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw )
{
}
@Override @Override
public void sendInitialChunkPackets(ChunkPos chunkPos, Packet<?> packet, Packet<?> packet2) { } public void sendInitialChunkPackets( ChunkPos chunkPos, Packet<?> packet, Packet<?> packet2 )
{
}
@Override @Override
public void sendUnloadChunkPacket(ChunkPos chunkPos) { } public void sendUnloadChunkPacket( ChunkPos chunkPos )
{
}
@Override @Override
public void playSound(SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch) { } public void playSound( SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch )
{
}
private static class FakeNetHandler extends ServerPlayNetworkHandler { private static class FakeNetHandler extends ServerPlayNetworkHandler
FakeNetHandler(ServerPlayerEntity player) { {
FakeNetHandler( ServerPlayerEntity player )
{
super( player.server, new FakeConnection(), player ); super( player.server, new FakeConnection(), player );
} }
@Override @Override
public void disconnect(Text message) { } 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 { @Override
FakeConnection() { 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 ); super( NetworkSide.CLIENTBOUND );
} }
@Override @Override
public void channelActive(ChannelHandlerContext active) { public void channelActive( ChannelHandlerContext active )
{
} }
@Override @Override
public void setState(NetworkState state) { public void setState( NetworkState state )
{
} }
@Override @Override
public void exceptionCaught(ChannelHandlerContext context, Throwable err) { public void exceptionCaught( ChannelHandlerContext context, Throwable err )
{
} }
@Override @Override
protected void channelRead0(ChannelHandlerContext context, Packet<?> packet) { protected void channelRead0( ChannelHandlerContext context, Packet<?> packet )
{
} }
@Override @Override
public void send(Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener) { public void send( Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> listener )
{
} }
@Override @Override
public void tick() { public void tick()
{
} }
@Override @Override
public void disconnect(Text message) { public void disconnect( Text message )
{
} }
@Override @Override
public void setupEncryption(SecretKey key) { public void setupEncryption( Cipher cipher, Cipher cipher2 )
{
super.setupEncryption( cipher, cipher2 );
} }
@Override @Override
public void disableAutoRead() { public void disableAutoRead()
{
} }
@Override @Override
public void setCompressionThreshold(int size) { public void setCompressionThreshold( int size )
{
} }
} }
} }

View File

@@ -1,20 +1,16 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle; package dan200.computercraft.api.turtle;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import dan200.computercraft.api.lua.ILuaCallback; import dan200.computercraft.api.lua.ILuaCallback;
import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.lua.MethodResult;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.ItemStorage;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -22,12 +18,16 @@ import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** /**
* The interface passed to turtle by turtles, providing methods that they can call. * 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 { public interface ITurtleAccess
{
/** /**
* Returns the world in which the turtle resides. * Returns the world in which the turtle resides.
* *
@@ -265,7 +265,8 @@ public interface ITurtleAccess {
*/ */
void updateUpgradeNBTData( @Nonnull TurtleSide side ); void updateUpgradeNBTData( @Nonnull TurtleSide side );
default ItemStorage getItemHandler() { default ItemStorage getItemHandler()
{
return ItemStorage.wrap( this.getInventory() ); return ItemStorage.wrap( this.getInventory() );
} }

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -14,7 +14,8 @@ import javax.annotation.Nonnull;
* @see ITurtleAccess#executeCommand(ITurtleCommand) * @see ITurtleAccess#executeCommand(ITurtleCommand)
*/ */
@FunctionalInterface @FunctionalInterface
public interface ITurtleCommand { public interface ITurtleCommand
{
/** /**
* Will be called by the turtle on the main thread when it is time to execute the custom command. * Will be called by the turtle on the main thread when it is time to execute the custom command.
* *

View File

@@ -1,51 +1,29 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle; package dan200.computercraft.api.turtle;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.IUpgradeBase;
import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.client.TransformedModel;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.util.math.Direction;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** /**
* 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) * @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
Identifier getUpgradeID();
/**
* Return an unlocalised string to describe this type of turtle in turtle item names.
*
* Examples of built-in adjectives are "Wireless", "Mining" and "Crafty".
*
* @return The localisation key for this upgrade's adjective.
*/
@Nonnull
String getUnlocalisedAdjective();
/** /**
* Return whether this turtle adds a tool or a peripheral to the turtle. * Return whether this turtle adds a tool or a peripheral to the turtle.
* *
@@ -55,18 +33,6 @@ public interface ITurtleUpgrade {
@Nonnull @Nonnull
TurtleUpgradeType getType(); 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. * Will only be called for peripheral upgrades. Creates a peripheral for a turtle being placed using this upgrade.
* *
@@ -78,7 +44,8 @@ public interface ITurtleUpgrade {
* @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 @Nullable
default IPeripheral createPeripheral(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side) { default IPeripheral createPeripheral( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side )
{
return null; return null;
} }
@@ -95,7 +62,8 @@ public interface ITurtleUpgrade {
* this method is not expected to be called. * this method is not expected to be called.
*/ */
@Nonnull @Nonnull
default TurtleCommandResult useTool(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side, @Nonnull TurtleVerb verb, @Nonnull Direction direction) { default TurtleCommandResult useTool( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side, @Nonnull TurtleVerb verb, @Nonnull Direction direction )
{
return TurtleCommandResult.failure(); return TurtleCommandResult.failure();
} }
@@ -116,6 +84,7 @@ public interface ITurtleUpgrade {
* @param turtle Access to the turtle that the upgrade resides on. * @param turtle Access to the turtle that the upgrade resides on.
* @param side Which side of the turtle (left or right) the upgrade resides on. * @param side Which side of the turtle (left or right) the upgrade resides on.
*/ */
default void update(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side) { default void update( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side )
{
} }
} }

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -13,7 +13,8 @@ package dan200.computercraft.api.turtle;
* *
* @see ITurtleAccess#playAnimation(TurtleAnimation) * @see ITurtleAccess#playAnimation(TurtleAnimation)
*/ */
public enum TurtleAnimation { public enum TurtleAnimation
{
/** /**
* An animation which does nothing. This takes no time to complete. * An animation which does nothing. This takes no time to complete.
* *

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -15,14 +15,16 @@ import javax.annotation.Nullable;
* @see ITurtleCommand#execute(ITurtleAccess) * @see ITurtleCommand#execute(ITurtleAccess)
* @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction) * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)
*/ */
public final class TurtleCommandResult { public final class TurtleCommandResult
{
private static final TurtleCommandResult EMPTY_SUCCESS = new TurtleCommandResult( true, null, null ); private static final TurtleCommandResult EMPTY_SUCCESS = new TurtleCommandResult( true, null, null );
private static final TurtleCommandResult EMPTY_FAILURE = new TurtleCommandResult( false, null, null ); private static final TurtleCommandResult EMPTY_FAILURE = new TurtleCommandResult( false, null, null );
private final boolean success; private final boolean success;
private final String errorMessage; private final String errorMessage;
private final Object[] results; private final Object[] results;
private TurtleCommandResult(boolean success, String errorMessage, Object[] results) { private TurtleCommandResult( boolean success, String errorMessage, Object[] results )
{
this.success = success; this.success = success;
this.errorMessage = errorMessage; this.errorMessage = errorMessage;
this.results = results; this.results = results;
@@ -34,7 +36,8 @@ public final class TurtleCommandResult {
* @return A successful command result with no values. * @return A successful command result with no values.
*/ */
@Nonnull @Nonnull
public static TurtleCommandResult success() { public static TurtleCommandResult success()
{
return EMPTY_SUCCESS; return EMPTY_SUCCESS;
} }
@@ -45,8 +48,10 @@ public final class TurtleCommandResult {
* @return A successful command result with the given values. * @return A successful command result with the given values.
*/ */
@Nonnull @Nonnull
public static TurtleCommandResult success(@Nullable Object[] results) { public static TurtleCommandResult success( @Nullable Object[] results )
if (results == null || results.length == 0) { {
if( results == null || results.length == 0 )
{
return EMPTY_SUCCESS; return EMPTY_SUCCESS;
} }
return new TurtleCommandResult( true, null, results ); return new TurtleCommandResult( true, null, results );
@@ -58,7 +63,8 @@ public final class TurtleCommandResult {
* @return A failed command result with no message. * @return A failed command result with no message.
*/ */
@Nonnull @Nonnull
public static TurtleCommandResult failure() { public static TurtleCommandResult failure()
{
return EMPTY_FAILURE; return EMPTY_FAILURE;
} }
@@ -69,8 +75,10 @@ public final class TurtleCommandResult {
* @return A failed command result with a message. * @return A failed command result with a message.
*/ */
@Nonnull @Nonnull
public static TurtleCommandResult failure(@Nullable String errorMessage) { public static TurtleCommandResult failure( @Nullable String errorMessage )
if (errorMessage == null) { {
if( errorMessage == null )
{
return EMPTY_FAILURE; return EMPTY_FAILURE;
} }
return new TurtleCommandResult( false, errorMessage, null ); return new TurtleCommandResult( false, errorMessage, null );
@@ -81,7 +89,8 @@ public final class TurtleCommandResult {
* *
* @return If the command was successful. * @return If the command was successful.
*/ */
public boolean isSuccess() { public boolean isSuccess()
{
return this.success; return this.success;
} }
@@ -91,7 +100,8 @@ public final class TurtleCommandResult {
* @return The command's error message, or {@code null} if it was a success. * @return The command's error message, or {@code null} if it was a success.
*/ */
@Nullable @Nullable
public String getErrorMessage() { public String getErrorMessage()
{
return this.errorMessage; return this.errorMessage;
} }
@@ -101,7 +111,8 @@ public final class TurtleCommandResult {
* @return The command's result, or {@code null} if it was a failure. * @return The command's result, or {@code null} if it was a failure.
*/ */
@Nullable @Nullable
public Object[] getResults() { public Object[] getResults()
{
return this.results; return this.results;
} }
} }

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -9,7 +9,8 @@ package dan200.computercraft.api.turtle;
/** /**
* An enum representing the two sides of the turtle that a turtle turtle might reside. * An enum representing the two sides of the turtle that a turtle turtle might reside.
*/ */
public enum TurtleSide { public enum TurtleSide
{
/** /**
* The turtle's left side (where the pickaxe usually is on a Wireless Mining Turtle). * The turtle's left side (where the pickaxe usually is on a Wireless Mining Turtle).
*/ */

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -11,7 +11,8 @@ package dan200.computercraft.api.turtle;
* *
* @see ITurtleUpgrade#getType() * @see ITurtleUpgrade#getType()
*/ */
public enum TurtleUpgradeType { public enum TurtleUpgradeType
{
/** /**
* A tool is rendered as an item on the side of the turtle, and responds to the {@code turtle.dig()} and {@code turtle.attack()} methods (Such as * 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). * pickaxe or sword on Mining and Melee turtles).
@@ -30,11 +31,13 @@ public enum TurtleUpgradeType {
*/ */
BOTH; BOTH;
public boolean isTool() { public boolean isTool()
{
return this == TOOL || this == BOTH; return this == TOOL || this == BOTH;
} }
public boolean isPeripheral() { public boolean isPeripheral()
{
return this == PERIPHERAL || this == BOTH; return this == PERIPHERAL || this == BOTH;
} }
} }

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -12,7 +12,8 @@ package dan200.computercraft.api.turtle;
* @see ITurtleUpgrade#getType() * @see ITurtleUpgrade#getType()
* @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction) * @see ITurtleUpgrade#useTool(ITurtleAccess, TurtleSide, TurtleVerb, Direction)
*/ */
public enum TurtleVerb { public enum TurtleVerb
{
/** /**
* The turtle called {@code turtle.dig()}, {@code turtle.digUp()} or {@code turtle.digDown()}. * The turtle called {@code turtle.dig()}, {@code turtle.digUp()} or {@code turtle.digDown()}.
*/ */

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
@@ -11,7 +11,8 @@ package dan200.computercraft.api.turtle.event;
* *
* @see TurtleActionEvent * @see TurtleActionEvent
*/ */
public enum TurtleAction { public enum TurtleAction
{
/** /**
* A turtle moves to a new position. * A turtle moves to a new position.
* *

View File

@@ -1,35 +1,37 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Objects; import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.TurtleCommandResult;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Objects;
import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.TurtleCommandResult;
/** /**
* An event fired when a turtle is performing a known action. * An event fired when a turtle is performing a known action.
*/ */
public class TurtleActionEvent extends TurtleEvent { public class TurtleActionEvent extends TurtleEvent
{
private final TurtleAction action; private final TurtleAction action;
private String failureMessage; private String failureMessage;
private boolean cancelled = false; private boolean cancelled = false;
public TurtleActionEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action) { public TurtleActionEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action )
{
super( turtle ); super( turtle );
Objects.requireNonNull( action, "action cannot be null" ); Objects.requireNonNull( action, "action cannot be null" );
this.action = action; this.action = action;
} }
public TurtleAction getAction() { public TurtleAction getAction()
{
return this.action; return this.action;
} }
@@ -43,7 +45,8 @@ public class TurtleActionEvent extends TurtleEvent {
* @deprecated Use {@link #setCanceled(boolean, String)} instead. * @deprecated Use {@link #setCanceled(boolean, String)} instead.
*/ */
@Deprecated @Deprecated
public void setCanceled(boolean cancel) { public void setCanceled( boolean cancel )
{
this.setCanceled( cancel, null ); this.setCanceled( cancel, null );
} }
@@ -56,7 +59,8 @@ public class TurtleActionEvent extends TurtleEvent {
* @param failureMessage The message to return to the user explaining the failure. * @param failureMessage The message to return to the user explaining the failure.
* @see TurtleCommandResult#failure(String) * @see TurtleCommandResult#failure(String)
*/ */
public void setCanceled(boolean cancel, @Nullable String failureMessage) { public void setCanceled( boolean cancel, @Nullable String failureMessage )
{
this.cancelled = true; this.cancelled = true;
this.failureMessage = cancel ? failureMessage : null; this.failureMessage = cancel ? failureMessage : null;
} }
@@ -69,11 +73,13 @@ public class TurtleActionEvent extends TurtleEvent {
* @see #setCanceled(boolean, String) * @see #setCanceled(boolean, String)
*/ */
@Nullable @Nullable
public String getFailureMessage() { public String getFailureMessage()
{
return this.failureMessage; return this.failureMessage;
} }
public boolean isCancelled() { public boolean isCancelled()
{
return this.cancelled; return this.cancelled;
} }
} }

View File

@@ -1,34 +1,34 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Objects;
import javax.annotation.Nonnull;
import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.FakePlayer;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleSide;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import javax.annotation.Nonnull;
import java.util.Objects;
/** /**
* Fired when a turtle attempts to attack an entity. * Fired when a turtle attempts to attack an entity.
* *
* @see TurtleAction#ATTACK * @see TurtleAction#ATTACK
*/ */
public class TurtleAttackEvent extends TurtlePlayerEvent { public class TurtleAttackEvent extends TurtlePlayerEvent
{
private final Entity target; private final Entity target;
private final ITurtleUpgrade upgrade; private final ITurtleUpgrade upgrade;
private final TurtleSide side; private final TurtleSide side;
public TurtleAttackEvent( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Entity target, @Nonnull ITurtleUpgrade upgrade, public TurtleAttackEvent( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Entity target, @Nonnull ITurtleUpgrade upgrade,
@Nonnull TurtleSide side) { @Nonnull TurtleSide side )
{
super( turtle, TurtleAction.ATTACK, player ); super( turtle, TurtleAction.ATTACK, player );
Objects.requireNonNull( target, "target cannot be null" ); Objects.requireNonNull( target, "target cannot be null" );
Objects.requireNonNull( upgrade, "upgrade cannot be null" ); Objects.requireNonNull( upgrade, "upgrade cannot be null" );
@@ -44,7 +44,8 @@ public class TurtleAttackEvent extends TurtlePlayerEvent {
* @return The entity being attacked. * @return The entity being attacked.
*/ */
@Nonnull @Nonnull
public Entity getTarget() { public Entity getTarget()
{
return this.target; return this.target;
} }
@@ -54,7 +55,8 @@ public class TurtleAttackEvent extends TurtlePlayerEvent {
* @return The upgrade responsible for attacking. * @return The upgrade responsible for attacking.
*/ */
@Nonnull @Nonnull
public ITurtleUpgrade getUpgrade() { public ITurtleUpgrade getUpgrade()
{
return this.upgrade; return this.upgrade;
} }
@@ -64,7 +66,8 @@ public class TurtleAttackEvent extends TurtlePlayerEvent {
* @return The upgrade's side. * @return The upgrade's side.
*/ */
@Nonnull @Nonnull
public TurtleSide getSide() { public TurtleSide getSide()
{
return this.side; return this.side;
} }
} }

View File

@@ -1,27 +1,25 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Nonnull;
import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.lua.MethodResult;
import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.FakePlayer;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleSide;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.Map;
import java.util.Objects;
/** /**
* A general event for when a turtle interacts with a block or region. * A general event for when a turtle interacts with a block or region.
* *
@@ -31,12 +29,14 @@ import net.minecraft.world.World;
* *
* Be aware that some events (such as {@link TurtleInventoryEvent}) do not necessarily interact with a block, simply objects within that block space. * Be aware that some events (such as {@link TurtleInventoryEvent}) do not necessarily interact with a block, simply objects within that block space.
*/ */
public abstract class TurtleBlockEvent extends TurtlePlayerEvent { public abstract class TurtleBlockEvent extends TurtlePlayerEvent
{
private final World world; private final World world;
private final BlockPos pos; private final BlockPos pos;
protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
@Nonnull BlockPos pos) { @Nonnull BlockPos pos )
{
super( turtle, action, player ); super( turtle, action, player );
Objects.requireNonNull( world, "world cannot be null" ); Objects.requireNonNull( world, "world cannot be null" );
@@ -50,7 +50,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @return The world the turtle is interacting in. * @return The world the turtle is interacting in.
*/ */
public World getWorld() { public World getWorld()
{
return this.world; return this.world;
} }
@@ -59,7 +60,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @return The position the turtle is interacting with. * @return The position the turtle is interacting with.
*/ */
public BlockPos getPos() { public BlockPos getPos()
{
return this.pos; return this.pos;
} }
@@ -68,13 +70,15 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @see TurtleAction#DIG * @see TurtleAction#DIG
*/ */
public static class Dig extends TurtleBlockEvent { public static class Dig extends TurtleBlockEvent
{
private final BlockState block; private final BlockState block;
private final ITurtleUpgrade upgrade; private final ITurtleUpgrade upgrade;
private final TurtleSide side; private final TurtleSide side;
public Dig( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState block, public Dig( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState block,
@Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side) { @Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side )
{
super( turtle, TurtleAction.DIG, player, world, pos ); super( turtle, TurtleAction.DIG, player, world, pos );
Objects.requireNonNull( block, "block cannot be null" ); Objects.requireNonNull( block, "block cannot be null" );
@@ -91,7 +95,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* @return The block which is going to be broken. * @return The block which is going to be broken.
*/ */
@Nonnull @Nonnull
public BlockState getBlock() { public BlockState getBlock()
{
return this.block; return this.block;
} }
@@ -101,7 +106,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* @return The upgrade doing the digging. * @return The upgrade doing the digging.
*/ */
@Nonnull @Nonnull
public ITurtleUpgrade getUpgrade() { public ITurtleUpgrade getUpgrade()
{
return this.upgrade; return this.upgrade;
} }
@@ -111,7 +117,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* @return The upgrade's side. * @return The upgrade's side.
*/ */
@Nonnull @Nonnull
public TurtleSide getSide() { public TurtleSide getSide()
{
return this.side; return this.side;
} }
} }
@@ -121,8 +128,10 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @see TurtleAction#MOVE * @see TurtleAction#MOVE
*/ */
public static class Move extends TurtleBlockEvent { public static class Move extends TurtleBlockEvent
public Move(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos) { {
public Move( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos )
{
super( turtle, TurtleAction.MOVE, player, world, pos ); super( turtle, TurtleAction.MOVE, player, world, pos );
} }
} }
@@ -132,10 +141,12 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @see TurtleAction#PLACE * @see TurtleAction#PLACE
*/ */
public static class Place extends TurtleBlockEvent { public static class Place extends TurtleBlockEvent
{
private final ItemStack stack; private final ItemStack stack;
public Place(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull ItemStack stack) { public Place( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull ItemStack stack )
{
super( turtle, TurtleAction.PLACE, player, world, pos ); super( turtle, TurtleAction.PLACE, player, world, pos );
Objects.requireNonNull( stack, "stack cannot be null" ); Objects.requireNonNull( stack, "stack cannot be null" );
@@ -148,7 +159,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* @return The item stack to be placed. * @return The item stack to be placed.
*/ */
@Nonnull @Nonnull
public ItemStack getStack() { public ItemStack getStack()
{
return this.stack; return this.stack;
} }
} }
@@ -160,12 +172,14 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @see TurtleAction#INSPECT * @see TurtleAction#INSPECT
*/ */
public static class Inspect extends TurtleBlockEvent { public static class Inspect extends TurtleBlockEvent
{
private final BlockState state; private final BlockState state;
private final Map<String, Object> data; private final Map<String, Object> data;
public Inspect( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, public Inspect( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state,
@Nonnull Map<String, Object> data) { @Nonnull Map<String, Object> data )
{
super( turtle, TurtleAction.INSPECT, player, world, pos ); super( turtle, TurtleAction.INSPECT, player, world, pos );
Objects.requireNonNull( state, "state cannot be null" ); Objects.requireNonNull( state, "state cannot be null" );
@@ -180,7 +194,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* @return The inspected block state. * @return The inspected block state.
*/ */
@Nonnull @Nonnull
public BlockState getState() { public BlockState getState()
{
return this.state; return this.state;
} }
@@ -190,7 +205,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* @return This block's inspection data. * @return This block's inspection data.
*/ */
@Nonnull @Nonnull
public Map<String, Object> getData() { public Map<String, Object> getData()
{
return this.data; return this.data;
} }
@@ -199,7 +215,8 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent {
* *
* @param newData The data to add. Note all values should be convertible to Lua (see {@link MethodResult#of(Object)}). * @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) { public void addData( @Nonnull Map<String, ?> newData )
{
Objects.requireNonNull( newData, "newData cannot be null" ); Objects.requireNonNull( newData, "newData cannot be null" );
this.data.putAll( newData ); this.data.putAll( newData );
} }

View File

@@ -1,18 +1,17 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Objects;
import javax.annotation.Nonnull;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import javax.annotation.Nonnull;
import java.util.Objects;
/** /**
* A base class for all events concerning a turtle. This will only ever constructed and fired on the server side, so sever specific methods on {@link * 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. * ITurtleAccess} are safe to use.
@@ -21,17 +20,20 @@ import dan200.computercraft.api.turtle.ITurtleAccess;
* *
* @see TurtleActionEvent * @see TurtleActionEvent
*/ */
public abstract class TurtleEvent { public abstract class TurtleEvent
{
public static final EventBus EVENT_BUS = new EventBus(); public static final EventBus EVENT_BUS = new EventBus();
private final ITurtleAccess turtle; private final ITurtleAccess turtle;
protected TurtleEvent(@Nonnull ITurtleAccess turtle) { protected TurtleEvent( @Nonnull ITurtleAccess turtle )
{
Objects.requireNonNull( turtle, "turtle cannot be null" ); Objects.requireNonNull( turtle, "turtle cannot be null" );
this.turtle = turtle; this.turtle = turtle;
} }
public static boolean post(TurtleActionEvent event) { public static boolean post( TurtleActionEvent event )
{
EVENT_BUS.post( event ); EVENT_BUS.post( event );
return event.isCancelled(); return event.isCancelled();
} }
@@ -42,7 +44,8 @@ public abstract class TurtleEvent {
* @return The access for this turtle. * @return The access for this turtle.
*/ */
@Nonnull @Nonnull
public ITurtleAccess getTurtle() { public ITurtleAccess getTurtle()
{
return this.turtle; return this.turtle;
} }

View File

@@ -1,21 +1,19 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Nonnull;
import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.lua.MethodResult;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import java.util.Map;
import java.util.Objects;
/** /**
* Fired when a turtle gathers data on an item in its inventory. * Fired when a turtle gathers data on an item in its inventory.
* *
@@ -24,17 +22,20 @@ import net.minecraft.item.ItemStack;
* *
* @see TurtleAction#INSPECT_ITEM * @see TurtleAction#INSPECT_ITEM
*/ */
public class TurtleInspectItemEvent extends TurtleActionEvent { public class TurtleInspectItemEvent extends TurtleActionEvent
{
private final ItemStack stack; private final ItemStack stack;
private final Map<String, Object> data; private final Map<String, Object> data;
private final boolean mainThread; private final boolean mainThread;
@Deprecated @Deprecated
public TurtleInspectItemEvent(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data) { public TurtleInspectItemEvent( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data )
{
this( turtle, stack, data, false ); this( turtle, stack, data, false );
} }
public TurtleInspectItemEvent(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data, boolean mainThread) { public TurtleInspectItemEvent( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack, @Nonnull Map<String, Object> data, boolean mainThread )
{
super( turtle, TurtleAction.INSPECT_ITEM ); super( turtle, TurtleAction.INSPECT_ITEM );
Objects.requireNonNull( stack, "stack cannot be null" ); Objects.requireNonNull( stack, "stack cannot be null" );
@@ -50,7 +51,8 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
* @return The item stack which is being inspected. This should <b>not</b> be modified. * @return The item stack which is being inspected. This should <b>not</b> be modified.
*/ */
@Nonnull @Nonnull
public ItemStack getStack() { public ItemStack getStack()
{
return this.stack; return this.stack;
} }
@@ -60,7 +62,8 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
* @return This items's inspection data. * @return This items's inspection data.
*/ */
@Nonnull @Nonnull
public Map<String, Object> getData() { public Map<String, Object> getData()
{
return this.data; return this.data;
} }
@@ -69,7 +72,8 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
* *
* @return If this is run on the main thread. * @return If this is run on the main thread.
*/ */
public boolean onMainThread() { public boolean onMainThread()
{
return this.mainThread; return this.mainThread;
} }
@@ -78,7 +82,8 @@ public class TurtleInspectItemEvent extends TurtleActionEvent {
* *
* @param newData The data to add. Note all values should be convertible to Lua (see {@link MethodResult#of(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) { public void addData( @Nonnull Map<String, ?> newData )
{
Objects.requireNonNull( newData, "newData cannot be null" ); Objects.requireNonNull( newData, "newData cannot be null" );
this.data.putAll( newData ); this.data.putAll( newData );
} }

View File

@@ -1,32 +1,32 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.FakePlayer;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Objects;
/** /**
* Fired when a turtle attempts to interact with an inventory. * Fired when a turtle attempts to interact with an inventory.
*/ */
public abstract class TurtleInventoryEvent extends TurtleBlockEvent { public abstract class TurtleInventoryEvent extends TurtleBlockEvent
{
private final Inventory handler; private final Inventory handler;
protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world,
@Nonnull BlockPos pos, @Nullable Inventory handler) { @Nonnull BlockPos pos, @Nullable Inventory handler )
{
super( turtle, action, player, world, pos ); super( turtle, action, player, world, pos );
this.handler = handler; this.handler = handler;
} }
@@ -37,7 +37,8 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
* @return The inventory being interacted with, {@code null} if the item will be dropped to/sucked from the world. * @return The inventory being interacted with, {@code null} if the item will be dropped to/sucked from the world.
*/ */
@Nullable @Nullable
public Inventory getItemHandler() { public Inventory getItemHandler()
{
return this.handler; return this.handler;
} }
@@ -46,8 +47,10 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
* *
* @see TurtleAction#SUCK * @see TurtleAction#SUCK
*/ */
public static class Suck extends TurtleInventoryEvent { public static class Suck extends TurtleInventoryEvent
public Suck(@Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory 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 ); super( turtle, TurtleAction.SUCK, player, world, pos, handler );
} }
} }
@@ -57,11 +60,13 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
* *
* @see TurtleAction#DROP * @see TurtleAction#DROP
*/ */
public static class Drop extends TurtleInventoryEvent { public static class Drop extends TurtleInventoryEvent
{
private final ItemStack stack; private final ItemStack stack;
public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler, public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler,
@Nonnull ItemStack stack) { @Nonnull ItemStack stack )
{
super( turtle, TurtleAction.DROP, player, world, pos, handler ); super( turtle, TurtleAction.DROP, player, world, pos, handler );
Objects.requireNonNull( stack, "stack cannot be null" ); Objects.requireNonNull( stack, "stack cannot be null" );
@@ -74,7 +79,8 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent {
* @return The item stack which will be dropped. This should <b>not</b> be modified. * @return The item stack which will be dropped. This should <b>not</b> be modified.
*/ */
@Nonnull @Nonnull
public ItemStack getStack() { public ItemStack getStack()
{
return this.stack; return this.stack;
} }
} }

View File

@@ -1,27 +1,28 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Objects;
import javax.annotation.Nonnull;
import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.FakePlayer;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import javax.annotation.Nonnull;
import java.util.Objects;
/** /**
* An action done by a turtle which is normally done by a player. * An action done by a turtle which is normally done by a player.
* *
* {@link #getPlayer()} may be used to modify the player's attributes or perform permission checks. * {@link #getPlayer()} may be used to modify the player's attributes or perform permission checks.
*/ */
public abstract class TurtlePlayerEvent extends TurtleActionEvent { public abstract class TurtlePlayerEvent extends TurtleActionEvent
{
private final FakePlayer player; private final FakePlayer player;
protected TurtlePlayerEvent(@Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player) { protected TurtlePlayerEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player )
{
super( turtle, action ); super( turtle, action );
Objects.requireNonNull( player, "player cannot be null" ); Objects.requireNonNull( player, "player cannot be null" );
@@ -36,7 +37,8 @@ public abstract class TurtlePlayerEvent extends TurtleActionEvent {
* @return A {@link FakePlayer} representing this turtle. * @return A {@link FakePlayer} representing this turtle.
*/ */
@Nonnull @Nonnull
public FakePlayer getPlayer() { public FakePlayer getPlayer()
{
return this.player; return this.player;
} }
} }

View File

@@ -1,19 +1,17 @@
/* /*
* This file is part of the public ComputerCraft API - http://www.computercraft.info * This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. This API may be redistributed unmodified and in full only. * Copyright Daniel Ratcliffe, 2011-2021. 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. * For help using the API, and posting your mods, visit the forums at computercraft.info.
*/ */
package dan200.computercraft.api.turtle.event; package dan200.computercraft.api.turtle.event;
import java.util.Objects; import dan200.computercraft.api.turtle.ITurtleAccess;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Objects;
import dan200.computercraft.api.turtle.ITurtleAccess;
import net.minecraft.item.ItemStack;
/** /**
* Fired when a turtle attempts to refuel from an item. * Fired when a turtle attempts to refuel from an item.
@@ -21,11 +19,13 @@ import net.minecraft.item.ItemStack;
* One may use {@link #setCanceled(boolean, String)} to prevent refueling from this specific item. Additionally, you may use {@link #setHandler(Handler)} to * One may use {@link #setCanceled(boolean, String)} to prevent refueling from this specific item. Additionally, you may use {@link #setHandler(Handler)} to
* register a custom fuel provider. * register a custom fuel provider.
*/ */
public class TurtleRefuelEvent extends TurtleActionEvent { public class TurtleRefuelEvent extends TurtleActionEvent
{
private final ItemStack stack; private final ItemStack stack;
private Handler handler; private Handler handler;
public TurtleRefuelEvent(@Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack) { public TurtleRefuelEvent( @Nonnull ITurtleAccess turtle, @Nonnull ItemStack stack )
{
super( turtle, TurtleAction.REFUEL ); super( turtle, TurtleAction.REFUEL );
Objects.requireNonNull( turtle, "turtle cannot be null" ); Objects.requireNonNull( turtle, "turtle cannot be null" );
@@ -39,7 +39,8 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
* *
* @return The stack to refuel from. * @return The stack to refuel from.
*/ */
public ItemStack getStack() { public ItemStack getStack()
{
return this.stack; return this.stack;
} }
@@ -50,7 +51,8 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
* @see #setHandler(Handler) * @see #setHandler(Handler)
*/ */
@Nullable @Nullable
public Handler getHandler() { public Handler getHandler()
{
return this.handler; return this.handler;
} }
@@ -62,7 +64,8 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
* @param handler The new refuel handler. * @param handler The new refuel handler.
* @see #getHandler() * @see #getHandler()
*/ */
public void setHandler(@Nullable Handler handler) { public void setHandler( @Nullable Handler handler )
{
this.handler = handler; this.handler = handler;
} }
@@ -70,7 +73,8 @@ public class TurtleRefuelEvent extends TurtleActionEvent {
* Handles refuelling a turtle from a specific item. * Handles refuelling a turtle from a specific item.
*/ */
@FunctionalInterface @FunctionalInterface
public interface Handler { public interface Handler
{
/** /**
* Refuel a turtle using an item. * Refuel a turtle using an item.
* *

View File

@@ -1,14 +1,11 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.client; package dan200.computercraft.client;
import java.util.HashSet;
import java.util.function.Consumer;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.ComputerCraftRegistry;
import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.common.IColouredItem;
@@ -16,7 +13,8 @@ import dan200.computercraft.shared.media.items.ItemDisk;
import dan200.computercraft.shared.media.items.ItemTreasureDisk; import dan200.computercraft.shared.media.items.ItemTreasureDisk;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.render.model.ModelLoader;
@@ -27,8 +25,8 @@ import net.minecraft.client.util.ModelIdentifier;
import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import java.util.HashSet;
import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; import java.util.function.Consumer;
/** /**
* Registers textures and models for items. * Registers textures and models for items.
@@ -37,7 +35,8 @@ import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback;
"MethodCallSideOnly", "MethodCallSideOnly",
"LocalVariableDeclarationSideOnly" "LocalVariableDeclarationSideOnly"
} ) } )
public final class ClientRegistry { public final class ClientRegistry
{
private static final String[] EXTRA_MODELS = new String[] { private static final String[] EXTRA_MODELS = new String[] {
"turtle_modem_normal_off_left", "turtle_modem_normal_off_left",
"turtle_modem_normal_on_left", "turtle_modem_normal_on_left",
@@ -69,20 +68,25 @@ public final class ClientRegistry {
private ClientRegistry() {} private ClientRegistry() {}
public static void onTextureStitchEvent(SpriteAtlasTexture atlasTexture, ClientSpriteRegistryCallback.Registry registry) { public static void onTextureStitchEvent( SpriteAtlasTexture atlasTexture, ClientSpriteRegistryCallback.Registry registry )
for (String extra : EXTRA_TEXTURES) { {
for( String extra : EXTRA_TEXTURES )
{
registry.register( new Identifier( ComputerCraft.MOD_ID, extra ) ); registry.register( new Identifier( ComputerCraft.MOD_ID, extra ) );
} }
} }
@SuppressWarnings( "NewExpressionSideOnly" ) @SuppressWarnings( "NewExpressionSideOnly" )
public static void onModelBakeEvent(ResourceManager manager, Consumer<ModelIdentifier> out) { public static void onModelBakeEvent( ResourceManager manager, Consumer<ModelIdentifier> out )
for (String model : EXTRA_MODELS) { {
for( String model : EXTRA_MODELS )
{
out.accept( new ModelIdentifier( new Identifier( ComputerCraft.MOD_ID, model ), "inventory" ) ); out.accept( new ModelIdentifier( new Identifier( ComputerCraft.MOD_ID, model ), "inventory" ) );
} }
} }
public static void onItemColours() { public static void onItemColours()
{
ColorProviderRegistry.ITEM.register( ( stack, layer ) -> { ColorProviderRegistry.ITEM.register( ( stack, layer ) -> {
return layer == 1 ? ((ItemDisk) stack.getItem()).getColour( stack ) : 0xFFFFFF; return layer == 1 ? ((ItemDisk) stack.getItem()).getColour( stack ) : 0xFFFFFF;
}, ComputerCraftRegistry.ModItems.DISK ); }, ComputerCraftRegistry.ModItems.DISK );
@@ -91,7 +95,8 @@ public final class ClientRegistry {
ComputerCraftRegistry.ModItems.TREASURE_DISK ); ComputerCraftRegistry.ModItems.TREASURE_DISK );
ColorProviderRegistry.ITEM.register( ( stack, layer ) -> { ColorProviderRegistry.ITEM.register( ( stack, layer ) -> {
switch (layer) { switch( layer )
{
case 0: case 0:
default: default:
return 0xFFFFFF; return 0xFFFFFF;
@@ -111,7 +116,8 @@ public final class ClientRegistry {
ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED ); ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED );
} }
private static BakedModel bake(ModelLoader loader, UnbakedModel model, Identifier identifier) { private static BakedModel bake( ModelLoader loader, UnbakedModel model, Identifier identifier )
{
model.getTextureDependencies( loader::getOrLoadModel, new HashSet<>() ); model.getTextureDependencies( loader::getOrLoadModel, new HashSet<>() );
return model.bake( loader, return model.bake( loader,
spriteIdentifier -> MinecraftClient.getInstance() spriteIdentifier -> MinecraftClient.getInstance()

View File

@@ -1,41 +1,43 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.client; package dan200.computercraft.client;
import javax.annotation.Nullable; import dan200.computercraft.fabric.mixin.ChatHudAccess;
import dan200.computercraft.mixin.ChatHudAccess;
import dan200.computercraft.shared.command.text.ChatHelpers; import dan200.computercraft.shared.command.text.ChatHelpers;
import dan200.computercraft.shared.command.text.TableBuilder; import dan200.computercraft.shared.command.text.TableBuilder;
import dan200.computercraft.shared.command.text.TableFormatter; import dan200.computercraft.shared.command.text.TableFormatter;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import org.apache.commons.lang3.StringUtils;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.ChatHud;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import org.apache.commons.lang3.StringUtils;
import javax.annotation.Nullable;
@SuppressWarnings( { @SuppressWarnings( {
"MethodCallSideOnly", "MethodCallSideOnly",
"LocalVariableDeclarationSideOnly" "LocalVariableDeclarationSideOnly"
} ) } )
public class ClientTableFormatter implements TableFormatter { public class ClientTableFormatter implements TableFormatter
{
public static final ClientTableFormatter INSTANCE = new ClientTableFormatter(); public static final ClientTableFormatter INSTANCE = new ClientTableFormatter();
private static Int2IntOpenHashMap lastHeights = new Int2IntOpenHashMap(); private static Int2IntOpenHashMap lastHeights = new Int2IntOpenHashMap();
@Override @Override
@Nullable @Nullable
public Text getPadding(Text component, int width) { public Text getPadding( Text component, int width )
{
int extraWidth = width - this.getWidth( component ); int extraWidth = width - this.getWidth( component );
if (extraWidth <= 0) { if( extraWidth <= 0 )
{
return null; return null;
} }
@@ -48,22 +50,26 @@ public class ClientTableFormatter implements TableFormatter {
return ChatHelpers.coloured( StringUtils.repeat( ' ', spaces ) + StringUtils.repeat( (char) 712, extra ), Formatting.GRAY ); return ChatHelpers.coloured( StringUtils.repeat( ' ', spaces ) + StringUtils.repeat( (char) 712, extra ), Formatting.GRAY );
} }
private static TextRenderer renderer() { private static TextRenderer renderer()
{
return MinecraftClient.getInstance().textRenderer; return MinecraftClient.getInstance().textRenderer;
} }
@Override @Override
public int getColumnPadding() { public int getColumnPadding()
{
return 3; return 3;
} }
@Override @Override
public int getWidth(Text component) { public int getWidth( Text component )
{
return renderer().getWidth( component ); return renderer().getWidth( component );
} }
@Override @Override
public void writeLine(int id, Text component) { public void writeLine( int id, Text component )
{
MinecraftClient mc = MinecraftClient.getInstance(); MinecraftClient mc = MinecraftClient.getInstance();
ChatHud chat = mc.inGameHud.getChatHud(); ChatHud chat = mc.inGameHud.getChatHud();
@@ -75,7 +81,8 @@ public class ClientTableFormatter implements TableFormatter {
} }
@Override @Override
public int display(TableBuilder table) { public int display( TableBuilder table )
{
ChatHud chat = MinecraftClient.getInstance().inGameHud.getChatHud(); ChatHud chat = MinecraftClient.getInstance().inGameHud.getChatHud();
int lastHeight = lastHeights.get( table.getId() ); int lastHeight = lastHeights.get( table.getId() );
@@ -83,7 +90,8 @@ public class ClientTableFormatter implements TableFormatter {
int height = TableFormatter.super.display( table ); int height = TableFormatter.super.display( table );
lastHeights.put( table.getId(), height ); lastHeights.put( table.getId(), height );
for (int i = height; i < lastHeight; i++) { for( int i = height; i < lastHeight; i++ )
{
((ChatHudAccess) chat).callRemoveMessage( i + table.getId() ); ((ChatHudAccess) chat).callRemoveMessage( i + table.getId() );
} }
return height; return height;

View File

@@ -1,6 +1,6 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
@@ -8,38 +8,41 @@ package dan200.computercraft.client;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
public final class FrameInfo { public final class FrameInfo
{
private static int tick; private static int tick;
private static long renderFrame; private static long renderFrame;
static { private FrameInfo()
{
} }
private FrameInfo() { public static void init()
} {
public static void init() {
ClientTickEvents.START_CLIENT_TICK.register( m -> { ClientTickEvents.START_CLIENT_TICK.register( m -> {
tick++; tick++;
} ); } );
} }
public static boolean getGlobalCursorBlink() { public static boolean getGlobalCursorBlink()
{
return (tick / 8) % 2 == 0; return (tick / 8) % 2 == 0;
} }
public static long getRenderFrame() { public static long getRenderFrame()
{
return renderFrame; return renderFrame;
} }
// TODO Call this in a callback // TODO Call this in a callback
public static void onTick() { public static void onTick()
{
tick++; tick++;
} }
// TODO Call this in a callback // TODO Call this in a callback
public static void onRenderFrame() { public static void onRenderFrame()
{
renderFrame++; renderFrame++;
} }
} }

View File

@@ -1,34 +1,29 @@
/* /*
* This file is part of ComputerCraft - http://www.computercraft.info * This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com * Send enquiries to dratcliffe@gmail.com
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.client.FrameInfo; import dan200.computercraft.client.FrameInfo;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.*;
import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.AffineTransformation; import net.minecraft.client.util.math.AffineTransformation;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Matrix4f;
import org.lwjgl.opengl.GL11;
public final class FixedWidthFontRenderer { import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public final class FixedWidthFontRenderer
{
public static final int FONT_HEIGHT = 9; public static final int FONT_HEIGHT = 9;
public static final int FONT_WIDTH = 6; public static final int FONT_WIDTH = 6;
public static final float WIDTH = 256.0f; public static final float WIDTH = 256.0f;
@@ -40,11 +35,13 @@ public final class FixedWidthFontRenderer {
public static final RenderLayer TYPE = Type.MAIN; public static final RenderLayer TYPE = Type.MAIN;
private FixedWidthFontRenderer() { private FixedWidthFontRenderer()
{
} }
public static void drawString( float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, public static void drawString( float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour,
@Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize) { @Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize )
{
bindFont(); bindFont();
VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance()
@@ -64,7 +61,8 @@ public final class FixedWidthFontRenderer {
renderer.draw(); renderer.draw();
} }
private static void bindFont() { private static void bindFont()
{
MinecraftClient.getInstance() MinecraftClient.getInstance()
.getTextureManager() .getTextureManager()
.bindTexture( FONT ); .bindTexture( FONT );
@@ -73,17 +71,23 @@ public final class FixedWidthFontRenderer {
public static void drawString( @Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, @Nonnull TextBuffer text, public static void drawString( @Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, @Nonnull TextBuffer text,
@Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale,
float leftMarginSize, float rightMarginSize) { float leftMarginSize, float rightMarginSize )
if (backgroundColour != null) { {
if( backgroundColour != null )
{
drawBackground( transform, renderer, x, y, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT ); drawBackground( transform, renderer, x, y, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT );
} }
for (int i = 0; i < text.length(); i++) { for( int i = 0; i < text.length(); i++ )
{
double[] colour = palette.getColour( getColour( textColour.charAt( i ), Colour.BLACK ) ); double[] colour = palette.getColour( getColour( textColour.charAt( i ), Colour.BLACK ) );
float r, g, b; float r, g, b;
if (greyscale) { if( greyscale )
{
r = g = b = toGreyscale( colour ); r = g = b = toGreyscale( colour );
} else { }
else
{
r = (float) colour[0]; r = (float) colour[0];
g = (float) colour[1]; g = (float) colour[1];
b = (float) colour[2]; b = (float) colour[2];
@@ -91,7 +95,8 @@ public final class FixedWidthFontRenderer {
// Draw char // Draw char
int index = text.charAt( i ); int index = text.charAt( i );
if (index > 255) { if( index > 255 )
{
index = '?'; index = '?';
} }
drawChar( transform, renderer, x + i * FONT_WIDTH, y, index, r, g, b ); drawChar( transform, renderer, x + i * FONT_WIDTH, y, index, r, g, b );
@@ -101,12 +106,15 @@ public final class FixedWidthFontRenderer {
private static void drawBackground( @Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, private static void drawBackground( @Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y,
@Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, float leftMarginSize, @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, float leftMarginSize,
float rightMarginSize, float height) { float rightMarginSize, float height )
if (leftMarginSize > 0) { {
if( leftMarginSize > 0 )
{
drawQuad( transform, renderer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ) ); drawQuad( transform, renderer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ) );
} }
if (rightMarginSize > 0) { if( rightMarginSize > 0 )
{
drawQuad( transform, drawQuad( transform,
renderer, renderer,
x + backgroundColour.length() * FONT_WIDTH, x + backgroundColour.length() * FONT_WIDTH,
@@ -121,13 +129,16 @@ public final class FixedWidthFontRenderer {
// Batch together runs of identical background cells. // Batch together runs of identical background cells.
int blockStart = 0; int blockStart = 0;
char blockColour = '\0'; char blockColour = '\0';
for (int i = 0; i < backgroundColour.length(); i++) { for( int i = 0; i < backgroundColour.length(); i++ )
{
char colourIndex = backgroundColour.charAt( i ); char colourIndex = backgroundColour.charAt( i );
if (colourIndex == blockColour) { if( colourIndex == blockColour )
{
continue; continue;
} }
if (blockColour != '\0') { if( blockColour != '\0' )
{
drawQuad( transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour ); drawQuad( transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour );
} }
@@ -135,7 +146,8 @@ public final class FixedWidthFontRenderer {
blockStart = i; blockStart = i;
} }
if (blockColour != '\0') { if( blockColour != '\0' )
{
drawQuad( transform, drawQuad( transform,
renderer, renderer,
x + blockStart * FONT_WIDTH, x + blockStart * FONT_WIDTH,
@@ -148,17 +160,21 @@ public final class FixedWidthFontRenderer {
} }
} }
public static int getColour(char c, Colour def) { public static int getColour( char c, Colour def )
{
return 15 - Terminal.getColour( c, def ); return 15 - Terminal.getColour( c, def );
} }
public static float toGreyscale(double[] rgb) { public static float toGreyscale( double[] rgb )
{
return (float) ((rgb[0] + rgb[1] + rgb[2]) / 3); return (float) ((rgb[0] + rgb[1] + rgb[2]) / 3);
} }
private static void drawChar(Matrix4f transform, VertexConsumer buffer, float x, float y, int index, float r, float g, float b) { private static void drawChar( Matrix4f transform, VertexConsumer buffer, float x, float y, int index, float r, float g, float b )
{
// Short circuit to avoid the common case - the texture should be blank here after all. // Short circuit to avoid the common case - the texture should be blank here after all.
if (index == '\0' || index == ' ') { if( index == '\0' || index == ' ' )
{
return; return;
} }
@@ -195,12 +211,16 @@ public final class FixedWidthFontRenderer {
} }
private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, Palette palette, private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, Palette palette,
boolean greyscale, char colourIndex) { boolean greyscale, char colourIndex )
{
double[] colour = palette.getColour( getColour( colourIndex, Colour.BLACK ) ); double[] colour = palette.getColour( getColour( colourIndex, Colour.BLACK ) );
float r, g, b; float r, g, b;
if (greyscale) { if( greyscale )
{
r = g = b = toGreyscale( colour ); r = g = b = toGreyscale( colour );
} else { }
else
{
r = (float) colour[0]; r = (float) colour[0];
g = (float) colour[1]; g = (float) colour[1];
b = (float) colour[2]; b = (float) colour[2];
@@ -209,7 +229,8 @@ public final class FixedWidthFontRenderer {
drawQuad( transform, buffer, x, y, width, height, r, g, b ); drawQuad( transform, buffer, x, y, width, height, r, g, b );
} }
private static void drawQuad(Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, float r, float g, float b) { private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, float r, float g, float b )
{
buffer.vertex( transform, x, y, 0 ) buffer.vertex( transform, x, y, 0 )
.color( r, g, b, 1.0f ) .color( r, g, b, 1.0f )
.texture( BACKGROUND_START, BACKGROUND_START ) .texture( BACKGROUND_START, BACKGROUND_START )
@@ -238,7 +259,8 @@ public final class FixedWidthFontRenderer {
public static void drawTerminalWithoutCursor( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, public static void drawTerminalWithoutCursor( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y,
@Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize,
float leftMarginSize, float rightMarginSize) { float leftMarginSize, float rightMarginSize )
{
Palette palette = terminal.getPalette(); Palette palette = terminal.getPalette();
int height = terminal.getHeight(); int height = terminal.getHeight();
@@ -266,7 +288,8 @@ public final class FixedWidthFontRenderer {
bottomMarginSize ); bottomMarginSize );
// The main text // The main text
for (int i = 0; i < height; i++) { for( int i = 0; i < height; i++ )
{
drawString( transform, drawString( transform,
buffer, buffer,
x, x,
@@ -282,19 +305,24 @@ public final class FixedWidthFontRenderer {
} }
public static void drawCursor( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @Nonnull Terminal terminal, public static void drawCursor( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @Nonnull Terminal terminal,
boolean greyscale) { boolean greyscale )
{
Palette palette = terminal.getPalette(); Palette palette = terminal.getPalette();
int width = terminal.getWidth(); int width = terminal.getWidth();
int height = terminal.getHeight(); int height = terminal.getHeight();
int cursorX = terminal.getCursorX(); int cursorX = terminal.getCursorX();
int cursorY = terminal.getCursorY(); int cursorY = terminal.getCursorY();
if (terminal.getCursorBlink() && cursorX >= 0 && cursorX < width && cursorY >= 0 && cursorY < height && FrameInfo.getGlobalCursorBlink()) { if( terminal.getCursorBlink() && cursorX >= 0 && cursorX < width && cursorY >= 0 && cursorY < height && FrameInfo.getGlobalCursorBlink() )
{
double[] colour = palette.getColour( 15 - terminal.getTextColour() ); double[] colour = palette.getColour( 15 - terminal.getTextColour() );
float r, g, b; float r, g, b;
if (greyscale) { if( greyscale )
{
r = g = b = toGreyscale( colour ); r = g = b = toGreyscale( colour );
} else { }
else
{
r = (float) colour[0]; r = (float) colour[0];
g = (float) colour[1]; g = (float) colour[1];
b = (float) colour[2]; b = (float) colour[2];
@@ -305,13 +333,15 @@ public final class FixedWidthFontRenderer {
} }
public static void drawTerminal( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @Nonnull Terminal terminal, public static void drawTerminal( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @Nonnull Terminal terminal,
boolean greyscale, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize) { boolean greyscale, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize )
{
drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
drawCursor( transform, buffer, x, y, terminal, greyscale ); drawCursor( transform, buffer, x, y, terminal, greyscale );
} }
public static void drawTerminal( @Nonnull Matrix4f transform, float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, public static void drawTerminal( @Nonnull Matrix4f transform, float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize,
float bottomMarginSize, float leftMarginSize, float rightMarginSize) { float bottomMarginSize, float leftMarginSize, float rightMarginSize )
{
bindFont(); bindFont();
VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance()
@@ -323,15 +353,18 @@ public final class FixedWidthFontRenderer {
} }
public static void drawTerminal( float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize, public static void drawTerminal( float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize,
float leftMarginSize, float rightMarginSize) { float leftMarginSize, float rightMarginSize )
{
drawTerminal( IDENTITY, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); drawTerminal( IDENTITY, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
} }
public static void drawEmptyTerminal(float x, float y, float width, float height) { public static void drawEmptyTerminal( float x, float y, float width, float height )
{
drawEmptyTerminal( IDENTITY, x, y, width, height ); drawEmptyTerminal( IDENTITY, x, y, width, height );
} }
public static void drawEmptyTerminal(@Nonnull Matrix4f transform, float x, float y, float width, float height) { public static void drawEmptyTerminal( @Nonnull Matrix4f transform, float x, float y, float width, float height )
{
bindFont(); bindFont();
VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance()
@@ -342,17 +375,20 @@ public final class FixedWidthFontRenderer {
} }
public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width,
float height) { float height )
{
Colour colour = Colour.BLACK; Colour colour = Colour.BLACK;
drawQuad( transform, renderer.getBuffer( TYPE ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() ); drawQuad( transform, renderer.getBuffer( TYPE ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() );
} }
public static void drawBlocker(@Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, float height) { public static void drawBlocker( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, float height )
{
Colour colour = Colour.BLACK; Colour colour = Colour.BLACK;
drawQuad( transform, renderer.getBuffer( Type.BLOCKER ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() ); drawQuad( transform, renderer.getBuffer( Type.BLOCKER ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() );
} }
private static final class Type extends RenderPhase { private static final class Type extends RenderPhase
{
private static final int GL_MODE = GL11.GL_TRIANGLES; private static final int GL_MODE = GL11.GL_TRIANGLES;
private static final VertexFormat FORMAT = VertexFormats.POSITION_COLOR_TEXTURE; private static final VertexFormat FORMAT = VertexFormats.POSITION_COLOR_TEXTURE;
@@ -377,7 +413,8 @@ public final class FixedWidthFontRenderer {
.lightmap( DISABLE_LIGHTMAP ) .lightmap( DISABLE_LIGHTMAP )
.build( false ) ); .build( false ) );
private Type(String name, Runnable setup, Runnable destroy) { private Type( String name, Runnable setup, Runnable destroy )
{
super( name, setup, destroy ); super( name, setup, destroy );
} }
} }

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