[INACTIVE][DEV] Persistence v0.76 - Data-Driven Bukkit [677]

Discussion in 'Inactive/Unsupported Plugins' started by NathanWolf, Jan 29, 2011.

  1. Offline

    NathanWolf

    Persistence - Data-Driven Bukkit

    PLEASE NOTE
    Persistence is a developer API and framework- NOT a game or admin plugin.

    If you've come here looking for plugin/admin support for Spells, Wand, NetherGate or any other plugin that uses Persistence- please turn around and go back to that thread. Thank you for your cooperation!

    If you're a dev, then check the Persistence wiki for information on using the Persistence framework.

    View changelog on github
     
    Duccis likes this.
  2. Offline

    amkeyte

    Ok new spam from the new build :)

    Code:
    
    2011-02-06 16:02:31 [INFO] amkeyte [/127.0.0.1:7347] logged in with entity id 28
    
    Player count: 1
    2011-02-06 16:02:32 [WARNING] Persistence error getting field x for position: nu
    ll
    2011-02-06 16:02:32 [WARNING] Persistence error getting field y for position: nu
    ll
    2011-02-06 16:02:32 [WARNING] Persistence error getting field z for position: nu
    ll
    2011-02-06 16:02:32 [WARNING] Persistence error getting field yaw for orientatio
    n: null
    2011-02-06 16:02:32 [WARNING] Persistence error getting field pitch for orientat
    ion: null
    2011-02-06 16:02:46 [WARNING] Persistence: Error updating table player: [SQLITE_
    ERROR] SQL error or missing database (table player has no column named positionX
    )
    2011-02-06 16:02:46 [INFO] INSERT OR REPLACE INTO "player" ("name", "id", "onlin
    e", "positionX", "positionY", "positionZ", "superUser", "firstLogin", "lastLogin
    ", "lastDisconnect", "orientationYaw", "orientationPitch") VALUES (?, ?, ?, ?, ?
    , ?, ?, ?, ?, ?, ?, ?)
    2011-02-06 16:02:46 [WARNING] Persistence: Error updating table player: [SQLITE_
    ERROR] SQL error or missing database (table player has no column named positionX
    )
    2011-02-06 16:02:46 [INFO] INSERT OR REPLACE INTO "player" ("name", "id", "onlin
    e", "positionX", "positionY", "positionZ", "superUser", "firstLogin", "lastLogin
    ", "lastDisconnect", "orientationYaw", "orientationPitch") VALUES (?, ?, ?, ?, ?
    , ?, ?, ?, ?, ?, ?, ?)
    2011-02-06 16:02:46 [WARNING] Can't keep up! Did the system time change, or is t
    he server overloaded?
     
    Client takes approx a minute to log into server then this happens. This is with new build, new craftbukkit, new bukkit.
     
  3. Offline

    NathanWolf

    Ha- I also edited my edit to your edit! Or ... something.

    So, yeah, ok- that's embarassing! It looks like I have a PersistedClass.remove() that will remove an object from the cache- but I need to take a look at the updating code and see if that actually is smart enough to delete the row (yet). I was debating whether I needed to keep a separate list of objects, or just sort it out dynamically ... and I can't honestly remember where I'm at with that :)

    You can try calling getPersistedClass() to get the PersistedClass, and then call .remove().. but, yah, that's super nasty. I'll make sure to get a remove() working ASAP!

    It will just be Persistence.remove(Object o) - though I will probably also have a variant that takes an EntityInfo object, for overriding annotation default (I'm hoping to support the same object in multiple stores or schema without conflict....)
     
  4. Offline

    WinSock

    I saw that but i didn't know if there was something else blocking that.
    --- merged: Feb 7, 2011 12:10 AM ---
    You have to delete the old global.db for the new build
     
  5. Offline

    NathanWolf

    Yeaaahhh... also embarassing. Floats apparently don't persist right- I recently added pitch and yaw to PlayerData, and then haven't had a chance to fix it.

    You know what, since we're all friends here in the source code, let me just do an update real quick...

    You're going to need to delete your global.db (and, now there's the first time I've told someone to do that- chalk up one win for contained data vs references...)

    I'll let you know in a minute when it's ready :)
    --- merged: Feb 7, 2011 12:15 AM ---
    Ok- just committed. I commented out the BlockVector and float issues for now- and I also threw in a Persistence.remove. It will at least remove your object from the cache- I have not yet had a chance to test whether or not it removes an object (or, you know, remember if I implemented it or not).

    It's crazy that this thing is so complex I've already lost track of what it can do yet.

    Anyway, I may be going to hang out with my daughter for a couple hours in a bit- hopefully you can make it somewhere with this in the meantime! :D
    --- merged: Feb 7, 2011 12:16 AM ---
    I really want to get that data migration implemented, before I hear and say this too many times :)
     
  6. Offline

    amkeyte

    Thanks Nathan! I'm already liking this utility... going to make my job much easier
     
    NathanWolf likes this.
  7. Offline

    WinSock

    i might be going crazy but i see no commit. no problem i understand your code enough to implement it myself :p
     
  8. Offline

    NathanWolf

    Derp, geez- looks like I forgot to actually push!

    Should be in now, for really reals.

    I'm not quite all there tonight, haven't been getting much sleep :)
    --- merged: Feb 7, 2011 12:29 AM ---
    Glad you like it, thanks!
     
  9. Offline

    WinSock

    Aww i just put in my copy what you just pushed :p and ya if you remove it from the cache it should delete i think if i understand your code right.

    Edit:
    Yep its confirmed you put that functionality in :p
    --- merged: Feb 7, 2011 12:39 AM ---
    Sorry one question all i have to do is change the reference and the PersistedClass is set to Dirty automatically right?
     
  10. Offline

    NathanWolf

    Sweet, thanks :) I thought I put that in, I wasn't sure. I originally had it building an id list and using a DELETE WHERE NOT IN() .. then I decided that was a really bad idea, so I wasn't sure that I'd gotten back around to it.

    Well, I'm glad that adding remove support was as simple as adding a function to Persistence :)

    --- merged: Feb 7, 2011 12:42 AM ---
    Reading my mind- I wanted to note about this!

    No, unfortunately- I haven't thought of a way to make it that clean, without shadowing every instance to be able to check for modifications (I can't really "catch" when you call a setter).

    So, you have to call persistence.put() any time you modify something. This would also apply to any referenced objects, I don't assume that a reference is dirty just because you put() something that references it.

    If you have a contained object, and you modify it- you need to put() its owning object, since it's not an entity itself.

    I hope that all makes sense :)

    Right now, all persistence.put() does if the entity is already in the cache is mark it dirty. Eventually, I'll merge in the data as well, in case you've cloned your reference (and I need the converse of this to support references auto-updating when you reload data, which is really the more important side of this)
     
  11. Offline

    amkeyte

    I would like to request a code change :)

    Is it possible to pass in an instance of the command object to the command handler? This would be similar to an event having access to its event object.

    code change:
    Code:
                                Method customHandler;
                                customHandler = listener.getClass().getMethod(callbackName, senderType, PluginCommand.class, String[].class);
                                return (Boolean) customHandler.invoke(listener, senderType.cast(sender), command, parameters);
    and the same in one other call a bit lower.

    this would allow for the following usage:

    Code:
        public boolean onCommandHelp(CommandSender sender, PluginCommand command, String[] args) {
            command.sendHelp(sender, "", true, true);
            return true;
        }
    I'm sure there are a multitude of reasons I could think of to have an easy reference to the command object. I'll be playing around with it tonight and provide more feedback if anything particularly good comes up.

    Thanks!
     
  12. Offline

    NathanWolf

    I can't see why not- I could even look for both signatures, make it optional. For that matter, I should also look for parameter-less callbacks, since sometimes you don't really care about the parameters.

    Great suggestion, thanks!
    --- merged: Feb 7, 2011 2:51 AM ---
    Oh, BTW- for what it's worth, you can ask for a PluginData structure by name, and then iterate through its CommandData's.

    I've pretty much mirrored anything you'd find in Command and PluginDescription, so you can already just pull it out of the store.

    I can still see why you'd want the original Command object, in case you need to pass it to something or call one of it's methods, though.
     
  13. Offline

    amkeyte

    I'm keeping two private variables in my main plugin class, messaging and persistence. I did try to pull a refernce from messaging.getGeneralCommand(...).getSubCommand(...) but I got back errors about concurrent access or something. (figured I was doing something wrong, so I didn't report here) It seems from what you say there may be an easier way to get the reference?
     
  14. Offline

    NathanWolf

    Hmmm... I may need to copy some lists, or use a concurrent list. Since the callback is being fired from within a loop that's looking through all the registered commands, things go boom when you try to access that same list. Oops. Anyway, you're not doing anything wrong :)

    If you're looking for a reference back to your plugin, I've got no easy way- I just didn't even think about it, honestly!

    I'll make sure to add that Command parameter option soon- you can get back to Plugin from Command, right?
    --- merged: Feb 7, 2011 4:05 AM ---
    Ugh, persisting a BlockVector has gotten complicated!

    First, I had to implement read-only fields. Since the id for BlockVector is a hash value, I don't ever set it- in fact, there isn't even a reason to read it from the store.

    Anyway, it also doesn't have a setter, which would currently cause Persistence to complain. So, I had to get that working.

    It was also called something ugly like hashValue, and I'd rather just have it called "id"- so now you can add a "name" to PersistField (which I renamed from "Persist", btw) to optionally change the column name it'll bind to.

    And now, to further complicate matters- the data I want is actually getBlockX(), not getX(), etc. And, while there are setX, etc functions, there are not setBlockX, etc- so I now have to support asymmetrical getters/setters, or do some Bukkit coding and request a pull.

    Anyway, just thought I'd check in- I'm extremely motivated to get NetherGate working now that multi-world support is released. DinnerBone was way faster with that than I expected, and I've got a lot of actual teleporting-players-around work I need to do, so Persistence better get up to speed! :)
     
  15. Offline

    amkeyte

    no I don't need that... I would keep a plugin reference privately in whatever object held the commandHandlers. I wouldn't see that as the responsibility of your code.
     
  16. Offline

    WinSock

    umm i cannot get the newest commit to play nice with my plugin. i get this
    Code:
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.CommandSenderData.getId is not persistable, type=java.lang.Str
    ing
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.CommandSenderData.getClassName is not persistable, type=java.l
    ang.String
    2011-02-06 22:17:57 [WARNING] Persistence: class sender has no fields
    2011-02-06 22:17:57 [WARNING] Persistence: Error selecting from table sender: no
     such table: sender
    2011-02-06 22:17:57 [INFO] Persistence version 0.24 failed to initialize
    java.lang.NullPointerException
            at com.elmakers.mine.bukkit.plugins.persistence.core.PersistedClass.addT
    oCache(PersistedClass.java:659)
            at com.elmakers.mine.bukkit.plugins.persistence.core.PersistedClass.put(
    PersistedClass.java:223)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.put(Persiste
    nce.java:200)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.updateComman
    dSender(Persistence.java:427)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.updateGlobal
    Data(Persistence.java:408)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.initialize(P
    ersistence.java:400)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.getInstance(
    Persistence.java:254)
            at com.elmakers.mine.bukkit.plugins.persistence.PersistencePlugin.getPer
    sistence(PersistencePlugin.java:52)
            at com.elmakers.mine.bukkit.plugins.persistence.PersistencePlugin.initia
    lize(PersistencePlugin.java:144)
            at com.elmakers.mine.bukkit.plugins.persistence.PersistencePlugin.onEnab
    le(PersistencePlugin.java:100)
            at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:135)
            at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader
    .java:394)
            at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManage
    r.java:175)
            at org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:64)
            at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:45)
            at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:156)
            at net.minecraft.server.MinecraftServer.c(MinecraftServer.java:143)
            at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:104)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:186)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:512)
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getId is not persistable, type=java.lang.String
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getVersion is not persistable, type=java.lang.Strin
    g
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getDescription is not persistable, type=java.lang.S
    tring
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getAuthors is not persistable, type=java.util.List
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getWebsite is not persistable, type=java.lang.Strin
    g
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getCommands is not persistable, type=java.util.List
    
    2011-02-06 22:17:57 [WARNING] Persistence: Field com.elmakers.mine.bukkit.plugin
    s.persistence.dao.PluginData.getMessages is not persistable, type=java.util.List
    
    2011-02-06 22:17:57 [WARNING] Persistence: class plugin has no fields
    2011-02-06 22:17:57 [WARNING] Persistence: Error selecting from table plugin: no
     such table: plugin
    Feb 6, 2011 10:17:57 PM org.bukkit.craftbukkit.CraftServer loadPlugins
    SEVERE: null (Is it up to date?)
    java.lang.NullPointerException
            at com.elmakers.mine.bukkit.plugins.persistence.core.PersistedClass.addT
    oCache(PersistedClass.java:659)
            at com.elmakers.mine.bukkit.plugins.persistence.core.PersistedClass.put(
    PersistedClass.java:223)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.put(Persiste
    nce.java:200)
            at com.elmakers.mine.bukkit.plugins.persistence.Messaging.<init>(Messagi
    ng.java:46)
            at com.elmakers.mine.bukkit.plugins.persistence.Persistence.getMessaging
    (Persistence.java:51)
            at com.elmakers.mine.bukkit.plugins.persistence.core.PersistenceCommands
    .initialize(PersistenceCommands.java:25)
            at com.elmakers.mine.bukkit.plugins.persistence.PersistencePlugin.initia
    lize(PersistencePlugin.java:144)
            at com.elmakers.mine.bukkit.plugins.persistence.PersistencePlugin.onEnab
    le(PersistencePlugin.java:110)
            at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:135)
            at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader
    .java:394)
            at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManage
    r.java:175)
            at org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:64)
            at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:45)
            at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:156)
            at net.minecraft.server.MinecraftServer.c(MinecraftServer.java:143)
            at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:104)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:186)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:512)
    2011-02-06 22:17:57 [INFO] Done! For help, type "help" or "?"
    
    And yes i updated my plugin reference but its a problem with yours i think. Could you post a working jar please. My plugin is ready for release but i need the latest build.
     
  17. Offline

    NathanWolf

    Now that I'm testing the code, it's clear that there are some really bad bugs in the field-binding code- I'm assuming it's related to the recent refactor, so the last release is OK- but I'm not sure about the git repo, I'm surprised things aren't really wonky for the people who were brave enough to pull my last checkin :)

    I'm hoping to have a new version ready soon- I'm testing BlockVector persistence now. I'll probably check a version in once that's working (and everything else seems good), and then get to work on the object-as-id bug and float value bugs... then I'm hoping to get some NetherGate work done, since I think that's all it needs to get going.
    --- merged: Feb 7, 2011 4:30 AM ---
    Aaahhhhhh.... Messaging has one, i think. I could add an accessor- but then, do you have access to Messaging in your callbacks? Depends on your setup, really.

    Would it be easier to just pass a reference to your plugin to whatever is handling your events? I think that's what I do, more or less.
    --- merged: Feb 7, 2011 4:31 AM ---

    Sorry! I'm hoping to have that fixed within minutes... I just ran into it myself, and came here to warn you- too late!
    --- merged: Feb 7, 2011 5:17 AM ---
    Ok, I just pushed to my repo, it should fix this. I realize it's late (I'm West-Coast USA, so not too bad here), so you may not get it until tomorrow- at which point I'll hopefully have an official release ready.

    I'm going to start doing some real testing soon, working on NetherGate, so I'm hoping it'll stabilize quickly (for my sake, too, I'm itching to get back to game code!)
    --- merged: Feb 7, 2011 7:43 AM ---
    Ok, here you go! Download the latest jar, or update from source.

    I'm honestly not too confident in the stability of this build, but I've tested it a bit and it seems to be working.

    I know there are some issues with contained name generation- I need to suffix the fields using the container field name, otherwise there can be conflicts. So, I think there are still some bugs with that- if you're using contained objects, and it's working, you may want to wait for 0.26 ...

    If you're just referencing things, you should be fine.

    BlockVector is in here, but it doesn't seem to be working- though I'm trying to contain it (player class, moves around a lot) so it's hard to tell which part is actually broken.

    My brain's all melty. Hopefully I can get some time to work on this during the work-week... I'm going to be really sad if someone beats me to the punch on a cross-world plugin. I think it's probably happened already! :(
    --- merged: Feb 7, 2011 7:45 AM ---
    Oh, and, finally (for the night) - note that some stuff was renamed, so you'll have to update your code a bit.

    "Persist" is now "PersistField", and "Messaging" is now PluginUtilities, obtained via getUtilities.

    Good night!
     
  18. Offline

    PierreLouis

    So this is only for plugin devs, right?
     
  19. Offline

    NathanWolf

    Right-o!

    Though, once there are plugins out there that use it, you may want to familiarize yourself with the /persist and /phelp console commands.
     
  20. Offline

    PierreLouis

    OK thanks.
     
  21. Offline

    WinSock

    I see you refactored Messaging to PluginUtilites and i refactored my code but im getting a spew of messages like this
    Code:
    2011-02-07 14:41:42 [WARNING] Persistence error getting field command for comman
    d: null
    2011-02-07 14:41:42 [WARNING] Persistence error getting field plugin for command
    : null
    2011-02-07 14:41:42 [WARNING] Persistence error getting field parent for command
    : null
    2011-02-07 14:41:42 [WARNING] Persistence error getting field tooltip for comman
    d: null
    2011-02-07 14:41:42 [WARNING] Persistence error getting field enabled for comman
    d: null
    
    and it repeats for each command registering i think.
     
  22. Offline

    NathanWolf

    Hopefully that will resolve if you delete global.db?

    If not then... hm... I may have an issue.
     
  23. Offline

    WinSock

    Duh y didn't i think of that :p Now it works great! Thanks for all of your hard work!
    --- merged: Feb 7, 2011 9:00 PM ---
    Ok another problem it dosent effect anything that i can see but this happens after a unclean stop of the server.
    Code:
    2011-02-07 14:59:03 [WARNING] Persistence error getting field position for playe
    r: null
    2011-02-07 14:59:03 [WARNING] Persistence error getting field orientation for pl
    ayer: null
    
     
  24. Offline

    NathanWolf

    Whew! :) No problem, thanks!

    Yah- I need to fix this.... apparently I still have float problems :p

    EDIT: hm, looking closer at your debug log, it like position isn't loading either- I didn't notice that. That's more... bad... and BlockVectors should be persisted as ints, so I can't explain that away with the float issue :)

    I need that playerlocation to work for NetherGate. So, yeah, I'll be figuring that one out soon- thanks for pointing it out!

    I think I know what to do- I'm going to touch that area soon to try to support enums anyway- hopefully it'll go away in the next release.

    It just means that the player orientation isn't loading right, which isn't a big deal if you're not using it.

    Oh, and yeah- once NetherGate is released, getting data migration to work is my #1 priority. Things are going to get seriously messy once databases start being "out there". Especially since I'm using global vectors in NetherGate.... I can't just tell people to delete global.db... so it becomes keeping track of when entities change and then having release notes telling people to use /persist RESET <entity>... not a great situation to be in.

    I don't never want to have to give out sql scripts to admins for updating- I think that's one of the major things people really hated about mysql in hMod.
     
  25. Offline

    WinSock

    Ok new error i think its somthing im doing by my list objects wont persist all of a sudden!
    Code:
    2011-02-07 16:37:47 [WARNING] Persistence: Field com.bukkit.WinSock.ProtectedDoo
    rs.DoorObject.getGroups is not persistable, type=java.util.List
    2011-02-07 16:37:47 [WARNING] Persistence: Field com.bukkit.WinSock.ProtectedDoo
    rs.DoorObject.getUsers is not persistable, type=java.util.List
    
    https://github.com/winsock/Protecte...bukkit/WinSock/ProtectedDoors/DoorObject.java

    Edit:
    Also i noticed that Loading Terrain takes a long time using your plugin.

    Edit 2:
    Forget the first part i figured it out :p
     
  26. Offline

    NathanWolf

    Hm- no idea why this would be! I don't actually do anything on chunk load- NetherGate will, but it should be cheap.
     
  27. Offline

    WinSock

    Ignore that statement its just the slow internet i have :p and my plugin is seconds away from prime time. I just have to implement backwards compatibility and i'm good :p
     
  28. Offline

    NathanWolf

    Awesome! Congrats!

    Persistence just got a big update- lots of stability improvements. I'll update the OP in a bit, but check the changelog if you're interested. The jar is live.
    --- merged: Feb 8, 2011 1:52 PM ---
    Finally got a chance to get the javadocs and OP updated for 0.26! Let me know if you notice any inaccuracies or inconsistencies. Thanks!

    Also, 0.26 is (I think) a really good update. I completely changed the way I handle primitive type casting (darn floats!), and I think it's much more solid now. I also support persisting enums, which is handy.

    And, @WinSock- this also included BlockVector support, and I fixed the bug about using an object as an id.

    I'm now using BlockVector internally (see PlayerData), and I'm also using an object (PlayerData, in fact) as an id in NetherGate- so I'm sure both of these work separately, I just haven't tried combining them yet- definitely an edge case. Let me know if you switch your DoorObject id to use BlockVector, and if it works :)
    --- merged: Feb 8, 2011 2:15 PM ---
    Oh!

    Also, this release supports multi-world! Like, easily. So, if you're interested in that sort of thing...

    It manages worlds for you, so you don't have to worry about double-registering (I think DinnerBone may have fixed that internally already anyway, but still).

    And then, of course, managed worlds are persisted as data- check out the built-in WorldData class, and the functions in PluginUtilities to get or create worlds.

    This is particularly important to someone like @WinSock - you will want to store a WorldData refence in each of your DoorObjects to keep track of which world they're from!

    Ok, got to go to work now (real work)... enjoy!
     
  29. Offline

    WinSock

    Hey nathan this plugin slows down my server like crazy. Could you multi thread it please :p.
    Or seperate the parts in the plugin. When i slimmed down you plugin just to the base part of saving data without any of the extra features like messaging / player storage / command storage(i.e. no global.db). The plugin was really fast.
     
  30. Offline

    NathanWolf

    Hm...

    Not really sure why it would do that- it shouldn't do that at all, in fact.

    Persistence is just a framework- it does nothing unless you ask it to, other than load a very small set of global data on startup.

    Are you doing something crazy in your plugin like calling .save() onPlayerMove? :)
     
  31. Offline

    WinSock

    no, i tested this behavior with just persistence and logging in with and without the plugin. Maybe its just a overload on minecrafts server because without online mode(no auth) i can login really fast.
     

Share This Page