Jump to content

NBT Tag setting for all players that join the world, not just one


MistPhizzle

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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-

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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-

Link to comment
Share on other sites

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Compare this list (client-side-only mods) with your mods: https://www.dropbox.com/scl/fi/yeldxfv8ed60e4uflc2fi/Client-Side-Only-Modlist.xlsx?rlkey=8376c5bk7b33je2tad4p3ybrg&st=qf6osvit&dl=0  
    • Crashlog: https://paste.ee/p/WrGYD I'm thinking the problem might be a client side mod but ive already checked the mod list like 5 times and still cant find the problem
    • I'm unable to join my local forge servers. When running my forge servers of seemingly any version (tested 1.18 to 1.21.1) I get an error message [Forge Version Check/WARN] [ne.mi.fm.VersionChecker/]: Failed to process update information The server continues to start up and run, however I'm unable to join. Looking for solutions? Full error message: (note last "thead warning" error seems to be unrelated and only happened once for 1.20.1) Forge version check warning has happened for every version. [09:52:31] [Forge Version Check/WARN] [ne.mi.fm.VersionChecker/]: Failed to process update information java.net.http.HttpConnectTimeoutException: HTTP connect timed out         at jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:950) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133) ~[java.net.http:?] {}         at net.minecraftforge.fml.VersionChecker$1.openUrlString(VersionChecker.java:142) ~[fmlcore-1.20.1-47.3.10.jar%23102!/:?] {}         at net.minecraftforge.fml.VersionChecker$1.process(VersionChecker.java:180) ~[fmlcore-1.20.1-47.3.10.jar%23102!/:?] {}         at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] {}         at net.minecraftforge.fml.VersionChecker$1.run(VersionChecker.java:117) ~[fmlcore-1.20.1-47.3.10.jar%23102!/:?] {} Caused by: java.net.http.HttpConnectTimeoutException: HTTP connect timed out         at jdk.internal.net.http.ResponseTimerEvent.handle(ResponseTimerEvent.java:68) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl.purgeTimeoutsAndReturnNextDeadline(HttpClientImpl.java:1788) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1385) ~[java.net.http:?] {} Caused by: java.net.ConnectException: HTTP connect timed out         at jdk.internal.net.http.ResponseTimerEvent.handle(ResponseTimerEvent.java:69) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl.purgeTimeoutsAndReturnNextDeadline(HttpClientImpl.java:1788) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1385) ~[java.net.http:?] {} [09:52:31] [Yggdrasil Key Fetcher/ERROR] [mojang/YggdrasilServicesKeyInfo]: Failed to request yggdrasil public key com.mojang.authlib.exceptions.AuthenticationUnavailableException: Cannot contact authentication server         at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:119) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:91) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo.fetch(YggdrasilServicesKeyInfo.java:94) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo.lambda$get$1(YggdrasilServicesKeyInfo.java:81) ~[authlib-4.0.43.jar%2375!/:?] {}         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[?:?] {}         at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[?:?] {}         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?] {}         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?] {}         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?] {}         at java.lang.Thread.run(Thread.java:1575) ~[?:?] {} Caused by: java.net.SocketTimeoutException: Connect timed out         at sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546) ~[?:?] {}         at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:592) ~[?:?] {}         at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?] {}         at java.net.Socket.connect(Socket.java:760) ~[?:?] {}         at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304) ~[?:?] {}         at sun.net.NetworkClient.doConnect(NetworkClient.java:178) ~[?:?] {}         at sun.net.www.http.HttpClient.openServer(HttpClient.java:531) ~[?:?] {}         at sun.net.www.http.HttpClient.openServer(HttpClient.java:636) ~[?:?] {}         at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) ~[?:?] {}         at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:377) ~[?:?] {}         at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1273) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1114) ~[?:?] {}         at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1676) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1600) ~[?:?] {}         at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:223) ~[?:?] {}         at com.mojang.authlib.HttpAuthenticationService.performGetRequest(HttpAuthenticationService.java:140) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:96) ~[authlib-4.0.43.jar%2375!/:?] {}         ... 9 more [09:52:31] [Server thread/WARN] [minecraft/MinecraftServer]: Can't keep up! Is the server overloaded? Running 5985ms or 119 ticks behind
    • Remove the mod tempad from the mods-folder
    • Hi, deleting the config folder did not appear to work, what mod are you referring to I could try to delete to fix the problem?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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