Skip to content

Commit 8d8c506

Browse files
committed
v0.14.16.2 - Radar Mode ID Overlay, Radar Overlay improvements, and more
- Added RadarModeProperty which just makes more sense - PMWExtras#RADAR_MODE is now a RadarModeProperty - Added PMWUtils#isRadarAdjacent - Added arguments that can be passed to radar overlays - Added IRadarOverlay#getRadarMode and IRadarOverlay#renderText methods - Added RadarMode#getId - Added two new client config settings to show radar mode IDs (for debug use) Took 2 hours 43 minutes
1 parent ddb71df commit 8d8c506

16 files changed

Lines changed: 245 additions & 33 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ parchment_mappings_version=2024.11.17
1717
mod_id=pmweatherapi
1818
mod_name=PMWeatherAPI
1919
mod_license=GNU GPL 3.0
20-
mod_version=0.14.16.1
20+
mod_version=0.14.16.2
2121
mod_group_id=net.nullved
2222
mod_authors=NullVed
2323
mod_description=An API for interfacing with ProtoManly's Weather Mod

src/main/java/net/nullved/pmweatherapi/PMWeatherAPI.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package net.nullved.pmweatherapi;
22

33
import com.mojang.logging.LogUtils;
4-
import dev.protomanly.pmweather.compat.DistantHorizons;
5-
import dev.protomanly.pmweather.config.ClientConfig;
64
import net.minecraft.resources.ResourceLocation;
75
import net.neoforged.bus.api.IEventBus;
86
import net.neoforged.fml.ModContainer;
9-
import net.neoforged.fml.ModList;
107
import net.neoforged.fml.common.Mod;
118
import net.neoforged.fml.config.ModConfig;
129
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
@@ -15,10 +12,11 @@
1512
import net.neoforged.neoforge.client.gui.ConfigurationScreen;
1613
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
1714
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
15+
import net.nullved.pmweatherapi.client.render.IDOverlay;
1816
import net.nullved.pmweatherapi.client.render.RadarOverlays;
1917
import net.nullved.pmweatherapi.config.PMWClientConfig;
20-
import net.nullved.pmweatherapi.example.ExampleOverlay;
2118
import net.nullved.pmweatherapi.network.PMWNetworking;
19+
import net.nullved.pmweatherapi.radar.RadarMode;
2220
import org.slf4j.Logger;
2321

2422
@Mod(PMWeatherAPI.MODID)
@@ -30,6 +28,7 @@ public PMWeatherAPI(IEventBus modEventBus, ModContainer modContainer) {
3028
LOGGER.info("Initializing PMWAPI...");
3129

3230
modEventBus.addListener(this::commonSetup);
31+
modEventBus.addListener(this::clientSetup);
3332
modEventBus.addListener(this::registerPayloads);
3433

3534
LOGGER.info("Initialized PMWAPI");
@@ -51,7 +50,8 @@ private void registerPayloads(RegisterPayloadHandlersEvent event) {
5150
}
5251

5352
private void clientSetup(FMLClientSetupEvent event) {
54-
RadarOverlays.registerOverlay(() -> ExampleOverlay.INSTANCE);
53+
RadarOverlays.registerOverlay(() -> IDOverlay.INSTANCE);
54+
//RadarOverlays.registerOverlay(() -> ExampleOverlay.INSTANCE);
5555
}
5656

5757
public static ResourceLocation rl(String path) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package net.nullved.pmweatherapi.client.render;
2+
3+
import com.mojang.blaze3d.vertex.BufferBuilder;
4+
import com.mojang.blaze3d.vertex.PoseStack;
5+
import com.mojang.math.Axis;
6+
import net.minecraft.network.chat.Component;
7+
import net.neoforged.api.distmarker.Dist;
8+
import net.neoforged.api.distmarker.OnlyIn;
9+
import net.nullved.pmweatherapi.PMWeatherAPI;
10+
import net.nullved.pmweatherapi.config.PMWClientConfig;
11+
import net.nullved.pmweatherapi.radar.RadarMode;
12+
13+
/**
14+
* The overlay for {@link RadarMode} IDs.
15+
* <br>
16+
* To enable, you must enable {@code Show Radar Mode IDs} in PMWeatherAPI's Client Config
17+
* @since 0.14.16.2
18+
*/
19+
@OnlyIn(Dist.CLIENT)
20+
public class IDOverlay implements IRadarOverlay {
21+
public static final IRadarOverlay INSTANCE = new IDOverlay();
22+
23+
@Override
24+
public void render(boolean canRender, RenderData renderData, BufferBuilder bufferBuilder, Object... args) {
25+
if (!PMWClientConfig.showRadarModeId) return;
26+
RadarMode mode = getRadarMode(renderData);
27+
PoseStack poseStack = renderData.poseStack();
28+
PMWClientConfig.RadarModeIDSide side = PMWClientConfig.radarModeIDSide;
29+
30+
poseStack.translate(side.x, 1.055f, side.z);
31+
poseStack.mulPose(Axis.ZP.rotationDegrees(side.rotation));
32+
poseStack.scale(0.01f, 0.01f, 0.01f);
33+
34+
renderText(Component.literal(mode.getId().toString()), renderData, poseStack);
35+
36+
// While I could reset the pose, it is not strictly necessary
37+
// poseStack.scale(100f, 100f, 100f);
38+
// poseStack.mulPose(Axis.ZP.rotationDegrees(-side.rotation));
39+
// poseStack.translate(-side.x, -1.055f, -side.z);
40+
}
41+
42+
@Override
43+
public String getModID() {
44+
return PMWeatherAPI.MODID;
45+
}
46+
47+
@Override
48+
public String getIDPath() {
49+
return "id";
50+
}
51+
}

src/main/java/net/nullved/pmweatherapi/client/render/IRadarOverlay.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22

33
import com.mojang.blaze3d.vertex.BufferBuilder;
44
import com.mojang.blaze3d.vertex.PoseStack;
5+
import com.mojang.math.Axis;
6+
import net.minecraft.client.Minecraft;
7+
import net.minecraft.client.gui.Font;
58
import net.minecraft.client.renderer.MultiBufferSource;
69
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
10+
import net.minecraft.network.chat.Component;
711
import net.minecraft.resources.ResourceLocation;
812
import net.minecraft.world.level.block.entity.BlockEntity;
13+
import net.nullved.pmweatherapi.data.PMWExtras;
14+
import net.nullved.pmweatherapi.radar.RadarMode;
915

1016
/**
1117
* An interface defining a radar overlay
12-
* To implement this, you must override {@link #render(boolean, RenderData, BufferBuilder)} and {@link #getModID()}
18+
* To implement this, you must override {@link #render(boolean, RenderData, BufferBuilder, Object...)} and {@link #getModID()}
1319
* @since 0.14.15.2
1420
*/
1521
public interface IRadarOverlay {
@@ -18,9 +24,25 @@ public interface IRadarOverlay {
1824
* @param canRender {@code true} if either the server doesn't require WSR-88D or a WSR-88D is complete within 4 chunks of the radar
1925
* @param renderData The data used to call {@link BlockEntityRenderer#render(BlockEntity, float, PoseStack, MultiBufferSource, int, int)}
2026
* @param bufferBuilder The {@link BufferBuilder} that gets drawn to the radar
27+
* @param args The arguments to pass to the Radar Overlay
2128
* @since 0.14.15.2
2229
*/
23-
void render(boolean canRender, RenderData renderData, BufferBuilder bufferBuilder);
30+
void render(boolean canRender, RenderData renderData, BufferBuilder bufferBuilder, Object... args);
31+
32+
default RadarMode getRadarMode(RenderData renderData) {
33+
return renderData.blockEntity().getBlockState().getValue(PMWExtras.RADAR_MODE);
34+
}
35+
36+
default void renderText(Component component, RenderData renderData, PoseStack poseStack) {
37+
Font font = Minecraft.getInstance().font;
38+
poseStack.mulPose(Axis.XN.rotationDegrees(-90));
39+
font.drawInBatch(component, 0, 0, 0xFFFFFF, false, poseStack.last().pose(), renderData.multiBufferSource(), Font.DisplayMode.NORMAL, 0xFFFFFF, 0xFFFFFF);
40+
poseStack.mulPose(Axis.XN.rotationDegrees(90));
41+
}
42+
43+
default void renderText(Component component, RenderData renderData) {
44+
this.renderText(component, renderData, renderData.poseStack());
45+
}
2446

2547
/**
2648
* @return The Mod ID of the mod that registered this overlay

src/main/java/net/nullved/pmweatherapi/client/render/RadarOverlays.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.minecraft.world.level.block.entity.BlockEntity;
88
import net.nullved.pmweatherapi.PMWeatherAPI;
99

10+
import java.util.HashMap;
1011
import java.util.HashSet;
1112
import java.util.Set;
1213
import java.util.function.Supplier;
@@ -18,13 +19,13 @@
1819
* @since 0.14.15.0
1920
*/
2021
public class RadarOverlays {
21-
private static final HashSet<Supplier<? extends IRadarOverlay>> OVERLAYS = new HashSet<>();
22+
private static final HashMap<Supplier<? extends IRadarOverlay>, Supplier<? extends Object[]>> OVERLAYS = new HashMap<>();
2223

2324
/**
2425
* @return The {@link Set} of all overlay instances to render to
2526
*/
2627
public static Set<Supplier<? extends IRadarOverlay>> getOverlays() {
27-
return OVERLAYS;
28+
return OVERLAYS.keySet();
2829
}
2930

3031
/**
@@ -35,16 +36,30 @@ public static Set<Supplier<? extends IRadarOverlay>> getOverlays() {
3536
* @since 0.14.15.0
3637
*/
3738
public static void renderOverlays(RenderData renderData, BufferBuilder bufferBuilder, boolean canRender) {
38-
OVERLAYS.forEach(overlay -> overlay.get().render(canRender, renderData, bufferBuilder));
39+
OVERLAYS.forEach((overlay, args) -> {
40+
renderData.poseStack().pushPose();
41+
overlay.get().render(canRender, renderData, bufferBuilder, args);
42+
renderData.poseStack().popPose();
43+
});
3944
}
4045

4146
/**
4247
* Registers an overlay to be rendered.
4348
* @param overlay A {@link Supplier} returning an instance of an {@link IRadarOverlay}
44-
* @since 0.14.15.2 (in it's current form)
49+
* @param argsSupplier A supplier that returns an array of arguments
50+
* @since 0.14.16.1
4551
*/
46-
public static void registerOverlay(Supplier<? extends IRadarOverlay> overlay) {
52+
public static void registerOverlay(Supplier<? extends IRadarOverlay> overlay, Supplier<? extends Object[]> argsSupplier) {
4753
PMWeatherAPI.LOGGER.info("Registering overlay {}", overlay.get().getID());
48-
OVERLAYS.add(overlay);
54+
OVERLAYS.put(overlay, argsSupplier);
55+
}
56+
57+
/**
58+
* Registers an overlay to be rendered.
59+
* @param overlay A {@link Supplier} returning an instance of an {@link IRadarOverlay}
60+
* @since 0.14.15.2
61+
*/
62+
public static void registerOverlay(Supplier<? extends IRadarOverlay> overlay) {
63+
registerOverlay(overlay, () -> new Object[0]);
4964
}
5065
}

src/main/java/net/nullved/pmweatherapi/command/NearbyRadarsCommand.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.minecraft.world.entity.player.Player;
1313
import net.nullved.pmweatherapi.PMWeatherAPI;
1414
import net.nullved.pmweatherapi.radar.NearbyRadars;
15+
import net.nullved.pmweatherapi.util.PMWUtils;
1516

1617
import java.util.Set;
1718

@@ -50,6 +51,10 @@ private static int nearbyRadars(CommandContext<CommandSourceStack> ctx) {
5051
sb.append("\nPos: ").append(blockPos.toShortString());
5152
}
5253

54+
if (PMWUtils.isRadarAdjacent(plr.level(), plr.blockPosition())) {
55+
sb.append("\nYou are next to a radar!");
56+
}
57+
5358
plr.sendSystemMessage(Component.literal(sb.toString()).withColor(ChatFormatting.GOLD.getColor()));
5459
return Command.SINGLE_SUCCESS;
5560
}

src/main/java/net/nullved/pmweatherapi/config/PMWClientConfig.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,49 @@
66
import net.neoforged.fml.event.config.ModConfigEvent;
77
import net.neoforged.neoforge.common.ModConfigSpec;
88
import net.nullved.pmweatherapi.PMWeatherAPI;
9+
import net.nullved.pmweatherapi.radar.RadarMode;
910

1011
@EventBusSubscriber(modid = PMWeatherAPI.MODID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
1112
public class PMWClientConfig {
1213
private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder();
1314

1415
private static final ModConfigSpec.BooleanValue DISABLE_CUSTOM_RADAR_MODE_RENDERING;
1516
public static boolean disableCustomRadarModeRendering;
17+
private static final ModConfigSpec.BooleanValue SHOW_RADAR_MODE_ID;
18+
public static boolean showRadarModeId;
19+
private static final ModConfigSpec.EnumValue<RadarModeIDSide> RADAR_MODE_ID_SIDE;
20+
public static RadarModeIDSide radarModeIDSide;
1621
public static final ModConfigSpec SPEC;
1722

1823
@SubscribeEvent
1924
private static void onLoad(ModConfigEvent event) {
2025
if (event.getConfig().getSpec() == SPEC && !(event instanceof ModConfigEvent.Unloading)) {
2126
PMWeatherAPI.LOGGER.info("Loading Client PMWeatherAPI Configs");
2227
disableCustomRadarModeRendering = DISABLE_CUSTOM_RADAR_MODE_RENDERING.getAsBoolean();
28+
showRadarModeId = SHOW_RADAR_MODE_ID.getAsBoolean();
29+
radarModeIDSide = RADAR_MODE_ID_SIDE.get();
2330
}
2431
}
2532

2633
static {
2734
DISABLE_CUSTOM_RADAR_MODE_RENDERING = BUILDER.comment("Disables custom radar mode rendering").define("disable_custom_radar_mode_rendering", false);
35+
SHOW_RADAR_MODE_ID = BUILDER.comment("Shows the radar mode ID").define("show_radar_mode_id", false);
36+
RADAR_MODE_ID_SIDE = BUILDER.comment("The side to render the radar mode ID on").defineEnum("radar_mode_id_side", RadarModeIDSide.NORTH);
2837
SPEC = BUILDER.build();
2938
}
39+
40+
public enum RadarModeIDSide {
41+
NORTH(0, -1, -1),
42+
EAST(90, 2, -1),
43+
SOUTH(180, 2, 2),
44+
WEST(-90, -1, 2),;
45+
46+
public int rotation, x, z;
47+
48+
RadarModeIDSide(int rotation, int x, int z) {
49+
this.rotation = rotation;
50+
this.x = x;
51+
this.z = z;
52+
}
53+
}
3054
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package net.nullved.pmweatherapi.data;
22

33
import net.minecraft.core.BlockPos;
4-
import net.nullved.pmweatherapi.radar.RadarMode;
5-
import net.nullved.pmweatherapi.util.StringProperty;
4+
import net.nullved.pmweatherapi.radar.RadarModeProperty;
65

76
import java.util.HashMap;
87
import java.util.Map;
@@ -12,6 +11,6 @@
1211
* @since 0.14.15.6
1312
*/
1413
public class PMWExtras {
15-
public static StringProperty RADAR_MODE = new StringProperty("radarmode", RadarMode.values());
14+
public static RadarModeProperty RADAR_MODE = new RadarModeProperty("radarmode");
1615
public static final Map<BlockPos, BlockPos> RADAR_WSR_88D_LOOKUP = new HashMap<>();
1716
}

src/main/java/net/nullved/pmweatherapi/example/ExampleOverlay.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.nullved.pmweatherapi.client.render.IRadarOverlay;
1313
import net.nullved.pmweatherapi.client.render.RenderData;
1414
import net.nullved.pmweatherapi.radar.NearbyRadars;
15+
import net.nullved.pmweatherapi.radar.RadarMode;
1516
import net.nullved.pmweatherapi.storm.NearbyStorms;
1617
import org.joml.Vector3f;
1718

@@ -24,15 +25,15 @@ public class ExampleOverlay implements IRadarOverlay {
2425
public static final ExampleOverlay INSTANCE = new ExampleOverlay();
2526

2627
@Override
27-
public void render(boolean canRender, RenderData renderData, BufferBuilder bufferBuilder) {
28+
public void render(boolean canRender, RenderData renderData, BufferBuilder bufferBuilder, Object... args) {
2829
if (!canRender) return;
2930
BlockEntity blockEntity = renderData.blockEntity();
3031
BlockPos pos = blockEntity.getBlockPos();
31-
RadarBlock.Mode mode = blockEntity.getBlockState().getValue(RadarBlock.RADAR_MODE);
32-
if (mode == RadarBlock.Mode.REFLECTIVITY) {
32+
RadarMode mode = getRadarMode(renderData);
33+
if (mode == RadarMode.REFLECTIVITY) {
3334
NearbyRadars.client().forRadarNearBlock(pos, 2048,
3435
p -> renderMarker(bufferBuilder, p.offset(-pos.getX(), -pos.getY(), -pos.getZ()).getCenter()));
35-
} else if (mode == RadarBlock.Mode.VELOCITY) {
36+
} else if (mode == RadarMode.VELOCITY) {
3637
NearbyStorms.client().forStormNearBlock(pos, 2048,
3738
s -> renderMarker(bufferBuilder, s.position.add(-pos.getX(), -pos.getY(), -pos.getZ())));
3839
}

src/main/java/net/nullved/pmweatherapi/mixin/RadarBlockMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class RadarBlockMixin {
2727

2828
@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Ldev/protomanly/pmweather/block/RadarBlock;registerDefaultState(Lnet/minecraft/world/level/block/state/BlockState;)V"))
2929
private void init(RadarBlock instance, BlockState state) {
30-
instance.registerDefaultState(instance.defaultBlockState().setValue(PMWExtras.RADAR_MODE, RadarMode.REFLECTIVITY.stringValue()).setValue(RADAR_MODE, RadarBlock.Mode.REFLECTIVITY));
30+
instance.registerDefaultState(instance.defaultBlockState().setValue(PMWExtras.RADAR_MODE, RadarMode.REFLECTIVITY).setValue(RADAR_MODE, RadarBlock.Mode.REFLECTIVITY));
3131
}
3232

3333
@Inject(method = "createBlockStateDefinition", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/StateDefinition$Builder;add([Lnet/minecraft/world/level/block/state/properties/Property;)Lnet/minecraft/world/level/block/state/StateDefinition$Builder;"))
@@ -40,9 +40,9 @@ private InteractionResult useWithoutItem(BlockState state, Level level, BlockPos
4040
original.call(state, level, pos, player, hitResult);
4141

4242
if (!level.isClientSide()) {
43-
RadarMode currentMode = RadarMode.get(state.getValue(PMWExtras.RADAR_MODE).value());
43+
RadarMode currentMode = state.getValue(PMWExtras.RADAR_MODE);
4444
RadarMode newMode = currentMode.cycle();
45-
level.setBlockAndUpdate(pos, state.setValue(PMWExtras.RADAR_MODE, newMode.stringValue()));
45+
level.setBlockAndUpdate(pos, state.setValue(PMWExtras.RADAR_MODE, newMode));
4646
}
4747

4848
return InteractionResult.SUCCESS_NO_ITEM_USED;

0 commit comments

Comments
 (0)