Jump to content

Custom ArgumentType(s) not Serializing!


X_ZombieSlayer_X

Recommended Posts

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:

Spoiler

import java.util.concurrent.CompletableFuture;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import mod.utils.ModStatics;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.SharedSuggestionProvider;

public class RankArgument implements ArgumentType<String>{

    public static RankArgument ranks() {
        return new RankArgument();
    }
    
    public static String getRankName(CommandContext<CommandSourceStack> p_98430_, String p_98431_) {
          return p_98430_.getArgument(p_98431_, String.class);
    }
    
    @Override
    public String parse(StringReader reader) throws CommandSyntaxException {
        String name = reader.readString();
        return name;
    }

    public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> p_98438_, SuggestionsBuilder p_98439_) {
        return SharedSuggestionProvider.suggest(ModStatics.rankManager.getAvaliableRanks(), p_98439_);
    }
    
}

 

ModCommandArgument:

Spoiler

import java.util.concurrent.CompletableFuture;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import mod.utils.ModStatics;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.SharedSuggestionProvider;

public class ModCommandArgument implements ArgumentType<String>{

    public static ModCommandArgument commands() {
        return new ModCommandArgument();
    }
    
    public static String getCommandLiteral(CommandContext<CommandSourceStack> p_98430_, String p_98431_) {
          return p_98430_.getArgument(p_98431_, String.class);
    }
    
    @Override
    public String parse(StringReader reader) throws CommandSyntaxException {
        String name = reader.readString();
        return name;
    }

    public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> p_98438_, SuggestionsBuilder p_98439_) {
        return SharedSuggestionProvider.suggest(ModStatics.modCommandList.getAvaliable(), p_98439_);
    }
    
}

 

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!
Link to comment
Share on other sites

  • X_ZombieSlayer_X changed the title to Custom ArgumentType(s) not Serializing!
6 hours ago, diesieben07 said:

Actually I just noticed this is missing enqueueWork.

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!

 

7 hours ago, diesieben07 said:

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

Link to comment
Share on other sites

2 minutes ago, 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.

Ah, thank you for the enlightenment and help!

 

Link to comment
Share on other sites

15 hours ago, diesieben07 said:

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
Link to comment
Share on other sites

13 hours ago, diesieben07 said:

I don't see anything wrong, no.

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?

Link to comment
Share on other sites

13 hours ago, diesieben07 said:

I don't see anything wrong, no.

 

24 minutes ago, 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?

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

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

    • 国内野球募集▦BCGAME33·COM§ トンガ野球コミュニティ国内マレーシア野球接続[本社お問い合わせテレJBOX7]国内野球♣♣ゲームニカラグア野球戦略国内サンマリノ国内野球サイト[総販お問い合わせカカオトークJBOX7]国内野球 ♨♤接続シンガポール野球遊び場国内ジブチ国内やきゅうトーナメント[各種オフィコミュニティ制作] 国内野♠□バカラパブモーリシャスやきゅうリーグ韓国西ヨーロッパ内のやきゅうクーポン[マーケティングお問い合わせ] 国内のやきゅう º↕バカラパブガーナやきゅう放送 韓国産マリノ本社] メーカー 韓国ケンティングハイランドカジノ国内野球ホールダンパブ [ト本社お問い合わせ]国内野球(株)☏戦略ジャマイカ野球賭博場国内南スーダン国内野球ツアー[トト総販購入]国内野球↘◐ホールダンバモンテネグロ野球接続 国内北キプロス国内野球接続[カジノ総販]国内野球☜ネプリーグアラブ球ユーチューブ韓国タジキスタン国内の野球ゲーム[大和本社]韓国内の野球 ※ネプサイト日本野球募集 韓国ナイジェリア国内の球住所[バカラ総販]韓国内野戦 キャッシュゲーム 韓国スウェーデンの韓国内のサッカースタジアム 森ショッパーズ
    • Tsuopy №BCGAME55·COM @ Opie总经销短道速滑Opie视频链接
    • 海外ホールダムゲームセンター㉿BCGAME33·COM▩ネパールホールダム競技海外レソトホールダムキャッシュゲーム[本社お問い合わせテレJBOX7]海外ホールダム▲→リーグクウェートホールダムリーグ海外レソト海外ホールダムカジノパブ[総販お問い合わせカカオトークJBOX7]海外ホールダム♤◈リーグ南アジアホールダムメーカー海外スーダン海外ホルダンバー[各種オフィコミュニティ制作] 海外ホルダンバー¶賭博場ロシアホルダンポーカー大会 海外中央アジア 海外ホルダングループトーク[マーケティングお問い合わせ] 海外ホルダン ↑△検証ルーマニア ホールダンボール チリ ホールダンボール 動画 グループトーク [TOTO本社お問い合わせ] 海外ホールダム▧º 放送 マリホールダムトーナメント 海外ソマリランド 海外ホールダムホールダムパブ [TOTO銃販購入] 海外ホールダム☆☆ゲーム ペルーホールダム遊び場 海外BCGAMEカジノ 海外ホールダムクープーン [カジノ銃販] 海外ホールダム☆▽リーグ トルコ ホールダーム放送 海外タイ海外 ホールダーム放送 [ヤマト本社]海外 ホールダーム●◇メーカー オーストラリア ホールダーム海外グレナディン海外 ホールダーム遊び場 [バカラ銃販]海外 ホールダーム▩◑遊び場 北欧 ホールダーム 方法 [競馬場
    • Tsuopy №BCGAME55·COM @ Opie总经销短道速滑Opie视频链接
    • 東南アジアボクシング競技@BCGAME33·COM♧アトランティスカジノボクシング業者東南アジアソロモン諸島ボクシングゲーム[本社お問い合わせテレJBOX7]東南アジアボクシング◁◎アクセスペルーボクシングバーカラパブ東南アジアサントメプリンシペ東南アジアボクシング遊び場[総販お問い合わせカカオトークJBOX7]東南アジアボクシング←ºホールダンパブ北米ボクシングクープン東南アジアグレナディン東南アジアボクシンググループトーク[各種オフィコミュニティ制作]南東アボクサーズパレスカジノ キャッシュゲーム南東アマーシャル諸島の東南アボクシングホールダンパブ[マーケティングお問い合わせ] [マーケティングお問い合わせ] ギニア ギニア 動画サイト [スポーツ本社]東南アジアボクシング♩️バカラパブ北キプロスボクシングホールダンバー東南アジアコンゴ東南アジアボクシング遊び場[ト本社お問い合わせ]東南アジアボクシング↖アットユーチューブアトランティスカジノボクシングサイト東南アジアバヌアツー東南アジアボクシング放送[トト銃販購入]東南アジアボクシング▼アットリーグリオオールスイートカジノボクシング放送東南アジアソマリア·東南アボクシングゲーム[カジノ銃販]南東アボクサーモンズ♠◁コミュニティモリタニボクシング放送南東アトルコ·東南アボクシングゲーム場[大和本社]南東アボクサーモンズ♧▶コミュニティアフリカボクシング戦略板 グループトーク [BCGAMEBCゲーム総販お問い合わせ] お知らせ設定おすすめ購読いいですね
  • Topics

×
×
  • Create New...

Important Information

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