modified ant build to not do unit tests -- not necessary right now. also closes #66 -- all LWC dependencies are now located in the lib/ folder (commit: 2e58458)
Fixes #70 -- also, when clicking on say, a block under a Sign, it will now say that it's a Sign, not the block you clicked (e.g Stone). Done for consistency and also so it's easier to know that's the block that's not actually protected (just indirectly !!) (commit: c79712f)
It would be preferable to take your eyes away from this commit. On a nicer note, detecting wall signs was fixed. It detected too many blocks before. (commit: 2d7d046)
Closes #61 -- Kainzo: This one is long overdue !! Protection discounts now give the exact amount for the discount price. e.g, if you set a discount to charge 0 money, and set amount to 5, players can obtain 5 of these before never being able to get 5 discounted protections for 0 coins again (unless you make it higher than 5 or change the surcharge.) (commit: bebee65)
Updated changelog.md -- should have done that already !! Also made purchased protection refunds use the player that setup the transaction, not the current protections. Why: Before: Hidendra /cprivate's chest. /cadmin forceowner Notch is done to the chest and it is removed. Notch then gets the refund, not Hidendra. After: The same, except Hidendra gets the refund, instead of Notch. (commit: 6138726)
Convert history when converting from SQLite -> MySQL. History was not being correctly modified when a protection was registered by placing it down (resulted in not being able to get a refund for it.) Next commit will be 3.40. (commit: fe75db7)
Protections + history will now not be immediately flushed to the database as quickly as before -- at the moment, mostly just History (even when it is created.) The update thread is in a seperate thread. In the future, this will play a much larger role. (commit: c6961fa)
MonsterTKE: fixes #73: add EXEMPTION flag which exempts protections from being expired by ADMIN PURGE, and ADMIN EXPIRE. This flag can only be set by LWC ADMINS: /cexempt on OR /lwc flag exempt on (commit: c142dfe)
pre-3.42. Fix a consistency error for history cache <-> database. And for Jenkins-built builds, /lwc admin version will use (bBUILD) instead of (BUILD). Manual builds will still show up as (MANUAL) (commit: 72c48ba)
Add discount type to LWC-Economy, to support how discounts worked before. The default (current) way is discount.type: EXACT, while the old behaviour which would give the discount while the player was UNDER the discount.amount is now discount.type: TOTAL (commit: 50c1d94)
Allow /lwc admin purgebanned to take the -remove argument, which removes every block + contents as well (e.g chests + contents, etc.) (commit: 9edccba)
Closes #85 -- fixes /permissions not working on PermissionsBukkit 1.2 (but 1.1 was fine.) Technical: LWC was enabling a plugin when it resolved it as a Permissions API, which must have made PermissionsBukkit not a happy camper :-). LWC no longer enables the plugin, which is not necessary, anyway. (commit: 73bc131)
Does all of #88 - not fully tested yet, so it will not be auto closed just yet. By default, permission groups (via SuperPerms) uses lwc.group.X, and can be overridden in core.yml with groupPrefix: 'your.prefix.' Also, ensure you don't have a supported Permissions plugin installed so that this will activate correctly (it will not override others, so as to not break the ones that don't support SuperPerms by themselves.) (commit: 48da505)
Initial work on #87 - fully untested !! Adds central bank functionality, enforcing money to not come from thin air. When a protection is purchased, the money goes into the configured bank account, and when a protection is removed, the money will be withdrawn from said bank account (and denied removal if they don't have enough.) Supports BOSEconomy, iConomy [?] (commit: 290bae3)
Add a bit more to central banking so protections could not be removed if the server bank cannot afford it. Also, /cremove wasn't broading LWCProtectionDestroyEvent! (#87) (commit: f61e1eb)
mostly final changes for #87. Central banking now works as expected, have only tested on iConomy 5.01 for now (should also work as expected on BOSEconomy.) [cc: imaxorz] (commit: 1b70331)
Using /cinfo (or most other LWC commands) on a double wooden door would open or close the one beside it (while the door hit was reverted) and mis-match the doors. Doing the same thing again would fix it, though. (commit: d1c9850)
in regards to #88 - removes reliance on Permission plugin-specific methods to check for permissions and instead defaults to Superperms. Legacy Permissions 2/3 support is for the most part dropped in this build and can be supported with SuperpermsBridge. (commit: 36971bb)
Protection rights are now stored via JSON in the protections table. Automatic conversion of the old rights table will be a build or two ahead, not this one (#81). ChestProtect/ChastityChest plugin conversions are now also fully removed. (commit: 30e1c1b)
Old rights -> new rights conversion. Does not drop the rights table just yet. Will be tested more performance-wise once word is received from Kainzo. (commit: c8ba2d7)
Initial implementation for being able to schedule jobs or commands - for example, being able to automatically run cleanup every week (or something.) It's also extensible by other plugins. LWC had something extremely similar to this a long time ago, when a web UI was in the works - it was able to remotely delete chests, open/close doors, dispense dispensers, and so on (it would insert jobs into the database, and LWC would notice that, and then execute them.) It may not seem so useful at first glance, but if combined with outside tasks, it can potentially do a lot. (commit: b9cf3bc)
Using /cinfo (or most other LWC commands) on a double wooden door would open or close the one beside it (while the door hit was reverted) and mis-match the doors. Doing the same thing again would fix it, though. (commit: 3d10e29)
Spout support via 100% standalone LWC-Spout.jar. At the moment, it just allows you to unlock passworded chests via a GUI, but was just made. It'll be expanded upon, of course! (commit: 4cfe20a)
Non-Custom spout windows can't be drawn on, so we'll make our own. /lwc spout opens a blank window at the moment ... Version info is also in the bottom left of any LWC Spout windows for the time being. (commit: 602055e)
Redid how /lwc admin report looks. Much prettier and easier to read. /lwc admin debug has also been removed, since the new /cadmin report does what it did as well. (commit: 0f0336f)
4.0.0-alpha3. Scheduler is complete and needs some minor changes and localized into the localization files. A bunch of new commands attached to it - changelog.md has the current commands .. (commit: 16466b8)
FULL removal of Memory Database. Every single usage of it has been removed - gone. Still may be UNSTABLE and volatile; it has not be tested extensively just yet !! [#53] The current implementation will be smoothed out later on. (commit: c1af71d)
The openAndClose feature of double doors has been given new life and works fully as expected now. Double wooden doors now function more gracefully, as well. #98 (commit: 17696f2)
Version comparator for semver compliancy. Parses versions as small as 3.47, but can also fully parse 4.0.0-alpha3 (b220). For example, 4.0.0-alpha3 (b221) would be greater than 4.0.0-alpha3 (b220), if compared via this class. As would betas of the same version be greater than alphas. (commit: 82ff2b4)
3.48. You can now interchange 3.48 and 4.0.0-alphaX without NOT being able to easily revert back. lwc.protect perm node now also default to true #promote (commit: 8cf1510)
Fix piston exploit that allowed wooden doors and other minor protectables to be destroyed via: PISTON -> BLOCK -> PROTECTED DOOR - closes #77 (commit: 64bafbd)
Shiny new updater + downloader (old one was scrapped.) At the moment, it is by default set to update to ANY NEW BUILDS (BLEEDING EDGE) but is not automatic by default. /lwc admin version will tell you if there's a new build of the alpha out; /lwc admin update can auto update. (commit: f1300fc)
4.0.0-alpha4 - All builds past this are now running on the new update system; alphas can be updated to the latest alpha very easily now without manual work. For automatic updating, set core.updateMethod to AUTOMATIC (note the caps), or you can manually update via /lwc admin update (commit: 90316da)
Protection rights have been moved to the 'data' column in protections, instead of its own. Any rights made to protections after converting to 4.0.0 (but not your 3.xx rights) will be lost upon updating. Also, permission metadata has been removed for commands (same as 43ace80fbf) (commit: 33751b1)
The command /lwc admin purgeregion <RegionName> [WorldName] has been added to the WorldGuard module. If you are using it from the console, you must also specify the world that the region is in. If the region is in a different world than the player you use the command from, you must again also provide the world name. (commit: 26631cc)
Flags are now in data column and now support data as well. No utility to set data yet, however. Also fixed a bug where some messages were not sent to the player after they logged out and back in. (commit: 9579810)
/lwc admin dump locale! It dumps the current loaded locale into plugins/LWC/locale/lwc.properties. Along with /lwc admin reload, it'll be a ton easier to create custom locale messages now :) (commit: 99429e1)
Add the AUTOCLOSE flag which will make doors automatically close after 3 seconds (configurable in plugins/LWC/doors.yml). /cautoclose on|off, /lwc flag autoclose on|off. Flags are also settable again (oops) (commit: 1961bb7)
in regards to #88 - removes reliance on Permission plugin-specific methods to check for permissions and instead defaults to Superperms. Legacy Permissions 2/3 support is for the most part dropped in this build and can be supported with SuperpermsBridge. Conflicts:
Add t:TownName and town:TownName for Towny integration for /cprivate and /cmodify. Allows residents of the town named to access that protection. (commit: 0c46aa2)
Closes #105 - add lwc.autoregister perm node to allow a player/group to auto protect all LWC protections to private. not as configurable as it should be at the moment, however :) (commit: f4a243c)
Automatically fix chest block faces from pre-1.7 maps. Also, /lwc fix will set the chest's face to face towards you, incase it's not facing the way you want it to :) (commit: 3ab7de2)
Destroyer of a protection was not being added to the history on /cremove. Instead hooked into onPostRemoval which should've been done originally.. (commit: 8e3fc01)
Add /lwc history. Allows the viewing of all history items for a player (or everyone.) Dynamic arguments allow you to use the player name or page name anywhere: /lwc history, /lwc history Hidendra 2, /lwc history 2 Hidendra, /lwc history 2, and /lwc history Hidendra are all valid and will work! Later on, will work hand-in-hand with /lwc details <HistoryId> (commit: 0328e82)
The player who destroyed a protection was always being shown as the owner of the protection - reverted to how it's done before and fixed /cremove not modifying the history items (commit: 009eca5)
Developer Mode - to enable on a player, /lwc dev enable PlayerName. You then must confirm it with /lwc confirm before it will actually take effect. Not entirely useful yet, just lets players with Dev mode enabled modify what LWC permissions they have (none, player, mod, admin) (commit: cc8890f)
ability to define an id for Economy discounts to allow EXACT to give _exactly_ X protections for THAT specific discount Id. The default id is shared between all discounts. (commit: 33b8bed)
Economy usage fees. set usageFee to a number (e.g usageFee: 2.50) and players will be charged that each time they OPEN a protected container (chest, furnace, etc.) It can be used the same as charge: under groups and players to override the default. (commit: f9940aa)
Allow /cmodify to take an id:## argument. The id can be anywhere, for example: /lwc modify Hidendra id:5 would work, as well as /lwc modify g:Yo id:5 Hidendra, and so on! (commit: f948cc7)
More modular build.xml to allow seperate Jenkins projects for LWC, LWC-Spout, and LWC-Economy. They still share the same workspace. Also, faster compilation! (commit: 89f3a3c)
Closes #109 - add the IN_USE discount type to allow discounts to only take effect when they have less than X DISCOUNTED protections in use (NOT TOTAL!) Also, minor changes to how the protection update queue is done (commit: 71d2cb9)
the bug 656 workaround has been removed and instead has been replaced with a feature that automatically attempts to only rely on the database when the most common form of the chunk bug is found (when blocks show up as AIR to LWC, which is under normal conditions, impossible) (commit: f469693)
Fix for creation date not showing up for History objects. Also, hide the protection if we know it was destroyed (SQLite likes to reuse primary keys, so collisions occur.) Also #2, make dev mode PLAYER_INTERACT notices a little more descriptive (commit: 08a8019)
The previous commit was fine for 1 million protections. Not 13 million. Some more underlying issues have been discovered (e.g how indexes were being created) and have been resolved. (commit: d18c4b2)
Begin storing x/y/z coordinates for history objects. Fix a bug with indexing (oops). SPUNKIIE: first startup using this build will take around 10-15 minutes for you, after that it will be fine again :) - it fixes old problems and now only performs indexing 1 time (commit: 98d139f)
Make lwc.encrypt use StringUtils.encrypt (they were identical!) Side effect: testing if commit messages are carried down onto LWC/ project (commit: 61b0f01)
Added /cremoveall, which will remove ALL OF YOUR PROTECTIONS. This prompts you to use /lwc confirm before it actually goes through. Also fixed a couple of bugs: /lwc admin report was recently broken, and the internal database version was not being updated. [cc: Asphodan] (commit: a909cc4)
Allow `lwc.limit.#` permission nodes to explicitly set the player's limit on ANY block (even if they are in the custom limit group). `lwc.limit.BLOCKID.#` can be used to limit a specific block (e.g `lwc.limit.54.0` = 0 chests). ONLY SUPPORTED BY SUPERPERMS COMPATIBLE PERM PLUGINS~ (commit: 33b1f42)
new OO-style Protection finder. Works the same as before (the old _validateBlock) but is significantly easier to use and understand. see: com.griefcraft.util.ProtectionFinder (commit: 3904c4b)
The ProtectionTypes class is no longer in use and is now replaced with the Protection.Type enum - any plugins that called registerProtection() directly will not work with this build onwards unless it is fixed. (commit: eed3525)
misc cleanup - no noticeable changes (unless you break the database.) Removes ProtectionTypes, Changes Protection.data to creation and makes Database.connect() a bit neater. (commit: 76fb14e)
More un-noticeable stuff: renamed CacheSet to ProtectionCache and it now stores a set of hard references to cached protections. At some point the other caches will only use WeakReferences, not hard. This will allow more versatile caches so we can use the cache more often while guaranteeing we can keep caches up to date (e.g when the hard reference disappears, the weak references will as well) (commit: 31a56ec)
"exploit": Don't allow drop transfer to be used to transfer items across worlds. This is problematic if one world is survival oriented and another world allows creative mode for everyone with free spawning rights (you can guess what happens next.) (commit: e3f1af0)
Preliminary support for DONATION chests - yeah. Allows you to *donate* items, but only people with access (ala /cprivate) can move items and/or remove items. Will require LWC-Spout & Spout. P.S: Not functional yet :P (#138) (commit: ca58f74)
Donation chest support - requires LWC-Spout. Anyone can open the chest and add items to it, but only those with admin rights can modify the chest, take out items, etc (e.g /cmodify @Hidendra will allow Hidendra to modify the chest - /cmodify Hidendra IS NOT enough at the moment.) (commit: c526fc2)
Automatic config updater. What it does is automatically adds new config values to the LWC conf files that are missing and also deletes invalid nodes (AKA Magic). It doesn't touch dynamic nodes such as protection.blocks, limits, etc. This also means LWC.jar is a tiny bit bigger because all the config files are in the local jar. #91 (commit: 9e23509)
Startup errors saying a path could not be found should now be resolved - occurred when the path to the Minecraft folder contained spaces. (commit: bc7d8e7)
On the fly live database conversion which can switch between SQLite and MySQL without a plugin reload or server restart. NOT FULLY TESTED YET, HEY.-- /lwc setup database NEWTYPE (mysql or sqlite), mysql data however would need to already be configured in core.yml for now (commit: aff1ea0)
Give /cinfo a fresh look. Now also shows who can access the protection and lets you know /lwc owners exists if you have more than 9 users on the chest (before now, /lwc owners was documented nowhere, aha!) (commit: 662cada)
Convenience commands to query the database much more easily. Example: rename protections using World1 to World2, /lwc admin updateprotections set world = 'World2' where world = 'World1'; .... All new commands: /lwc admin updateprotections, /lwc admin deleteprotections, /lwc admin selectprotections. All commands cannot take no arguments; e.g /lwc admin deleteprotections alone will not accidentally delete your whole database. If you wanted to delete your whole database, you would do /lwc admin deleteprotections 1=1, or to delete all protections in a world: /lwc admin deleteprotections world='TheWorld' (commit: d10bff2)
1. Add removeProtectionsByPlayer to PhysDB; 2. Only show ACL list in /cinfo to those who can admin the protection; 3. Add a friendly warning message when a LWC-related action is attempted but another plugin has cancelled the interact event before LWC could process it. (commit: bb3d7d6)
Closes #141 -- Adds optional.onlyProtectIfOwnerIsOnline to core.yml (when you update it'll show up automatically in your config). If you tick it to true, protections will only be useful (and prevent entry) when the owner of it is online! (commit: b4e9ebc)
Fun little info message when starting up. Will be changed to only shown the first time using LWC later on (most likely when we're ready to begin translations) (commit: 7804288)
Add a warning after protecting something that redstone is currently allowed on it if the block can be affected by redstone (doors, trapdoors, etc etc) and that they can disable redstone with /credstone on (commit: 3a7e143)
Added worldguard.allowProtectionsOutsideRegions to the WorldGuard portion of LWC to decide if you want to allow protections outside of WorldGuard regions. (commit: 61d4e50)
Add RustyDagger (donation) and krinsdeath to credits. Started the changelog that will be shown publicly at release, not yet finished. (commit: 27fe764)
Refactor some PhysDB methods to remove old naming from LWC 1.00. This should not affect any other plugins but if it does they are doing something they probably should not be doing :) (or doing it wrong) (commit: 6368b19)
Rename UpdateThread -> DatabaseThread and rewrite it. Again, there shouldn't be any plugins interfacing with this directly so it should not break anything. (commit: 63be96c)
1. Don't display redstone warning when denyRedstone is true for /cprivate; 2. Allow Fence Gates to be automatically closed by /cautoclose & doors.yml (commit: c335834)
Closes #161: Add the ALLOWEXPLOSIONS flag, which allows a protection to be exploded and/or protection removed by an explosion. The protection is GUARANTEED to be removed by an explosion; however the block may not be removed if another protected block is nearby. Aliases: /callowexplosions, /ctnt (commit: db031a9)
Major refactoring of what was known as 'AccessRight'. It is now named 'Permission'. Rights and type are now an enum. This MAY break some plugins that used these but it cannot be helped. (commit: 1dafb34)
Closes #168: fixes a bug where doors would appear to disappear if you interacted with the block under it and also lowered entity destruction event priority (commit: e3a9c57)
Closes #136: Protection item keys! These allow you to make your private protection beckon to a specific item, or "key." This sees its best uses with Spout custom items, however normal items can still be used. Using it: /cmodify item:ID or /cprivate item:ID. (commit: 58028b9)
When matching protections, remove 'corrupted' protections that shouldn't be there from the database. This results from an ID mismatch and/or a block changing type (e.g worldedited to some other block) (commit: 6cd6b40)
Begin the translation phase -- a lot of additions (~80) to lwc_en.properties and some strings have also been removed -- not been reflected in the other files yet however. Virtually every message now resides in the language file again (commit: 876725f)
Experimental metrics. Basic non-identifiable data available to anyone: http://metrics.griefcraft.com/plugin/LWC | http://github.com/Hidendra/metrics.griefcraft.com Opt-out: optional.optOut (commit: efcc431)
Add player counts -- will be pretty graphs at some point when viable data is available (and the cron script will be pushed to git then) (commit: 398566d)
Experimental door & wooden plate feature. It AUTOMATICALLY PROTECTS pressure plates that are in front of a wooden/iron door and prevents players that cannot access the door from opening it. If you experience any lag because of this new build please notify me directly (#157) (commit: 8e72315)
Cool feature 002: You can now disable all redstone on a door (/credstone on), place a pressure plate in front, and then this pressure plate will open the door ONLY WHEN you use it. No redstone torches/levers/assertive chats will work on the door after activating the flag, either! (unless you're within 1 block of it) (#157) (commit: ea39672)
4.0.0-beta1: all major changes should now be completed. From here on: bug fixes, consistency fixes, completion of minor features that still haven't been done, and testing. At this point those who opted to help translate LWC into X language will be contacted. (commit: c817937)
Expose the updater config options (core.yml -> updater.branch and updater.method) and begin operating on STABLE as the default option. The new update site for STABLE is: http://update.griefcraft.com/lwc/branch/stable/ and each new version is now separated into their own folder. (commit: 2ad5f13)
At long last, the protection's type can now easily be changed. /cmodify private = Change the protection to private, /cmodify password 1234 = Set the protection to password and make the pass 1234. It can also be used to CHANGE the password! (commit: 7a294d8)
Disable the lwc.autprotect perm node and minor grammar error fix. The autoprotect permission node will be replaced with a more robust config feature in the future because of clunkiness with perm plugins that allow * (commit: e2e98cf)
Sample config for new limits v2 -- only config is implemented, not functionality yet. The old limits.yml will still be usable but won't be auto downloaded after the new one is implemented to be backwards-compatible for a while. It will be dead simple to set limits - see config/limitsv2.yml for some examples (commit: ce8299d)
Limits v2 -- extremely simple and much more easier to use over the legacy Limits. If a limit is not defined for a specific block, it will instead use the total amount of protections the player has. (commit: 2daccaf)
Add a method for limits that gets all of the limits that can affect the player. Conveniently it has the highest limit available to them for each type. This'll be used for /climits for better listing of what a player can protect soon! (huzzah) (commit: 78743db)
Stop auto downloading limits.yml (old one) so as to not add more confusion when the server doesn't have it. And remove some extra output that was used for testing. (commit: 539c880)
protection config: 'quiet' mode which hides all creation messages & notices. useful for those that allow protection of blocks such as stone, wood, etc. (commit: f74bab6)
Add the amount of protections the player has to /climits (and for chests, only count how many chests they have, etc) and colourize the output -- green if they're good and red if they've exceeded that limit. (commit: ba14874)
Fix a dumb Spout bug (in RB and dev builds) that allows protections (e.g CHESTS) to be removed, and also fix a bug in converting rights from LWC3 -> 4 format when bad rights are in the table (commit: f6a54f0)
4.0.2 - mainly a bugfix/optimization release. Fixes the bug where old /cmodify'd players could not access protections. Merry christmas! (commit: 789fcfc)
make quiet protection config also hide removal message (via removing the block) and redstone note when registered a door/trap door/etc (commit: 46ae1e3)
Two great things! When removing one side of a protected double chest, it won't REMOVE the protection now. It will move the protection to the side of the chest that isn't destroyed if needed. Second great thing, located an area of more wasted queries (when clicking certain blocks) (commit: 0aeba94)
Fix an exploit detailed by Sir Spunkiie. the fixes applied to ProtectionFinder: 1. ensure blocks matched are kept in the same order; 2. when tryLoadProtection() is used, if a protection is matched THAT protection is cached. Default the function to NOT cache and only cache when the protection finder uses it (commit: 58edf5b)
Remove the dependancy on LWC-Spout / LWC-Economy because of some 'dumb' bugs with how Bukkit dependancies work. Also, these two plugins load POSTWORLD now to doubly make sure everything still plays nice together. (commit: c816f84)
Allow the group prefix for matching groups via Permissions be changed in core.yml (and also change the default to group. instead of lwc.group.) (commit: 77ec986)
Fix multiple bugs: the charge was not using the correct method to find the lowest amount to use (multigroups) and there was a minor error in how sorting was done by lowest number (x < -1 is always false :), so it became x < -1 OR x == -1) (commit: d985d96)
4.0.9: /lwc admin rebuild: a command to rebuild a wiped database, barring some missing data such as ACLs which is less important and unrecoverable without backups. See http://forums.bukkit.org/threads/60178/ (commit: 7e437fa)
Backups can be created via /lwc admin backup create. No guarantee they are legitimate until a restoration tool is done. And fix lwc.shownotices perm node again (commit: 8dbae48)
LWC full backups are now creatable and savable (saves protections & the block+contents). NOT COMPATIBLE WITH DOUBLE CHESTS (yet). Restore via /lwc admin backup restore NAME. Still some bugs, so unless your database is empty you'll get duplicates :p (commit: d5a3366)
Bring down the hammer of death upon features and let my wrath be known. The following has been REMOVED: /lwc schedule; /lwc menu; /lwc dev; /lwc admin config; Lists support; EasyNotify; job support; Kick Traps; Ban Traps; and lastly, the deprecated ProtectionTypes class has been fully removed. (commit: c433cb6)
Remove Permissions 3 support, update metrics, add /lwc admin protectregion NAME to protect all protectable LWC blocks in the region to 'LWCWorldGuard', the owner can be changed via /lwc admin updateprotections set owner = 'NewOwner' where owner ='LWCWorldGuard' (sorry for being so long spunk!) (commit: f98e2f0)
Implement entityBreakDoor and add the config option allowEntityBreakDoor (this will automatically show up in your protections section next time you start the server) (commit: fe24d92)
Potentially large performance fixes all around- 1. Blocks that are KNOWN and GUARANTEED to return a null protection are now stored in a cache. This will decrease the number of database queries overall. This cache is 10 times larger than cacheSize because it uses a flat integer and uses very very little memory for the amount of benefit it can potentially get over time. 2. Protection finders have been optimized. Now, instead of trying every finder, only the relevent finders will be used. For example, if the player clicked on a double chest, LWC will only use the double chest finder, not the others (which would be used in turn if no protection existed on the double chest.) None of the protection finders now should query the database. It should more strictly either return TRUE if there is a match in blocks (but not a protection, which may not exist), and FALSE if there is no match at all. These changes will more be noticeable in the long run. Database calls seem expensive but by adding another cache and removing places where queries were previously done (unnecessarily), should help. (commit: b115958)
Fix a bug where when using /cprivate manually the null would not be removed from the cache: There was already checks to remove the nulled block but to get the Protection object after creating a protection, loadProtection(world, x, y, z) is used. This respects the null cache, so it always returned null when using /cprivate, which is obviously bad. We instead remove the key from the cache before using loadProtection () when creating a new protection so that this cannot happen. (commit: 5e42a6a)
Even more performance issues fixed. I do not guarantee there are no bugs in this build ;). Status of what else needs to be done will be assessed later on. What has changed: 1. If EVERY protection is inside of the cache, it is safe to assume that any block NOT in the cache, IS NOT in the database. We leverage this fact heavily in this build to give a significant boost to performance. 2. Caches. Cache ALL the computations. Numerous caches have been added in various places where specific points of bad performance was located at. These caches generally only store computationally expensive calls; overall this is also significant after the caches are nice and toasty. 3. Modules - before, LWC's own module system would broadcast events to every registered module. This added a overhead of about 1k nanoseconds per module, if they didn't override the method. This has been changed to detect at runtime what methods they have overrided and then ONLY send events to modules that have them overridden. We could have modules register what events they use but this would break backwards compatibility with plugins that hook into LWC. This uses reflection but is all done on startup so the overhead is minimal. The gains is fairly large and worthwhile. There is still a potential to shave off even more precious cpu cycles but this will be assessed further once initial results are in. For scope, here is some example values for events: timing is in nanoseconds Event |Before | After| Redstone | 22k | 3k | Interact | 100k | 46k | (commit: 0d39aa1)
removeModes () should be using the accessor method not the direct set and also fix mismatch between known actions and actual actions that are really there (was causing an NPE) (commit: 8910ec5)
Two experimental optimizations that proved a noticeable effect in testing: 1. Apache commons has been used in place of replaceAll () and split () where they are heavily used and abused. Both of these methods are very slow so this will suggest to me if they should be replaced. In one place a custom char-array based method is used to replace single char values instead of strings, which proves extremely fast. A custom solution will probably be written to replace commons so that it does not need to be included. 2. Message queueing - messages to be sent to players are noe queued in a sync task as an experiment. This will most likely not prove to make anything positive in reality but it is simply a test that I would not know what would happen otherwise. (commit: 7d405e8)
Even more performance enhancements. This time: both the interact and redstone events have been cut 50% each:- 1. Heavy caching has been introduced on KNOWN blocks such as the block under a door or the second side of a double chest. This heavy caching is mainly for the redstone event however it has also very positively effected interactions. 2. CPU enhancements here and there - convert some lists to a map where constant time access is better than looping over it. This is mainly done in player Actions, which are constantly compared against, thus a map is very preferable. 3. instanceof seemed to kill performance when comparing against a ContainerBlock. This has been fixed. As well, event dispatching has been changed from instanceof to checking the enum, which should have been done before. And other misc changes that I forget. No bugs expected this time around, I tested it pretty thoroughly because caching was changed so it impacted a lot of core methods. After: PlayerInteractEvent Time: 389942868 Count: 43680 Avg: 8927 BlockRedstoneEvent Time: 493837325 Count: 412871 Avg: 1196 Before: - Interact was approximately 20-25k - Redstone was consistently at 2.8-3k If all goes well, this represents a over 94% performance increase over the stable version of LWC when comparing just the interact event. The redstone event thus far has now also seen a 94% performance increase. (commit: a17ac63)
Fix a cache synchronization bug that can cause other protections to not show up on one half of double chests when creating a protection (commit: a324755)
The rest of the cache synchronization issues should* now be fixed. The problem lied in protected blocks that DON'T contain the protection being assumed to have a null protection. This caused a disconnect between what blocks should be protected and which really are. So we force the cache to be updated instead of only when it is first looked up. No large performance impact. (commit: 306df70)
Fix double chests removing the protection when one side is removed. Normally, it should transfer the protection to the other chest or just overall prevent removal when the unprotected side is removed. (commit: 4f4f9ce)
Many months late, but add /lwc info history. When used in conjunction with /cpersist, it makes a very nice history checker! Cycles through all known history for a block's lifetime. (commit: ce7f087)
Remove the null cache. After a feature causes me to scratch my head more than five times, something is obviously wrong! Fixes some caching issues with cacheSize < protection count (commit: ffbe885)
Rewrite Door logic to be 99% more awesome. It now properly does not open doors when auto closing them if it's closed! As well: - Double doors will no longer open when the block below the door is clicked. This was mentioned before and I figured I would make it explicitly not possible because this caused confusion. Because it is a rewrite I personally feel the logic is extremely simple now and no longer complex. It also works very nicely and worked without having to crawl through bugs like I had to when I first wrote it. It just 'worked' (commit: 2da13bb)
fix modules registering even if they only implement Module and don't extend JavaModule previously, it would only work if MyModule extends JavaModule but not if MyModule implements Module this now allows the latter too (commit: 530a539)
remove the player chat event for now and update CB reference. It is not worth it to lose backwards compatiblity over something stupidly small. This can be worked around so I may do just this at some point. (commit: f3fe48a)
hide an underlying issue between shared prepared statements that can cause deadlocks. the deadlock should no longer occur however nor is the issue fully fixed. (commit: 1215df9)
merge in changes by AlphA (albeit modified) which add config support for blacklisting blocks that can be placed beside chests and blacklisting specific players (e.g '[BuildCraft]') to not be able to destroy protections (commit: 9bef00e)
In the StructureGrowEvent, do not check blocks which are not protectable. While this is certainly not a problem on servers with all protections in the cache, it still appears to cause large event timings even for those (which does not make sense). For servers WITHOUT all protections in the cache it can cause severe problems especially if the database backend takes time to respond. (commit: 41148ec)
Magnet: Items that are polled are not considered "fresh" as items are polled once the queue reaches 0 and then that queue is emptied before repolling the items for all worlds again. This means that in the time between the item being added to the internal queue and being checked by magnet, it may have died. Which can cause issues ;) (commit: 968ebb6)
optimize magnet to be highly efficient when dealing with a lot of dropped items. It will only check items that have blocks w/ inventories nearby. It can also leverages the LWC cache now (commit: de42453)
run /lwc admin cleanup in a separate thread -- if your server grinded to a halt before it should no longer do so, it may be slower than usual while it's running but it'll still be usable (commit: 17efa56)
Closes #393 for magnet chests, only pickup items that have lived for longer than the pick up delay. It fixes instant item pickups (sometimes, when timed right) and also picking up items that plugins don't want picked up. (commit: 43079c6)
closes #394 don't put items into furnaces when input slots are already occupied. That is, don't try to put items into the OUTPUT slot. This could be smarter and put items into the furnace if it'll fit into the input slots but would require custom methods to handle adding items to inventory, so not going to happen at the moment. (commit: 85aff8e)
#409 - patch by @Brianum to not allow magnet chests to deposit into the output slot of burning furnaces, and allow items to be deposited in the 1st / 2nd slots (not output) (commit: 452a041)
Add a db pool in a slightly elegant way without having to modify the existing code base TOO much!: Database pools required you to get a Connection object and then close it afterwards. LWC has 2000+ lines of database code. Modifying every instance of this is extremely (!!) time consuming and very inconvenient. Instead of doing this we exploit the fact that in LWC's usecase, once a PreparedStatement or ResultSet is closed, everything above it is closed, e.g a close chain: ResultSet -> PreparedStatement -> Connection. This is done automatically by the new backing AutoClosingPreparedStatement and AutoClosingResultSet. This however did require manually modifying anything that used raw Statement objects. This means that this build truly is a "dev" build not an unreleased stable build. Care should be taken with this build. (commit: ff6ef30)
addresses issues with connections staying open when a exception occurs and more importantly locking issues with SQLite ( use a single connection ). this may require some tuning (commit: 9c717fb)
Highly experimental entity protection & slightly improved magnets. NOTE THE FOLLOWING: THIS HAS NOT BEEN FULLY TESTED OR EXPLORED. This extends LWC protections to the following major entities: Storage Minecarts, Portraits, and Item Frames. LWC has been originally designed to work with clean Block & Material objects. Making it work with entities is interesting so I _expect bugs_! * All wall entities should be protectable: portraits, item frames * => To interact with them you need to try to destroy them. * => You yourself cannot destroy a protected entity. You need to /cremove it * => Protected entities will NEVER BE DESTROYED unless /cremove'd at the moment. That means if the wall backing them is removed, the entity stays! And if water fills your beautiful palace, the entities again stay. * STORAGE MINECARTS are protectable * => Furthermore, /cmagnet WILL work on storage minecarts * => When interacting with the cart, try to open the inventory (right click) * /lwc admin cleanup has been tested and properly checks for entities but has not been fully examined * There *may* be entities that I don't know of that can be protected. I've tried protecting MOBs and it didn't work so you don't need to try that! (although LWC could probably protect mobs really easily now, but that's a different story) Again, bugs are expected at this point so PLEASE DO NOT RUN ON HUGE 300+ PLAYER PRODUCTION SERVERS! As much as I would love that, you'll probably hit a brick wall very quickly. This addresses #392 for the most part. There is s till more left to do for a full implementation however this is a good start. (commit: 3413f60)
improve errorneous database configurations. Errors that are no huge stack traces; and safe mode for the server when unrecoverable Database errors occur. #411 (commit: 0bb5161)
Make LWC compatible with CB build removing easy visibility to NMS / CB code, meaning LWC no longer uses FAST native access in key areas :( (commit: c26e641)
fix matching blocks attached to wall signs. looks like minecraft did the ol' switcheroo with data values for block faces at some point (commit: e24d790)
Run database thread in a task on the main thread for now. Seems to fix contention issues with the db pool. Needs to be assessed if writes / reads can be separated into separate pools or not. (commit: a9be214)
Revert "catch exception in rare cases when bukkit fails to get the location of a block when interacting with an inventory" This reverts commit 3c3bc3396864c9754116e832fafcb51aa2751d71. (commit: 5fedfd3)
Revert "share 1 connection when flushing the db queue instead of opening a lot of connections" This reverts commit 6a6839e133987b333e355fcffb79fcf43eb46089. (commit: f60472e)
Revert "Disable magnets globally for now due to ongoing lag issues with it" This reverts commit 0092804eed212a130f03dd82c7093d5084583d59. (commit: 6f51c30)
Revert "fix database migration (saveNow() used to create if it needed to, it no longer does because it really should not!)" This reverts commit 87f27256fcc0769ba3bc92a97c7c622c353a31e5. (commit: 0239ef4)
Revert "Move the database thread to async task and impose a work limit" This reverts commit a35e726fd68ee2f0e0155f9c2b2f4f588449fec9. (commit: c06d89b)
Revert "Allow "sign" limit in limitsv2 to apply to _both_ wall signs and sign posts. Closes #338" This reverts commit 0be8b9ed86982977f68a64f8257ceb69aef14f92. (commit: e2cdc2f)
Revert "Run database thread in a task on the main thread for now. Seems to fix contention issues with the db pool. Needs to be assessed if writes / reads can be separated into separate pools or not." This reverts commit 9dae28b9102115817ada7f559d98b8dc8d666280. (commit: 4f6f101)
Revert "Add pool statistics to /lwc admin report and don't forcefully flush" This reverts commit 903b989549fe279e965b137d1ade894a9d297ee1. (commit: 0d19c6d)
Revert "use Bukkit's getFIle() to get the location to LWC's jar instead of the usual Java way" This reverts commit 6d54a79a9b041533f2c1972e1ef039447765f4fe. (commit: e77ac19)
Revert "fix matching blocks attached to wall signs. looks like minecraft did the ol' switcheroo with data values for block faces at some point" This reverts commit 1aa143d5beb0f7fd2c861bfb313a748844b48e77. (commit: 5427cbe)
Revert "improvements to magnet again and remove storage minecart magnets for now as they are slowing everything down" This reverts commit 3afa50299e1374effa59ac9fca0f400b9a284c3e. (commit: e7762ae)
Revert "LWC-Econ: use class-loader-of instead of using Class-Path in the manifest" This reverts commit a07206e4fdb5b0bd17e0d7f663bf5ef35c4ed633. (commit: 3078f4c)
Revert "allow entity protections to be configured in core.yml. storage_minecart, item_frame ;)" This reverts commit f802de5b463e60393aa726ad2741daeddbda74f9. (commit: 0c48fdb)
Revert "Make LWC compatible with CB build removing easy visibility to NMS / CB code, meaning LWC no longer uses FAST native access in key areas :(" This reverts commit fb47ca0fb8b6f8d001fc1f905c23b36627336f0c. (commit: 85cc306)
Revert "improve errorneous database configurations. Errors that are no huge stack traces; and safe mode for the server when unrecoverable Database errors occur. #411" This reverts commit f3793bed9b976ad6f4d3dd9c96e6052f9882dcb7. (commit: 1ea289a)
Revert "remove extraneous startup output and move some of it to /lwc admin report. Also, cache output in /lwc admin report is a bit nicer." This reverts commit 8b59a8abb23193f8369a0f015312697ca2ca63d4. (commit: daaac49)
Revert "Remove automatic updating. Instead, a notice will be printed in the console." This reverts commit 7dcb153f9beea320632d55623078d7c263794aef. (commit: 5ae8e52)
Revert "addresses issues with connections staying open when a exception occurs and more importantly locking issues with SQLite ( use a single connection ). this may require some tuning" This reverts commit 112bb65513c3b921879215d845bd4bd42c1c7a56. (commit: d6f8f8e)
Revert "naïve implemention of async magnets. if needed could be improved by batching together requests inside Future tasks. #441" This reverts commit 4ae53dc3d34b7a8615573fc65382b7fa0e5b1e70. (commit: c876f11)
Revert "Don't use unnecessary getItemStack() calls by using native code. #441" This reverts commit 6848daa1835bffe7494e7225fa0f05f324ab9f2a. (commit: 2cf4586)
Revert "Add a db pool in a slightly elegant way without having to modify the existing code base TOO much!:" This reverts commit cec9f858d42c34fd634723426293987963cd69ee. (commit: daa9893)
fix matching blocks attached to wall signs. looks like minecraft did the ol' switcheroo with data values for block faces at some point (commit: 22cb713)
Not efficient at all! Revert "optimize magnet to be highly efficient when dealing with a lot of dropped items. It will only check items that have blocks w/ inventories nearby. It can also leverages the LWC cache now" This reverts commit 4cb9b050c650b0ca54f2a72fa0a052689e21ede2. (commit: 42c9445)
Send a keepalive packet to the database server approximately every 5 minutes. This fixes issues with LWC exploding after a few hours when using MySQL due to wait_timeout. (commit: 7d1402b)
Update src/main/java/com/griefcraft/listeners/LWCEntityListener.java Due to an API change a few versions ago, LWC relies on a method that doesn't exist anymore in CreeperHeal, resulting in exploded doors dropping to the ground instead of staying protected. This is the correct way to access it now. (commit: 72dc874)
add readonly-modify and readonly-remove to protection configs. allows you to not allow users to remove or modify their protection. (e.g if it's automatically protected using autoRegister) (commit: fde4c9a)
change version to 4.3.2 for second (and probably last) beta release. Official release will be made once hopper API is added most likely. (commit: b38ad78)
caught AbstractMethodError for inventory event's event.getInventory().getHolder() and dump the player who caused it so it can be investigated (commit: c9a7c63)
add Hoppers to core.yml by default the first time this version/build is ran. After that it can be safely removed if you do not desire it (you will also be told in the console this happened) (commit: 604e318)
add Trapped Chests to core.yml by default the first time this version/build is ran. After that it can be safely removed if you do not desire it (you will also be told in the console this happened) (commit: 020a416)
Disable hoppers on protections by default. They can be enabled on individual protections by using /chopper on. If you want hoppers to be enabled by default (and then /chopper disables them) set denyHoppers in core.yml to false (it'll show up first time you run this build) (commit: 771cc89)
hopper prevention now uses both dest/source. this just adds destination prevention, so people can't dump all their junk into your chest w/ a dropper (commit: baa4e4d)
Fix minor bugs with donation chests: allow left clicking (inserting) into the chest when an item is in hand and compare enchantment levels correctly incase it was not working (commit: 3bd8ca3)
Replaced this ugly StackTrace message (Failed to connect to MySQL) with a message that should contain information that are equally useful. (commit: 5728875)
Implement Bukkit's doubleClick() method for InventoryClickEvent. Still a PR so pending acceptance. Fixes taking items out of Donation chests by double clicking. (commit: e5e7ae1)
Fix Block name matching for protectable blocks in core.yml. This finally properly fixes support with specific ModLoader blocks (e.g. 145:2) as long as it reports proper block / data. HOWEVER, BREAKING CHANGE! If you use LWC-Economy you need to update to the latest build. This begins development on 4.4.0 because of the breaking change as mentioned before which will not be made backwards compatibility to ensure 100% compatibility with ModLoader blocks going forward. (commit: 6d2ef60)
Replace the enumset used to check if a block is an inventory with a Bukkit API call. This should have been done a long time ago as many blocks (e.g. mods) can have inventories that I cannot account for. This also fixes compatibility with MCPC+ according to bloodshot. (commit: 0f7e798)
Auto protect can create duplicate protections when blocks are unexpectedly destroyed (e.g. WorldEdit //set). Also, use MONITOR for auto protection. (commit: 0c1a034)
fullRemoveProtections should update the history table to make the protection inactive. This effects lwc admin expire, cleanup, and other commands. (commit: b9ac4b8)
fullRemoveProtections should update the history table to make the protection inactive. This effects lwc admin expire, cleanup, and other commands. (commit: efb6edb)
Implement chest double click (implemented in MC 1.5). This fixes issues with donation chests and taking arbitrary items if you have the same item type already. (commit: d380b4e)
Allow hoppers to transfer items if the hopper AND inventory it's attached to are protected by LWC by the same owner. This means hoppers would need to be made protectable of course. (commit: 26356c7)
Prepare for adaptive cache testing with a known-nulls cache. This existed probably over a year ago as well but was removed. Basically: It is just a cache of blocks that are known to not have any protections on them. If all protections are not in the cache then an otherwise cache miss would force a DB lookup. This prevents that DB lookup after the first time it's done (and nothing is found) (commit: e72b569)
Fix a somewhat long standing bug where you might see "grass" or something protected when removing one side of a double chest and placing a block down where it was before. Other removeCache calls are to assist with the known null cache (commit: b476444)
New adaptive cache increasing which can be requested by high-intensity code areas. /lwc admin report now lists the default and adaptive cache size, e.g. ( 1252/1260 [100+1160] ) = 100 default cache size (core.yml) + 1160 adaptively increased because a high-intensity code area needed it. PS this is of course in very much testing. I expect this to work well in the long run but of course some minor issues may come up here and there. (commit: d018552)
protection.removeCache() should remove adjacent blocks that aren't protected (i.e. in null cache). This fixes double chests (and potentially doors and other multiblock protections) from not being detected if it is /cprivate'd and not placed down. closes #712 (commit: bb622ed)
Some specific optimizations targeted at hoppers but should help all around as well. LWC startup may be a touch slower for now while more testing is done. This commit makes LWC do the following: - When all protections are in the cache don't even go through the protection matcher (skip it entirely) - Match all blocks for precached protections on startup (makes the above op allowed) When the cache is full don't bother trying to match any blocks. All precached blocks are matched on startup. - Hardwires HOPPER to not use any block matchers (i.e. used when the cache is not full) All of these together should significantly decrease the event time for InventoryMoveItemEvent. For example, it was >30,000 nanoseconds per event for my test server before (around 130 hoppers spamming items every tick) and is now around 2,000-2,500 nanoseconds per event while keeping the exact same functionality. This commit *might* break things (e.g. LWC-Economy might break since LWC now loads postworld not on startup but from my testing it is OK). If your world doesn't explode in a ball of fire you should be alright. (commit: 52be000)
Add a method counter which right now is just used for the cache in /lwc admin report to give a more detailed view of the cache, e.g.: 15:19:14 [INFO] ==== Cache ==== 15:19:14 [INFO] Usage: 15.92% ( 1592/10000 [10000+0] ) 15:19:14 [INFO] Profile: 15:19:14 [INFO] isKnownNull: 645,738 (9496.15 / second) 15:19:14 [INFO] getProtection: 228,874 (3365.79 / second) 15:19:14 [INFO] addProtection: 1,592 (23.41 / second) 15:19:14 [INFO] addKnownNull: 1,244 (18.29 / second) This test world has a LOT of hoppers so the huge amount of reads is to be expected (each hopper is trying to poll an item every single tick but getting blocked by LWC) #734 (commit: 0265839)
Hopper events only ever have 1 inventory to select from so instead of trying both source and dest use only the one that is not the hopper For my test server this removed about 30% of the cache reads some may be more or less Lastly, optimize flags a tiny bit and add a resolveProtectionConfiguration method to skip the getBlock call (commit: b92e97b)
The messy hopper protection stuff can be shifted back to the handleMoveItemEvent because it will only ever be called once per event now (commit: 5229817)
Move LWC's load time back to startup The main reason is so that is loads before WorldEdit and other such plugins that LWC needs to run events before. For example, so that WorldEdit's super pickaxe can be properly cancelled on protections the player cannot access. This is better than moving LWC's event priority down. (commit: eb13844)
#811 Initial UUID work. This is NOT backwards compatible with MC 1.6 Offline mode: Names shouldn't be converted to the UUID of the user with the same username (online mode) as long as the player already logged into the server at least once. Offline mode might still have a couple bugs as a result. * When a protection is loaded: Check if it needs converting; if it does, convert it * Use UUIDs when creating protections and modifying rights * /cadmin find now searches by UUID * Change output from varous commands to attempt to resolve a player's name instead of using a UUID This does not yet slowly crawl the database to convert everything. (commit: 67ab525)
#811 Do not convert protections to UUIDs at the moment until the new converter is ready (which will be quite different.) This will still support protections that did convert to have UUIDs (commit: 2ed212e)
#811 Register protections using a player's name instead of their UUID -- the new converter will change the format so better keep better backwards compatibility (/cremoveall, and so on) for now (commit: 880acaf)
Fix issue with LWC downloading Linux native libraries on FreeBSD (and thus crashing the JVM because SQLite happily also defaults to Linux ...) (commit: 395232f)
Add support for MC 1.8 banners (both standing & wall). The must be manually enabled in the config, i.e.: standing_banner: enabled: true wall_banner: enabled: true (commit: 2f3d535)
Private protections: Allow access via the player's name as well as their UUID. This fixes an issue where users coming from an older build would have broken /cmodify'd permissions. (commit: 88552d8)
Protections should be created using a player's UUID. Before, /cprivate, etc was using the player's name. Protections created with autoRegister (i.e. auto protect when placing blocks) were being created with the player's UUID correctly. (commit: 11fb163)
Several bugfixes + features: - Armor stands can now be autoprotected when placed - Protections are no longer accidentally removed when left clicking them - Member access does no longer allow you to destroy protected entities - You can no longer break protections of other players when you don't have the permission to create them - Everyone can rotate items in public protected item frames - Everyone can add/remove items from public protected armor stands (commit: cb515dd)
- Don't update the last accessed of a protection when an admin opens it. - Only show the name, not the uuid of a known player when opening a protection (commit: 7e086fd)
- fix: update protection timespamp when accessing as non-owner - change: messages for own protections in action bar (to avoid chat spam) - fix: admin cleanup for sqlite - fix: doors: disable block placing when opening/closing iron doors/trapdoors - fix: doors: disable door interaction when shift-clicking (commit: 827d555)
Update to make it ready for 1.13 !! Update before updating mc to 1.13 or everything will break - Remove all deprecation ignore annotations - Use own block mapping table instead of block ids - Removed a lot of old deprecated methods, some very old plugins may be incompatible - old backups are incompatible because they were saved using item ids instead of material names - item ids are no longer supported in config files, use material names - possibly broke everything - minecraft before 1.8 is no longer supported (commit: 0fa6e7c)
Catch some more block changes - Block explosions (beds) - Entity change block - Explosions are no longer cancelled but protected blocks are kept safe (commit: efb40aa)
New command to transfer all protections from one player to another one Command is /lwc admin transfer oldplayer newplayer Permission is lwc.admin.transfer (commit: 3d8b0c9)
Update to 1.13 (still buggy, don't update yet) Important change: In core.yml only item/entity names are allowed, no ids. protectable entites have to be in protections.entities now. If unsure look at the default config. (commit: 60b4c5f)
Convert protections 1.12 -> 1.13 - Update your core.yml with new materials before starting 1.13 - After starting use "/lwc admin cleanup" to refresh protections (commit: cad5cd6)
Add license information See https://github.com/Hidendra/LWC/commit/e4fb181bf80cb17cf605d82f94e0209b20e4019f#diff-9879d6db96fd29134fc802214163b95a (commit: b82e212)
Optimize table format and improve startup time - Several columns were much too large - Add a check if any database upgrades might be required before trying to upgrade - Fix database schema on creation (commit: e738c8e)