From 661f8c14f47cccbc2a987e063a49a639f19483f4 Mon Sep 17 00:00:00 2001 From: rokoblox <40763333+rokoblox@users.noreply.github.com> Date: Wed, 21 Sep 2022 19:23:27 +0200 Subject: [PATCH] 0.2.0: deprecated IMapMarkedBlock and switched to a registry system. - updated 0.1.3 to 0.2.0 - deprecated IMapMarkedBlock - add PinLib.registerMapMarkedBlock() and PinLib.getMapMarkedBlock() for new registry - updated TestingClass to work with new API --- gradle.properties | 2 +- src/main/java/com/rokoblox/pinlib/PinLib.java | 72 ++++++++++++++++--- .../mapmarker/CustomMarkerProvider.java | 5 ++ .../pinlib/mapmarker/IMapMarkedBlock.java | 2 + .../pinlib/mapmarker/MapMarkedBlock.java | 18 +++++ .../pinlib/mapmarker/MapMarkerEntity.java | 14 ++-- .../pinlib/mapmarker/MarkerColorProvider.java | 8 +++ .../mapmarker/MarkerDisplayNameProvider.java | 9 +++ srcdev/TestingClass.java | 59 +++++++++------ 9 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/rokoblox/pinlib/mapmarker/CustomMarkerProvider.java create mode 100644 src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkedBlock.java create mode 100644 src/main/java/com/rokoblox/pinlib/mapmarker/MarkerColorProvider.java create mode 100644 src/main/java/com/rokoblox/pinlib/mapmarker/MarkerDisplayNameProvider.java diff --git a/gradle.properties b/gradle.properties index aaa4c0b..5f404b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.19.2 yarn_mappings=1.19+build.4 loader_version=0.14.9 # Mod Properties -mod_version=0.1.3+1.19 +mod_version=0.2.0+1.19 maven_group=com.rokoblox archives_base_name=pinlib # Dependencies diff --git a/src/main/java/com/rokoblox/pinlib/PinLib.java b/src/main/java/com/rokoblox/pinlib/PinLib.java index ee6e312..46ca5c8 100644 --- a/src/main/java/com/rokoblox/pinlib/PinLib.java +++ b/src/main/java/com/rokoblox/pinlib/PinLib.java @@ -1,11 +1,11 @@ package com.rokoblox.pinlib; import com.rokoblox.pinlib.access.MapStateAccessor; -import com.rokoblox.pinlib.mapmarker.IMapMarkedBlock; -import com.rokoblox.pinlib.mapmarker.MapMarker; -import com.rokoblox.pinlib.mapmarker.MapMarkerEntity; +import com.rokoblox.pinlib.mapmarker.*; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; import net.minecraft.item.FilledMapItem; import net.minecraft.item.ItemStack; import net.minecraft.item.map.MapState; @@ -18,10 +18,13 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; + public class PinLib implements ModInitializer { public static final Logger LOGGER = LogManager.getLogger("PinLib"); - private static final Registry REGISTRY = FabricRegistryBuilder.createDefaulted(MapMarker.class, new Identifier("pinlib", "map_markers"), new Identifier("pinlib", "default")).buildAndRegister(); + private static final Registry MAP_MARKER_REGISTRY = FabricRegistryBuilder.createDefaulted(MapMarker.class, new Identifier("pinlib", "map_markers"), new Identifier("pinlib", "default")).buildAndRegister(); + private static final Registry MAP_MARKED_BLOCKS_REGISTRY = FabricRegistryBuilder.createSimple(MapMarkedBlock.class, new Identifier("pinlib", "map_marked_blocks")).buildAndRegister(); private static final MapMarker DEFAULT_MARKER = createStaticMarker(new Identifier("pinlib", "default")); /** @@ -47,7 +50,7 @@ public void onInitialize() { */ public static MapMarker createStaticMarker(Identifier id) { LOGGER.info("Registering new static map marker with id [{}]", id.toString()); - return Registry.register(REGISTRY, id, new MapMarker(id, false)); + return Registry.register(MAP_MARKER_REGISTRY, id, new MapMarker(id, false)); } /** @@ -68,7 +71,42 @@ public static MapMarker createStaticMarker(Identifier id) { */ public static MapMarker createDynamicMarker(Identifier id) { LOGGER.info("Registering new dynamic map marker with id [{}]", id.toString()); - return Registry.register(REGISTRY, id, new MapMarker(id, true)); + return Registry.register(MAP_MARKER_REGISTRY, id, new MapMarker(id, true)); + } + + /** + * Creates and registers a {@link com.rokoblox.pinlib.mapmarker.MapMarkedBlock} + * for the provided block with + * the provided methods. + * + * @param entry Block to register + * @param markerProvider You can use `() -> PinLib.getDefaultMarker()` as a default value. + * @param colorProvider You can use `(world, pos) -> 0xFFFFFFFFL` as a default value. + * @param displayNameProvider You can use `(BlockView world, BlockPos pos) -> null` as a default value. + * @return Provided entry + */ + public static MapMarkedBlock registerMapMarkedBlock(Block entry, CustomMarkerProvider markerProvider, MarkerColorProvider colorProvider, MarkerDisplayNameProvider displayNameProvider) { + Identifier id = Registry.BLOCK.getId(entry); + if (id == Registry.BLOCK.getDefaultId()) + LOGGER.warn("Registering default ID [{}] as a map marked block, this might be because the provided block entry was not registered as a block first.", id.toString()); + LOGGER.info("Registering block with id [{}] as a map marked block.", id.toString()); + return Registry.register(MAP_MARKED_BLOCKS_REGISTRY, id, new MapMarkedBlock(entry, markerProvider, colorProvider, displayNameProvider)); + } + + /** + * Returns a {@link MapMarkedBlock} for the provided + * block if the block was previously registered with + * registerMapMarkedBlock(...) or null if not. + *

+ * This method uses caching for performance, + * manually optimizing results is not needed. + *

+ * + * @param block Block to find {@link MapMarkedBlock} for + * @return Matching {@link MapMarkedBlock}, null if none was found in registry. + */ + public static MapMarkedBlock getMapMarkedBlock(Block block) { + return MapMarkedBlockCache.fromBlock(block); } /** @@ -167,11 +205,13 @@ public static boolean tryRemoveMapMarker(ItemStack stack, World world, BlockPos * @param blockPos Position of the block * @return Whether the action succeeded or not */ + @SuppressWarnings("deprecation") public static boolean tryUseOnMarkableBlock(ItemStack stack, World world, BlockPos blockPos) { MapStateAccessor mapState = (MapStateAccessor) FilledMapItem.getOrCreateMapState(stack, world); if (mapState == null) return false; MapMarkerEntity mapMarker = MapMarkerEntity.fromWorldBlock(world, blockPos); + BlockState blockState = world.getBlockState(blockPos); if (mapState.addMapMarker(world, blockPos, mapMarker)) { if (mapMarker == null) return false; @@ -181,7 +221,7 @@ public static boolean tryUseOnMarkableBlock(ItemStack stack, World world, BlockP null, blockPos.getX(), blockPos.getZ(), - !(world.getBlockState(blockPos).getBlock() instanceof IMapMarkedBlock), + !(blockState.getBlock() instanceof IMapMarkedBlock) && (getMapMarkedBlock(blockState.getBlock()) == null), null )) != null) { PinLib.LOGGER.info("Removed map marker with id [{}] at: [{}]", mapMarker.getId(), blockPos.toShortString()); @@ -191,10 +231,24 @@ public static boolean tryUseOnMarkableBlock(ItemStack stack, World world, BlockP } public static MapMarker get(Identifier id) { - return REGISTRY.get(id); + return MAP_MARKER_REGISTRY.get(id); } public static MapMarker getDefaultMarker() { return DEFAULT_MARKER; } -} + + static class MapMarkedBlockCache { + private static final HashMap cache = new HashMap<>(); + + public static MapMarkedBlock fromBlock(Block block) { + if (cache.containsKey(block)) + return cache.get(block); + else { + MapMarkedBlock entry = MAP_MARKED_BLOCKS_REGISTRY.get(Registry.BLOCK.getId(block)); + cache.put(block, entry); + return entry; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rokoblox/pinlib/mapmarker/CustomMarkerProvider.java b/src/main/java/com/rokoblox/pinlib/mapmarker/CustomMarkerProvider.java new file mode 100644 index 0000000..2453903 --- /dev/null +++ b/src/main/java/com/rokoblox/pinlib/mapmarker/CustomMarkerProvider.java @@ -0,0 +1,5 @@ +package com.rokoblox.pinlib.mapmarker; + +public interface CustomMarkerProvider { + MapMarker run(); +} diff --git a/src/main/java/com/rokoblox/pinlib/mapmarker/IMapMarkedBlock.java b/src/main/java/com/rokoblox/pinlib/mapmarker/IMapMarkedBlock.java index 4a349a6..e92cf8e 100644 --- a/src/main/java/com/rokoblox/pinlib/mapmarker/IMapMarkedBlock.java +++ b/src/main/java/com/rokoblox/pinlib/mapmarker/IMapMarkedBlock.java @@ -10,6 +10,8 @@ *

* Implement in your Block class to use it as a MapMarker. */ +@SuppressWarnings("DeprecatedIsStillUsed") +@Deprecated public interface IMapMarkedBlock { default MapMarker getCustomMarker() { return PinLib.getDefaultMarker(); diff --git a/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkedBlock.java b/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkedBlock.java new file mode 100644 index 0000000..14c997f --- /dev/null +++ b/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkedBlock.java @@ -0,0 +1,18 @@ +package com.rokoblox.pinlib.mapmarker; + +import net.minecraft.block.Block; + +public class MapMarkedBlock { + public final Block block; + public final CustomMarkerProvider markerProvider; + public final MarkerColorProvider markerColorProvider; + public final MarkerDisplayNameProvider markerDisplayNameProvider; + + public MapMarkedBlock(Block block, CustomMarkerProvider markerProvider, MarkerColorProvider markerColorProvider, MarkerDisplayNameProvider markerDisplayNameProvider) { + this.block = block; + this.markerProvider = markerProvider; + this.markerColorProvider = markerColorProvider; + this.markerDisplayNameProvider = markerDisplayNameProvider; + } +} + diff --git a/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkerEntity.java b/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkerEntity.java index 19490d9..e203a96 100644 --- a/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkerEntity.java +++ b/src/main/java/com/rokoblox/pinlib/mapmarker/MapMarkerEntity.java @@ -51,10 +51,15 @@ public MapMarkerEntity(MapMarker type, BlockPos pos, @Nullable Text displayName) @Nullable public static MapMarkerEntity fromWorldBlock(World world, BlockPos blockPos) { BlockState blockState = world.getBlockState(blockPos); - if (blockState.getBlock() instanceof IMapMarkedBlock mapMarkedBlock) { - MapMarker type = mapMarkedBlock.getCustomMarker(); - Text text = mapMarkedBlock.getDisplayName(world, blockPos); - return new MapMarkerEntity(type, blockPos, text, mapMarkedBlock.getMarkerColor(world, blockPos)); + MapMarkedBlock mapMarkedBlock = PinLib.getMapMarkedBlock(blockState.getBlock()); + if (mapMarkedBlock != null) { + MapMarker type = mapMarkedBlock.markerProvider.run(); + Text text = mapMarkedBlock.markerDisplayNameProvider.run(world, blockPos); + return new MapMarkerEntity(type, blockPos, text, mapMarkedBlock.markerColorProvider.run(world, blockPos)); + } else if (blockState.getBlock() instanceof @SuppressWarnings("deprecation")IMapMarkedBlock deprecatedMapMarkedBlock) { + MapMarker type = deprecatedMapMarkedBlock.getCustomMarker(); + Text text = deprecatedMapMarkedBlock.getDisplayName(world, blockPos); + return new MapMarkerEntity(type, blockPos, text, deprecatedMapMarkedBlock.getMarkerColor(world, blockPos)); } return null; } @@ -150,3 +155,4 @@ public long getColor() { return this.color; } } + diff --git a/src/main/java/com/rokoblox/pinlib/mapmarker/MarkerColorProvider.java b/src/main/java/com/rokoblox/pinlib/mapmarker/MarkerColorProvider.java new file mode 100644 index 0000000..7385ed2 --- /dev/null +++ b/src/main/java/com/rokoblox/pinlib/mapmarker/MarkerColorProvider.java @@ -0,0 +1,8 @@ +package com.rokoblox.pinlib.mapmarker; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; + +public interface MarkerColorProvider { + long run(BlockView world, BlockPos pos); +} diff --git a/src/main/java/com/rokoblox/pinlib/mapmarker/MarkerDisplayNameProvider.java b/src/main/java/com/rokoblox/pinlib/mapmarker/MarkerDisplayNameProvider.java new file mode 100644 index 0000000..ccb469c --- /dev/null +++ b/src/main/java/com/rokoblox/pinlib/mapmarker/MarkerDisplayNameProvider.java @@ -0,0 +1,9 @@ +package com.rokoblox.pinlib.mapmarker; + +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; + +public interface MarkerDisplayNameProvider { + Text run(BlockView world, BlockPos pos); +} diff --git a/srcdev/TestingClass.java b/srcdev/TestingClass.java index 9f5b4eb..37aacca 100644 --- a/srcdev/TestingClass.java +++ b/srcdev/TestingClass.java @@ -22,32 +22,49 @@ public static void init() { TESTMARKER = PinLib.createDynamicMarker(new Identifier("pinlib", "testmarker")); TESTBLOCK = new TestBlock(FabricBlockSettings.of(Material.STONE)); Registry.register(Registry.BLOCK, new Identifier("pinlib", "testblock"), TESTBLOCK); + + // Map marked blocks should NOT be registered like this, + // this is just to demonstrate how to switch from the + // deprecated IMapMarkedBlock to the new registering system. + PinLib.registerMapMarkedBlock( + TESTBLOCK, + () -> TESTMARKER, + (world, pos) -> 0xFFFFFFFFL, + (world, pos) -> Text.literal("Hello world!").setStyle(Style.EMPTY) + ); ServerTickEvents.END_SERVER_TICK.register(server -> isRed = !isRed); } } -class TestBlock extends Block implements IMapMarkedBlock { +class TestBlock extends Block { public TestBlock(Settings settings) { super(settings); } - - @Override // Default method returns default marker (useful for quick debugging). - public MapMarker getCustomMarker() { - return PinLib.get(new Identifier("pinlib", "testmarker")); - } - - @Override // Default method returns 0xFFFFFFFFL (white) - public long getMarkerColor(BlockView world, BlockPos pos) { - // Use net.minecraft.util.math.ColorHelper to get integer from RGB values. - return 0xFFFFFFFFL; // (argb) -> 255, 255, 0, 0 - } - - @Override - public Text getDisplayName(BlockView world, BlockPos pos) { - // It's a good idea to not leave style as null since the loaded - // map markers from NBT always load with an empty style, thus - // the game thinks the loaded display name and the one here - // are unequal causing an unnecessary update to the map marker. - return Text.literal("Hey there!").setStyle(Style.EMPTY); - } } + +// Deprecated IMapMarkedBlock implementation, use above example instead. +//class TestBlock extends Block implements IMapMarkedBlock { +// public TestBlock(Settings settings) { +// super(settings); +// } +// +// @Override // Default method returns default marker (useful for quick debugging). +// public MapMarker getCustomMarker() { +// return PinLib.get(new Identifier("pinlib", "testmarker")); +// } +// +// @Override // Default method returns 0xFFFFFFFFL (white) +// public long getMarkerColor(BlockView world, BlockPos pos) { +// // Use net.minecraft.util.math.ColorHelper to get integer from RGB values. +// return 0xFFFFFFFFL; // (argb) -> 255, 255, 0, 0 +// } +// +// @Override +// public Text getDisplayName(BlockView world, BlockPos pos) { +// // It's a good idea to not leave style as null since the loaded +// // map markers from NBT always load with an empty style, thus +// // the game thinks the loaded display name and the one here +// // are unequal causing an unnecessary update to the map marker. +// return Text.literal("Hey there!").setStyle(Style.EMPTY); +// } +//}