diff --git a/src/main/java/com/solegendary/reignofnether/ClientModConfigs.java b/src/main/java/com/solegendary/reignofnether/ClientModConfigs.java index 32de04937..d759c4366 100644 --- a/src/main/java/com/solegendary/reignofnether/ClientModConfigs.java +++ b/src/main/java/com/solegendary/reignofnether/ClientModConfigs.java @@ -10,7 +10,7 @@ public class ClientModConfigs { public static void registerClientConfigs(FMLJavaModLoadingContext mlctx) { mlctx.registerConfig(ModConfig.Type.CLIENT, ReignOfNetherClientConfigs.SPEC, - "reignofnether-client-" + ReignOfNether.VERSION_STRING + ".toml"); + "reignofnether-client.toml"); mlctx.registerExtensionPoint( ConfigScreenHandler.ConfigScreenFactory.class, diff --git a/src/main/java/com/solegendary/reignofnether/ClientModEvents.java b/src/main/java/com/solegendary/reignofnether/ClientModEvents.java index 6af4420bc..cbcb058e0 100644 --- a/src/main/java/com/solegendary/reignofnether/ClientModEvents.java +++ b/src/main/java/com/solegendary/reignofnether/ClientModEvents.java @@ -1,6 +1,9 @@ package com.solegendary.reignofnether; +import com.solegendary.reignofnether.blocks.BlockClientEvents; import com.solegendary.reignofnether.blocks.InvisibleBlockRenderer; +import com.solegendary.reignofnether.config.ReignOfNetherClientConfigs; +import com.solegendary.reignofnether.orthoview.OrthoviewClientEvents; import com.solegendary.reignofnether.blocks.SkullTypes; import com.solegendary.reignofnether.building.BuildingPlacement; import com.solegendary.reignofnether.building.BuildingUtils; @@ -181,6 +184,9 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers evt) @SubscribeEvent @OnlyIn(Dist.CLIENT) public static void onClientSetupEvent(FMLClientSetupEvent evt) { + // read on hot render paths, so kept in statics; the toggles write them back + OrthoviewClientEvents.hideLeavesMethod = ReignOfNetherClientConfigs.HIDE_LEAVES.get(); + BlockClientEvents.nightCircleMode = ReignOfNetherClientConfigs.NIGHT_CIRCLES.get(); evt.enqueueWork(() -> { MenuScreens.register(ContainerRegistrar.TOPDOWNGUI_CONTAINER.get(), TopdownGui::new); ItemBlockRenderTypes.setRenderLayer( diff --git a/src/main/java/com/solegendary/reignofnether/alliance/AlliancesClient.java b/src/main/java/com/solegendary/reignofnether/alliance/AlliancesClient.java index 9f727077f..5b12c315e 100644 --- a/src/main/java/com/solegendary/reignofnether/alliance/AlliancesClient.java +++ b/src/main/java/com/solegendary/reignofnether/alliance/AlliancesClient.java @@ -3,17 +3,22 @@ import com.solegendary.reignofnether.gamerules.GameruleClient; import com.solegendary.reignofnether.player.PlayerClientEvents; import com.solegendary.reignofnether.unit.interfaces.Unit; +import com.solegendary.reignofnether.util.WorldState; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.LivingEntity; import java.util.*; public class AlliancesClient { + + static { + WorldState.onClientReset(AlliancesClient::resetAllAlliances); + } private static final Minecraft MC = Minecraft.getInstance(); private static final Map> alliances = new HashMap<>(); - public static final Set inboundPendingAlliances = new HashSet<>(); - public static final Set outboundPendingAlliances = new HashSet<>(); + public static final Set inboundPendingAlliances = WorldState.client(new HashSet<>()); + public static final Set outboundPendingAlliances = WorldState.client(new HashSet<>()); public static final HashSet playersWithAlliedControl = new HashSet<>(); public static boolean sharingAllyControl() { diff --git a/src/main/java/com/solegendary/reignofnether/alliance/AlliancesServerEvents.java b/src/main/java/com/solegendary/reignofnether/alliance/AlliancesServerEvents.java index 8ea3fc5c5..b639f02a9 100644 --- a/src/main/java/com/solegendary/reignofnether/alliance/AlliancesServerEvents.java +++ b/src/main/java/com/solegendary/reignofnether/alliance/AlliancesServerEvents.java @@ -6,17 +6,17 @@ import com.solegendary.reignofnether.scenario.ScenarioServerEvents; import com.solegendary.reignofnether.scenario.ScenarioUtils; import com.solegendary.reignofnether.unit.interfaces.Unit; +import com.solegendary.reignofnether.util.WorldState; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.server.ServerStoppedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import java.util.*; public class AlliancesServerEvents { - private static final Map> alliances = new HashMap<>(); - public static final Map> pendingAlliances = new HashMap<>(); - public static final HashSet playersWithAlliedControl = new HashSet<>(); + private static final Map> alliances = WorldState.server(new HashMap<>()); + public static final Map> pendingAlliances = WorldState.server(new HashMap<>()); + public static final HashSet playersWithAlliedControl = WorldState.server(new HashSet<>()); public static boolean canControlAlly(String player, LivingEntity entity) { return entity instanceof Unit unit && canControlAlly(player, unit.getOwnerName()); @@ -144,12 +144,6 @@ public static void syncAlliances() { } // statics outlive the world: clear them so the next world opened in this game starts clean - @SubscribeEvent - public static void onServerStopped(ServerStoppedEvent evt) { - alliances.clear(); - pendingAlliances.clear(); - playersWithAlliedControl.clear(); - } @SubscribeEvent public static void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent evt) { diff --git a/src/main/java/com/solegendary/reignofnether/alliance/AllyCommand.java b/src/main/java/com/solegendary/reignofnether/alliance/AllyCommand.java index d54c8bf67..7c2133868 100644 --- a/src/main/java/com/solegendary/reignofnether/alliance/AllyCommand.java +++ b/src/main/java/com/solegendary/reignofnether/alliance/AllyCommand.java @@ -1,5 +1,6 @@ package com.solegendary.reignofnether.alliance; +import com.solegendary.reignofnether.chat.SystemMessage; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.BoolArgumentType; @@ -63,26 +64,26 @@ private static int ally(CommandContext context) throws Comma if (context.getSource().getLevel().getGameRules().getRule(GameRuleRegistrar.LOCK_ALLIANCES).get() && (PlayerServerEvents.isRTSPlayer(playerName) || PlayerServerEvents.isRTSPlayer(allyPlayerName))) { - player.sendSystemMessage(Component.translatable("alliance.reignofnether.alliances_lock")); + player.sendSystemMessage(SystemMessage.error(Component.translatable("alliance.reignofnether.alliances_lock"))); return 0; } if (context.getSource().getLevel().getGameRules().getRule(GameRuleRegistrar.COOP_MODE).get() && (PlayerServerEvents.isRTSPlayer(playerName) || PlayerServerEvents.isRTSPlayer(allyPlayerName))) { - player.sendSystemMessage(Component.translatable("alliance.reignofnether.alliances_lock_coop")); + player.sendSystemMessage(SystemMessage.error(Component.translatable("alliance.reignofnether.alliances_lock_coop"))); return 0; } if (player.equals(allyPlayer)) { - player.sendSystemMessage(Component.translatable("alliance.reignofnether.ally_self", playerName)); + player.sendSystemMessage(SystemMessage.error(Component.translatable("alliance.reignofnether.ally_self", playerName))); return 0; } AlliancesServerEvents.pendingAlliances.computeIfAbsent(allyPlayerName, k -> new HashSet<>()).add(playerName); AllianceClientboundPacket.addPendingAlliance(allyPlayerName, playerName); - context.getSource().sendSuccess(()->Component.translatable("alliance.reignofnether.sent_request", allyPlayerName), false); + context.getSource().sendSuccess(()->SystemMessage.info(Component.translatable("alliance.reignofnether.sent_request", allyPlayerName)), false); SoundClientboundPacket.playSoundForPlayer(SoundAction.CHAT, allyPlayerName); - allyPlayer.sendSystemMessage(Component.translatable("alliance.reignofnether.ally_confirm", playerName, playerName)); + allyPlayer.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.ally_confirm", playerName, playerName))); if (PlayerServerEvents.isRTSPlayer(allyPlayerName)) - allyPlayer.sendSystemMessage(Component + allyPlayer.sendSystemMessage(SystemMessage.info(Component .translatable("alliance.reignofnether.accept") // [CLick to accept] .withStyle(Style.EMPTY .withColor(ChatFormatting.GREEN) @@ -96,7 +97,7 @@ private static int ally(CommandContext context) throws Comma .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.translatable("alliance.reignofnether.cancel"))) ) ) - ); + )); SoundClientboundPacket.playSoundForPlayer(SoundAction.CHAT, playerName); return Command.SINGLE_SUCCESS; @@ -113,9 +114,9 @@ private static int allyCancelRequest(CommandContext context) } AlliancesServerEvents.pendingAlliances.getOrDefault(playerName, new HashSet<>()).remove(allyPlayerName); AllianceClientboundPacket.cancelPendingAlliance(allyPlayerName, playerName); - context.getSource().sendSuccess(()->Component.translatable("alliance.reignofnether.ally_request_cancelled_self", allyPlayerName), false); + context.getSource().sendSuccess(()->SystemMessage.info(Component.translatable("alliance.reignofnether.ally_request_cancelled_self", allyPlayerName)), false); SoundClientboundPacket.playSoundForPlayer(SoundAction.ENEMY, allyPlayerName); - allyPlayer.sendSystemMessage(Component.translatable("alliance.reignofnether.ally_request_cancelled", playerName)); + allyPlayer.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.ally_request_cancelled", playerName))); SoundClientboundPacket.playSoundForPlayer(SoundAction.ENEMY, playerName); return Command.SINGLE_SUCCESS; @@ -131,19 +132,19 @@ private static int allyConfirm(CommandContext context) throw AlliancesServerEvents.addAlliance(playerName, requesterPlayerName); AlliancesServerEvents.pendingAlliances.getOrDefault(requesterPlayerName, new HashSet<>()).remove(playerName); - context.getSource().sendSuccess(()->Component.translatable("alliance.reignofnether.now_allied", requesterPlayerName), false); + context.getSource().sendSuccess(()->SystemMessage.info(Component.translatable("alliance.reignofnether.now_allied", requesterPlayerName)), false); SoundClientboundPacket.playSoundForPlayer(SoundAction.ALLY, requesterPlayerName); - requesterPlayer.sendSystemMessage(Component.translatable("alliance.reignofnether.ally_accepted", playerName)); + requesterPlayer.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.ally_accepted", playerName))); SoundClientboundPacket.playSoundForPlayer(SoundAction.ALLY, playerName); for (ServerPlayer serverPlayer : PlayerServerEvents.players) { if (!serverPlayer.equals(player) && !serverPlayer.equals(requesterPlayer)) { - serverPlayer.sendSystemMessage(Component.translatable("alliance.reignofnether.now_allied_third_party", playerName, requesterPlayerName)); + serverPlayer.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.now_allied_third_party", playerName, requesterPlayerName))); SoundClientboundPacket.playSoundForPlayer(SoundAction.CHAT, playerName); } } } else { - context.getSource().sendFailure(Component.translatable("alliance.reignofnether.no_request", requesterPlayerName)); + context.getSource().sendFailure(SystemMessage.error(Component.translatable("alliance.reignofnether.no_request", requesterPlayerName))); } return Command.SINGLE_SUCCESS; } @@ -156,29 +157,29 @@ private static int disband(CommandContext context) throws Co if (context.getSource().getLevel().getGameRules().getRule(GameRuleRegistrar.LOCK_ALLIANCES).get() && (PlayerServerEvents.isRTSPlayer(playerName) || PlayerServerEvents.isRTSPlayer(allyPlayerName))) { - player.sendSystemMessage(Component.translatable("alliance.reignofnether.alliances_lock")); + player.sendSystemMessage(SystemMessage.error(Component.translatable("alliance.reignofnether.alliances_lock"))); return 0; } if (context.getSource().getLevel().getGameRules().getRule(GameRuleRegistrar.COOP_MODE).get() && (PlayerServerEvents.isRTSPlayer(playerName) || PlayerServerEvents.isRTSPlayer(allyPlayerName))) { - player.sendSystemMessage(Component.translatable("alliance.reignofnether.alliances_lock_coop")); + player.sendSystemMessage(SystemMessage.error(Component.translatable("alliance.reignofnether.alliances_lock_coop"))); return 0; } if (player.equals(allyPlayer)) { - context.getSource().sendFailure(Component.translatable("alliance.reignofnether.disband_self")); + context.getSource().sendFailure(SystemMessage.error(Component.translatable("alliance.reignofnether.disband_self"))); return 0; } AlliancesServerEvents.removeAlliance(playerName, allyPlayerName); - player.sendSystemMessage(Component.translatable("alliance.reignofnether.disbanded", allyPlayerName)); + player.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.disbanded", allyPlayerName))); SoundClientboundPacket.playSoundForPlayer(SoundAction.ENEMY, playerName); - allyPlayer.sendSystemMessage(Component.translatable("alliance.reignofnether.disbanded", playerName)); + allyPlayer.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.disbanded", playerName))); SoundClientboundPacket.playSoundForPlayer(SoundAction.ENEMY, allyPlayerName); for (ServerPlayer serverPlayer : PlayerServerEvents.players) { if (!serverPlayer.equals(player) && !serverPlayer.equals(allyPlayer)) { - serverPlayer.sendSystemMessage(Component.translatable("alliance.reignofnether.disbanded_third_party", playerName, allyPlayerName)); + serverPlayer.sendSystemMessage(SystemMessage.info(Component.translatable("alliance.reignofnether.disbanded_third_party", playerName, allyPlayerName))); SoundClientboundPacket.playSoundForPlayer(SoundAction.CHAT, playerName); } } @@ -190,7 +191,7 @@ private static int getAlliedControl(CommandContext context) String playerName = player.getName().getString(); boolean value = AlliancesServerEvents.playersWithAlliedControl.contains(playerName); String msgKey = value ? "alliance.reignofnether.ally_control_enabled" : "alliance.reignofnether.ally_control_disabled"; - context.getSource().sendSuccess(()->Component.translatable(msgKey, playerName), false); + context.getSource().sendSuccess(()->SystemMessage.info(Component.translatable(msgKey, playerName)), false); return Command.SINGLE_SUCCESS; } @@ -206,11 +207,11 @@ private static int setAlliedControl(CommandContext context) AlliancesServerEvents.playersWithAlliedControl.remove(playerName); AllianceClientboundPacket.setAllyControl(playerName, value); - context.getSource().sendSuccess(()->Component.translatable(msgKey, playerName), false); + context.getSource().sendSuccess(()->SystemMessage.info(Component.translatable(msgKey, playerName)), false); SoundClientboundPacket.playSoundForPlayer(SoundAction.CHAT, playerName); for (String allyPlayerName : AlliancesServerEvents.getAllAllies(playerName)) { - PlayerServerEvents.sendMessageToPlayerNoNewLines(allyPlayerName, msgKey, false, playerName); + PlayerServerEvents.sendMessageToPlayer(allyPlayerName, msgKey, false, playerName); SoundClientboundPacket.playSoundForPlayer(SoundAction.CHAT, allyPlayerName); } return Command.SINGLE_SUCCESS; diff --git a/src/main/java/com/solegendary/reignofnether/building/BuildingClientEvents.java b/src/main/java/com/solegendary/reignofnether/building/BuildingClientEvents.java index 1600bffc7..d942c3a25 100644 --- a/src/main/java/com/solegendary/reignofnether/building/BuildingClientEvents.java +++ b/src/main/java/com/solegendary/reignofnether/building/BuildingClientEvents.java @@ -1,6 +1,8 @@ package com.solegendary.reignofnether.building; +import com.solegendary.reignofnether.hud.buttons.HelperButtons; import com.mojang.blaze3d.platform.NativeImage; +import com.solegendary.reignofnether.player.PlayerClientEvents; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.solegendary.reignofnether.ReignOfNether; @@ -16,6 +18,7 @@ import com.solegendary.reignofnether.building.custombuilding.CustomBuilding; import com.solegendary.reignofnether.building.production.ActiveProduction; import com.solegendary.reignofnether.cursor.CursorClientEvents; +import com.solegendary.reignofnether.faction.Factions; import com.solegendary.reignofnether.fogofwar.FogOfWarClientEvents; import com.solegendary.reignofnether.gamerules.GameruleClient; import com.solegendary.reignofnether.hud.HudClientEvents; @@ -37,6 +40,7 @@ import com.solegendary.reignofnether.unit.interfaces.WorkerUnit; import com.solegendary.reignofnether.util.MiscUtil; import com.solegendary.reignofnether.util.MyRenderer; +import com.solegendary.reignofnether.util.WorldState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.BeaconScreen; import net.minecraft.client.gui.screens.inventory.ContainerScreen; @@ -73,10 +77,14 @@ import static com.solegendary.reignofnether.unit.UnitClientEvents.getSelectedUnits; public class BuildingClientEvents { + static { + WorldState.onClientReset(() -> setBuildingToPlace(null)); + } + static final Minecraft MC = Minecraft.getInstance(); public static int getTotalPopulationSupply(String playerName) { - if (ResearchClient.hasCheat("foodforthought")) { + if (ResearchClient.hasCheat("foodforthought") || PlayerClientEvents.getPlayerFaction(playerName) == Factions.NONE) { return GameruleClient.maxPopulation; } @@ -90,7 +98,7 @@ public static int getTotalPopulationSupply(String playerName) { } // clientside buildings used for tracking position (for cursor selection) - private static final ArrayList buildings = new ArrayList<>(); + private static final ArrayList buildings = WorldState.client(new ArrayList<>()); private static final ArrayList selectedBuildings = new ArrayList<>(); private static Building buildingToPlace = null; private static Building lastBuildingToPlace = null; @@ -478,7 +486,7 @@ public static boolean isBridgeDiagonal() { @SubscribeEvent public static void onMouseScroll(ScreenEvent.MouseScrolled.Post evt) { - if (buildingToPlace != null) { + if (buildingToPlace != null && !Keybindings.altMod.isDown()) { // Alt + wheel zooms instead if (buildingToPlace instanceof AbstractBridge bridge) { bridgePlaceState += evt.getScrollDelta() > 0 ? 1 : -1; if (bridgePlaceState < 0) { @@ -741,7 +749,9 @@ public static void onButtonPress(ScreenEvent.KeyPressed.Pre evt) { if (building != null && building.getBuilding().capturable && !isSandboxPlayer) { HudClientEvents.showTemporaryMessage(I18n.get("server.reignofnether.cannot_delete_capturable")); } else if (building != null && - ((building.isBuilt && getPlayerToBuildingRelationship(building) == Relationship.OWNED) || isSandboxPlayer)) { + // unbuilt: cancel construction, under the same rule as the card's Cancel button (B) + (((building.isBuilt || !HelperButtons.buildingCancelButton.isHidden.get()) + && getPlayerToBuildingRelationship(building) == Relationship.OWNED) || isSandboxPlayer)) { HudClientEvents.hudSelectedPlacement = null; BuildingServerboundPacket.cancelBuilding(building.minCorner, MC.player.getName().getString()); } @@ -787,7 +797,12 @@ public static void onClientTick(TickEvent.ClientTickEvent evt) { // cleanup destroyed buildings selectedBuildings.removeIf(BuildingPlacement::shouldBeDestroyed); - buildings.removeIf(BuildingPlacement::shouldBeDestroyed); + buildings.removeIf(b -> { + if (!b.shouldBeDestroyed()) + return false; + onLost(b); + return true; + }); } } @@ -965,10 +980,26 @@ public static void syncBeacon(UnitAction action, BlockPos beaconPos, boolean act } public static void removeBuilding(BlockPos bp) { - buildings.removeIf(b -> b.originPos.equals(bp)); + buildings.removeIf(b -> { + if (!b.originPos.equals(bp)) + return false; + onLost(b); + return true; + }); BuildingClientEvents.clearSelectedBuildings(); } + /** Losing your last capital: a tip in chat that surrender is in the pause menu. */ + private static void onLost(BuildingPlacement b) { + if (!b.isCapitol || !b.isBuilt || MC.player == null || !PlayerClientEvents.isRTSPlayer() + || !b.ownerName.equals(MC.player.getName().getString())) + return; + boolean another = buildings.stream().anyMatch(o -> o != b && o.isCapitol && o.ownerName.equals(b.ownerName) && !o.shouldBeDestroyed()); + if (!another) + MC.gui.getChat().addMessage(com.solegendary.reignofnether.chat.SystemMessage.important( + net.minecraft.network.chat.Component.translatable("hud.reignofnether.capital_lost_tip"))); + } + public static void removeFogQueuedBuilding(BlockPos bp) { for (LivingEntity le : UnitClientEvents.getAllUnits()) { if (le instanceof WorkerUnit workerUnit) { diff --git a/src/main/java/com/solegendary/reignofnether/building/BuildingPlaceButton.java b/src/main/java/com/solegendary/reignofnether/building/BuildingPlaceButton.java index 57996889b..637136ad4 100644 --- a/src/main/java/com/solegendary/reignofnether/building/BuildingPlaceButton.java +++ b/src/main/java/com/solegendary/reignofnether/building/BuildingPlaceButton.java @@ -9,11 +9,14 @@ import java.util.function.Supplier; public class BuildingPlaceButton extends Button { + public final Building building; + public BuildingPlaceButton(String name, ResourceLocation rl, Keybinding hotkey, Supplier isSelected, Supplier isHidden, Supplier isEnabled, List tooltipLines, Building building) { // generate x/y based on given position (starting at 0 which is bottom left 1 row above generic action buttons) super(name, Button.itemIconSize, rl, hotkey, isSelected, isHidden, isEnabled, () -> BuildingClientEvents.setBuildingToPlace(building), null, tooltipLines); + this.building = building; } } diff --git a/src/main/java/com/solegendary/reignofnether/building/BuildingPlacement.java b/src/main/java/com/solegendary/reignofnether/building/BuildingPlacement.java index 6b6c2a380..b3baaa234 100644 --- a/src/main/java/com/solegendary/reignofnether/building/BuildingPlacement.java +++ b/src/main/java/com/solegendary/reignofnether/building/BuildingPlacement.java @@ -896,6 +896,7 @@ public void onBuilt() { if (rtsPlayer != null) rtsPlayer.scores.addToScore(RTSPlayerScoresEnum.TOTAL_BUILDINGS_CONSTRUCTED); } else { + com.solegendary.reignofnether.chat.SpectatorFeed.built(ownerName, com.solegendary.reignofnether.hud.panels.SelectionPanel.buildingName(this)); TutorialClientEvents.updateStage(); if (this.isCapitol && !SandboxClientEvents.isSandboxPlayer() && getTotalCompletedBuildingsOwned(this.level.isClientSide(), ownerName) == 1) diff --git a/src/main/java/com/solegendary/reignofnether/building/BuildingServerEvents.java b/src/main/java/com/solegendary/reignofnether/building/BuildingServerEvents.java index c1d8dcc3e..77e0c054a 100644 --- a/src/main/java/com/solegendary/reignofnether/building/BuildingServerEvents.java +++ b/src/main/java/com/solegendary/reignofnether/building/BuildingServerEvents.java @@ -667,7 +667,7 @@ public static void cancelBuilding(BuildingPlacement building, String playerName) } public static int getTotalPopulationSupply(String ownerName) { - if (ResearchServerEvents.playerHasCheat(ownerName, "foodforthought")) { + if (ResearchServerEvents.playerHasCheat(ownerName, "foodforthought") || SandboxServer.isSandboxPlayer(ownerName)) { return UnitServerEvents.maxPopulation; } diff --git a/src/main/java/com/solegendary/reignofnether/building/buildings/placements/BeaconPlacement.java b/src/main/java/com/solegendary/reignofnether/building/buildings/placements/BeaconPlacement.java index 71681f4f8..e465e31ff 100644 --- a/src/main/java/com/solegendary/reignofnether/building/buildings/placements/BeaconPlacement.java +++ b/src/main/java/com/solegendary/reignofnether/building/buildings/placements/BeaconPlacement.java @@ -198,7 +198,6 @@ public void onBuilt() { public void sendWarning(String msg) { if (!level.isClientSide) { - PlayerServerEvents.sendMessageToAllPlayersNoNewlines(""); BeaconPlacement beacon = BuildingUtils.getBeacon(level.isClientSide); if (beacon != null && msg.equals("upgraded_warning")) { String upgradeName = ""; @@ -208,17 +207,16 @@ public void sendWarning(String msg) { else if (beacon.getUpgradeLevel() == 4) upgradeName = Component.translatable("buildings.reignofnether.beacon.upgrade.beacon_level4").getString(); else if (beacon.getUpgradeLevel() == 5) upgradeName = Component.translatable("buildings.reignofnether.beacon.upgrade.beacon_level5").getString(); - PlayerServerEvents.sendMessageToAllPlayersNoNewlines("buildings.reignofnether.beacon.upgrade_warning", + PlayerServerEvents.sendMessageToAllPlayers("buildings.reignofnether.beacon.upgrade_warning", true, ownerName, upgradeName, beacon.getUpgradeLevel(), Beacon.MAX_UPGRADE_LEVEL); } else { - PlayerServerEvents.sendMessageToAllPlayersNoNewlines("buildings.reignofnether.beacon." + msg, + PlayerServerEvents.sendMessageToAllPlayers("buildings.reignofnether.beacon." + msg, true, ownerName); } if (beacon != null && beacon.getUpgradeLevel() >= Beacon.MAX_UPGRADE_LEVEL && !msg.equals("destroy_warning")) { - PlayerServerEvents.sendMessageToAllPlayersNoNewlines("buildings.reignofnether.beacon.time_to_win", + PlayerServerEvents.sendMessageToAllPlayers("buildings.reignofnether.beacon.time_to_win", false, ownerName, PlayerServerEvents.getBeaconWinTime(ownerName)); } - PlayerServerEvents.sendMessageToAllPlayersNoNewlines(""); if (SurvivalServerEvents.isEnabled() && !msg.equals("destroy_warning")) SoundClientboundPacket.playSoundForAllPlayers(SoundAction.ALLY); else diff --git a/src/main/java/com/solegendary/reignofnether/building/custombuilding/CustomBuildingClientEvents.java b/src/main/java/com/solegendary/reignofnether/building/custombuilding/CustomBuildingClientEvents.java index 861738649..1626f33c2 100644 --- a/src/main/java/com/solegendary/reignofnether/building/custombuilding/CustomBuildingClientEvents.java +++ b/src/main/java/com/solegendary/reignofnether/building/custombuilding/CustomBuildingClientEvents.java @@ -1,13 +1,15 @@ package com.solegendary.reignofnether.building.custombuilding; +import com.solegendary.reignofnether.chat.SystemMessage; import com.solegendary.reignofnether.blocks.RTSStructureBlockEntity; import com.solegendary.reignofnether.building.Building; import com.solegendary.reignofnether.building.BuildingBlock; import com.solegendary.reignofnether.building.BuildingBlockData; import com.solegendary.reignofnether.guiscreen.TopdownGui; -import com.solegendary.reignofnether.hud.buttons.Button; -import com.solegendary.reignofnether.hud.RectZone; +import com.solegendary.reignofnether.hud.panels.HudFrame; +import com.solegendary.reignofnether.ui.EditorRows; import com.solegendary.reignofnether.util.MyRenderer; +import com.solegendary.reignofnether.util.WorldState; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; @@ -22,7 +24,6 @@ import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import org.lwjgl.glfw.GLFW; import java.util.ArrayList; @@ -31,6 +32,10 @@ public class CustomBuildingClientEvents { + static { + WorldState.onClientReset(() -> setCustomBuildingToEdit(null)); + } + // since every custom building has a different structure, we need to maintain a list of them here public static final ArrayList customBuildings = new ArrayList<>(); @@ -39,8 +44,7 @@ public class CustomBuildingClientEvents { private static final Minecraft MC = Minecraft.getInstance(); private static CustomBuilding customBuildingToEdit = null; - private static final ArrayList