Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

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.

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-

  • 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.

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-

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.

  • 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.

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-

  • 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.

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-

  • Author

are you starting a server and 2 client or only the client program ?

 

I'm only opening the Client via Eclipse.

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-

  • 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

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.