Jump to content

Recommended Posts

Posted

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.

Posted

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-

Posted

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-

Posted

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.

Posted

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.

Posted

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-

Posted

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.

Posted

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-

Posted

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.