Posted August 18, 201312 yr Hello everyone. I'm trying to set an NBT Tag for just one player. It works, but it also proceeds to set the same tag and value for each player that signs on afterward in this world. The setElement method: public static void setElement(EntityPlayer player, String element) { String Element = null; NBTTagCompound nbt = player.getEntityData(); if (Arrays.asList(BendingCommand.airbendingAliases).contains(element)) Element = "air"; if (Arrays.asList(BendingCommand.waterbendingAliases).contains(element)) Element = "water"; if (Arrays.asList(BendingCommand.earthbendingAliases).contains(element)) Element = "earth"; if (Arrays.asList(BendingCommand.firebendingAliases).contains(element)) Element = "fire"; if (Arrays.asList(BendingCommand.chiblockingAliases).contains(element)) Element = "chi"; nbt.setString("Element", Element); } The method is only called via the command, which can be found here: package com.etriacraft.bending; import java.util.Arrays; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChatMessageComponent; public class BendingCommand extends CommandBase { //Command Aliases public static String[] chooseAliases = {"choose", "ch", "c"}; public final static String[] airbendingAliases = { "air", "a", "airbender", "airbending", "airbend" }; public final static String[] earthbendingAliases = { "earth", "e", "earthbender", "earthbending", "earthbend" }; public final static String[] firebendingAliases = { "fire", "f", "firebender", "firebending", "firebend" }; public final static String[] waterbendingAliases = { "water", "w", "waterbender", "waterbending", "waterbend" }; public final static String[] chiblockingAliases = { "chi", "c", "chiblock", "chiblocker", "chiblocking" }; @Override public String getCommandName() { return "bending"; } @Override public String getCommandUsage(ICommandSender icommandsender) { // TODO Auto-generated method stub return null; } @Override public void processCommand(ICommandSender icommandsender, String[] args) { if (!(icommandsender instanceof EntityPlayer)) { return; } EntityPlayer player = (EntityPlayer) icommandsender; if (args.length == 0) { player.addChatMessage("§4/bending choose [element] §f- Picks an element."); player.addChatMessage("§4/bending who [Player] §f- Show a player's element."); return; } if (Arrays.asList(chooseAliases).contains(args[0])) { if (args.length != 2) { player.addChatMessage("§eProper Usage: /bending choose [Air|Water|Earth|Fire|Chi]"); return; } if (BendingMethods.hasElement(player)) { player.addChatMessage("§eYou already have an element."); return; } if (Arrays.asList(airbendingAliases).contains(args[1])) { BendingMethods.setElement(player, "air"); player.addChatMessage("§eYou are now an §7airbender."); BendingPlayerTracker.benders.put(player.username, "air"); return; } if (Arrays.asList(waterbendingAliases).contains(args[1])) { BendingMethods.setElement(player, "water"); player.addChatMessage("§eYou are now a §bwaterbender."); BendingPlayerTracker.benders.put(player.username, "water"); return; } if (Arrays.asList(earthbendingAliases).contains(args[1])) { BendingMethods.setElement(player, "earth"); player.addChatMessage("§eYou are now an §aearthbender."); BendingPlayerTracker.benders.put(player.username, "earth"); return; } if (Arrays.asList(firebendingAliases).contains(args[1])) { BendingMethods.setElement(player, "fire"); player.addChatMessage("§eYou are now a §cfirebender."); BendingPlayerTracker.benders.put(player.username, "fire"); return; } if (Arrays.asList(chiblockingAliases).contains(args[1])) { BendingMethods.setElement(player, "chi"); player.addChatMessage("§eYou are now a §6chiblocker."); BendingPlayerTracker.benders.put(player.username, "chi"); } else { player.addChatMessage("§eProper Usage: /bending choose Air|Water|Earth|Fire|Chi"); return; } } } } Anyway, this is using the latest Recommended version. The method works and it sets the element as it should. HOWEVER, every player that signs on after that player into that world will have that same element. Thanks in advance for any help.
August 19, 201312 yr cant you just use a IPlayertracker to override whatever this weird system does ? like manually place a starting element ? how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author I want the user to pick their starting element. The problem is that upon picking, it sets it for any other players that join the world as well.
August 19, 201312 yr yeah, sooo why dont you set a starting element for everyone with a IPlayerTracker, then tell new players to call that command to pick one. how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr The errors I can see: -checking twice if string is in the array of aliases -sending chat messages instead of using the WrongUsageException tool -making arrays and converting them to lists instead of using lists directly -not making Element as an object, thus resulting in use of static methods and multiple side checks As for your issue, it can in if (BendingMethods.hasElement(player)) but can't be sure without the code.
August 19, 201312 yr Author The errors I can see: -checking twice if string is in the array of aliases -sending chat messages instead of using the WrongUsageException tool -making arrays and converting them to lists instead of using lists directly -not making Element as an object, thus resulting in use of static methods and multiple side checks As for your issue, it can in if (BendingMethods.hasElement(player)) but can't be sure without the code. My hasElement Method looks like so: public static boolean hasElement(EntityPlayer player) { if (player.getEntityData().hasKey("Element")) { return true; } return false; } yeah, sooo why dont you set a starting element for everyone with a IPlayerTracker, then tell new players to call that command to pick one. Is there any way to check if a player has ever played this world before? Was looking in the Forge Javadocs for something along the lines of player.hasPlayedBefore or whatever. (Bukkit has one and I'm much more used to Bukkit). If I can find a method to check if the player is new, then a "dummy" element could be set.
August 19, 201312 yr yeah we noticed your a bukkit coder, you're using commands .... but you could always just set a boolean in the nbt to true if the player has played. and check with the IPlayerTracker if its true when he enters the world how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author yeah we noticed your a bukkit coder, you're using commands .... but you could always just set a boolean in the nbt to true if the player has played. and check with the IPlayerTracker if its true when he enters the world The PlayerTracker Check @Override public void onPlayerLogin(EntityPlayer player) { if (BendingMethods.hasPlayed(player)) { player.addChatMessage("You've played before."); } else { player.addChatMessage("You have not played before."); player.getEntityData().setBoolean("BendingData.PlayedBefore", true); } } And the hasPlayed Method: public static boolean hasPlayed(EntityPlayer player) { if (player.getEntityData().hasKey("BendingData.PlayedBefore")) { return true; } else { return false; } } This is doing the same thing. Player1 signs on, it sends them the message that they have not played before, then sets the boolean to true. I log out, all is good. I sign in with a different username, say, Player2, and it tells Player2 that they have already played.
August 19, 201312 yr are you starting a server and 2 client or only the client program ? how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author are you starting a server and 2 client or only the client program ? I'm only opening the Client via Eclipse.
August 19, 201312 yr someone correct me if im wrong but i think every client use the exact same player.dat try it with a real server software and 2 client (you can open the server via ecipse by pressing the smaller arrow next to the green one) how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 19, 201312 yr Author That fixes it. I guess the problem is with Single player and not the server. And I have no reason to check for changes if you're using single player. Thanks a ton! +1
August 19, 201312 yr well the way you are describing this it seems your mod is made for smp so yeah always use the real server software when testing stuff like this how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
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.