Posted January 27, 201510 yr Basically ani-logout system. I want that if ExtendedPlayer.get(player).canLogOut() is false, player will be locked for let's say 10sec after he disconnects. I mean: client can disconnect in any way - exiting game or closing it, but server will spawn some fake player and keep it for 10sec. Critical points: I have 3 ideas: 1. - How to not-remove EntityPlayer from entity list? - If i could do this, whole problem becomes very easy to resolve. 2. (If I can't keep real player, like in 1.) - Should I spawn new EntityPlayer and clone() data from old one via PlayerLoggedOutEvent and operate on new entity. - In this case - since they are clons, will this give me ability to edit "real" player's .dat file? (I mean, when I remove new clonned EntityPlayer, will it call saveNBT() like "real" one would - keeping the player/session UUID)? - If I remove clonned EntityPlayer - will it call PlayerLoggedOutEvent and make finite loop (until player#canLogOut()), OR PlayerLoggedOutEvent is only called on disconnect? 3. Use some kind of Abstract/Fake Player, I heard Forge has some class with this name, I have no idea what's the use of it. Okay so, please post you knowledge/ideas/critical-points. Thanks all 1.7.10 is no longer supported by forge, you are on your own.
January 27, 201510 yr Why do you want to keep "the player" logged in for an extra 10 seconds after they disconnect? Don't make mods if you don't know Java. Check out my website: http://shadowfacts.net Developer of many mods
January 27, 201510 yr Author Read again, you will know, literally 1st sentence. Anyone has something? 1.7.10 is no longer supported by forge, you are on your own.
January 27, 201510 yr Yes, but why do you want to prevent the player from logging out? Depending on what your final goal is, there might be a better way to do this. Don't make mods if you don't know Java. Check out my website: http://shadowfacts.net Developer of many mods
January 27, 201510 yr Author Dude, there is NO "better" way to do this. I need EntityPlayer to be IN WORLD and be treaten like you never logged out (killable, movable) after session is ended. That is literally what it means to have "ani-logout system", you can't run from combat, can't logout if threatened, can't logout with poison on you (to escape some player that want to loot you). I'd like straight from-experience answers to this thread, or idea other than mine, or why mine wouldn't work. Thanks for help 1.7.10 is no longer supported by forge, you are on your own.
January 27, 201510 yr You are being fairly rude. If you decide you want to change your attitude, there is a simple way to do it. Long time Bukkit & Forge Programmer Happy to try and help
January 27, 201510 yr Author Damn, I felt like I am kinda of charging here after re-reading, but that wasn't my intention. Sry to offended. Anyway, any further help still appreciated. 1.7.10 is no longer supported by forge, you are on your own.
January 27, 201510 yr Maybe you can try to catch the GuiOpenEvent , check if the event.gui==GuiIngameMenu and then use event.gui.buttonList.set(0,button) with the a button overriding the onActionPerformed method to first check if you can log out, and if so, proceed, else cancel. Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support. 1.12 -> 1.13 primer by williewillus. 1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support. http://www.howoldisminecraft1710.today/
January 27, 201510 yr Author That's Client-side, I need server-side solution. You can close game without pressing "Quit Game" button. If you do that client will never send disconnect info, therefore player will still be logged on server and server will throw UnexpectedConnection error and kick player after short while. But that's not what I want. I need player to presist as long as I need him too (not too long ofc, few, maybe dozen of seconds). To post above - he posed to right topic (i mean, hopefully), just from different point of view (client). 1.7.10 is no longer supported by forge, you are on your own.
January 27, 201510 yr Here is how to do it in 1.7.2, you will have to leverage changes from 1.7.10 Setup event for player logout and record the players name and inventory. If you are having trouble getting the inventory before logout, something like this may help. In the below example skin is the players name // Get NBT data NBTTagCompound nbt = instance.player_manager().player_nbt(skin); // Check for null if (nbt != null) { // Get Inventory tag NBTTagList nbttaglist = nbt.getTagList("Inventory", 10); // Read into it inventory.readFromNBT(nbttaglist); } Spawn a Custom NPC with the skin (name) of the player. - you need a datawatcher to move the skin name over to the client side - Give the npc the inventory, weapons ect from what you saved above - on the custom render for the npc look up the skin, you can look up skin with this // Get the skin location texture = new ResourceLocation("skins/" + StringUtils.stripControlCodes(name)); // Download the skin ThreadDownloadImageData skin = getDownloadImageSkin(texture, name); Put a timer in the NPC logic for how long you want it to exist. Watch for if someone or something kills it. If so, erase the players inventory on the server. To find the players data you can adapt some code I had to move the player out of a deleted dimension. public void offlinePlayerDimension_Check() { // Setup Variables String base = "[Player_Manager][offlinePlayerDimension_Check] : "; SaveHandler saveHandler = (SaveHandler) DimensionManager.getWorld(0).getSaveHandler(); // Create high level Directory File player_directory = new File(saveHandler.getWorldDirectory(), "players"); // Cycle through stored players String[] players = saveHandler.getAvailablePlayerDat(); for (String item : players) { // Get the NBT Data NBTTagCompound tag = saveHandler.getPlayerData(item); // Grab the current dimension int current_dimension = tag.getInteger("Dimension"); // Grab the home world World world = instance.functions_common().find_world(0); // If the Dimension does not exists, move the player if (!instance.functions_common().dimension_check(current_dimension)) { // Set to safe dimension tag.setInteger("Dimension", 0); // Set to spawn tag.setTag("Pos", this.newDoubleNBTList(new double[] {world.getWorldInfo().getSpawnX(), world.getWorldInfo().getSpawnY() + 1.0d, world.getWorldInfo().getSpawnZ()})); // Try and save the data try { // Make a temporary file File file1 = new File(player_directory, item + ".dat.tmp"); // Grab the old file File file2 = new File(player_directory, item + ".dat"); // Write to the new file CompressedStreamTools.writeCompressed(tag, new FileOutputStream(file1)); // See if the file exists and remove it if (file2.exists()) { file2.delete(); } // Move the file name over file1.renameTo(file2); // notify the system instance.logger.warn(base + "Moved player " + item + " from non-Dimension " + current_dimension); } catch (Exception e) { // notify the system instance.logger.warn(base + "Failed to mov player " + item + " from non-Dimension " + current_dimension); } } } } Long time Bukkit & Forge Programmer Happy to try and help
January 27, 201510 yr Author @diesieben07 "You won't get around making a new entity most likely. In that entity..." So either I missunderstood or you ment "will" not "won't", doesn't matter - I'll probably get around faking player anyway. @delpi Problem here is not with loading/saving even not copying data and keeping it. Main thing I am worried is one you didn't place in you post - how to fake EntityPlayer. Ofc thanks for your post Spawning an EntityPlayer and putting data from EntityPlayer (clonning) that logged out brought me questions about how it will be handled by game. EntityPlayer is quite an unique object (one per session) which left me with questions about what happens to stuff like playerUUIDs (which is held not-in EntityPlayer) or playerIP. In the end I'll probably just get it done like in "idea 2." and see what happens. If I can't save that data I'll probably use some caching that will be read on rejoin like diesieben suggested. Any further knowledge ofc always appreciated. 1.7.10 is no longer supported by forge, you are on your own.
January 27, 201510 yr I did tell you how, read again. Hint on what to read again "Spawn a Custom NPC with the skin (name) of the player" Long time Bukkit & Forge Programmer Happy to try and help
January 27, 201510 yr Author If by Custom NPC you mean EntityPlayer then yeah, that's what I'll do. "Im pretty sure the mod Sync uses this aswell" Love you, checking out Repo right now I'll just experiment a bit and post solutions/questions later Thanks all. 1.7.10 is no longer supported by forge, you are on your own.
January 28, 201510 yr By Custom_NPC, i meant Custom_NPC. I've never like the result of making a fake player. I've found it much easier to create an NPC that will act like a player, stick a nametag above it, and copy the inventory over. Long time Bukkit & Forge Programmer Happy to try and help
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.