Warning: This update contains API changes, some 3rd-party addons may stop working after update.
Removed
- DisplayItem-Centered on double-chest store now completely deleted, The code maintainer of this function no longer updates it, and it has created a lot of trouble, making it worth not to keep it again.
Fixes
- When the Quickshop-Hikari runs on the Paper software, the custom enchantment added by a third-party plugin may cause the API call error and prevent the player from accessing the store.
- For the enchantments that creates the errors, we will try to display a fallback name.
- Fixed dupelicated Util reloading registry.
- Fixed
/qs paste
may stop working if updater has been disabled or failed to check the updates.
Changes
- Most of errors now contains a human-friendly simple description.
Important: Running QuickShop-Hikari on the Spigot server now requires an NBT-API dependency, Paper and its Fork are not affected.
QuickShop-Hikari 1st Anniversary!
It has been a year since the first stable release of QuickShop-Hikari. Thank you to everyone who supported and used QuickShop-Hikari, your great suggestions and ideas made QuickShop-Hikari get epic feature enhancements in the past year. And thanks to the early supporters and beta testers for their hard work testing so that QuickShop-Hikari becomes more stable and runs smoothly!
New Features
- On Paper and Spigot 1.19.4 or higher, QuickShop-Hikari is now able to display the item names of potions. (example:
Potion
->Potion of Speed
, orSpeed
->Potion of Speed
.) They are now displayed in the same format as the client. - The store information sign on Spigot server are able to correctly display and render translation components by access NBT directly through NBT-API (thanks @tr7zw for the help)
- Added Dynmap Addon into official addons bundle.
- Added BlueMap Addon into official addons bundle.
- Redesigned CommandHandler stuff, The new command system can resolve colon variables from commands.
5.1. Colon variables are separate from the parameter variables, are ordered, and can be added at any position (e.g
-foo:bar
). 5.2. Command now supports arguments with space inside, just wrap the string containing spaces with the "`" symbol. 5.3. The API has been changed accordingly and developers are advised to upgrade the relevant classes. The original classes will not be removed for a long time and every effort will be made to provide forward compatibility.
Bug Fixes
- Fixed translation files locating issue in Apollo Converter (the thing that Hikari used for converting from Reremake), now MineDown messages.json should can be correctly converting to MiniMessage format.
- Fixed the incorrect price logging in price changing logger.
Optimization
- Redesigned BatchBukkitExecutor, it now more smart and reduces the performance overhead associated with frequent thread scheduling.
- Move
/qs cleanghost
command to use new BatchBukkitExecutor.
Misc
- Platform field now included into Paste so you can check which one Platform module enabled for your server.
- CommandContainer binding now included into Paste so you can check the specificed quickshop subcommand handler class name.
- Updated translations from Crowdin.
Long time no see! After a nice holiday and a busy exam week, I'm gradually getting back to my old update frequency and planning new functional updates.
But how, I hope you enjoy the update :)
Paper users: If you're running into java.lang.NoClassDefFoundError
with addons installed but doesn't working, it's a Paper new plugin loader bug, make sure you have update to Paper-#445 or higher.
Bug Fixes
- Fixed
/qs export
command will create an IOException and doesn't work at all. - Fixed GSON creates IllegalAccessException when I/O per-player notifaction settings on some servers.
- Fixed
/qs import
command doesn't work if database configured prefix.
Removed
- NoCheatPlus compatibility module was excluded from bundle compatibility modules pack since it's repository down and nobody maintains it. (If there are other forks of active development, please let me know.) 1.1. If QuickShop-Hikari is conflicting with the anti-cheat plugin you are using, please open an Issue and I will try to resolve it.
- Netease regional legal restrictions has been removed since it not necessary anymore.
There are important notes on this update, please read the changelog
EN: Since 4.1.0.3, QuickShop-Hikari are disallowed to be load that the server located at Mainland China due potential legal risks, please read Regional legal restrictions. This decision should won't affect any users out of mainland China.
ZH: 自 4.1.0.3 以来,由于可能的法律风险,QuickShop-Hikari 将不再允许位于中国大陆地区的服务器加载,请阅读区域法律限制.
Privacy Policy
We have updated our privacy policy to reflect the changes we have made.
We are now sending you our new privacy policy to ensure that you are informed.
We will send an IP lookup request to CloudFlare to determine if your server is located in mainland China. For more information, please see: Regional legal restrictions. The URL we will request: https://cloudflare.com/cdn-cgi/trace.
Fixes
- Fixed H2 database won't close until JVM exited.
Optimization
- Created a new batch processing mechanism to avoid server stopping response issues that can occur when a large number of tasks (e.g ShopPurger) are executed.
- The new mechanism limits the maximum number of tasks that can be executed in a period of time and will try to reduce the impact on TPS as much as possible and compensate for TPS time by suspending tasks when they exceed the expected time.
The first release after the Lunar New Year!
Guys how are you? We're starting to get back to normal life after lighting up a lot of fireworks (hah) to celebrate the Lunar New Year, so now allow me to serve up a stack of delicious updates!
Bug Fixes
- All compatibility modules stopping works in 4.0.0.0, please update your all compatibility modules to adapt the new versions.
- Incorrect dependency structure leads to ClassLoader conflicts on some servers, so that the plugin cannot be loaded, mitigation measures have been invoked in this version, and the effects are still to be observed.
Optimization
- Reduced JAR size from 7.7MB to 2.8MB.
Addons
Discord Addon
- Added per-player notifaction settings, player are able to use command
/qs discord
to toggle the DM.
List Addon
- The addon
list
has been added into main-line, this addon allow player to check all shops they owned, check the document here.
Limited Addon
- The addon
limited
has been added into main-line, this addon allow store owners to set a limit on the number of sales for their store over a period of time,check the document here.
ShopItemOnly addon
- The addon
shopitemonly
has been added into main-line, this addon prevents players from putting non-store items into store containers, check the document here.
Happy Lunar New Year!
We're celebrating our major event - the Lunar New Year!
Like Christmas, Lunar New Year is a fairly important holiday in mainland China. People leave their work behind and return to their hometowns to reunite with their loved ones and family and celebrate the new year of the lunar calendar together.
I'd like to send Lunar New Year wishes to everyone in the lovely Minecraft community!
This update is a major update, please take care to backup your server and database. It is very difficult to roll back without a backup.
New features
- Added
/qs debug purgeplayerscache
to purge PLAYERS database table. - Paster now contains more useful data.
- Those paste entires has been added into paste:
- PlayerFinder
- Performance Monitor logs
- MiscUtils data (including General, Shopable Types, Custom StackSize etc.)
- TextManager data (including fallback language, local mapping prefix, file pathes, distribution url, available languages, post processors and caching stats)
- Nexus Manager data
- ItemMarker rules
- Price Limiter settings and rules
- Rank Limiter permission nodes
- Interaction Controller mappings
- PAPI Manager placeholder handlers and caching stats
- Added ton of new PlaceHolders.
- All placeholders are caching for 15mins by default to reduce the server performance impacts.
- You can find those placeholders from our documents.
- All placeholders:
%qs_metrics_recent_purchases_global_all_x%
- Count all purchases in recent x days with all types%qs_metrics_recent_purchases_global_selling_x%
- Count all purchases in recent x days which only selling shops%qs_metrics_recent_purchases_global_buying_x%
- Count all purchases in recent x days which only buying shops%qs_metrics_recent_purchases_global_buying_x%
- Count all purchases in recent x days which only buying shops%qs_metrics_recent_purchases_player_all_x%
- Count all purchases in recent x days with all types%qs_metrics_recent_purchases_player_selling_x%
- Count all purchases in recent x days which only selling shops for single player%qs_metrics_recent_purchases_player_buying_x%
- Count all purchases in recent x days which only buying shops for single player%qs_metrics_recent_purchases_player_buying_x%
- Count all purchases in recent x days which only buying shops for single player%qs_metrics_recent_transactionamount_global_all_x%
- Count all purchases transaction amount in recent x days with all types%qs_metrics_recent_transactionamount_global_selling_x%
- Count all purchases transaction amount in recent x days which only selling shops%qs_metrics_recent_transactionamount_global_buying_x%
- Count all purchases transaction amount in recent x days which only buying shops%qs_metrics_recent_transactionamount_global_buying_x%
- Count all purchases transaction amount in recent x days which only buying shops%qs_metrics_recent_transactionamount_player_all_x%
- Count all purchases transaction amount in recent x days with all types%qs_metrics_recent_transactionamount_player_selling_x%
- Count all purchases transaction amount in recent x days which only selling shops for single player%qs_metrics_recent_transactionamount_player_buying_x%
- Count all purchases transaction amount in recent x days which only buying shops for single player%qs_metrics_recent_transactionamount_player_buying_x%
- Count all purchases transaction amount in recent x days which only buying shops for single player%qs_shopmanager_global_total_all%
- Count all shops in this server%qs_shopmanager_global_total_selling%
- Count all selling shops in this server%qs_shopmanager_global_total_buying%
- Count all buying in this server%qs_shopmanager_global_total_loaded%
- Count loaded shops in this server%qs_shopmanager_global_total_unloaded%
- Count unloaded shops in this server%qs_shopmanager_player_total_all%
- Count all shops in this server for single player%qs_shopmanager_player_total_selling%
- Count all selling shops in this server for single player%qs_shopmanager_player_total_buying%
- Count all buying in this server for single player%qs_shopmanager_player_total_loaded%
- Count loaded shops in this server for single player%qs_shopmanager_player_total_unloaded%
- Count unloaded shops in this server for single player%qs_metadata_fork%
- Gets the QuickShop fork name%qs_metadata_version%
- Gets the QuickShop version
- Added ItemExpression.
- Please our documents for more.
- Added enchantment support for both blacklist and price-limit based on new ItemExpression system.
- Including enchantment level restrictions
- Added switch ToggleDisplay ability into shop control panel.
- Added
/qs debug updateplayersigns <player>
command to allow batch updates all shops info sign for a specific player.
Bug fixes
- Fixed economy loading issue on serval servers.
- Fixed QuickShopItemMatcher cannot correct matching items (thanks @Lufano for reporting it).
Performance optimization
- Baking shops owner uuid<->name mapping in asynchronous threads.
- Loading transaction messages in asynchronous threads.
- Reduced unnecessary shop loading.
- Restricted the sign update watcher can max cost 50ms in single loop.
- Prevent shops loading on server startup if they're in unloaded chunks.
- Caching configuration values and pre-bake decimal formatter in busy tasks.
- Improved database upgrading / check for schame updates speed.
- Improved command handler lookup speed.
API changes
- QuickShop no-longer extends the JavaPlugin, this may break some 3rd-party addons.
- QuickShop logger now replaced by SLF4J.
- Some util funcations moved into PlatformUtil or CommonUtil.
- JsonUtil was moved into common module.
- Exposed PlayerFinder in QuickShopAPI
- Added
QuickShopAPI#getSemVersion
for returning a Semver object. - Added
ShopCreateSuccessEvent
event.
Upcoming changes
The following features could not be included in 4.0.0.0 due to time constraints. We are celebrating the Lunar New Year, and as soon as our holiday is over, I will get back to development work and bring them to QuickShop-Hikari.
The following features have been confirmed and are in the process of being implemented.
- Shop Inventory Rebinding
- Allow user change the shop inventory out of shop container, player can easily binding to another container, or multiple container, to extend the shop.
- This allows players to add the contents of multiple chests/containers to a single shop and update inventory/space information simultaneously.
- If you have OpenInv installed, it can also bind the player's EnderChest inventory.
- It is also possible to bind inventory from a plugin, or even from players and entities, if someone is willing to support InventoryWrapper API.
- Allow user change the shop inventory out of shop container, player can easily binding to another container, or multiple container, to extend the shop.
- Extend DiscordSRV addon and allow players self enable/disable DM notifactions.
- Add discord commands into DiscordSRV addon that allow players use discord command to query shops or transaction logs.
- Migrate addons from QuickShop-Suite into QuickShop-Hikari mainline, and also adapt the per-player localization system.
- Dynmap Integration
This is a small optional bug fix for Hikari.
Bug Fixes
- If user upgrading from Reremake legacy version (which released before Minecraft 1.16 updates), the shop sign won't be correctly upgraded or recognized. (It fixed in 3.6.1.5 and all exists signs should be recongnized and upgraded after user click it.) Thanks for @Magma from server ria.red for reporting it (Well, that's probably what happens when production environment servers are upgraded only once in many years XD, I recommend that all server administrators for set up a upgrade schedule for updating plugins).
Other Stuff
We're working on Hikari-v4.0.0.0 and focus on performance optimize (multi-threaded, async, caching etc.), improve loading logic, boost startup speed and improve user experience so it will ready for large network.
Also, this is a great opportunity to make feature requests to us (because this change to the API will create changes, and once the API is fixed, it will be difficult for us to make major feature changes)
You can create your feature request on our Discusstions or Issue Tracker, Looking forward to seeing your thoughts.
This might be last version of v3 branch, we're developing Hikari v4!
Unless there are major errors in this version, it is unlikely that we will release a new version in a short time.
3.6.1.4/stable
Bug Fixes
- Fix top-level command tab-complete doesn't work.
- Database version didn't bump to
11
and cause dupilicate upgrade.
New Features
N/A
Optimization
N/A
New Features
- New option
shop.async-owner-name-fetch
has been added into configuration.
#[BETA] Should we async fetch the owner name?
#If you enable this option, the calls for ContainerShop#ownerName will return the cached result.
#If the request out of cache, QuickShop-Hikari will allow up to 20 ms for sync fetch username.
#Then it will turn to background and return "N/A" this time.
#This may cause some display problems (e.g. the info sign will show that the shop owner is N/A)
#But once the cache is completed for fetching in the background, the next request will return the correct username
#This is very useful for large servers, because sometimes players may accidentally load a large number of long ago shops, resulting in a large number of main route IO requests for username queries and causing a spike in lagging
async-owner-name-fetch: false
Optimize
- Improved parallel player username <-> uuid query workflow, reduced unnecessary Bukkit OfflinePlayer API requests (which it really slow)
- Pre-fill username lookup cache with server's
usercache.json
to boost initialization cache for improve the cache hit rate - Added
EssentialsX
data sources, now QuickShop will also use EssentialsX's data for mapping query (still, in parallel) - Move
/qs staff
uuidquery tasks from server thread to standalone async thread to avoid tps loss - Move
/qs unlimited
uuid query tasks from server thread to standalone async thread to avoid tps loss - Move
/qs benefit
uuid query tasks from server thread to standalone async thread to avoid tps loss - Move
/qs staff
uuid query tasks from server thread to standalone async thread to avoid tps loss - Move
/qs transfer
uuid query tasks from server thread to standalone async thread to avoid tps loss - Move
/qs permission
uuid query tasks from server thread to standalone async thread to avoid tps loss - Move MsgUtil msg sending functions username query tasks from server thread to standalone async thread to avoid tps loss
Check the change log in https://modrinth.com/plugin/quickshop-hikari/version/3.6.1.0
This version hot fixed username lookup bugs in 3.6.1.0 and 3.6.1.1.
3.6.1.0
NOTE: Due the API changes, you might need also update your Addons and Compatibility Modules.
WARNING: Due the database updates, downgrade from 3.6.1.0 without backup is impossible, BACKUP BEFORE INSTALLING THE UPDATE.
New Features
- The new FastPlayerFinder.
- The new FastPlayerFinder replaced old PlayerFinder for better uuid<->username lookup performance, see this this article for more.
- The Performance Monitor.
- We have added a Performance Monitor for monitoring the QuickShop-Hikari internal performance, see the article above for more.
Regression
CrowdinOTA back online with alternative.
We moved from Crowdin Content Delivery Network to ourself CloudFlare based infrastructure, see this article for details.
By updating to 3.6.1.0, the CrowdinOTA feature will re-enabled on your server.
If it is inconvenient to update the plug-in at this time (for example, code audit is required), you can make the following adjustments to your startup script to switch your existing installation to the new CrowdinOTA endpoint (required QuickShop-Hikari 3.6.0.2 or 3.6.0.3):
-Dcom.ghostchu.quickshop.localization.text.SimpleTextManager.enableCrowdinOTA=true -Dcom.ghostchu.quickshop.localization.text.SimpleTextManager.crowdinHost=https://crowdinota.hikari.r2.quickshop-powered.top
it should looks like this:
java -Xmx4G -Dcom.ghostchu.quickshop.localization.text.SimpleTextManager.enableCrowdinOTA=true -Dcom.ghostchu.quickshop.localization.text.SimpleTextManager.crowdinHost=https://crowdinota.hikari.r2.quickshop-powered.top -jar paper.jar nogui
Optimization
- PlayerFinder performance has been optimized for large minecraft network by rewriting. Now we will execute multiple queries in parallel to maximize response speed. (The working mode of this mechanism is similar to the snap answer.)
- The loading speed of a single shop is improved by removing unnecessary symbol link creation requests (aka.
InventoryWrapper#mklink
). - By disabling the display-item center alignment function by default, the loading speed of a single shop is improved, and the peak of TPS lag caused by chain block loading is avoided as far as possible.
- The schedulded container integrity check is no longer performed after loading in the shop. Due to the introduction of the new InventoryWrapper mechanism, the check has been completed at the time of
InventoryWrapper#locate
.
API Changes
QuickShop#getPlayerFinder has been replaced by FastPlayerFinder.
Database Schema Changes
qs_players
Please see Database Schema page for latest database schema.
Supporters
Thanks for supporters on Ko-fi for donation ❤
- OnlyPW
Please update to this version
Hi there, before the change log content, I want kindly ask you to upgrade your Hikari instance to 3.6.0.3 and I will show you for why.
An E-mail from Crowdin
Today (2022/12/30), I have received a e-mail from Crowdin Team and here is the content:
Hi there,
Greetings from Crowdin, hope you're going great🎄
Sorry to bother you during the holiday season, but our team did an annual review and we noticed that your team is actively using [Over-The-Air Content Delivery](https://support.crowdin.com/content-delivery/)feature, which is a paid option. The price is based on the number of requests ($3/1M requests) and the transferred data ($2/10GB) - if you have up to 1M requests and 10GB of data transfer, CDN is free.
According to our database, there were already sent 19M requests and 50GB of data was transferred for a total amount of 72 USD. You can also see this information in the [Payments](https://crowdin.com/settings#payments)tab, and I'm also sharing the document with detailed statistics about your OTA usage in the last months; please find it attached.
There is no need for you to pay the previous debt, but as you are already aware that CDN is a paid option, we kindly ask you to remove CDN from your code at your earliest convenience (preferably within the next month), so no new debt will grow or we can discuss the suitable ways for you to pay for future OTA usage if you would like to keep using it
Please let me know your thoughts on the matter
Looking forward to hearing from you,
And the attachment cdn_usage.txt
:
+----------+----------+-----------------------+
| date | requests | transferred_gigabytes |
+----------+----------+-----------------------+
| Apr 2022 | 1241624 | 4.729 |
| May 2022 | 1374644 | 3.768 |
| Jun 2022 | 2477846 | 6.025 |
| Jul 2022 | 2649011 | 6.571 |
| Aug 2022 | 2814239 | 6.446 |
| Sep 2022 | 2255808 | 4.454 |
| Oct 2022 | 2257621 | 5.098 |
| Nov 2022 | 2087014 | 4.902 |
| Dec 2022 | 1924092 | 7.711 |
I was shocked that I never noticed Crowdin Over-The-Air Distribution as a paid feature. Because it is freely available and unlimited in my Open Source Plans account.
Then I have a quick re-check for the Pricing pages and Crowdin's KB, I still can't find a description of Over-The-Air as a paid feature and its billing standard.
Well, as the email said, "Now I know that it is a charging function", so I deleted the Distributions of Remake and Hikari from the Crowdin Control Panel, and hoped Crowdin would not charge me any more.
After disable the Distributions
After that, I replied this email:
I'm sorry I didn't realize that my program has so many users and CDN requests!
Follow your advice, I have already removed Distributions from Crowdin's control panel after I received this mail and I will also remove Crowdin Over-The-Air related codes from the next version.
I am very grateful for your willingness to waive my bill for last month.
Since I can't control my users to upgrade to a new version that without Crowdin OTA functionality, I want to know if I will still receive bills from Crowdin OTA functionality after I removed all Distributions from Crowdin control panel?
Thank you for informing me about it.
Later, I was so shocked by Crowdin Team's reply.
Hi there,
If deleting only distribution (but keeping it in your code still) there will be no data transfer, but there will still be requests
In general, if you do not plan to use it as a paid feature, it would be great to delete it from your code as well
Well, I can't force anyone to update their plugin, this is users right.
So I continued to contact Crowdin Team and got the following reply.
Thank you for your quick reply!
My code uses GPLv3 license and distributes precompiled JARs in binary form.
I will release a new version that removes OTA functions as soon as possible, but I cannot force users to upgrade to a new version (if users are unwilling to uninstall my software from their devices). I have not designed telemetry and remote disabled functions for my software.
At the same time, my Distributions ID has been distributed along with the source code for a long time.
So I want to confirm the following questions to you:
1. Whether the Over The Air function can be completely disabled by myself or Crowdin Team, or whether I must pay the bill for any invalid request.
2. If I delete the Crowdin Project associated with it and recreate it, will the invalid request of the project before deletion continue to be charged.
3. If I do not pay the relevant bills, only the Over The Air function will be disabled or the entire account (even for the Open Source plan).
4. Whether Open Source plans to have a free Over The Air quota, because for a long time in the past, I did not notice that Crowdin mentioned the cost of Over The Air.
5. Earlier, I agreed to participate in the test invitation of Crowdin Enterprise and created the project and account (Open Source plan). But I didn't really use it because I was an open source project.
Should I contact customer support and delete my account and project in Crowdin Enterprise to avoid unnecessary bills?
Reply:
Hi Ghost,
Thanks and yes, we understand you cannot force users to use the new version of the app, so for now, what's needed for you is just to remove the OTA functions from your app's code and release the new version. As long as users switch the version, the number of requests will decrease
Currently, we calculate all the requests sent to the distribution and even if you remove the account\project\disctibition, the requests will still be sent to AWS (Over-the-Air technology is built on top of AWS infrastructure)
I'm afraid we also cannot stop the requests sent to AWS as they are external, and we cannot simply control that on our end so a solution for now, let's agree to the following:
you remove OTA feature from your code and release the new version of the app;
we keep monitoring the number of requests received from your users;
in a month, we'll get back to you with the latest statistic - there is a big chance the number of requests will drop significantly and you will fit the free tier of CDN usage (up to 1M requests and 10GB of data transfer).
during this month, there won't be a need to pay any bill for CDN;
you're also welcome to keep your accounts in Crowdin :)
Does it sound fine to you?
Alright, I agree.
So here we go
Since 3.6.0.3, the function of CrowdinOTA is completely disabled from plugin.
For other versions, you should not be able to get the latest translated files from the cloud because we terminated Distributions, the backup translation of the plug-in will replace CrowdinOTA, and you do not need to make any other changes.
For earlier versions that do not yet support offline backup translation, the plug-in may stop working, you must upgrade to any version that support offline translations.
Once again, I am very sorry for the inconvenience.
What about future
Sandtechnology and I are building our own infrastructure for QuickShop, which we are actively discussing and conducting technical verification. Once we have a viable alternative, we will test it and add it to the official version.
3.6.0.3 Changelog
Removed
- Removed Crowdin Over-The-Air translations update services.
- Both Hikari and Reremake has affected, across all versions.
New Features
- New EliteMobs compatibility modules
- This module will prevent player create or purchase a shop that trading items with EliteMobs's Soulbound enchantments to avoid trade scam.
Bug Fixes
Everything looks great, no bugs found.
3.6.0.2
Last update before 2023! Merry Christmas and Happy New Year!
Bug Fixes
- Fixed broken
display-item-use-name
. - Fixed VirtualDisplayItem stuff won't reload on
/qs reload
command. - Fixed Item Blacklist reloading doesn't work properly, it won't purge already registered entires.
- Fixed Adventure mode player shops clicking detecting.