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.

[Solved]Send message to player sending json [1.16.5]

Featured Replies

Posted

This is the first mod I've worked on in a few years now, last time I made a mod the current version of MC was 1.12.

I've been trying to get this send message to all players to work for about 2 days now, I've looked at sources for inspiration on why my message sends json instead of formatted text, to no avail.

Spoiler

package com.github.joelgodofwar.sps.server.events;


import java.util.Random;

import org.apache.logging.log4j.Logger;

import com.github.joelgodofwar.sps.SinglePlayerSleepMod;
import com.github.joelgodofwar.sps.common.WorldFunctions;
import com.mojang.brigadier.exceptions.CommandSyntaxException;

import net.minecraft.block.BedBlock;
import net.minecraft.client.renderer.entity.layers.EnergyLayer;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.Util;
import net.minecraft.util.text.ChatType;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextComponentUtils;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.event.TickEvent.ServerTickEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.Event.Result;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;

@SuppressWarnings("unused")
public class InteractEventHandler {
	public long daTimer = -1;
	public PlayerEntity sleepingPlayer;
	public World sleepingWorld;
	public String sleepMsg = "<player> went to sleep. Sweet dreams!";//"{\"text\":\"<player> went to sleep. Sweet dreams!\",\"color\":\"gold\"}";//"[\"\",{\"text\":\"<player> went to sleep. Sweet dreams!\"}]";//"<player> went to sleep. Sweet dreams!";
	Logger log;
	
    @SuppressWarnings("resource")
	@SubscribeEvent(priority = EventPriority.HIGHEST)
    public void stopBedUse(PlayerInteractEvent.RightClickBlock event){
    	log = SinglePlayerSleepMod.LOGGER;
    	Result result = event.getResult();
    	boolean canceled = event.isCanceled();
    	
        if(!event.getWorld().isClientSide) {
        	ServerPlayerEntity splayer = (ServerPlayerEntity) event.getPlayer();
        	splayer.setRespawnPosition(null, null, 0, false, false);
        	
        	PlayerEntity player = event.getPlayer();
			World world = event.getWorld();
        	
            if (world.getBlockState(event.getPos()).getBlock() instanceof BedBlock) {
                if (world.isDay()) {
                    return;
                }
                //splayer.setRespawnPosition(null, null, daTimer, canceled, canceled);
                if( result != Result.DENY && !canceled ) {
	                if(sleepingPlayer == null) {
	                	sleepingPlayer = player;
	                }
	                if(sleepingWorld == null) {
	                	sleepingWorld = world;
	                }
	                daTimer = 100; // 200 = 10 seconds
                }
                
                log.info("world.getDayTime=" + world.getDayTime());
                log.info("world.getGameTime=" + world.getGameTime());
                log.info("world.getTimeOfDay=" + world.getTimeOfDay(0));
                //WorldFunctions.setWorldTime((ServerWorld)world, 12540);
            }
        }
    }
    
    @SubscribeEvent
	public void servertick(ServerTickEvent event){
    	if(daTimer == 0){
			daTimer = -1;
			broadcast(sleepingWorld, sleepMsg.replace("<player>", sleepingPlayer.getDisplayName().toString()));
			setDatime(sleepingPlayer, sleepingWorld);
			sleepingPlayer = null;
			sleepingWorld = null;
    	}else if(daTimer > 0){
			daTimer--;
		}
    }
    
    public void setDatime(PlayerEntity player, World world){
		//World world = server.worlds[0];
        int i = (300 + (new Random()).nextInt(600)) * 20;
		if(world.isRaining()){
			world.setRainLevel(0);
		}
		if(world.isThundering()){
			world.setThunderLevel(0);
		}
		long Relative_Time = 24000 - world.getDayTime();
		
		ServerWorld serverworld = (ServerWorld) world;
        serverworld.setDayTime(world.getDayTime() + Relative_Time);
		// TODO Add debug log here
	}
	
	public void broadcast(World world, String string){
		MinecraftServer mcserver = world.getServer();
		//mcserver.getPlayerList().broadcastMessage(new StringTextComponent(string), ChatType.SYSTEM, null);
		//ITextComponent textComponent = ITextComponent.Serializer.jsonToComponent(string);
		StringTextComponent msg = new StringTextComponent(string);
    	msg.getStyle().applyFormats(TextFormatting.GOLD);
        for (ServerPlayerEntity player : mcserver.getPlayerList().getPlayers()) {
        	
        	//writeChatMessage(player, "sps.sleep.msg", TextFormatting.GOLD);
			player.sendMessage(msg, ChatType.SYSTEM, Util.NIL_UUID);
        }
        //mcserver.getPlayerList().broadcastMessage(new StringTextComponent(string), ChatType.SYSTEM, Util.NIL_UUID);
	}
	
	public static void writeChatMessage(PlayerEntity player, String translationKey, TextFormatting color) {
		TranslationTextComponent component = new TranslationTextComponent(translationKey);
		component.getStyle().applyFormats(color);
		player.sendMessage(component.plainCopy(), Util.NIL_UUID);
	}
}

As you can see in my source, the message to be sent is simple, "<player> went to sleep. Sweet dreams!", replacing <player> with their displayname.

The attached picture is how the text shows up in chat. I did try using TranslationTextComponent, but was not able to replace any of the text, so abandoned that idea quickly.

I'll probably be back here later to ask how to make sure this works both serverSide and singleplayer.

 

2021-05-09_00.51.21.png

  • Author
11 hours ago, diesieben07 said:

You cannot use toString on an ITextComponent, it will just give you a representation of its data (not JSON, by the way).

Instead of trying to replace in a string you should simply use text interpolation, which translation components support by defaut:


// in your language file:
"mymod.chatmessage": "%1$s went to bed. Sweet dreams!"

// in your code:
message = new TranslationTextComponent("mymod.chatmessage", player.getDisplayName());

 

Thank you for that.

Is it this part that is causing the representation, because I don't see any other spot where I use toString? "sleepingPlayer.getDisplayName().toString()"

  • joelstoner changed the title to [Solved]Send message to player sending json [1.16.5]

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.