Refactor sendNoSpamMessage to use a packet, fixes a number of issues where no chat messsage was being received at all.

More work towards splitting client and server.
This commit is contained in:
modmuss50 2022-03-02 01:50:38 +00:00
parent 45c1e7412c
commit 27cc9d0730
14 changed files with 123 additions and 116 deletions

View file

@ -30,22 +30,25 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.ChatHud;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reborncore.RebornCore;
import reborncore.client.ClientChunkManager;
import reborncore.common.screen.BuiltScreenHandler;
import reborncore.common.blockentity.FluidConfiguration;
import reborncore.common.blockentity.MachineBaseBlockEntity;
import reborncore.common.blockentity.SlotConfiguration;
import reborncore.common.chunkloading.ChunkLoaderManager;
import reborncore.common.screen.BuiltScreenHandler;
import reborncore.mixin.client.AccessorChatHud;
@Environment(EnvType.CLIENT)
public class ClientBoundPacketHandlers {
@ -136,6 +139,18 @@ public class ClientBoundPacketHandlers {
});
NetworkManager.registerClientBoundHandler(new Identifier("reborncore", "sync_chunks"), ChunkLoaderManager.CODEC, ClientChunkManager::setLoadedChunks);
NetworkManager.registerClientBoundHandler(new Identifier("reborncore", "no_spam_chat"), (client, handler, buf, responseSender) -> {
final int messageId = buf.readInt();
final Text text = buf.readText();
client.execute(() -> {
int deleteID = RebornCore.MOD_ID.hashCode() + messageId;
ChatHud chat = MinecraftClient.getInstance().inGameHud.getChatHud();
AccessorChatHud accessorChatHud = (AccessorChatHud) chat;
accessorChatHud.invokeAddMessage(text, deleteID);
});
});
}
}

View file

@ -28,6 +28,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import reborncore.common.blockentity.FluidConfiguration;
@ -79,4 +80,10 @@ public class ClientBoundPackets {
return NetworkManager.createClientBoundPacket(new Identifier("reborncore", "sync_chunks"), ChunkLoaderManager.CODEC, chunks);
}
public static IdentifiedPacket createPacketNoSpamMessage(int messageId, Text text) {
return NetworkManager.createClientBoundPacket(new Identifier("reborncore", "no_spam_chat"), packetBuffer -> {
packetBuffer.writeInt(messageId);
packetBuffer.writeText(text);
});
}
}

View file

@ -24,37 +24,14 @@
package reborncore.common.util;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.ChatHud;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import reborncore.mixin.client.AccessorChatHud;
/**
* Class stolen from SteamAgeRevolution, which I stole from BloodMagic, which was stolen from EnderCore, which stole the
* idea from ExtraUtilities, who stole it from vanilla.
* <p>
* Original class link:
* https://github.com/SleepyTrousers/EnderCore/blob/master/src/main/java/com/enderio/core/common/util/ChatUtil.java
* </p>
*/
import reborncore.common.network.ClientBoundPackets;
import reborncore.common.network.NetworkManager;
public class ChatUtils {
private static final int DELETION_ID = 1337; // MAKE THIS UNIQUE PER MOD THAT USES THIS
public static void sendNoSpamMessages(int messageID, Text message) {
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
sendNoSpamMessage(messageID, message);
}
}
@Environment(EnvType.CLIENT)
private static void sendNoSpamMessage(int messageID, Text message) {
int deleteID = DELETION_ID + messageID;
ChatHud chat = MinecraftClient.getInstance().inGameHud.getChatHud();
AccessorChatHud accessorChatHud = (AccessorChatHud) chat;
accessorChatHud.invokeAddMessage(message, deleteID);
public static void sendNoSpamMessage(ServerPlayerEntity player, int messageID, Text message) {
NetworkManager.sendToPlayer(ClientBoundPackets.createPacketNoSpamMessage(messageID, message), player);
}
}

View file

@ -28,9 +28,11 @@ import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext;
import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant;
import net.fabricmc.fabric.api.transfer.v1.item.PlayerInventoryStorage;
import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
@ -159,26 +161,27 @@ public class ItemUtils {
*
* @param stack {@link ItemStack} Stack to check
* @param cost {@link int} Cost of operation performed by tool
* @param isClient {@link boolean} Client side
* @param messageId {@link int} MessageID for sending no spam message
*/
public static void checkActive(ItemStack stack, int cost, boolean isClient, int messageId) {
public static void checkActive(ItemStack stack, int cost, int messageId, Entity player) {
if (!ItemUtils.isActive(stack)) {
return;
}
if (((RcEnergyItem) stack.getItem()).getStoredEnergy(stack) >= cost) {
return;
}
if (isClient) {
ChatUtils.sendNoSpamMessages(messageId, new TranslatableText("reborncore.message.energyError")
.formatted(Formatting.GRAY)
.append(" ")
.append(
new TranslatableText("reborncore.message.deactivating")
.formatted(Formatting.GOLD)
)
if (player instanceof ServerPlayerEntity serverPlayerEntity) {
ChatUtils.sendNoSpamMessage(serverPlayerEntity, messageId, new TranslatableText("reborncore.message.energyError")
.formatted(Formatting.GRAY)
.append(" ")
.append(
new TranslatableText("reborncore.message.deactivating")
.formatted(Formatting.GOLD)
)
);
}
stack.getOrCreateNbt().putBoolean("isActive", false);
}
@ -187,36 +190,34 @@ public class ItemUtils {
*
* @param stack {@link ItemStack} Stack to switch state
* @param cost {@code int} Cost of operation performed by tool
* @param isClient {@code boolean} Are we on client side
* @param messageId {@code int} MessageID for sending no spam message
*/
public static void switchActive(ItemStack stack, int cost, boolean isClient, int messageId) {
ItemUtils.checkActive(stack, cost, isClient, messageId);
public static void switchActive(ItemStack stack, int cost, int messageId, Entity entity) {
ItemUtils.checkActive(stack, cost, messageId, entity);
if (!ItemUtils.isActive(stack)) {
stack.getOrCreateNbt().putBoolean("isActive", true);
if (isClient) {
ChatUtils.sendNoSpamMessages(messageId, new TranslatableText("reborncore.message.setTo")
.formatted(Formatting.GRAY)
.append(" ")
.append(
new TranslatableText("reborncore.message.active")
.formatted(Formatting.GOLD)
)
if (entity instanceof ServerPlayerEntity serverPlayerEntity) {
ChatUtils.sendNoSpamMessage(serverPlayerEntity, messageId, new TranslatableText("reborncore.message.setTo")
.formatted(Formatting.GRAY)
.append(" ")
.append(
new TranslatableText("reborncore.message.active")
.formatted(Formatting.GOLD)
)
);
}
} else {
stack.getOrCreateNbt().putBoolean("isActive", false);
if (isClient) {
ChatUtils.sendNoSpamMessages(messageId, new TranslatableText("reborncore.message.setTo")
.formatted(Formatting.GRAY)
.append(" ")
.append(
new TranslatableText("reborncore.message.inactive")
.formatted(Formatting.GOLD)
)
if (entity instanceof ServerPlayerEntity serverPlayerEntity) {
ChatUtils.sendNoSpamMessage(serverPlayerEntity, messageId, new TranslatableText("reborncore.message.setTo")
.formatted(Formatting.GRAY)
.append(" ")
.append(
new TranslatableText("reborncore.message.inactive")
.formatted(Formatting.GOLD)
)
);
}
}