This update adds the following changes to InvSee++:
Minecraft 1.21.1 is now supported.
API (breaking): SpectatorInventoryView has been changed from a class to an interface because of a breaking change in Bukkit's API. Consumers of this API will have to recompile their plugin.
InvSee++_Give's command format was changed to accomodate the removal of NBT tags. The syntax of the /invgive and /endergive commands is now almost exactly like Vanilla's /give command. The exception is that entity selectors do not work with /ingvive and /endergive. Note that the new format is only required for Minecraft 1.20.5 and up. InvSee++ still uses the old format on Minecraft 1.20.4 and below.
InvSee++_Give now properly respects the max_stack_size component of item stacks - it is no longer possible to give stacks larger than the maximum stack size.
For server owners who are too afraid or too incompetent to run their 1.12.2 or 1.8.8 PvP server on Java 11, InvSee++ now supports being ran on Java 8 for these Minecraft versions. When ran on CraftBukkit 1.15.2 or newer, InvSee++ still requires Java 11 (or newer).
Support for Minecraft 1.20.1 and 1.20.3 have also been dropped this release.
This update makes InvSee++ work on CraftBukkit 1.20.3 and 1.20.4.
Support for no version has been dropped, but support for 1.20.3 will be dropped soon.
- Implemented improved merging algorithm of item stacks for the ender spectator inventory too.
- Fixed disappearing placeholders for inacessible slots (disappearing for other types of slots are an intended feature).
Hi all,
This update brings the following changes to InvSee++:
Support for the Folia server software has been disabled in this version. It was experimental for a long while, and it never really worked completely. I still want to implement proper support at some point, but this is a non-trivial task due to the fact that inventory spectator views combine inventories managed by multiple entity schedulers.
InvSee++ now as an event api, starting out with two events:
Added SpectatorInventoryOfflineCreatedEvent. This event is called when a SpectatorInventory is created for an offline player.
Added SpectatorInventorySaveEvent which is called when InvseeApi#saveInventory or InvseeApi#saveEnderchest is called by plugins. This also happens when admin players close a spectator inventory.
I know the first point is not good news, but I'd rather have a safe but more limited featureset than cause data corruption on servers for now. Thank you for your understanding.
This update fixes a bug that occured when an enderchest was spectated and the spectated target logged in.
If your server uses Bukkit 1.8.8 then it is strongly recommended to update.
Hi all, this update contains the following changes:
[Added] Placeholder item stacks to indicate which inventory slots are usable. Can be configured in the config.yml using the placeholder-palette option. Allowed values are glass panes (new default), icons and empty (fallback).
[Fixed] Improved Folia detection, fixes an incompatibility with XClaim.
[Fixed] When a target player was looking at a villager, you would be able to see the result item of the villager trade. This now no longer shows.
[Removed] support for the CraftBukkit 1.20 server software.
That's all, cheers!
P.s. if you like my work on InvSee++, consider leaving a review, or making a
donation.
This change to InvSee++ does not introduce any new features for server users, but the InvseeAPI used by other developers has seen several improvements and has been completely documented now.
If you are a developer wanting to make use of InvSee++'s API, these are your places to be:
This version of InvSee++ comes with the following changes:
Changed logging formatting internally.
Added configurable logging formats:
Code (YAML):
# Logging options. InvSee++ can log what spectators change in the SpectatorInventories. # Change these values to change how logging works. logging: # Pick one from: [LOG_NEVER, LOG_ON_CLOSE, LOG_EVERY_CHANGE] granularity: LOG_ON_CLOSE
# Pick zero or more from: [SERVER_LOG_FILE, PLUGIN_LOG_FILE, SPECTATOR_LOG_FILE, CONSOLE] output: [PLUGIN_LOG_FILE
] # # Logging formats strings: # The following macros will be replaced by the plugin: # <date> - will be replaced by the current date in yy-MM-dd notation # <time> - will be replaced by the current time in HH:mm:ss notation # <spectator_uuid> - will be replaced by the unique id of the spectator player # <spectator_name> - will be replaced by the username of the spectator player # <taken> - will be replaced by the items taken from the spectator inventory # <given> - will be replaced by the items given to the spectator inventory # <target> - will be replaced by the target player # # Format for logging to the server log file: format-server-log-file: | Spectator UUID: <spectator_uuid> Spectator Name: <spectator_name>
Taken : <taken>
Given : <given>
Target : <target
> # Format for logging to the plugin's log file: format-plugin-log-file: |
[<date> <time>] [<level>]:
Spectator UUID: <spectator_uuid>
Spectator Name: <spectator_name>
Taken : <taken>
Given : <given>
Target : <target
> # Format for logging to the spectator's log file format-spectator-log-file: |
[<date> <time>] [<level>]:
Taken : <taken>
Given : <given>
Target : <target
> # Format for logging to the console: format-console: |
[<date> <time>] [<level>]:
Spectator UUID: <spectator_uuid>
Spectator Name: <spectator_name>
Taken : <taken>
Given : <given>
Target : <target>
Api: Added SpectatorInventoryView, which allows access to the Difference that is tracked for logging.
This update of InvSee++ comes with the following changes:
Added:
Logging!
Support for logging changes made to the spectator inventories by spectating players.
Logging can be configured in the config now:
Code (YAML):
# Logging options. InvSee++ can log what spectators change in the SpectatorInventories. # Change these values to change how logging works. logging: # Pick one from: [LOG_NEVER, LOG_ON_CLOSE, LOG_EVERY_CHANGE] granularity: LOG_ON_CLOSE
# Pick zero or more from: [CONSOLE, SERVER_LOG_FILE, PLUGIN_LOG_FILE, SPECTATOR_LOG_FILE] output: [PLUGIN_LOG_FILE
]
Bypass permissions!
invseeplusplus.bypass-exempt.invsee to ignore whether targets are exempted from having their inventory spectated using /invsee
invseeplusplus.bypass-exempt.endersee to ignore whether targets are exempted from having their enderchest spectated using /endersee
invseeplusplus.bypass-exempt has been added as a parent permission for both invseeplusplus.bypass-exempt.invsee and invseeplusplus.bypass-exempt.endersee
invseeplusplus.* has also gained these two new permissions as children.
Added configuration option for whether InvSee++ lets you create spectator inventories for players who were never on the server before:
Code (YAML):
# Whether InvSee++ will let you spectate inventories of players who never player on the server before. enable-unknown-player-support: true
Speaking of configuration options: InvSee++_Give has gained the following configuration options:
Code (YAML):
# Whether InvSee++_Give can give items to offline players. # Possible values: [false, true, same_as_InvSee++, same_as_InvseeAPI] offline-player-support: true
# Whether InvSee++_Give can give items to players who have not played on the server before. # Possible values: [false, true, same_as_InvSee++, same_as_InvseeAPI] unknown-player-support: true
# Whether InvSee++_Give respects the target player's exemption status. # Possible values: [false, true, permission] bypass-exempt: permission
With these options you can configure whether InvSee++_Give gives items to offline players, unknown players, and whether it can bypass exempt permissions. Use value
permission to only bypass when the command sender has the exemption permission.
InvSee++_Clear has got similar config options:
Code (YAML):
# Whether InvSee++_Clear can remove items from offline players. # Possible values: [false, true, same_as_InvSee++, same_as_InvseeAPI] offline-player-support: true
# Whether InvSee++_Clear respects the target player's exemption status. # Possible values: [false, true, permission] bypass-exempt: permission
That is it! Cheers!
P.s. Feel free to write a review or make a
donation
This update brings a bunch of improvements to the InvseeAPI.
First of all, the Api is now documented on the
wiki on GitHub!
The following changes were made to the Api:
Optimised SpectatorInventory cache - no longer iterates over all online players.
Properly implemented methods in MainSpectatorInventory for checking whether items exist, or removing items from the inventory. (Adding items was already properly implemented.)
This fixes a bug in InvSee++_Clear where items wouldn't be removed from the armour slots, cursor slot, offhand slot, or personal slots.
Addressed a code smell where a mutable public field was used to set the bukkit wrapper for nms inventories.
Default values for customisation parameters (Title, OfflineSupport, Mirror) are now obtained from InvSee++'s config.
Other changes:
Fixed an issue where tabcompletion on Paper API-enabled servers would not work as intended (the first character was case-insensitive, but the others were not).
Dropped support for CraftBukkit 1.19. (1.19.2 and 1.19.3 are still supported)
Fixed an issue in the PerWorldInventory integration caused by not doing world-specific permission checks.
The project is now licensed under the LGPLv2.1 since version 0.15.4.
And that brings me to another point. I provide InvSee++ for free, and in most cases I do provide support free of charge as well. While supporting the project financially is completely optional, I would like to remind people that the option to
donate exists.
This update brings the following changes:
Additions:
Config option to customise the layout of the spectator inventories:
Code (YAML):
# Default templates for spectator inventories. # legend: # inventory: # - i_xx is a regular inventory 'container' slot (xx being the slot number) # - a_x is an armour slot: b for boots, l for leggings, c for chest and h for helmet # - oh is the offhand slot # - c is the cursor slot # - p_xx is a 'personal' slot, where the contents of the player's crafting items / anvil items / enchanting table items / etc. live # - _ is an unused slot # enderchest: # - e_xx is a regular enderchest 'container' slot (xx being the slot number) # Note that normally a player's enderchest is only 3*9=27 slots in size, but on Purpur this can go up to 54. templates:
inventory: | i_00 i_01 i_02 i_03 i_04 i_05 i_06 i_07 i_08 i_09 i_10 i_11 i_12 i_13 i_14 i_15 i_16 i_17
i_18 i_19 i_20 i_21 i_22 i_23 i_24 i_25 i_26
i_27 i_28 i_29 i_30 i_31 i_32 i_33 i_34 i_35
a_b a_l a_c a_h oh c _ _ _
p_00 p_01 p_02 p_03 p_04 p_05 p_06 p_07 p_08
enderchest: | e_00 e_01 e_02 e_03 e_04 e_05 e_06 e_07 e_08 e_09 e_10 e_11 e_12 e_13 e_14 e_15 e_16 e_17
e_18 e_19 e_20 e_21 e_22 e_23 e_24 e_25 e_26
e_27 e_28 e_29 e_30 e_31 e_32 e_33 e_34 e_35
e_36 e_37 e_38 e_39 e_40 e_41 e_42 e_43 e_44
e_45 e_46 e_47 e_48 e_49 e_50 e_51 e_52 e_53
This concept is also available via the api, it is called 'Mirror', representing a mirror through which the inventory is spectated. Mirrors have the power to change the slots in which the player's items are displayed, and they work on a per-window basis. This means that multiple admins could spectate the same player simultaniously, using different layouts! To make this work, several new overloads have been defined in the api, and new overloads have been defined that accept a Mirror as an argument. There are also two new methods: InvseeAPI#openMainSpectatorInventory and InvseeAPI#openEnderSpectatorInventory. The api is backwards-compatible for api consumers, but api implementors must update their code in order to work on this new version.
Optimized tabcompletion for offline players on Paper (and forks): Instead of searching linearly over all the all the player data files, the tabcompleter now uses a Trie structure interally.
A warning is now emitted for corrupt player files that could not be read.
Tabcompletion for offline players is now enabled by default.
For api users there is one breaking change:
The interface OfflinePlayerProvider was changed. Users with custom implementations of this interface will have to adapt their implementation to the new reactive pattern. The old methods have been deprecated.
In order to spectate inventories of offline players, InvSee++ needs to do UUID lookups when the provided argument in the command is a username.
The order in which the strategies to look up UUIDs are attempted is changed in this update. The order is now as follows:
Get it from the player in case they are online.
If step 1 didn't succeed, get it from the cache of recenly logged out players.
If step 2 didn't succeed, get it from the offline player cache in Paper-api enabled servers.
If step 3 didn't succeed, get it from the permission plugin (supports LuckPerms, GroupManager, BungeePerms and UltraPermissions).
If step 4 didn't succeed, get it from the proxy server using plugin messages (supports BungeeCord and Velocity).
If step 5 didn't succeed, get it by making a REST api call to Mojang.
If step 6 didn't succeed, get it from the player save files directly.
The last two strategies have been swapped, so that on server with lots of players getting the UUID won't take as long anymore since it's very likely that the player save files don't have to be inspected anymore.
Strategies 3 and 4 are also new in this update.
If your server is in offline mode because it is running behind a proxy, then if the proxy is in online mode, InvSee++ will now still try to resolve player UUIDs via Mojang's api when needed. This supports both BungeeCord and Velocity.
This update makes the following changes to InvSee++ and InvSee++_Give:
Added:
Support for CraftBukkit 1.19.1
/invgive & /endergive: If not all items could be given to the target player, the plugin will now log how many items are added to the queue.
Removed:
Support CraftBukkit 1.18.1
Changed:
The 'edit' permissions will also provide their respective 'view' permissions, i.e.: invseeplusplus.invsee.edit will now also provide invsee.plusplus.invsee.view, and similarly invseeplusplusinvsee.endersee.edit will provide invseeplusplus.endersee.view. This makes the invseeplusplus.invsee and invseeplusplus.endersee permissions obsolete.
InvSee++ no longer tries to load code that is only intended to be used by more recent versions of Minecraft. This fixes a bug that would make it impossible for InvSee++ to load on older Minecraft versions due to their lower Java requirement.
This update fixed a bug that got introduced while upgrading to 1.18.2. Shiftclicking items into or out of spectator inventories that are not your own now works again.
Additionally, I included a workaround for yet another LuckPerms bug. Spectating inventories of players who have not yet played on the server should now be possible again when running LuckPerms.
LuckPerms decided to not obey to the contract of Vault's Permission abstraction layer, so I worked around it by doing permission lookups of offline players outside of the primary server thread. This might introduce race conditions when other permissions plugins that store all known UUID's in memory are used, but who the hell cares anyway.
Hello, this release contains the following changes:
Added:
Two new permissions: invseeplusplus.exempt.invsee and invseeplusplus.exempt.endersee. These permissions make it so that the owner of these permissions can't be spectated using /invsee and /endersee respectively.
The 'master' permission invseeplusplus.* contains these two new permissions as children.
Fixed:
A bug where closing a spectator inventory would update the target player's lastPlayed (and on Paper LastSeen) timestamps.
Removed:
Support for Minecraft 1.15-1.15.1 (1.15.2 is still supported)
Support for Minecraft 1.16-1.16.4 (1.16.5 is still supported)
Changed:
Api changes to reflect the new reasons why creating a spectator inventory could fail.
Api changes to the uuid-resolve and name-resolve code.
I've always packaged the code for compatibility with multiple craftbukkit revisions within a single jar file, so that users wouldn't have to worry which version of InvSee++ they should download. However, since Spigot 1.17.1 md_5 decided that that he should stop bumping the net.minecraft.server revision numbers, which in the past updated always whenever a new versions of the mappings were used. I had to implement another check to see which names were used by actually fetching the version using some subroutine in de Server. This has worked fine on CraftBukkit, Spigot and Paper, HOWEVER one fork of Paper (*ehem Airplane ehem*) decided not to update their bukkit version, so InvSee++ loaded the wrong module.
This update changes the version checking code slightly to make it more robust. Hopefully this will make it so that InvSee++ loads successfully on all forks of Paper in the future, no matter how poorly maintained they are.
If you're already using InvSee++ 0.10.1 and it is working just fine for you, then there is no need to update now.
If the plugin can't read a player's save file, then the entire stacktrace will not be printed, instead just a single line with the player's save file location will be logged.
Note that tabcompletion for offline players could already be disabled completely by setting
tabcomplete-offline-players: false in the config.
An issue where integration with PerWorldInventory would not work correctly if load-data-on-join was set to false. Now InvSee++ will always save to the vanilla player data file if this setting is false.
Support for CraftBukkit/Spigot/Paper/Purpur 1.16.4
Added collection of Metrics using bStats. This can be disabled by setting 'enabled' to false in the bStats configuration. This configuration file is located at <server_root>/plugins/bStats/config.yml.
Updated /invsee and /endersee commands to take an extra parameter if PerWorldInventory is installed. For example `/invsee Jannyboy11 PWI{world=world_nether}` will show you the inventory that I have in that world. This will also work for offline players. To make this as user-friendly as possible, I implemented tabcompletion and helpful error messages, should you forget the exact format.
Fixed:
A bug (IndexOutOfBoundsException) that could occur if another plugin tried to set contents of a spectator inventory.
An error message would display that the player's save file could not be saved, but it had actually worked.
HTTP requests to Mojang's API would not work due to Java's built-in http client restricting the Connection header, causing /invsee and /endersee to break for target players that have never logged into the server yet.
/invsee now shows the item that the target players is holding on his cursor
/invsee now shows contents of 'personal' inventories such as the player's crafting slots, workbench slots, anvils, smithing tables, enchanting tables, stone cutters, grindstones, and looms
Fixed:
A bug that caused some tasks to execute on the server thread instead of an async worker thread
Tabcompletion could sometimes yield duplicate players
If you are running the Paper server software (
https://papermc.io/), then tabcompletion will work for ALL offline players, not just the ones that have been online during the current run of the server.
- Added a new command: /endersee. The permission node is invseeplusplus.endersee
- Added custom inventory titles for spectator inventories
- Made it so the last 4 slots of the /invsee inventory no longer accept items
- Fixed a uuid parsing mistake in SearchSaveFilesStrategy that caused this strategy to not work at all.
- Fixed a race condition that could occur in rare cases when a player logs in when somebody was requesting an offline inventory. This bug could make it that the spectator inventory wasn't actually linked to the player's live inventory.
If the plugin is running on Spigot and 'bungeecord' is set to true in the settings of the spigot.yml configuration, then InvSee++ will attempt to use BungeeCord as a way to resolve player Unique IDs given a username.