Jump to content

Recommended Posts

Posted (edited)

I am having problems with my custom ArgumentType(s) not serializing when running my mod on a server. It works fine on single player because there is not serialization required.

 

Log:

[00:00:24] [Server thread/INFO]: Made X_ZombieSlayer_X a server operator
[00:00:24] [Netty Server IO #4/ERROR]: Could not serialize mod.ranks.commands.RankArgument@3f19c861 (class mod.ranks.commands.RankArgument) - will not be sent to client!
[00:00:24] [Netty Server IO #4/ERROR]: Could not serialize mod.ranks.commands.RankArgument@72f73fc4 (class mod.ranks.commands.RankArgument) - will not be sent to client!
[00:00:24] [Netty Server IO #4/ERROR]: Could not serialize mod.ranks.commands.RankArgument@78019307 (class mod.ranks.commands.RankArgument) - will not be sent to client!
[00:00:24] [Netty Server IO #4/ERROR]: Could not serialize mod.commands.base.ModCommandArgument@5ff1379e (class mod.commands.base.ModCommandArgument) - will not be sent to client!
[00:00:24] [Netty Server IO #4/ERROR]: Could not serialize mod.commands.base.ModCommandArgument@27d41c38 (class mod.commands.base.ModCommandArgument) - will not be sent to client!

 

RankArgument:

  Reveal hidden contents

 

ModCommandArgument:

  Reveal hidden contents

 

Like I said before it works great on single player. I just need to get multiplayer working. Any help would be much appreciated. Seems like I need to call ArgumentTypes.register() but I am a bit confused on the arguments. Can someone please explain? Do I need a custom ArgumentSerializer?

Edited by X_ZombieSlayer_X
English and better info!
  • X_ZombieSlayer_X changed the title to Custom ArgumentType(s) not Serializing!
Posted
  On 9/3/2021 at 7:33 AM, diesieben07 said:

Actually I just noticed this is missing enqueueWork.

Expand  

I thought enqueueWork was for modifying existing attributes? I am just needing tab-complete suggestions to work on multiplayer. The commands run and operated as expected but they just appear red on multiplayer do to my lack of an ArgumentSerializer. If you could explain in further detail why it would be a good idea to include enqueuWork, that would be much appreciated!

 

  On 9/3/2021 at 7:22 AM, diesieben07 said:
Expand  

I will take a look and create my custom serializer ! Thanks.

Posted
  On 9/3/2021 at 2:35 PM, diesieben07 said:

enqueueWork is when you need to interact with things that are not thread safe (such as registering argument types) from a parallel mod loading event (such as FMLCommonSetupEvent). It has nothing to do with attributes. What I meant is that the forge code I linked is missing enqueueWork.

Expand  

Ah, thank you for the enlightenment and help!

 

Posted (edited)
  On 9/3/2021 at 7:22 AM, diesieben07 said:
Expand  

I made one that should replace both my ranks and modcommands argumenttype. It is no longer throwing errors/or red(invalid command), however, I can't see the suggestions. No suggestions are being listed(on multiplayer) and I am not sure why?

Here is my new code:

public class IterableArgumentType implements ArgumentType<String>{

	private Iterable<String> choices;
	
	private IterableArgumentType(Iterable<String> choices) {	
		this.choices = choices;
	}
	
	public static IterableArgumentType choices(Iterable<String> choices) {
		return new IterableArgumentType(choices);
	}
	
	public static String getChoice(CommandContext<CommandSourceStack> commandContext, String name) {
	      return commandContext.getArgument(name, String.class);
	}
	
	@Override
	public String parse(StringReader reader) throws CommandSyntaxException {
		String string = reader.readString();
		return string;
	}

	public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> commandContext, SuggestionsBuilder suggestionBuilder) {
		return SharedSuggestionProvider.suggest(choices, suggestionBuilder);
	}
	
	public Iterable<String> getChoices(){
		return choices;
	}
	
	public static class Serializer implements ArgumentSerializer<IterableArgumentType>{
		
		private String delimiter = ".";
		
		public String convertToString(Iterable<String> choices) {
			StringBuilder builder = new StringBuilder();
			
			ArrayList<String> array_choices = new ArrayList<String>();
			for(String choice : choices) {
				array_choices.add(choice);
			}
			for(int i = 0; i < array_choices.size(); i++) {
				builder.append(array_choices.get(i));
				if(i != array_choices.size()-1) {
					builder.append(delimiter);
				}
			}
			
			return builder.toString();
		}
		
		public Iterable<String> convertToIterable(String choices){
			String[] array_choices = choices.split(delimiter);
			
			Hashtable<String, Byte> hashtable_choices = new Hashtable<String, Byte>();
			for(String choice : array_choices) {
				hashtable_choices.put(choice, (byte) 0);
			}
			
			return hashtable_choices.keySet();
		}
		
        @Override
        public void serializeToNetwork(IterableArgumentType argument, FriendlyByteBuf buffer)
        {
            buffer.writeUtf(convertToString(argument.getChoices()));
        }

        @Override
        public IterableArgumentType deserializeFromNetwork(FriendlyByteBuf buffer)
        {
            String utf = buffer.readUtf();
			return new IterableArgumentType(convertToIterable(utf));
        }

        @Override
        public void serializeToJson(IterableArgumentType argument, JsonObject json)
        {
            json.addProperty("iterableargumenttype", convertToString(argument.getChoices()));
        }
    }
}

 Any ideas as to why it is not suggesting anything?

Edited by X_ZombieSlayer_X
Fixing errors
Posted
  On 9/4/2021 at 8:22 AM, diesieben07 said:

I don't see anything wrong, no.

Expand  

So I did a bit of primitive debugging(printing out from serializer methods). The server is sending information but the client is not deserializing the data for whatever reason.

Client Log:

[16:47:49] [Netty Client IO #2/INFO]: Connected to a modded server.
[04Sep2021 16:47:50.587] [Render thread/INFO] [com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService/]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD'
[16:47:51] [Render thread/INFO]: Loaded 0 advancements
[16:48:08] [Render thread/INFO]: [CHAT] §8[default]§f<X_ZombieSlayer_X> test
[16:48:14] [Render thread/INFO]: Stopping!

Server Log:

[16:47:49] [Server thread/INFO]: X_ZombieSlayer_X joined the game
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
[16:48:08] [Server thread/INFO]: º8[default]ºf<X_ZombieSlayer_X> test
[16:48:11] [Server thread/INFO]: X_ZombieSlayer_X lost connection: Disconnected
[16:48:11] [Server thread/INFO]: X_ZombieSlayer_X left the game

Serializer:

public static class Serializer implements ArgumentSerializer<IterableArgumentType>{
		
		private String delimiter = ".";
		
		public String convertToString(Iterable<String> choices) {
			StringBuilder builder = new StringBuilder();
			
			ArrayList<String> array_choices = new ArrayList<String>();
			for(String choice : choices) {
				array_choices.add(choice);
				System.out.println("seserializeToNetwork:"+choice);
			}
			for(int i = 0; i < array_choices.size(); i++) {
				builder.append(array_choices.get(i));
				if(i != array_choices.size()-1) {
					builder.append(delimiter);
				}
			}
			
			return builder.toString();
		}
		
		public Iterable<String> convertToIterable(String choices){
			String[] array_choices = choices.split(delimiter);
			
			Hashtable<String, Byte> hashtable_choices = new Hashtable<String, Byte>();
			for(String choice : array_choices) {
				System.out.println("deserializeFromNetwork:"+choice);
				hashtable_choices.put(choice, (byte) 0);
			}
			
			return hashtable_choices.keySet();
		}
		
        @Override
        public void serializeToNetwork(IterableArgumentType argument, FriendlyByteBuf buffer)
        {
            buffer.writeUtf(convertToString(argument.getChoices()));
        }

        @Override
        public IterableArgumentType deserializeFromNetwork(FriendlyByteBuf buffer)
        {
            String utf = buffer.readUtf();
			return new IterableArgumentType(convertToIterable(utf));
        }

        @Override
        public void serializeToJson(IterableArgumentType argument, JsonObject json)
        {
            json.addProperty("iterableargumenttype", convertToString(argument.getChoices()));
        }
    }

I should be hitting the println("deserializeFromNetwork:"+choice) but the client is outputting nothing?

Posted
  On 9/4/2021 at 8:22 AM, diesieben07 said:

I don't see anything wrong, no.

Expand  

 

  On 9/4/2021 at 9:53 PM, X_ZombieSlayer_X said:

So I did a bit of primitive debugging(printing out from serializer methods). The server is sending information but the client is not deserializing the data for whatever reason.

Client Log:

[16:47:49] [Netty Client IO #2/INFO]: Connected to a modded server.
[04Sep2021 16:47:50.587] [Render thread/INFO] [com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService/]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD'
[16:47:51] [Render thread/INFO]: Loaded 0 advancements
[16:48:08] [Render thread/INFO]: [CHAT] §8[default]§f<X_ZombieSlayer_X> test
[16:48:14] [Render thread/INFO]: Stopping!

Server Log:

[16:47:49] [Server thread/INFO]: X_ZombieSlayer_X joined the game
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
seserializeToNetwork:ench
seserializeToNetwork:rename
[16:48:08] [Server thread/INFO]: º8[default]ºf<X_ZombieSlayer_X> test
[16:48:11] [Server thread/INFO]: X_ZombieSlayer_X lost connection: Disconnected
[16:48:11] [Server thread/INFO]: X_ZombieSlayer_X left the game

Serializer:

public static class Serializer implements ArgumentSerializer<IterableArgumentType>{
		
		private String delimiter = ".";
		
		public String convertToString(Iterable<String> choices) {
			StringBuilder builder = new StringBuilder();
			
			ArrayList<String> array_choices = new ArrayList<String>();
			for(String choice : choices) {
				array_choices.add(choice);
				System.out.println("seserializeToNetwork:"+choice);
			}
			for(int i = 0; i < array_choices.size(); i++) {
				builder.append(array_choices.get(i));
				if(i != array_choices.size()-1) {
					builder.append(delimiter);
				}
			}
			
			return builder.toString();
		}
		
		public Iterable<String> convertToIterable(String choices){
			String[] array_choices = choices.split(delimiter);
			
			Hashtable<String, Byte> hashtable_choices = new Hashtable<String, Byte>();
			for(String choice : array_choices) {
				System.out.println("deserializeFromNetwork:"+choice);
				hashtable_choices.put(choice, (byte) 0);
			}
			
			return hashtable_choices.keySet();
		}
		
        @Override
        public void serializeToNetwork(IterableArgumentType argument, FriendlyByteBuf buffer)
        {
            buffer.writeUtf(convertToString(argument.getChoices()));
        }

        @Override
        public IterableArgumentType deserializeFromNetwork(FriendlyByteBuf buffer)
        {
            String utf = buffer.readUtf();
			return new IterableArgumentType(convertToIterable(utf));
        }

        @Override
        public void serializeToJson(IterableArgumentType argument, JsonObject json)
        {
            json.addProperty("iterableargumenttype", convertToString(argument.getChoices()));
        }
    }

I should be hitting the println("deserializeFromNetwork:"+choice) but the client is outputting nothing?

Expand  

Found solution! Don't use "." as a delimiter, now using "-" instead for better .split(delimiter)!

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.