From c36d9a4964169d432147267c6e43e61094ef2583 Mon Sep 17 00:00:00 2001
From: mine_diver
Date: Thu, 2 May 2024 18:11:58 +0500
Subject: [PATCH 01/10] First version of tool items update
---
.../sltest/block/Blocks.java | 2 +-
.../sltest/item/ItemListener.java | 4 +-
.../tags/blocks/mineable/pickaxe.json | 5 ++
.../tags/blocks/needs_iron_tool.json | 5 ++
.../tags/blocks/needs_tool_level_modded.json | 6 +++
.../api/item/tool/StationHoeItem.java | 1 -
.../api/item/tool/StationShearsItem.java | 1 -
.../api/item/tool/StationSwordItem.java | 1 -
.../api/item/tool/StationToolItem.java | 1 -
.../api/item/tool/StationToolMaterial.java | 36 +-------------
.../stationapi/api/item/tool/ToolLevel.java | 1 -
.../api/item/tool/ToolMaterialFactory.java | 1 -
.../impl/item/HijackShearsImplV1.java | 1 -
.../impl/item/ToolEffectivenessImplV1.java | 30 ++++++++++--
.../mixin/tools/ToolMaterialMixin.java | 47 ++-----------------
.../item/tool/VanillaToolFixImpl.java | 11 ++---
.../tags/blocks/needs_diamond_tool.json | 1 +
.../tags/blocks/needs_iron_tool.json | 1 +
18 files changed, 60 insertions(+), 95 deletions(-)
create mode 100644 src/test/resources/data/minecraft/stationapi/tags/blocks/mineable/pickaxe.json
create mode 100644 src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
create mode 100644 src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json
diff --git a/src/test/java/net/modificationstation/sltest/block/Blocks.java b/src/test/java/net/modificationstation/sltest/block/Blocks.java
index b30536a68..278cf6bfd 100644
--- a/src/test/java/net/modificationstation/sltest/block/Blocks.java
+++ b/src/test/java/net/modificationstation/sltest/block/Blocks.java
@@ -16,7 +16,7 @@
public enum Blocks {
- TEST_BLOCK("test_block", "testBlock", id -> new TemplateBlock(id, Material.CLAY).setHardness(1)),
+ TEST_BLOCK("test_block", "testBlock", id -> new TemplateBlock(id, Material.STONE).setHardness(1)),
TEST_ANIMATED_BLOCK("test_animated_block", "testAnimatedBlock", id -> new ModdedMetaBlock(id, Material.NETHER_PORTAL)),
CUSTOM_MODEL_BLOCK("farlands_block", "farlands_block", id -> new ModdedModelBlock(id, Material.SOIL).setHardness(1)),
FREEZER("freezer", "freezer", id -> new BlockFreezer(id).setHardness(2.5F).setSoundGroup(TemplateBlock.DEFAULT_SOUND_GROUP)),
diff --git a/src/test/java/net/modificationstation/sltest/item/ItemListener.java b/src/test/java/net/modificationstation/sltest/item/ItemListener.java
index ee725ed40..523a847b3 100644
--- a/src/test/java/net/modificationstation/sltest/item/ItemListener.java
+++ b/src/test/java/net/modificationstation/sltest/item/ItemListener.java
@@ -7,8 +7,10 @@
import net.modificationstation.sltest.block.VariationBlock;
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
import net.modificationstation.stationapi.api.item.tool.ToolMaterialFactory;
+import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
import net.modificationstation.stationapi.api.registry.Registry;
+import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.template.item.BlockStateItem;
import static net.modificationstation.sltest.SLTest.NAMESPACE;
@@ -18,7 +20,7 @@ public class ItemListener {
@EventListener
public void registerItems(ItemRegistryEvent event) {
testItem = new ModdedItem(NAMESPACE.id("test_item")).setTranslationKey(NAMESPACE, "testItem"); //8475
- testMaterial = ToolMaterialFactory.create("testMaterial", 3, Integer.MAX_VALUE, Float.MAX_VALUE, Integer.MAX_VALUE - 2);
+ testMaterial = ToolMaterialFactory.create("testMaterial", 3, Integer.MAX_VALUE, Float.MAX_VALUE, Integer.MAX_VALUE - 2).miningLevelTag(TagKey.of(BlockRegistry.KEY, NAMESPACE.id("needs_tool_level_modded")));
testPickaxe = new ModdedPickaxeItem(NAMESPACE.id("test_pickaxe"), testMaterial).setTranslationKey(NAMESPACE, "testPickaxe"); //8476
testNBTItem = new NBTItem(NAMESPACE.id("nbt_item")).setTranslationKey(NAMESPACE, "nbt_item"); //8477
testModelItem = new ModelItem(NAMESPACE.id("model_item")).setMaxCount(1).setTranslationKey(NAMESPACE, "idkSomething");
diff --git a/src/test/resources/data/minecraft/stationapi/tags/blocks/mineable/pickaxe.json b/src/test/resources/data/minecraft/stationapi/tags/blocks/mineable/pickaxe.json
new file mode 100644
index 000000000..04f9bde83
--- /dev/null
+++ b/src/test/resources/data/minecraft/stationapi/tags/blocks/mineable/pickaxe.json
@@ -0,0 +1,5 @@
+{
+ "values": [
+ "sltest:test_block"
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json b/src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
new file mode 100644
index 000000000..2dd664728
--- /dev/null
+++ b/src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
@@ -0,0 +1,5 @@
+{
+ "values": [
+ "#sltest:needs_tool_level_modded"
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json b/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json
new file mode 100644
index 000000000..b15b2bb24
--- /dev/null
+++ b/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json
@@ -0,0 +1,6 @@
+{
+ "values": [
+ "#needs_stone_tool",
+ "sltest:test_block"
+ ]
+}
\ No newline at end of file
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java
index 5f6ca48dc..9115fe99e 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java
@@ -7,7 +7,6 @@
import net.modificationstation.stationapi.api.util.Util;
public interface StationHoeItem extends ToolLevel {
-
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java
index f0d24982d..b6904d204 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java
@@ -7,7 +7,6 @@
import net.modificationstation.stationapi.api.util.Util;
public interface StationShearsItem extends ToolLevel {
-
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java
index 2cac4fec5..0f648e8d9 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java
@@ -7,7 +7,6 @@
import net.modificationstation.stationapi.api.util.Util;
public interface StationSwordItem extends ToolLevel {
-
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java
index 57998fd5a..f23cdbc75 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java
@@ -7,7 +7,6 @@
import net.modificationstation.stationapi.api.util.Util;
public interface StationToolItem extends ToolLevel {
-
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
index b9676af8a..e404b21bb 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
@@ -1,48 +1,16 @@
package net.modificationstation.stationapi.api.item.tool;
-import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
-import it.unimi.dsi.fastutil.objects.ReferenceSet;
import net.minecraft.block.Block;
import net.minecraft.item.ToolMaterial;
-import net.modificationstation.stationapi.api.block.BlockState;
-import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Util;
-import java.util.function.BiPredicate;
-import java.util.function.Predicate;
-
public interface StationToolMaterial {
-
- ReferenceSet> ALL_TOOL_MATERIAL_TAGS = new ReferenceOpenHashSet<>();
-
- default ToolMaterial inheritsFrom(ToolMaterial... toolMaterials) {
+ default ToolMaterial miningLevelTag(TagKey tag) {
return Util.assertImpl();
}
- default ToolMaterial requiredBlockTag(Identifier tag) {
+ default TagKey getMiningLevelTag() {
return Util.assertImpl();
}
-
- default ReferenceSet getParentMaterials() {
- return Util.assertImpl();
- }
-
- default TagKey getRequiredBlockTag() {
- return Util.assertImpl();
- }
-
- default boolean matches(BlockState state) {
- return ALL_TOOL_MATERIAL_TAGS.stream().noneMatch(state::isIn) || matches0(state);
- }
-
- private boolean matches0(BlockState state) {
- TagKey tag = getRequiredBlockTag();
- if (tag != null) {
- if (state.isIn(tag)) return true;
- BiPredicate matches0 = StationToolMaterial::matches0;
- Predicate matchesThis = t -> matches0.test(t, state);
- return getParentMaterials().stream().anyMatch(matchesThis);
- } else return false;
- }
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java
index 84bb3fb87..d12cf4528 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java
@@ -6,7 +6,6 @@
import net.modificationstation.stationapi.api.tag.TagKey;
public interface ToolLevel {
-
void setEffectiveBlocks(TagKey effectiveBlocks);
TagKey getEffectiveBlocks(ItemStack stack);
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java
index e0b52131a..8ecfecadd 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolMaterialFactory.java
@@ -4,7 +4,6 @@
import net.modificationstation.stationapi.api.factory.EnumFactory;
public class ToolMaterialFactory {
-
public static ToolMaterial create(String materialName, int miningLevel, int durability, float miningSpeed, int attackDamage) {
return EnumFactory.addEnum(
ToolMaterial.class, materialName,
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java
index ef0f81f1a..873ee30c3 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java
@@ -7,7 +7,6 @@
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class HijackShearsImplV1 {
-
//TODO: Make this match anything that has shear tool properties. Not sure how to go around this at the moment.
@EventListener
private static void hijackShearsEvent(ShearsOverrideEvent event) {
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
index 258205d1d..791131f69 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
@@ -3,6 +3,7 @@
import net.mine_diver.unsafeevents.listener.EventListener;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import net.minecraft.item.ToolMaterial;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.event.item.IsItemSuitableForStateEvent;
@@ -17,6 +18,7 @@
import net.modificationstation.stationapi.api.util.Namespace;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -25,7 +27,6 @@
@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public class ToolEffectivenessImplV1 {
-
public static final List VANILLA_TOOLS = new ArrayList<>();
@EventListener(priority = LOW)
@@ -55,15 +56,36 @@ private static void getItems(ItemRegistryEvent event) {
@EventListener
private static void isEffective(IsItemSuitableForStateEvent event) {
- event.suitable = event.suitable || isSuitable(event.itemStack, event.state);
+ // Disable custom tool logic if both the block and the tool are vanilla
+ // This is done to preserve the vanilla mining speeds
+ if (VANILLA_TOOLS.contains(ItemRegistry.INSTANCE.getId(event.itemStack.getItem()))
+ && Objects.requireNonNull(BlockRegistry.INSTANCE.getId(event.state.getBlock())).namespace == Namespace.MINECRAFT) return;
+
+ event.suitable = isSuitable(event.itemStack, event.state);
}
@EventListener
private static void getStrength(ItemMiningSpeedMultiplierOnStateEvent event) {
- if (!(VANILLA_TOOLS.contains(ItemRegistry.INSTANCE.getId(event.itemStack.getItem())) && Objects.requireNonNull(BlockRegistry.INSTANCE.getId(event.state.getBlock())).namespace == Namespace.MINECRAFT) && isSuitable(event.itemStack, event.state)) event.miningSpeedMultiplier = ((ToolLevel) event.itemStack.getItem()).getMaterial(event.itemStack).getMiningSpeedMultiplier();
+ // Disable custom tool logic if both the block and the tool are vanilla
+ // This is done to preserve the vanilla mining speeds
+ if (VANILLA_TOOLS.contains(ItemRegistry.INSTANCE.getId(event.itemStack.getItem()))
+ && Objects.requireNonNull(BlockRegistry.INSTANCE.getId(event.state.getBlock())).namespace == Namespace.MINECRAFT) return;
+
+ if (!isSuitable(event.itemStack, event.state)) return;
+
+ event.miningSpeedMultiplier = ((ToolLevel) event.itemStack.getItem()).getMaterial(event.itemStack).getMiningSpeedMultiplier();
}
private static boolean isSuitable(ItemStack item, BlockState state) {
- return item.getItem() instanceof ToolLevel toolLevel && state.isIn(toolLevel.getEffectiveBlocks(item)) && toolLevel.getMaterial(item).matches(state);
+ return item.getItem() instanceof ToolLevel toolLevel
+ && state.isIn(toolLevel.getEffectiveBlocks(item))
+ &&
+ (
+ state.isIn(toolLevel.getMaterial(item).getMiningLevelTag())
+ || Arrays
+ .stream(ToolMaterial.values())
+ .filter(toolMaterial -> toolMaterial.getMiningLevelTag() != null)
+ .noneMatch(toolMaterial -> state.isIn(toolMaterial.getMiningLevelTag()))
+ );
}
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
index 3429c86b5..820859da2 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
@@ -1,64 +1,27 @@
package net.modificationstation.stationapi.mixin.tools;
-import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
-import it.unimi.dsi.fastutil.objects.ReferenceSet;
-import it.unimi.dsi.fastutil.objects.ReferenceSets;
import net.minecraft.block.Block;
import net.minecraft.item.ToolMaterial;
import net.modificationstation.stationapi.api.item.tool.StationToolMaterial;
-import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
-import net.modificationstation.stationapi.api.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import java.util.Collections;
@Mixin(ToolMaterial.class)
class ToolMaterialMixin implements StationToolMaterial {
@Unique
- private TagKey stationapi_requiredBlockTag;
- @Unique
- private ReferenceSet stationapi_parentMaterials;
- @Unique
- private ReferenceSet stationapi_parentMaterialsView;
-
- @Inject(
- method = "(Ljava/lang/String;IIIFI)V",
- at = @At("RETURN")
- )
- private void stationapi_init(String i, int j, int k, int f, float l, int par6, CallbackInfo ci) {
- stationapi_parentMaterials = new ReferenceOpenHashSet<>();
- stationapi_parentMaterialsView = ReferenceSets.unmodifiable(stationapi_parentMaterials);
- }
-
- @Override
- @Unique
- public ToolMaterial inheritsFrom(ToolMaterial... toolMaterials) {
- Collections.addAll(stationapi_parentMaterials, toolMaterials);
- return ToolMaterial.class.cast(this);
- }
+ private TagKey stationapi_miningLevelTag;
@Override
@Unique
- public ToolMaterial requiredBlockTag(Identifier tag) {
- ALL_TOOL_MATERIAL_TAGS.remove(stationapi_requiredBlockTag);
- ALL_TOOL_MATERIAL_TAGS.add(stationapi_requiredBlockTag = TagKey.of(BlockRegistry.INSTANCE.getKey(), tag));
+ public ToolMaterial miningLevelTag(TagKey tag) {
+ stationapi_miningLevelTag = tag;
return ToolMaterial.class.cast(this);
}
@Override
@Unique
- public ReferenceSet getParentMaterials() {
- return stationapi_parentMaterialsView;
- }
-
- @Override
- @Unique
- public TagKey getRequiredBlockTag() {
- return stationapi_requiredBlockTag;
+ public TagKey getMiningLevelTag() {
+ return stationapi_miningLevelTag;
}
}
diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
index c9cffd6bc..0c9cedfa7 100644
--- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
+++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
@@ -6,6 +6,8 @@
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
+import net.modificationstation.stationapi.api.registry.BlockRegistry;
+import net.modificationstation.stationapi.api.tag.TagKey;
import static net.modificationstation.stationapi.api.util.Identifier.of;
@@ -17,11 +19,8 @@ private static void fixToolMaterials(ItemRegistryEvent event) {
ToolMaterial stone = ToolMaterial.STONE;
ToolMaterial iron = ToolMaterial.IRON;
ToolMaterial diamond = ToolMaterial.DIAMOND;
- stone.inheritsFrom(ToolMaterial.WOOD, ToolMaterial.GOLD);
- stone.requiredBlockTag(of("needs_stone_tool"));
- iron.inheritsFrom(ToolMaterial.STONE);
- iron.requiredBlockTag(of("needs_iron_tool"));
- diamond.inheritsFrom(ToolMaterial.IRON);
- diamond.requiredBlockTag(of("needs_diamond_tool"));
+ stone.miningLevelTag(TagKey.of(BlockRegistry.KEY, of("needs_stone_tool")));
+ iron.miningLevelTag(TagKey.of(BlockRegistry.KEY, of("needs_iron_tool")));
+ diamond.miningLevelTag(TagKey.of(BlockRegistry.KEY, of("needs_diamond_tool")));
}
}
diff --git a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json
index 54d961641..7e914dc50 100644
--- a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json
+++ b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json
@@ -1,5 +1,6 @@
{
"values": [
+ "#needs_iron_tool",
"obsidian"
]
}
\ No newline at end of file
diff --git a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
index 58f40dc96..d0bdd018c 100644
--- a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
+++ b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
@@ -1,5 +1,6 @@
{
"values": [
+ "#needs_stone_tool",
"diamond_block",
"diamond_ore",
"gold_block",
From 433fa82c627193c731b648bf0c499937c52e19cb Mon Sep 17 00:00:00 2001
From: mine_diver
Date: Wed, 8 May 2024 03:02:38 +0500
Subject: [PATCH 02/10] Mining levels graph
---
.../sltest/item/ItemListener.java | 10 +++++-
.../tags/blocks/needs_iron_tool.json | 5 ---
.../tags/blocks/needs_tool_level_modded.json | 1 -
.../api/item/tool/MiningLevelManager.java | 33 +++++++++++++++++++
.../api/item/tool/StationToolMaterial.java | 6 ++--
.../impl/item/ToolEffectivenessImplV1.java | 14 +++-----
.../mixin/tools/ToolMaterialMixin.java | 13 ++++----
.../item/tool/VanillaToolFixImpl.java | 16 +++++----
.../tags/blocks/needs_diamond_tool.json | 1 -
.../tags/blocks/needs_iron_tool.json | 1 -
10 files changed, 64 insertions(+), 36 deletions(-)
delete mode 100644 src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
create mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java
diff --git a/src/test/java/net/modificationstation/sltest/item/ItemListener.java b/src/test/java/net/modificationstation/sltest/item/ItemListener.java
index 523a847b3..89a2a712d 100644
--- a/src/test/java/net/modificationstation/sltest/item/ItemListener.java
+++ b/src/test/java/net/modificationstation/sltest/item/ItemListener.java
@@ -6,6 +6,7 @@
import net.modificationstation.sltest.block.Blocks;
import net.modificationstation.sltest.block.VariationBlock;
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
+import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
import net.modificationstation.stationapi.api.item.tool.ToolMaterialFactory;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
@@ -19,8 +20,13 @@ public class ItemListener {
@EventListener
public void registerItems(ItemRegistryEvent event) {
+ MiningLevelManager.LevelNode moddedNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, NAMESPACE.id("needs_tool_level_modded")));
+ MiningLevelManager.GRAPH.putEdge(ToolMaterial.STONE.getMiningLevelNode(), moddedNode);
+ MiningLevelManager.GRAPH.putEdge(moddedNode, ToolMaterial.IRON.getMiningLevelNode());
+ MiningLevelManager.invalidateCache();
+
testItem = new ModdedItem(NAMESPACE.id("test_item")).setTranslationKey(NAMESPACE, "testItem"); //8475
- testMaterial = ToolMaterialFactory.create("testMaterial", 3, Integer.MAX_VALUE, Float.MAX_VALUE, Integer.MAX_VALUE - 2).miningLevelTag(TagKey.of(BlockRegistry.KEY, NAMESPACE.id("needs_tool_level_modded")));
+ testMaterial = ToolMaterialFactory.create("testMaterial", 3, Integer.MAX_VALUE, Float.MAX_VALUE, Integer.MAX_VALUE - 2).miningLevelNode(moddedNode);
testPickaxe = new ModdedPickaxeItem(NAMESPACE.id("test_pickaxe"), testMaterial).setTranslationKey(NAMESPACE, "testPickaxe"); //8476
testNBTItem = new NBTItem(NAMESPACE.id("nbt_item")).setTranslationKey(NAMESPACE, "nbt_item"); //8477
testModelItem = new ModelItem(NAMESPACE.id("model_item")).setMaxCount(1).setTranslationKey(NAMESPACE, "idkSomething");
@@ -32,6 +38,8 @@ public void registerItems(ItemRegistryEvent event) {
testShears = new TestShearsItem(NAMESPACE.id("test_shears")).setTranslationKey(NAMESPACE, "test_shears");
pacifistSword = new PacifistSwordItem(NAMESPACE.id("pacifist_sword")).setTranslationKey(NAMESPACE, "pacifist_sword");
dullPickaxe = new DullPickaxeItem(NAMESPACE.id("dull_pickaxe")).setTranslationKey(NAMESPACE, "dull_pickaxe");
+
+
}
public static Item testItem;
diff --git a/src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json b/src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
deleted file mode 100644
index 2dd664728..000000000
--- a/src/test/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "#sltest:needs_tool_level_modded"
- ]
-}
\ No newline at end of file
diff --git a/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json b/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json
index b15b2bb24..04f9bde83 100644
--- a/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json
+++ b/src/test/resources/data/sltest/stationapi/tags/blocks/needs_tool_level_modded.json
@@ -1,6 +1,5 @@
{
"values": [
- "#needs_stone_tool",
"sltest:test_block"
]
}
\ No newline at end of file
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java
new file mode 100644
index 000000000..205f3b7db
--- /dev/null
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java
@@ -0,0 +1,33 @@
+package net.modificationstation.stationapi.api.item.tool;
+
+import com.google.common.graph.GraphBuilder;
+import com.google.common.graph.MutableGraph;
+import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
+import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap;
+import lombok.val;
+import net.minecraft.block.Block;
+import net.modificationstation.stationapi.api.block.BlockState;
+import net.modificationstation.stationapi.api.tag.TagKey;
+
+import java.util.stream.Collectors;
+
+public final class MiningLevelManager {
+ public record LevelNode(TagKey blockTag) {}
+ private record CacheKey(LevelNode levelNode, BlockState state) {}
+
+ public static final MutableGraph GRAPH = GraphBuilder.directed().build();
+ private static final Object2BooleanMap CACHE = new Object2BooleanOpenHashMap<>();
+
+ public static boolean isSuitable(LevelNode levelNode, BlockState state) {
+ return CACHE.computeIfAbsent(new CacheKey(levelNode, state), (CacheKey key) -> {
+ val nodes = GRAPH.nodes().stream().filter(node -> key.state.isIn(node.blockTag)).collect(Collectors.toSet());
+ if (nodes.isEmpty()) return true;
+ val pred = GRAPH.predecessors(key.levelNode);
+ return nodes.stream().anyMatch(node -> key.levelNode.equals(node) || pred.contains(node));
+ });
+ }
+
+ public static void invalidateCache() {
+ CACHE.clear();
+ }
+}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
index e404b21bb..a8aa7d932 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
@@ -1,16 +1,14 @@
package net.modificationstation.stationapi.api.item.tool;
-import net.minecraft.block.Block;
import net.minecraft.item.ToolMaterial;
-import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Util;
public interface StationToolMaterial {
- default ToolMaterial miningLevelTag(TagKey tag) {
+ default ToolMaterial miningLevelNode(MiningLevelManager.LevelNode levelNode) {
return Util.assertImpl();
}
- default TagKey getMiningLevelTag() {
+ default MiningLevelManager.LevelNode getMiningLevelNode() {
return Util.assertImpl();
}
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
index 791131f69..9f4d161d6 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
@@ -1,14 +1,15 @@
package net.modificationstation.stationapi.impl.item;
+import com.google.common.graph.GraphBuilder;
import net.mine_diver.unsafeevents.listener.EventListener;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
-import net.minecraft.item.ToolMaterial;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.event.item.IsItemSuitableForStateEvent;
import net.modificationstation.stationapi.api.event.item.ItemMiningSpeedMultiplierOnStateEvent;
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
+import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
import net.modificationstation.stationapi.api.item.tool.ToolLevel;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
@@ -18,7 +19,6 @@
import net.modificationstation.stationapi.api.util.Namespace;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -73,19 +73,13 @@ private static void getStrength(ItemMiningSpeedMultiplierOnStateEvent event) {
if (!isSuitable(event.itemStack, event.state)) return;
+ GraphBuilder.directed().allowsSelfLoops(true).build();
event.miningSpeedMultiplier = ((ToolLevel) event.itemStack.getItem()).getMaterial(event.itemStack).getMiningSpeedMultiplier();
}
private static boolean isSuitable(ItemStack item, BlockState state) {
return item.getItem() instanceof ToolLevel toolLevel
&& state.isIn(toolLevel.getEffectiveBlocks(item))
- &&
- (
- state.isIn(toolLevel.getMaterial(item).getMiningLevelTag())
- || Arrays
- .stream(ToolMaterial.values())
- .filter(toolMaterial -> toolMaterial.getMiningLevelTag() != null)
- .noneMatch(toolMaterial -> state.isIn(toolMaterial.getMiningLevelTag()))
- );
+ && MiningLevelManager.isSuitable(toolLevel.getMaterial(item).getMiningLevelNode(), state);
}
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
index 820859da2..aa4265349 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
@@ -1,27 +1,26 @@
package net.modificationstation.stationapi.mixin.tools;
-import net.minecraft.block.Block;
import net.minecraft.item.ToolMaterial;
+import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
import net.modificationstation.stationapi.api.item.tool.StationToolMaterial;
-import net.modificationstation.stationapi.api.tag.TagKey;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@Mixin(ToolMaterial.class)
class ToolMaterialMixin implements StationToolMaterial {
@Unique
- private TagKey stationapi_miningLevelTag;
+ private MiningLevelManager.LevelNode stationapi_levelNode;
@Override
@Unique
- public ToolMaterial miningLevelTag(TagKey tag) {
- stationapi_miningLevelTag = tag;
+ public ToolMaterial miningLevelNode(MiningLevelManager.LevelNode levelNode) {
+ stationapi_levelNode = levelNode;
return ToolMaterial.class.cast(this);
}
@Override
@Unique
- public TagKey getMiningLevelTag() {
- return stationapi_miningLevelTag;
+ public MiningLevelManager.LevelNode getMiningLevelNode() {
+ return stationapi_levelNode;
}
}
diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
index 0c9cedfa7..f51cceb4c 100644
--- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
+++ b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
@@ -4,6 +4,7 @@
import net.minecraft.item.ToolMaterial;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
+import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
@@ -16,11 +17,14 @@
public final class VanillaToolFixImpl {
@EventListener
private static void fixToolMaterials(ItemRegistryEvent event) {
- ToolMaterial stone = ToolMaterial.STONE;
- ToolMaterial iron = ToolMaterial.IRON;
- ToolMaterial diamond = ToolMaterial.DIAMOND;
- stone.miningLevelTag(TagKey.of(BlockRegistry.KEY, of("needs_stone_tool")));
- iron.miningLevelTag(TagKey.of(BlockRegistry.KEY, of("needs_iron_tool")));
- diamond.miningLevelTag(TagKey.of(BlockRegistry.KEY, of("needs_diamond_tool")));
+ MiningLevelManager.LevelNode stoneNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, of("needs_stone_tool")));
+ MiningLevelManager.LevelNode ironNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, of("needs_iron_tool")));
+ MiningLevelManager.LevelNode diamondNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, of("needs_diamond_tool")));
+ MiningLevelManager.GRAPH.putEdge(stoneNode, ironNode);
+ MiningLevelManager.GRAPH.putEdge(ironNode, diamondNode);
+ MiningLevelManager.invalidateCache();
+ ToolMaterial.STONE.miningLevelNode(stoneNode);
+ ToolMaterial.IRON.miningLevelNode(ironNode);
+ ToolMaterial.DIAMOND.miningLevelNode(diamondNode);
}
}
diff --git a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json
index 7e914dc50..54d961641 100644
--- a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json
+++ b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_diamond_tool.json
@@ -1,6 +1,5 @@
{
"values": [
- "#needs_iron_tool",
"obsidian"
]
}
\ No newline at end of file
diff --git a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
index d0bdd018c..58f40dc96 100644
--- a/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
+++ b/station-vanilla-fix-v0/src/main/resources/data/minecraft/stationapi/tags/blocks/needs_iron_tool.json
@@ -1,6 +1,5 @@
{
"values": [
- "#needs_stone_tool",
"diamond_block",
"diamond_ore",
"gold_block",
From a6dfbdcecfb32bb4b57c2ad1bf44dae91639b732 Mon Sep 17 00:00:00 2001
From: calmilamsy
Date: Mon, 8 Jul 2024 17:52:06 +0100
Subject: [PATCH 03/10] Fix a bad mixin declaration in lifecycle events
---
.../main/resources/station-lifecycle-events-v0.mixins.json | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/station-lifecycle-events-v0/src/main/resources/station-lifecycle-events-v0.mixins.json b/station-lifecycle-events-v0/src/main/resources/station-lifecycle-events-v0.mixins.json
index bdfda5905..93d37150f 100644
--- a/station-lifecycle-events-v0/src/main/resources/station-lifecycle-events-v0.mixins.json
+++ b/station-lifecycle-events-v0/src/main/resources/station-lifecycle-events-v0.mixins.json
@@ -3,12 +3,10 @@
"minVersion": "0.8",
"package": "net.modificationstation.stationapi.mixin.lifecycle",
"compatibilityLevel": "JAVA_17",
- "mixins": [
- "server.ServerPlayNetworkHandlerMixin"
- ],
"server": [
"server.MinecraftServerMixin",
- "server.ServerLoginNetworkHandlerMixin"
+ "server.ServerLoginNetworkHandlerMixin",
+ "server.ServerPlayNetworkHandlerMixin"
],
"client": [
"client.ClientNetworkHandlerMixin",
From 6a63f392ef631fa6e8b9366833d35177a7f9b60f Mon Sep 17 00:00:00 2001
From: calmilamsy
Date: Tue, 9 Jul 2024 17:39:05 +0100
Subject: [PATCH 04/10] Add RegistriesFrozenEvent
---
.../event/registry/RegistriesFrozenEvent.java | 16 ++++++++++++++++
.../mixin/registry/client/MinecraftMixin.java | 3 +++
2 files changed, 19 insertions(+)
create mode 100644 station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistriesFrozenEvent.java
diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistriesFrozenEvent.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistriesFrozenEvent.java
new file mode 100644
index 000000000..d9a13dcd5
--- /dev/null
+++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/RegistriesFrozenEvent.java
@@ -0,0 +1,16 @@
+package net.modificationstation.stationapi.api.event.registry;
+
+import net.mine_diver.unsafeevents.Event;
+import net.mine_diver.unsafeevents.event.EventPhases;
+import net.modificationstation.stationapi.api.StationAPI;
+
+/**
+ * This is the last init event called by StAPI.
+ * Called after registries are frozen.
+ * {@link net.modificationstation.stationapi.mixin.registry.client.MinecraftMixin}
+ */
+@SuppressWarnings("JavadocReference") // Shut, I know.
+@EventPhases(StationAPI.INTERNAL_PHASE)
+public class RegistriesFrozenEvent extends Event {
+
+}
diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/mixin/registry/client/MinecraftMixin.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/mixin/registry/client/MinecraftMixin.java
index e31a1526f..4bb983462 100644
--- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/mixin/registry/client/MinecraftMixin.java
+++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/mixin/registry/client/MinecraftMixin.java
@@ -1,6 +1,8 @@
package net.modificationstation.stationapi.mixin.registry.client;
import net.minecraft.client.Minecraft;
+import net.modificationstation.stationapi.api.StationAPI;
+import net.modificationstation.stationapi.api.event.registry.RegistriesFrozenEvent;
import net.modificationstation.stationapi.api.registry.Registries;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@@ -16,5 +18,6 @@ class MinecraftMixin {
)
private void stationapi_freeze(CallbackInfo ci) {
Registries.bootstrap();
+ StationAPI.EVENT_BUS.post(new RegistriesFrozenEvent());
}
}
From 1db84abe3171a795d97b1c668f91847742e7a6be Mon Sep 17 00:00:00 2001
From: calmilamsy
Date: Fri, 16 Aug 2024 18:18:10 +0100
Subject: [PATCH 05/10] Yeet deprecated code
---
.../screen/container/TooltipRenderEvent.java | 7 ----
.../stationapi/api/recipe/StationRecipe.java | 18 ----------
.../impl/recipe/StationShapedRecipe.java | 27 +--------------
.../impl/recipe/StationShapelessRecipe.java | 24 ++-----------
.../mixin/recipe/CraftingRecipeMixin.java | 19 -----------
.../mixin/recipe/ShapedRecipeMixin.java | 34 -------------------
.../mixin/recipe/ShapelessRecipeMixin.java | 27 ---------------
.../resources/station-recipes-v0.mixins.json | 3 --
8 files changed, 3 insertions(+), 156 deletions(-)
delete mode 100644 station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/StationRecipe.java
delete mode 100644 station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/CraftingRecipeMixin.java
delete mode 100644 station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapedRecipeMixin.java
delete mode 100644 station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapelessRecipeMixin.java
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/event/gui/screen/container/TooltipRenderEvent.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/event/gui/screen/container/TooltipRenderEvent.java
index 910373f32..a52aba416 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/event/gui/screen/container/TooltipRenderEvent.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/api/client/event/gui/screen/container/TooltipRenderEvent.java
@@ -21,13 +21,6 @@ public class TooltipRenderEvent extends ItemStackEvent {
public final HandledScreen container;
public final TextRenderer textManager;
public final PlayerInventory inventory;
- /**
- * These will be removed in a3, due to the fact the container var already exists.
- */
- @Deprecated(forRemoval = true)
- public final int
- containerX,
- containerY;
public final int
mouseX,
mouseY;
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/StationRecipe.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/StationRecipe.java
deleted file mode 100644
index 047a084fb..000000000
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/api/recipe/StationRecipe.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.modificationstation.stationapi.api.recipe;
-
-import net.minecraft.item.ItemStack;
-
-/**
- * This entire interface is slated for removal in alpha 3.
- * Stop using it, it's shit and was made specifically for HMI, for all the wrong reasons.
- * - calm
- */
-@Deprecated(forRemoval = true)
-public interface StationRecipe {
-
- @Deprecated(forRemoval = true)
- ItemStack[] getIngredients();
-
- @Deprecated(forRemoval = true)
- ItemStack[] getOutputs();
-}
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapedRecipe.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapedRecipe.java
index d2d63f841..2afd4cdb9 100644
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapedRecipe.java
+++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapedRecipe.java
@@ -5,17 +5,11 @@
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.CraftingRecipe;
-import net.modificationstation.stationapi.api.recipe.StationRecipe;
-import net.modificationstation.stationapi.api.registry.ItemRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
import java.util.*;
-import java.util.function.Function;
-
-public class StationShapedRecipe implements CraftingRecipe, StationRecipe {
-
- private static final Random RANDOM = new Random();
+public class StationShapedRecipe implements CraftingRecipe {
public final int width, height;
private final Either, ItemStack>[] grid;
public final ItemStack output;
@@ -84,25 +78,6 @@ public ItemStack getOutput() {
return output;
}
- @Override
- public ItemStack[] getIngredients() {
- ItemStack[] stacks = new ItemStack[9];
- for (int h = 0; h < height; h++)
- for (int w = 0; w < width; w++) {
- int localId = (h * width) + w;
- Either, ItemStack> ingredient = grid[localId];
- if (ingredient == null) continue;
- int id = (h * 3) + w;
- stacks[id] = ingredient.map(tag -> new ItemStack(ItemRegistry.INSTANCE.getEntryList(tag).orElseThrow(() -> new RuntimeException("Identifier ingredient \"" + tag.id() + "\" has no entry in the tag registry!")).getRandom(RANDOM).orElseThrow().value()), Function.identity());
- }
- return stacks;
- }
-
- @Override
- public ItemStack[] getOutputs() {
- return new ItemStack[] { output };
- }
-
public Either, ItemStack>[] getGrid() {
//noinspection unchecked
return (Either, ItemStack>[]) Arrays.stream(grid).map(entry -> entry == null ? null : entry.mapRight(ItemStack::copy)).toArray(Either[]::new);
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapelessRecipe.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapelessRecipe.java
index b82e2eb6e..b095b311e 100644
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapelessRecipe.java
+++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/StationShapelessRecipe.java
@@ -5,14 +5,11 @@
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.CraftingRecipe;
-import net.modificationstation.stationapi.api.recipe.StationRecipe;
-import net.modificationstation.stationapi.api.registry.ItemRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
import java.util.*;
-import java.util.function.Function;
-public class StationShapelessRecipe implements CraftingRecipe, StationRecipe {
+public class StationShapelessRecipe implements CraftingRecipe {
private static final Random RANDOM = new Random();
@@ -78,24 +75,7 @@ public ItemStack getOutput() {
return output;
}
- @Override
- public ItemStack[] getIngredients() {
- ItemStack[] inputs = new ItemStack[ingredients.length];
- for (int i = 0, ingredientsLength = ingredients.length; i < ingredientsLength; i++)
- inputs[i] = ingredients[i].map(tag -> new ItemStack(ItemRegistry.INSTANCE.getEntryList(tag).orElseThrow(() -> new RuntimeException("Identifier ingredient \"" + tag.id() + "\" has no entry in the tag registry!")).getRandom(RANDOM).orElseThrow().value()), Function.identity());
- return inputs;
- }
-
- @Override
- public ItemStack[] getOutputs() {
- return new ItemStack[] { output };
- }
-
- /**
- * To be renamed to getIngredients in a3, use with caution.
- */
- @Deprecated
- public Either, ItemStack>[] getInputs() {
+ public Either, ItemStack>[] getIngredients() {
//noinspection unchecked
return (Either, ItemStack>[]) Arrays.stream(ingredients).map(entry -> entry == null ? null : entry.mapRight(ItemStack::copy)).toArray(Either[]::new);
}
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/CraftingRecipeMixin.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/CraftingRecipeMixin.java
deleted file mode 100644
index ccd3ac845..000000000
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/CraftingRecipeMixin.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.modificationstation.stationapi.mixin.recipe;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.CraftingRecipe;
-import net.modificationstation.stationapi.api.recipe.StationRecipe;
-import org.spongepowered.asm.mixin.Mixin;
-
-@Mixin(CraftingRecipe.class)
-public interface CraftingRecipeMixin extends StationRecipe {
- @Override
- default ItemStack[] getIngredients() {
- throw new UnsupportedOperationException("Your custom recipe registry needs to implement the methods found in \"net.modificationstation.stationapi.api.recipe.StationRecipe\"!");
- }
-
- @Override
- default ItemStack[] getOutputs() {
- throw new UnsupportedOperationException("Your custom recipe registry needs to implement the methods found in \"net.modificationstation.stationapi.api.recipe.StationRecipe\"!");
- }
-}
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapedRecipeMixin.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapedRecipeMixin.java
deleted file mode 100644
index 9f9ed3f84..000000000
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapedRecipeMixin.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package net.modificationstation.stationapi.mixin.recipe;
-
-import net.minecraft.ShapedRecipe;
-import net.minecraft.item.ItemStack;
-import net.modificationstation.stationapi.api.recipe.StationRecipe;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-
-@Mixin(ShapedRecipe.class)
-class ShapedRecipeMixin implements StationRecipe {
- @Shadow private int width;
- @Shadow private int height;
- @Shadow private ItemStack output;
-
- @Shadow private ItemStack[] input;
-
- @Override
- public ItemStack[] getIngredients() {
- ItemStack[] stacks = new ItemStack[9];
- for (int h = 0; h < height; h++) {
- for (int w = 0; w < width; w++) {
- int localId = (h * width) + w;
- int id = (h * 3) + w;
- stacks[id] = input[localId];
- }
- }
- return stacks;
- }
-
- @Override
- public ItemStack[] getOutputs() {
- return new ItemStack[] { output };
- }
-}
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapelessRecipeMixin.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapelessRecipeMixin.java
deleted file mode 100644
index 2270e4279..000000000
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/mixin/recipe/ShapelessRecipeMixin.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package net.modificationstation.stationapi.mixin.recipe;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.recipe.ShapelessRecipe;
-import net.modificationstation.stationapi.api.recipe.StationRecipe;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-
-import java.util.List;
-
-@Mixin(ShapelessRecipe.class)
-class ShapelessRecipeMixin implements StationRecipe {
- @Shadow @Final private List input;
-
- @Shadow @Final private ItemStack output;
-
- @Override
- public ItemStack[] getIngredients() {
- return input.toArray(ItemStack[]::new);
- }
-
- @Override
- public ItemStack[] getOutputs() {
- return new ItemStack[] { output };
- }
-}
diff --git a/station-recipes-v0/src/main/resources/station-recipes-v0.mixins.json b/station-recipes-v0/src/main/resources/station-recipes-v0.mixins.json
index ff2373bb4..cb789d3bc 100644
--- a/station-recipes-v0/src/main/resources/station-recipes-v0.mixins.json
+++ b/station-recipes-v0/src/main/resources/station-recipes-v0.mixins.json
@@ -5,12 +5,9 @@
"compatibilityLevel": "JAVA_17",
"mixins": [
"CraftingRecipeManagerMixin",
- "CraftingRecipeMixin",
"CraftingResultMixin",
"FurnaceBlockEntityMixin",
"RecipeComparatorMixin",
- "ShapedRecipeMixin",
- "ShapelessRecipeMixin",
"SmeltingRecipeManagerAccessor",
"SmeltingRecipeManagerMixin",
"StatsMixin"
From bf4e97e11263f53cc22cec5ea55c30fd96503cda Mon Sep 17 00:00:00 2001
From: mineLdiver
Date: Fri, 6 Sep 2024 21:05:51 +0500
Subject: [PATCH 06/10] *actually* remove deprecated stuff
---
.../container/CustomTooltipRendererImpl.java | 12 ++++++++----
.../mixin/item/client/ContainerScreenMixin.java | 1 -
.../mixin/item/client/HandledScreenAccessor.java | 14 ++++++++++++++
.../main/resources/station-items-v0.mixins.json | 1 +
4 files changed, 23 insertions(+), 5 deletions(-)
create mode 100644 station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/HandledScreenAccessor.java
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java
index edfe77658..ac3f3173b 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/gui/screen/container/CustomTooltipRendererImpl.java
@@ -1,19 +1,23 @@
package net.modificationstation.stationapi.impl.client.gui.screen.container;
import net.mine_diver.unsafeevents.listener.EventListener;
+import net.minecraft.client.gui.DrawContext;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.client.TooltipHelper;
import net.modificationstation.stationapi.api.client.event.gui.screen.container.TooltipRenderEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
import net.modificationstation.stationapi.mixin.item.client.DrawContextAccessor;
+import net.modificationstation.stationapi.mixin.item.client.HandledScreenAccessor;
-import java.util.*;
+import java.util.ArrayList;
import java.util.stream.IntStream;
@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
@EventListener(phase = StationAPI.INTERNAL_PHASE)
public final class CustomTooltipRendererImpl {
+ private static final DrawContext CONTEXT = new DrawContext();
+
@EventListener
private static void renderCustomTooltips(TooltipRenderEvent event) {
if(event.isCanceled()) {
@@ -24,9 +28,9 @@ private static void renderCustomTooltips(TooltipRenderEvent event) {
if (!newTooltip.isEmpty()) {
newTooltip.stream().mapToInt(event.textManager::getWidth).max().ifPresent(tooltipWidth -> {
- int tooltipX = event.mouseX - event.containerX + 12;
- int tooltipY = event.mouseY - event.containerY - 12;
- ((DrawContextAccessor) event.container).invokeFillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipWidth + 3, tooltipY + (8 * newTooltip.size()) + (3 * newTooltip.size()), -1073741824, -1073741824);
+ int tooltipX = event.mouseX - (event.container == null ? 0 : ((event.container.width - ((HandledScreenAccessor) event.container).stationapi_getBackgroundWidth()) / 2)) + 12;
+ int tooltipY = event.mouseY - (event.container == null ? 0 : ((event.container.height - ((HandledScreenAccessor) event.container).stationapi_getBackgroundHeight()) / 2)) - 12;
+ ((DrawContextAccessor) CONTEXT).invokeFillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipWidth + 3, tooltipY + (8 * newTooltip.size()) + (3 * newTooltip.size()), -1073741824, -1073741824);
IntStream.range(0, newTooltip.size()).forEach(currentTooltip -> event.textManager.drawWithShadow(newTooltip.get(currentTooltip), tooltipX, tooltipY + (8 * currentTooltip) + (3 * currentTooltip), -1));
});
event.cancel();
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/ContainerScreenMixin.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/ContainerScreenMixin.java
index 1f2fc98e5..d69cf53ef 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/ContainerScreenMixin.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/ContainerScreenMixin.java
@@ -36,7 +36,6 @@ private void stationapi_renderTooltip(int mouseX, int mouseY, float delta, Callb
.container((HandledScreen) (Object) this)
.textManager(this.textRenderer)
.inventory(inventory)
- .containerX(containerX).containerY(containerY)
.mouseX(mouseX).mouseY(mouseY)
.delta(delta)
.originalTooltip(originalTooltip)
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/HandledScreenAccessor.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/HandledScreenAccessor.java
new file mode 100644
index 000000000..495231844
--- /dev/null
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/HandledScreenAccessor.java
@@ -0,0 +1,14 @@
+package net.modificationstation.stationapi.mixin.item.client;
+
+import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(HandledScreen.class)
+public interface HandledScreenAccessor {
+ @Accessor("backgroundWidth")
+ int stationapi_getBackgroundWidth();
+
+ @Accessor("backgroundHeight")
+ int stationapi_getBackgroundHeight();
+}
diff --git a/station-items-v0/src/main/resources/station-items-v0.mixins.json b/station-items-v0/src/main/resources/station-items-v0.mixins.json
index 77cd0e61a..2fd54f374 100644
--- a/station-items-v0/src/main/resources/station-items-v0.mixins.json
+++ b/station-items-v0/src/main/resources/station-items-v0.mixins.json
@@ -30,6 +30,7 @@
"client.ContainerScreenMixin",
"client.DrawContextAccessor",
"client.GameRendererMixin",
+ "client.HandledScreenAccessor",
"client.InteractionManagerMixin",
"client.ItemRendererMixin",
"client.MultiplayerInteractionManagerMixin",
From 1f9c5678ac36f2b533195a63f71bfcdcc91a7e28 Mon Sep 17 00:00:00 2001
From: mineLdiver
Date: Sun, 3 Nov 2024 01:29:12 +0500
Subject: [PATCH 07/10] Dependency debloat (#126)
* Partial dependency debloat (doesn't yet compile)
* Partial dependency debloat part 2 (still doesn't compile)
* Finished debloating
* Use `Pair#of` instead of `Pair#new`
* Remove dependency declarations
* Move client-side entity registries to client.registry package.
---
build.gradle.kts | 15 ++-----
gradle.properties | 10 +----
.../sltest/gui/GuiListener.java | 7 ++--
.../screen/achievement/AchievementPage.java | 4 +-
.../api/client/gui/screen/GuiHandler.java | 28 +++++++++++++
.../client/registry/GuiHandlerRegistry.java | 19 +++++++++
.../registry/GuiHandlerRegistryEvent.java | 2 +-
.../api/gui/screen/container/GuiHelper.java | 2 +-
.../api/registry/GuiHandlerRegistry.java | 30 --------------
.../network/GuiClientNetworkHandler.java | 12 ++----
.../factory/EntityWorldAndPosFactory.java | 8 ++++
.../registry/EntityHandlerRegistry.java | 14 +++----
.../registry/MobHandlerRegistry.java | 5 ++-
.../api/event/entity/EntityRegister.java | 21 ++++++----
.../registry/EntityHandlerRegistryEvent.java | 2 +-
.../registry/MobHandlerRegistryEvent.java | 2 +-
.../network/EntityClientNetworkHandler.java | 10 ++---
.../client/ClientNetworkHandlerMixin.java | 9 ++--
.../util/math/DirectionTransformation.java | 7 ++--
.../stationapi/api/util/math/Matrix3f.java | 41 +++++++++----------
.../impl/recipe/tag/TagConversionStorage.java | 12 +++---
.../api/registry/RegistryEntryListCodec.java | 2 +-
.../model/PreLoadUnbakedModelEvent.java | 8 +++-
.../api/client/render/model/ModelLoader.java | 4 +-
.../api/client/texture/SpritesheetHelper.java | 7 ++--
.../api/client/texture/atlas/Atlas.java | 10 +++--
.../api/util/math/AffineTransformation.java | 13 +++---
.../impl/client/texture/GuiItemsHelper.java | 4 +-
.../client/texture/StationRenderImpl.java | 15 ++++---
.../impl/client/texture/TerrainHelper.java | 13 +++---
.../api/client/resource/ReloadScreen.java | 25 +++++------
.../client/resource/ReloadScreenManager.java | 32 +++++++--------
.../api/resource/CompositeResourceReload.java | 36 ++++++----------
.../api/resource/ProfiledResourceReload.java | 37 +++++++----------
.../api/resource/SimpleResourceReload.java | 3 +-
.../client/resource/AssetsReloaderImpl.java | 11 +++--
.../impl/resource/DataReloaderImpl.java | 7 ++--
.../resource/ReloadableResourceManager.java | 3 +-
.../loader/ResourceManagerHelperImpl.java | 6 +--
.../resourceloader/client/MinecraftMixin.java | 9 +++-
.../client/TextRendererMixin.java | 3 +-
.../client/TexturePackMixin.java | 11 +++--
.../client/ZipTexturePackMixin.java | 11 +++--
43 files changed, 266 insertions(+), 264 deletions(-)
create mode 100644 station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/GuiHandler.java
create mode 100644 station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/GuiHandlerRegistry.java
delete mode 100644 station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/GuiHandlerRegistry.java
create mode 100644 station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/entity/factory/EntityWorldAndPosFactory.java
rename station-entities-v0/src/main/java/net/modificationstation/stationapi/api/{ => client}/registry/EntityHandlerRegistry.java (54%)
rename station-entities-v0/src/main/java/net/modificationstation/stationapi/api/{ => client}/registry/MobHandlerRegistry.java (74%)
diff --git a/build.gradle.kts b/build.gradle.kts
index feea36bea..aae75ab9a 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -65,20 +65,15 @@ allprojects {
modImplementation("babric:fabric-loader:${project.properties["loader_version"]}")
- implementation("io.github.llamalad7:mixinextras-fabric:${project.properties["mixinextras_version"]}")
- annotationProcessor("io.github.llamalad7:mixinextras-fabric:${project.properties["mixinextras_version"]}")
-
"transitiveImplementation"("org.apache.commons:commons-lang3:3.12.0")
"transitiveImplementation"("commons-io:commons-io:2.11.0")
"transitiveImplementation"("net.jodah:typetools:${project.properties["typetools_version"]}")
- "transitiveImplementation"("com.github.mineLdiver:expressions:${project.properties["expressions_version"]}")
"transitiveImplementation"("com.github.mineLdiver:UnsafeEvents:${project.properties["unsafeevents_version"]}")
"transitiveImplementation"("it.unimi.dsi:fastutil:${project.properties["fastutil_version"]}")
//noinspection GradlePackageUpdate
"transitiveImplementation"("com.github.ben-manes.caffeine:caffeine:${project.properties["caffeine_version"]}")
"transitiveImplementation"("com.mojang:datafixerupper:${project.properties["dfu_version"]}")
"transitiveImplementation"("maven.modrinth:spasm:${project.properties["spasm_version"]}")
- "transitiveImplementation"("com.oath.cyclops:cyclops:${project.properties["cyclops_version"]}")
// convenience stuff
// adds some useful annotations for data classes. does not add any dependencies
@@ -95,6 +90,10 @@ allprojects {
}
implementation("blue.endless:jankson:1.2.1")
+ implementation("me.carleslc:Simple-Yaml:1.8.4")
+ modLocalRuntime("net.glasslauncher.mods:glass-networking:1.0.2") {
+ isTransitive = false
+ }
modLocalRuntime("net.glasslauncher.mods:GlassConfigAPI:${project.properties["gcapi_version"]}") {
isTransitive = false
}
@@ -261,18 +260,12 @@ subprojects {
}
dependencies {
- include("com.github.llamalad7.mixinextras:mixinextras-fabric:${project.properties["mixinextras_version"]}")
include("net.jodah:typetools:${project.properties["typetools_version"]}")
- include("com.github.mineLdiver:expressions:${project.properties["expressions_version"]}")
include("com.github.mineLdiver:UnsafeEvents:${project.properties["unsafeevents_version"]}")
include("it.unimi.dsi:fastutil:${project.properties["fastutil_version"]}")
include("com.github.ben-manes.caffeine:caffeine:${project.properties["caffeine_version"]}")
include("com.mojang:datafixerupper:${project.properties["dfu_version"]}")
include("maven.modrinth:spasm:${project.properties["spasm_version"]}")
- include("com.oath.cyclops:cyclops:${project.properties["cyclops_version"]}")
- include("org.reactivestreams:reactive-streams:${project.properties["reactivestreams_version"]}")
- include("io.kindedj:kindedj:${project.properties["kindedj_version"]}")
- include("org.agrona:Agrona:${project.properties["agrona_version"]}")
}
// Makes java shut up
diff --git a/gradle.properties b/gradle.properties
index c26c228b1..13e224124 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,17 +15,11 @@ fabric.loom.multiProjectOptimisation=true
# Library Properties
typetools_version = 0.8.3
- expressions_version = f676bbe
unsafeevents_version = 17ac2971
fastutil_version = 8.5.8
caffeine_version = 3.0.5
dfu_version = 6.0.6
spasm_version = 0.2.2
- cyclops_version = 10.4.1
- reactivestreams_version = 1.0.0
- kindedj_version = 1.1.0
- agrona_version = 0.9.1
- mixinextras_version = 0.2.2
# Mod Properties
mod_version = 2.0-alpha.2.4
@@ -33,7 +27,7 @@ fabric.loom.multiProjectOptimisation=true
archives_base_name = StationAPI
# Test properties
- gcapi_version = 1.3.1
- hmi_version = 5.1.1
+ gcapi_version = 3.0.0
+ hmi_version = 5.2.1
modmenu_version = v1.8.5-beta.3
mojangfix_version = 0.5.2
\ No newline at end of file
diff --git a/src/test/java/net/modificationstation/sltest/gui/GuiListener.java b/src/test/java/net/modificationstation/sltest/gui/GuiListener.java
index 2b6f58242..80446c720 100644
--- a/src/test/java/net/modificationstation/sltest/gui/GuiListener.java
+++ b/src/test/java/net/modificationstation/sltest/gui/GuiListener.java
@@ -8,10 +8,11 @@
import net.minecraft.inventory.Inventory;
import net.modificationstation.sltest.SLTest;
import net.modificationstation.sltest.tileentity.TileEntityFreezer;
+import net.modificationstation.stationapi.api.client.gui.screen.GuiHandler;
+import net.modificationstation.stationapi.api.client.registry.GuiHandlerRegistry;
import net.modificationstation.stationapi.api.event.registry.GuiHandlerRegistryEvent;
-import net.modificationstation.stationapi.api.registry.GuiHandlerRegistry;
+import net.modificationstation.stationapi.api.registry.Registry;
import net.modificationstation.stationapi.api.util.Identifier;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
public class GuiListener {
@@ -19,7 +20,7 @@ public class GuiListener {
@EventListener
public void registerGuiHandlers(GuiHandlerRegistryEvent event) {
GuiHandlerRegistry registry = event.registry;
- registry.registerValueNoMessage(Identifier.of(SLTest.NAMESPACE, "freezer"), BiTuple.of(this::openFreezer, TileEntityFreezer::new));
+ Registry.register(registry, Identifier.of(SLTest.NAMESPACE, "freezer"), new GuiHandler((GuiHandler.ScreenFactoryNoMessage) this::openFreezer, TileEntityFreezer::new));
}
@Environment(EnvType.CLIENT)
diff --git a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/achievement/AchievementPage.java b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/achievement/AchievementPage.java
index 0a5f120fe..2df7cd7a5 100644
--- a/station-achievements-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/achievement/AchievementPage.java
+++ b/station-achievements-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/achievement/AchievementPage.java
@@ -6,7 +6,6 @@
import net.minecraft.achievement.Achievement;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Namespace;
-import uk.co.benjiweber.expressions.property.Named;
import java.util.ArrayList;
import java.util.Collections;
@@ -17,7 +16,7 @@
* Instantiates and adds an achievement page to the achievement page list.
* @author calmilamsy
*/
-public class AchievementPage implements Named {
+public class AchievementPage {
private static final List PAGES = new ArrayList<>();
private static int currentPage = 0;
@@ -75,7 +74,6 @@ public int getBackgroundTexture(Random random, int column, int row, int randomiz
return currentTexture;
}
- @Override
public String name() {
return translationKey;
}
diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/GuiHandler.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/GuiHandler.java
new file mode 100644
index 000000000..2e3261e5f
--- /dev/null
+++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/GuiHandler.java
@@ -0,0 +1,28 @@
+package net.modificationstation.stationapi.api.client.gui.screen;
+
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.inventory.Inventory;
+import net.modificationstation.stationapi.api.network.packet.MessagePacket;
+
+public record GuiHandler(ScreenFactory screenFactory, InventoryFactory inventoryFactory) {
+ @FunctionalInterface
+ public interface ScreenFactory {
+ Screen create(PlayerEntity player, Inventory inventory, MessagePacket packet);
+ }
+
+ @FunctionalInterface
+ public interface ScreenFactoryNoMessage extends ScreenFactory {
+ @Override
+ default Screen create(PlayerEntity player, Inventory inventory, MessagePacket packet) {
+ return create(player, inventory);
+ }
+
+ Screen create(PlayerEntity player, Inventory inventory);
+ }
+
+ @FunctionalInterface
+ public interface InventoryFactory {
+ Inventory create();
+ }
+}
diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/GuiHandlerRegistry.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/GuiHandlerRegistry.java
new file mode 100644
index 000000000..043455b79
--- /dev/null
+++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/GuiHandlerRegistry.java
@@ -0,0 +1,19 @@
+package net.modificationstation.stationapi.api.client.registry;
+
+import com.mojang.serialization.Lifecycle;
+import net.modificationstation.stationapi.api.StationAPI;
+import net.modificationstation.stationapi.api.client.gui.screen.GuiHandler;
+import net.modificationstation.stationapi.api.registry.Registries;
+import net.modificationstation.stationapi.api.registry.RegistryKey;
+import net.modificationstation.stationapi.api.registry.SimpleRegistry;
+import net.modificationstation.stationapi.api.util.Identifier;
+
+public final class GuiHandlerRegistry extends SimpleRegistry {
+ private static final GuiHandler EMPTY = new GuiHandler((player, inventory, packet) -> null, () -> null);
+ public static final RegistryKey KEY = RegistryKey.ofRegistry(Identifier.of(StationAPI.NAMESPACE, "gui_handlers"));
+ public static final GuiHandlerRegistry INSTANCE = Registries.create(KEY, new GuiHandlerRegistry(), registry -> EMPTY, Lifecycle.experimental());
+
+ private GuiHandlerRegistry() {
+ super(KEY, Lifecycle.experimental(), false);
+ }
+}
diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java
index 0c109cd3a..265602540 100644
--- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java
+++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/GuiHandlerRegistryEvent.java
@@ -1,6 +1,6 @@
package net.modificationstation.stationapi.api.event.registry;
-import net.modificationstation.stationapi.api.registry.GuiHandlerRegistry;
+import net.modificationstation.stationapi.api.client.registry.GuiHandlerRegistry;
public class GuiHandlerRegistryEvent extends RegistryEvent {
public GuiHandlerRegistryEvent() {
diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/gui/screen/container/GuiHelper.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/gui/screen/container/GuiHelper.java
index c3f7b7d67..8f0ecf6e7 100644
--- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/gui/screen/container/GuiHelper.java
+++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/gui/screen/container/GuiHelper.java
@@ -5,7 +5,7 @@
import net.minecraft.screen.ScreenHandler;
import net.modificationstation.stationapi.api.event.registry.GuiHandlerRegistryEvent;
import net.modificationstation.stationapi.api.network.packet.MessagePacket;
-import net.modificationstation.stationapi.api.registry.GuiHandlerRegistry;
+import net.modificationstation.stationapi.api.client.registry.GuiHandlerRegistry;
import net.modificationstation.stationapi.api.util.API;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.SideUtil;
diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/GuiHandlerRegistry.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/GuiHandlerRegistry.java
deleted file mode 100644
index e0c7aeac1..000000000
--- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/GuiHandlerRegistry.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.modificationstation.stationapi.api.registry;
-
-import com.mojang.serialization.Lifecycle;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.inventory.Inventory;
-import net.modificationstation.stationapi.api.StationAPI;
-import net.modificationstation.stationapi.api.network.packet.MessagePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
-import uk.co.benjiweber.expressions.function.TriFunction;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
-
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-public final class GuiHandlerRegistry extends SimpleRegistry, Supplier>> {
-
- private static final BiTuple, Supplier> EMPTY = Tuple.tuple((playerBase, inventoryBase, message) -> null, () -> null);
- public static final RegistryKey KEY = RegistryKey.ofRegistry(Identifier.of(StationAPI.NAMESPACE, "gui_handlers"));
- public static final GuiHandlerRegistry INSTANCE = Registries.create(KEY, new GuiHandlerRegistry(), registry -> EMPTY, Lifecycle.experimental());
-
- private GuiHandlerRegistry() {
- super(KEY, Lifecycle.experimental(), false);
- }
-
- public void registerValueNoMessage(Identifier identifier, BiTuple, Supplier> value) {
- Registry.register(this, identifier, Tuple.tuple((playerBase, inventoryBase, message) -> value.one().apply(playerBase, inventoryBase), value.two()));
- }
-}
diff --git a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java
index f5b98220f..20a200524 100644
--- a/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java
+++ b/station-container-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/GuiClientNetworkHandler.java
@@ -3,22 +3,18 @@
import net.fabricmc.loader.api.FabricLoader;
import net.mine_diver.unsafeevents.listener.EventListener;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.screen.Screen;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.Inventory;
import net.modificationstation.stationapi.api.StationAPI;
+import net.modificationstation.stationapi.api.client.gui.screen.GuiHandler;
+import net.modificationstation.stationapi.api.client.registry.GuiHandlerRegistry;
import net.modificationstation.stationapi.api.event.registry.GuiHandlerRegistryEvent;
import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
import net.modificationstation.stationapi.api.network.packet.MessagePacket;
-import net.modificationstation.stationapi.api.registry.GuiHandlerRegistry;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.registry.Registry;
-import uk.co.benjiweber.expressions.function.TriFunction;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-
-import java.util.function.Supplier;
import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
@@ -34,10 +30,10 @@ private static void registerMessageListeners(MessageListenerRegistryEvent event)
private static void handleGui(PlayerEntity player, MessagePacket message) {
boolean isClient = player.world.isRemote;
- BiTuple, Supplier> guiHandler = GuiHandlerRegistry.INSTANCE.get(Identifier.of(message.strings[0]));
+ GuiHandler guiHandler = GuiHandlerRegistry.INSTANCE.get(Identifier.of(message.strings[0]));
if (guiHandler != null)
//noinspection deprecation
- ((Minecraft) FabricLoader.getInstance().getGameInstance()).setScreen(guiHandler.one().apply(player, isClient ? guiHandler.two().get() : (Inventory) message.objects[0], message));
+ ((Minecraft) FabricLoader.getInstance().getGameInstance()).setScreen(guiHandler.screenFactory().create(player, isClient ? guiHandler.inventoryFactory().create() : (Inventory) message.objects[0], message));
if (isClient)
player.container.syncId = message.ints[0];
}
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/entity/factory/EntityWorldAndPosFactory.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/entity/factory/EntityWorldAndPosFactory.java
new file mode 100644
index 000000000..e40d4e574
--- /dev/null
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/entity/factory/EntityWorldAndPosFactory.java
@@ -0,0 +1,8 @@
+package net.modificationstation.stationapi.api.client.entity.factory;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.world.World;
+
+public interface EntityWorldAndPosFactory {
+ Entity create(World world, double x, double y, double z);
+}
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/registry/EntityHandlerRegistry.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/EntityHandlerRegistry.java
similarity index 54%
rename from station-entities-v0/src/main/java/net/modificationstation/stationapi/api/registry/EntityHandlerRegistry.java
rename to station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/EntityHandlerRegistry.java
index b1d44fa17..1574978c2 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/registry/EntityHandlerRegistry.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/EntityHandlerRegistry.java
@@ -1,15 +1,15 @@
-package net.modificationstation.stationapi.api.registry;
+package net.modificationstation.stationapi.api.client.registry;
import com.mojang.serialization.Lifecycle;
-import net.minecraft.entity.Entity;
-import net.minecraft.world.World;
-import uk.co.benjiweber.expressions.function.QuadFunction;
+import net.modificationstation.stationapi.api.client.entity.factory.EntityWorldAndPosFactory;
+import net.modificationstation.stationapi.api.registry.Registries;
+import net.modificationstation.stationapi.api.registry.RegistryKey;
+import net.modificationstation.stationapi.api.registry.SimpleRegistry;
import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-public final class EntityHandlerRegistry extends SimpleRegistry> {
-
- private static final QuadFunction EMPTY = (world, x, y, z) -> null;
+public final class EntityHandlerRegistry extends SimpleRegistry {
+ private static final EntityWorldAndPosFactory EMPTY = (world, x, y, z) -> null;
public static final RegistryKey KEY = RegistryKey.ofRegistry(NAMESPACE.id("entity_handlers"));
public static final EntityHandlerRegistry INSTANCE = Registries.create(KEY, new EntityHandlerRegistry(), registry -> EMPTY, Lifecycle.experimental());
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/registry/MobHandlerRegistry.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/MobHandlerRegistry.java
similarity index 74%
rename from station-entities-v0/src/main/java/net/modificationstation/stationapi/api/registry/MobHandlerRegistry.java
rename to station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/MobHandlerRegistry.java
index c3dbbbcea..5909d2968 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/registry/MobHandlerRegistry.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/client/registry/MobHandlerRegistry.java
@@ -1,8 +1,11 @@
-package net.modificationstation.stationapi.api.registry;
+package net.modificationstation.stationapi.api.client.registry;
import com.mojang.serialization.Lifecycle;
import net.minecraft.entity.LivingEntity;
import net.minecraft.world.World;
+import net.modificationstation.stationapi.api.registry.Registries;
+import net.modificationstation.stationapi.api.registry.RegistryKey;
+import net.modificationstation.stationapi.api.registry.SimpleRegistry;
import java.util.function.Function;
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/EntityRegister.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/EntityRegister.java
index 3fcace2ea..7e0a1e8fc 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/EntityRegister.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/EntityRegister.java
@@ -3,20 +3,27 @@
import lombok.experimental.SuperBuilder;
import net.mine_diver.unsafeevents.Event;
import net.minecraft.entity.Entity;
-import uk.co.benjiweber.expressions.function.TriConsumer;
-
-import java.util.function.BiConsumer;
@SuperBuilder
public class EntityRegister extends Event {
- public final TriConsumer, String, Integer> register;
- public final BiConsumer, String> registerNoID;
+ @FunctionalInterface
+ public interface RegisterFunction {
+ void register(Class extends Entity> entityClass, String entityIdentifier, int entityId);
+ }
+
+ @FunctionalInterface
+ public interface RegisterFunctionNoId {
+ void register(Class extends Entity> entityClass, String entityIdentifier);
+ }
+
+ public final RegisterFunction register;
+ public final RegisterFunctionNoId registerNoID;
public final void register(Class extends Entity> entityClass, String entityIdentifier, int entityId) {
- register.accept(entityClass, entityIdentifier, entityId);
+ register.register(entityClass, entityIdentifier, entityId);
}
public final void register(Class extends Entity> entityClass, String entityIdentifier) {
- registerNoID.accept(entityClass, entityIdentifier);
+ registerNoID.register(entityClass, entityIdentifier);
}
}
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java
index 44c9409e7..8c168c4c7 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/EntityHandlerRegistryEvent.java
@@ -1,6 +1,6 @@
package net.modificationstation.stationapi.api.event.registry;
-import net.modificationstation.stationapi.api.registry.EntityHandlerRegistry;
+import net.modificationstation.stationapi.api.client.registry.EntityHandlerRegistry;
public class EntityHandlerRegistryEvent extends RegistryEvent {
public EntityHandlerRegistryEvent() {
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java
index 3b5dafe23..f511823bd 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/api/event/registry/MobHandlerRegistryEvent.java
@@ -1,6 +1,6 @@
package net.modificationstation.stationapi.api.event.registry;
-import net.modificationstation.stationapi.api.registry.MobHandlerRegistry;
+import net.modificationstation.stationapi.api.client.registry.MobHandlerRegistry;
public class MobHandlerRegistryEvent extends RegistryEvent {
public MobHandlerRegistryEvent() {
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java
index 473339822..0c31b8989 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java
@@ -11,6 +11,9 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.World;
import net.modificationstation.stationapi.api.StationAPI;
+import net.modificationstation.stationapi.api.client.entity.factory.EntityWorldAndPosFactory;
+import net.modificationstation.stationapi.api.client.registry.EntityHandlerRegistry;
+import net.modificationstation.stationapi.api.client.registry.MobHandlerRegistry;
import net.modificationstation.stationapi.api.entity.HasOwner;
import net.modificationstation.stationapi.api.event.registry.EntityHandlerRegistryEvent;
import net.modificationstation.stationapi.api.event.registry.MessageListenerRegistryEvent;
@@ -18,12 +21,9 @@
import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
import net.modificationstation.stationapi.api.network.packet.MessagePacket;
-import net.modificationstation.stationapi.api.registry.EntityHandlerRegistry;
-import net.modificationstation.stationapi.api.registry.MobHandlerRegistry;
import net.modificationstation.stationapi.api.registry.Registry;
import net.modificationstation.stationapi.api.server.entity.StationSpawnDataProvider;
import net.modificationstation.stationapi.mixin.entity.client.ClientNetworkHandlerAccessor;
-import uk.co.benjiweber.expressions.function.QuadFunction;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
@@ -47,7 +47,7 @@ private static void registerMessageListeners(MessageListenerRegistryEvent event)
}
private static void handleEntitySpawn(PlayerEntity player, MessagePacket message) {
- QuadFunction entityHandler = EntityHandlerRegistry.INSTANCE.get(of(message.strings[0]));
+ EntityWorldAndPosFactory entityHandler = EntityHandlerRegistry.INSTANCE.get(of(message.strings[0]));
if (entityHandler != null) {
double
x = message.ints[1] / 32D,
@@ -56,7 +56,7 @@ private static void handleEntitySpawn(PlayerEntity player, MessagePacket message
//noinspection deprecation
ClientNetworkHandlerAccessor networkHandler = (ClientNetworkHandlerAccessor) ((Minecraft) FabricLoader.getInstance().getGameInstance()).getNetworkHandler();
class_454 world = networkHandler.getField_1973();
- Entity entity = entityHandler.apply(world, x, y, z);
+ Entity entity = entityHandler.create(world, x, y, z);
if (entity != null) {
entity.field_1654 = message.ints[1];
entity.field_1655 = message.ints[2];
diff --git a/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/client/ClientNetworkHandlerMixin.java b/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/client/ClientNetworkHandlerMixin.java
index aac693661..e8b8cb567 100644
--- a/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/client/ClientNetworkHandlerMixin.java
+++ b/station-entities-v0/src/main/java/net/modificationstation/stationapi/mixin/entity/client/ClientNetworkHandlerMixin.java
@@ -4,8 +4,8 @@
import net.minecraft.client.network.ClientNetworkHandler;
import net.minecraft.entity.Entity;
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
-import net.minecraft.world.World;
-import net.modificationstation.stationapi.api.registry.EntityHandlerRegistry;
+import net.modificationstation.stationapi.api.client.entity.factory.EntityWorldAndPosFactory;
+import net.modificationstation.stationapi.api.client.registry.EntityHandlerRegistry;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -15,7 +15,6 @@
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
-import uk.co.benjiweber.expressions.function.QuadFunction;
import static net.modificationstation.stationapi.api.util.Identifier.of;
@@ -55,9 +54,9 @@ private void stationapi_captureCoords(EntitySpawnS2CPacket packet, CallbackInfo
)
)
private Entity stationapi_onEntitySpawn(Entity entity, EntitySpawnS2CPacket packet) {
- QuadFunction entityHandler = EntityHandlerRegistry.INSTANCE.get(of(String.valueOf(packet.entityType)));
+ EntityWorldAndPosFactory entityHandler = EntityHandlerRegistry.INSTANCE.get(of(String.valueOf(packet.entityType)));
if (entityHandler != null)
- entity = entityHandler.apply(field_1973, capturedX, capturedY, capturedZ);
+ entity = entityHandler.create(field_1973, capturedX, capturedY, capturedZ);
return entity;
}
}
diff --git a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/DirectionTransformation.java b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/DirectionTransformation.java
index 8141a2772..42913ff89 100644
--- a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/DirectionTransformation.java
+++ b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/DirectionTransformation.java
@@ -1,13 +1,12 @@
package net.modificationstation.stationapi.api.util.math;
import com.google.common.collect.Maps;
+import com.mojang.datafixers.util.Pair;
import it.unimi.dsi.fastutil.booleans.BooleanArrayList;
import it.unimi.dsi.fastutil.booleans.BooleanList;
import net.modificationstation.stationapi.api.util.StringIdentifiable;
import net.modificationstation.stationapi.api.util.Util;
import org.jetbrains.annotations.Nullable;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
import java.util.Arrays;
import java.util.Map;
@@ -72,7 +71,7 @@ public enum DirectionTransformation implements StringIdentifiable {
private final boolean flipZ;
private final AxisTransformation axisTransformation;
private static final DirectionTransformation[][] COMBINATIONS = Util.make(new DirectionTransformation[values().length][values().length], (directionTransformations) -> {
- Map, DirectionTransformation> map = Arrays.stream(values()).collect(Collectors.toMap((directionTransformationx) -> Tuple.tuple(directionTransformationx.axisTransformation, directionTransformationx.getAxisFlips()), (directionTransformationx) -> directionTransformationx));
+ Map, DirectionTransformation> map = Arrays.stream(values()).collect(Collectors.toMap((directionTransformationx) -> Pair.of(directionTransformationx.axisTransformation, directionTransformationx.getAxisFlips()), (directionTransformationx) -> directionTransformationx));
DirectionTransformation[] var2 = values();
for (DirectionTransformation directionTransformation : var2) {
@@ -88,7 +87,7 @@ public enum DirectionTransformation implements StringIdentifiable {
booleanArrayList.add(booleanList.getBoolean(i) ^ booleanList2.getBoolean(directionTransformation.axisTransformation.map(i)));
}
- directionTransformations[directionTransformation.ordinal()][directionTransformation2.ordinal()] = map.get(Tuple.tuple(axisTransformation, booleanArrayList));
+ directionTransformations[directionTransformation.ordinal()][directionTransformation2.ordinal()] = map.get(Pair.of(axisTransformation, booleanArrayList));
}
}
diff --git a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Matrix3f.java b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Matrix3f.java
index ae0583f38..62703ca56 100644
--- a/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Matrix3f.java
+++ b/station-maths-v0/src/main/java/net/modificationstation/stationapi/api/util/math/Matrix3f.java
@@ -1,8 +1,7 @@
package net.modificationstation.stationapi.api.util.math;
+import com.mojang.datafixers.util.Pair;
import org.apache.commons.lang3.tuple.Triple;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
import java.nio.FloatBuffer;
@@ -89,17 +88,17 @@ public Matrix3f(Matrix3f source) {
this.a22 = source.a22;
}
- private static BiTuple getSinAndCosOfRotation(float upperLeft, float diagonalAverage, float lowerRight) {
+ private static Pair getSinAndCosOfRotation(float upperLeft, float diagonalAverage, float lowerRight) {
float f = 2.0F * (upperLeft - lowerRight);
if (THREE_PLUS_TWO_SQRT_TWO * diagonalAverage * diagonalAverage < f * f) {
float h = MathHelper.fastInverseSqrt(diagonalAverage * diagonalAverage + f * f);
- return Tuple.tuple(h * diagonalAverage, h * f);
+ return Pair.of(h * diagonalAverage, h * f);
} else {
- return Tuple.tuple(SIN_PI_OVER_EIGHT, COS_PI_OVER_EIGHT);
+ return Pair.of(SIN_PI_OVER_EIGHT, COS_PI_OVER_EIGHT);
}
}
- private static BiTuple method_22848(float f, float g) {
+ private static Pair method_22848(float f, float g) {
float h = (float)Math.hypot(f, g);
float i = h > 1.0E-6F ? g : 0.0F;
float j = Math.abs(f) + Math.max(h, 1.0E-6F);
@@ -113,13 +112,13 @@ private static BiTuple method_22848(float f, float g) {
l = MathHelper.fastInverseSqrt(j * j + i * i);
j *= l;
i *= l;
- return Tuple.tuple(i, j);
+ return Pair.of(i, j);
}
private static Quaternion method_22857(Matrix3f matrix3f) {
Matrix3f matrix3f2 = new Matrix3f();
Quaternion quaternion = Quaternion.IDENTITY.copy();
- BiTuple pair3;
+ Pair pair3;
Float float4;
Float float5;
Quaternion quaternion4;
@@ -128,8 +127,8 @@ private static Quaternion method_22857(Matrix3f matrix3f) {
float o;
if (matrix3f.a01 * matrix3f.a01 + matrix3f.a10 * matrix3f.a10 > 1.0E-6F) {
pair3 = getSinAndCosOfRotation(matrix3f.a00, 0.5F * (matrix3f.a01 + matrix3f.a10), matrix3f.a11);
- float4 = pair3.one();
- float5 = pair3.two();
+ float4 = pair3.getFirst();
+ float5 = pair3.getSecond();
quaternion4 = new Quaternion(0.0F, 0.0F, float4, float5);
m = float5 * float5 - float4 * float4;
n = -2.0F * float4 * float5;
@@ -149,8 +148,8 @@ private static Quaternion method_22857(Matrix3f matrix3f) {
if (matrix3f.a02 * matrix3f.a02 + matrix3f.a20 * matrix3f.a20 > 1.0E-6F) {
pair3 = getSinAndCosOfRotation(matrix3f.a00, 0.5F * (matrix3f.a02 + matrix3f.a20), matrix3f.a22);
- float i = -(Float)pair3.one();
- float5 = pair3.two();
+ float i = -(Float)pair3.getFirst();
+ float5 = pair3.getSecond();
quaternion4 = new Quaternion(0.0F, i, 0.0F, float5);
m = float5 * float5 - i * i;
n = -2.0F * i * float5;
@@ -170,8 +169,8 @@ private static Quaternion method_22857(Matrix3f matrix3f) {
if (matrix3f.a12 * matrix3f.a12 + matrix3f.a21 * matrix3f.a21 > 1.0E-6F) {
pair3 = getSinAndCosOfRotation(matrix3f.a11, 0.5F * (matrix3f.a12 + matrix3f.a21), matrix3f.a22);
- float4 = pair3.one();
- float5 = pair3.two();
+ float4 = pair3.getFirst();
+ float5 = pair3.getSecond();
quaternion4 = new Quaternion(float4, 0.0F, 0.0F, float5);
m = float5 * float5 - float4 * float4;
n = -2.0F * float4 * float5;
@@ -219,9 +218,9 @@ public Triple decomposeLinearTransformation() {
Matrix3f matrix3f2 = new Matrix3f(this);
matrix3f2.multiply(new Matrix3f(quaternion2));
float f = 1.0F;
- BiTuple pair = method_22848(matrix3f2.a00, matrix3f2.a10);
- Float float_ = pair.one();
- Float float2 = pair.two();
+ Pair pair = method_22848(matrix3f2.a00, matrix3f2.a10);
+ Float float_ = pair.getFirst();
+ Float float2 = pair.getSecond();
float g = float2 * float2 - float_ * float_;
float h = -2.0F * float_ * float2;
float j = float2 * float2 + float_ * float_;
@@ -237,8 +236,8 @@ public Triple decomposeLinearTransformation() {
f *= j;
matrix3f3.multiply(matrix3f2);
pair = method_22848(matrix3f3.a00, matrix3f3.a20);
- float k = -(Float)pair.one();
- Float float3 = pair.two();
+ float k = -(Float)pair.getFirst();
+ Float float3 = pair.getSecond();
float l = float3 * float3 - k * k;
float m = -2.0F * k * float3;
float n = float3 * float3 + k * k;
@@ -254,8 +253,8 @@ public Triple decomposeLinearTransformation() {
f *= n;
matrix3f4.multiply(matrix3f3);
pair = method_22848(matrix3f4.a11, matrix3f4.a21);
- Float float4 = pair.one();
- Float float5 = pair.two();
+ Float float4 = pair.getFirst();
+ Float float5 = pair.getSecond();
float o = float5 * float5 - float4 * float4;
float p = -2.0F * float4 * float5;
float q = float5 * float5 + float4 * float4;
diff --git a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/tag/TagConversionStorage.java b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/tag/TagConversionStorage.java
index 628e0dac7..51ae03cbd 100644
--- a/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/tag/TagConversionStorage.java
+++ b/station-recipes-v0/src/main/java/net/modificationstation/stationapi/impl/recipe/tag/TagConversionStorage.java
@@ -1,11 +1,11 @@
package net.modificationstation.stationapi.impl.recipe.tag;
+import it.unimi.dsi.fastutil.objects.ReferenceIntPair;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
-import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
+import net.modificationstation.stationapi.api.util.Identifier;
import java.util.ArrayList;
import java.util.HashMap;
@@ -13,7 +13,7 @@
// TODO: replace in vanillafix by actually changing recipes
public class TagConversionStorage {
- public static final HashMap, Identifier> CONVERSION_TABLE = new HashMap<>();
+ public static final HashMap, Identifier> CONVERSION_TABLE = new HashMap<>();
private static ArrayList spammedNames = new ArrayList<>();
@@ -106,11 +106,11 @@ public static void init() {
// }
// }
- private static BiTuple getIdentifier(Object o, int meta) {
- return o instanceof Block block ? BiTuple.of(BlockRegistry.INSTANCE.getId(block), meta) : BiTuple.of(ItemRegistry.INSTANCE.getId((Item) o), meta);
+ private static ReferenceIntPair getIdentifier(Object o, int meta) {
+ return o instanceof Block block ? ReferenceIntPair.of(BlockRegistry.INSTANCE.getId(block), meta) : ReferenceIntPair.of(ItemRegistry.INSTANCE.getId((Item) o), meta);
}
- private static BiTuple getIdentifier(Object o) {
+ private static ReferenceIntPair getIdentifier(Object o) {
return getIdentifier(o, 0);
}
diff --git a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/RegistryEntryListCodec.java b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/RegistryEntryListCodec.java
index 415912eec..1276370d7 100644
--- a/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/RegistryEntryListCodec.java
+++ b/station-registry-api-v0/src/main/java/net/modificationstation/stationapi/api/registry/RegistryEntryListCodec.java
@@ -78,7 +78,7 @@ private DataResult, T>> decodeDirect(DynamicOps
}
return DataResult.error(() -> "Can't decode element " + registryEntry + " without registry");
}
- return DataResult.success(new Pair<>(RegistryEntryList.of(list), pair.getSecond()));
+ return DataResult.success(Pair.of(RegistryEntryList.of(list), pair.getSecond()));
});
}
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/PreLoadUnbakedModelEvent.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/PreLoadUnbakedModelEvent.java
index c8fd9ca4a..707dc947f 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/PreLoadUnbakedModelEvent.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/event/render/model/PreLoadUnbakedModelEvent.java
@@ -5,13 +5,17 @@
import net.modificationstation.stationapi.api.client.render.model.ModelLoader;
import net.modificationstation.stationapi.api.client.render.model.UnbakedModel;
import net.modificationstation.stationapi.api.util.Identifier;
-import uk.co.benjiweber.expressions.function.ExceptionalFunction;
import java.io.IOException;
@SuperBuilder
public class PreLoadUnbakedModelEvent extends Event {
+ @FunctionalInterface
+ public interface Loader {
+ UnbakedModel load(Identifier identifier) throws IOException;
+ }
+
public final Identifier identifier;
public final ModelLoader modelLoader;
- public ExceptionalFunction loader;
+ public Loader loader;
}
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelLoader.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelLoader.java
index 84ca963bc..23ab77d35 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelLoader.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/render/model/ModelLoader.java
@@ -27,11 +27,11 @@
import net.modificationstation.stationapi.api.client.texture.Sprite;
import net.modificationstation.stationapi.api.client.texture.SpriteIdentifier;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
-import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
import net.modificationstation.stationapi.api.resource.ResourceFinder;
import net.modificationstation.stationapi.api.state.StateManager;
import net.modificationstation.stationapi.api.state.property.Property;
+import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Util;
import net.modificationstation.stationapi.api.util.math.AffineTransformation;
import net.modificationstation.stationapi.api.util.profiler.Profiler;
@@ -316,7 +316,7 @@ private UnbakedModel loadModelFromResource(Identifier id) throws IOException {
.modelLoader(this)
.loader(this::loadModelFromJson)
.build()
- ).loader.apply(id)
+ ).loader.load(id)
)
.build()
).model;
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpritesheetHelper.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpritesheetHelper.java
index f60bda6e7..824c77a3e 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpritesheetHelper.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/SpritesheetHelper.java
@@ -1,14 +1,13 @@
package net.modificationstation.stationapi.api.client.texture;
+import it.unimi.dsi.fastutil.ints.IntIntPair;
import net.modificationstation.stationapi.api.util.Identifier;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
public interface SpritesheetHelper {
- BiTuple DEFAULT_RESOLUTION_MULTIPLIER = Tuple.tuple(1, 1);
+ IntIntPair DEFAULT_RESOLUTION_MULTIPLIER = IntIntPair.of(1, 1);
Identifier generateIdentifier(int textureIndex);
- BiTuple getResolutionMultiplier(int textureIndex);
+ IntIntPair getResolutionMultiplier(int textureIndex);
}
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/atlas/Atlas.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/atlas/Atlas.java
index 0b0721adf..3e83bc74b 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/atlas/Atlas.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/atlas/Atlas.java
@@ -14,7 +14,6 @@
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Util;
import org.jetbrains.annotations.ApiStatus;
-import uk.co.benjiweber.expressions.function.ObjIntFunction;
import java.util.IdentityHashMap;
import java.util.List;
@@ -55,13 +54,18 @@ public abstract class Atlas {
this.parent = parent;
}
- protected final T applyInherited(int textureIndex, IntFunction atlasBounds, ObjIntFunction parentBounds) {
+ @FunctionalInterface
+ protected interface ParentBoundsGetter {
+ T getBounds(Atlas atlas, int texture);
+ }
+
+ protected final T applyInherited(int textureIndex, IntFunction atlasBounds, ParentBoundsGetter parentBounds) {
if (parent == null) {
if (0 <= textureIndex && textureIndex < size)
return atlasBounds.apply(textureIndex);
} else {
if (textureIndex < parent.size)
- return parentBounds.apply(parent, textureIndex);
+ return parentBounds.getBounds(parent, textureIndex);
else if (textureIndex < size)
return atlasBounds.apply(textureIndex - parent.size);
}
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/util/math/AffineTransformation.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/util/math/AffineTransformation.java
index bcf7c7957..872dffd13 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/util/math/AffineTransformation.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/util/math/AffineTransformation.java
@@ -1,10 +1,9 @@
package net.modificationstation.stationapi.api.util.math;
+import com.mojang.datafixers.util.Pair;
import net.modificationstation.stationapi.api.util.Util;
import org.apache.commons.lang3.tuple.Triple;
import org.jetbrains.annotations.Nullable;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
import java.util.Objects;
@@ -67,9 +66,9 @@ public AffineTransformation invert() {
private void init() {
if (!this.initialized) {
- BiTuple pair = getLinearTransformationAndTranslationFromAffine(this.matrix);
- Triple triple = pair.one().decomposeLinearTransformation();
- this.translation = pair.two();
+ Pair pair = getLinearTransformationAndTranslationFromAffine(this.matrix);
+ Triple triple = pair.getFirst().decomposeLinearTransformation();
+ this.translation = pair.getSecond();
this.rotation2 = triple.getLeft();
this.scale = triple.getMiddle();
this.rotation1 = triple.getRight();
@@ -102,11 +101,11 @@ private static Matrix4f setup(@Nullable Vec3f translation, @Nullable Quaternion
return matrix4f;
}
- public static BiTuple getLinearTransformationAndTranslationFromAffine(Matrix4f affineTransform) {
+ public static Pair getLinearTransformationAndTranslationFromAffine(Matrix4f affineTransform) {
affineTransform.multiply(1.0F / affineTransform.a33);
Vec3f vector3f = new Vec3f(affineTransform.a03, affineTransform.a13, affineTransform.a23);
Matrix3f matrix3f = new Matrix3f(affineTransform);
- return Tuple.tuple(matrix3f, vector3f);
+ return Pair.of(matrix3f, vector3f);
}
public Matrix4f getMatrix() {
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/GuiItemsHelper.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/GuiItemsHelper.java
index 4cb7396c1..f4d61538f 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/GuiItemsHelper.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/GuiItemsHelper.java
@@ -2,12 +2,12 @@
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntIntPair;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import net.modificationstation.stationapi.api.client.texture.SpritesheetHelper;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Util;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
import java.util.function.ObjIntConsumer;
@@ -149,7 +149,7 @@ public Identifier generateIdentifier(int textureIndex) {
}
@Override
- public BiTuple getResolutionMultiplier(int textureIndex) {
+ public IntIntPair getResolutionMultiplier(int textureIndex) {
return DEFAULT_RESOLUTION_MULTIPLIER;
}
}
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java
index 02ae98f85..6b089cd29 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/StationRenderImpl.java
@@ -1,5 +1,6 @@
package net.modificationstation.stationapi.impl.client.texture;
+import com.mojang.datafixers.util.Pair;
import net.fabricmc.loader.api.FabricLoader;
import net.mine_diver.unsafeevents.listener.EventListener;
import net.minecraft.class_285;
@@ -26,8 +27,6 @@
import net.modificationstation.stationapi.api.util.Null;
import net.modificationstation.stationapi.api.util.profiler.Profiler;
import org.apache.logging.log4j.Logger;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
import java.util.Collection;
import java.util.Objects;
@@ -115,7 +114,7 @@ public void reload(ResourceManager manager) {
}
});
abstract class SPIResourceReloader extends SinglePreparationResourceReloader implements IdentifiableResourceReloadListener {}
- helper.registerReloadListener(new SPIResourceReloader>() {
+ helper.registerReloadListener(new SPIResourceReloader>() {
@Override
public String getName() {
@@ -133,7 +132,7 @@ public Collection getDependencies() {
}
@Override
- protected BiTuple prepare(ResourceManager manager, Profiler profiler) {
+ protected Pair prepare(ResourceManager manager, Profiler profiler) {
profiler.startTick();
profiler.push("legacy_atlases");
ExpandableAtlas
@@ -143,13 +142,13 @@ protected BiTuple prepare(ResourceManager mana
guiItems.addSpritesheet(16, GuiItemsHelper.INSTANCE);
profiler.pop();
profiler.endTick();
- return Tuple.tuple(terrain, guiItems);
+ return Pair.of(terrain, guiItems);
}
@Override
- protected void apply(BiTuple prepared, ResourceManager manager, Profiler profiler) {
- TERRAIN = prepared.one();
- GUI_ITEMS = prepared.two();
+ protected void apply(Pair prepared, ResourceManager manager, Profiler profiler) {
+ TERRAIN = prepared.getFirst();
+ GUI_ITEMS = prepared.getSecond();
profiler.startTick();
profiler.push("mod_textures");
StationAPI.EVENT_BUS.post(TextureRegisterEvent.builder().build());
diff --git a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/TerrainHelper.java b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/TerrainHelper.java
index bb2812f48..09013b8ca 100644
--- a/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/TerrainHelper.java
+++ b/station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/impl/client/texture/TerrainHelper.java
@@ -2,13 +2,12 @@
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntIntPair;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import net.modificationstation.stationapi.api.client.texture.SpritesheetHelper;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Util;
-import uk.co.benjiweber.expressions.tuple.BiTuple;
-import uk.co.benjiweber.expressions.tuple.Tuple;
import java.util.function.ObjIntConsumer;
@@ -184,11 +183,11 @@ final class TerrainHelper implements SpritesheetHelper {
f.accept("destroy_stage_9", 249);
});
- private static final Int2ObjectMap> RESOLUTION_MULTIPLIERS = Util.make(new Int2ObjectOpenHashMap<>(), map -> {
+ private static final Int2ObjectMap RESOLUTION_MULTIPLIERS = Util.make(new Int2ObjectOpenHashMap<>(), map -> {
map.defaultReturnValue(DEFAULT_RESOLUTION_MULTIPLIER);
- ObjIntConsumer> f = (resMul, index) -> map.put(index, resMul);
- f.accept(Tuple.tuple(2, 2), 206);
- f.accept(Tuple.tuple(2, 2), 238);
+ ObjIntConsumer f = (resMul, index) -> map.put(index, resMul);
+ f.accept(IntIntPair.of(2, 2), 206);
+ f.accept(IntIntPair.of(2, 2), 238);
});
@Override
@@ -197,7 +196,7 @@ public Identifier generateIdentifier(int textureIndex) {
}
@Override
- public BiTuple getResolutionMultiplier(int textureIndex) {
+ public IntIntPair getResolutionMultiplier(int textureIndex) {
return RESOLUTION_MULTIPLIERS.get(textureIndex);
}
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreen.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreen.java
index c088afc31..070b07814 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreen.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreen.java
@@ -2,9 +2,6 @@
import com.google.common.primitives.Floats;
import com.google.common.primitives.Longs;
-import cyclops.control.Option;
-import cyclops.function.Effect;
-import cyclops.function.FluentFunctions;
import it.unimi.dsi.fastutil.doubles.Double2DoubleFunction;
import it.unimi.dsi.fastutil.longs.Long2DoubleFunction;
import lombok.val;
@@ -16,11 +13,11 @@
import net.modificationstation.stationapi.api.util.math.ColorHelper;
import net.modificationstation.stationapi.impl.client.resource.ReloadScreenManagerImpl;
+import java.util.Optional;
import java.util.Random;
import java.util.concurrent.CompletionException;
import java.util.function.*;
-import static cyclops.function.FluentFunctions.expression;
import static java.util.Map.of;
import static net.modificationstation.stationapi.api.StationAPI.LOGGER;
import static net.modificationstation.stationapi.api.util.math.MathHelper.ceil;
@@ -77,7 +74,7 @@ private static UnaryOperator when(BooleanSupplier condition
private long initTimestamp;
private long currentTime;
private float progress;
- private final Effect
+ private final Runnable
backgroundEmitter,
stage0Emitter;
private boolean finished;
@@ -116,14 +113,12 @@ private static UnaryOperator when(BooleanSupplier condition
ToDoubleFunction deltaFunc = key -> deltaMap.get(key).applyAsDouble(currentTime);
- backgroundEmitter = FluentFunctions
- .>expression(this::renderBackground)
- .partiallyApply(deltaFunc)::get;
+ backgroundEmitter = () -> renderBackground(deltaFunc);
- stage0Emitter =
- expression(this::renderProgressBar)
- .before(this::renderLogo)
- .partiallyApply(deltaFunc)::get;
+ stage0Emitter = () -> {
+ renderLogo(deltaFunc);
+ renderProgressBar(deltaFunc);
+ };
}
private void renderBackground(ToDoubleFunction deltaFunc) {
@@ -275,7 +270,7 @@ public void render(int mouseX, int mouseY, float delta) {
val locationsSize = ReloadScreenManager.LOCATIONS.size();
if (!exceptionThrown && !finished && !(scrollProgress + .1 < locationsSize) && !(progress + .1 < 1) && ReloadScreenManager.isReloadComplete()) {
try {
- ReloadScreenManager.getCurrentReload().peek(ResourceReload::throwException);
+ ReloadScreenManager.getCurrentReload().ifPresent(ResourceReload::throwException);
finished = true;
fadeOutStart = currentTime;
} catch (CompletionException e) {
@@ -286,8 +281,8 @@ public void render(int mouseX, int mouseY, float delta) {
}
}
if (!partial) {
- Option reload;
- progress = Floats.constrainToRange(progress * .95F + (isReloadStarted() && (reload = ReloadScreenManager.getCurrentReload()).isPresent() ? reload.orElse(null/*safe*/).getProgress() : 0) * .05F, 0, 1);
+ Optional reload;
+ progress = Floats.constrainToRange(progress * .95F + (isReloadStarted() && (reload = ReloadScreenManager.getCurrentReload()).isPresent() ? reload.get().getProgress() : 0) * .05F, 0, 1);
scrollProgress = Floats.constrainToRange(scrollProgress * .95F + locationsSize * .05F, 0, locationsSize);
}
if ((finished ? currentTime <= fadeOutStart + GLOBAL_FADE_OUT : currentTime < BACKGROUND_START + BACKGROUND_FADE_IN) && parent != null)
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreenManager.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreenManager.java
index 050c73880..64ec1c1f1 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreenManager.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/client/resource/ReloadScreenManager.java
@@ -1,6 +1,5 @@
package net.modificationstation.stationapi.api.client.resource;
-import cyclops.control.Option;
import lombok.Getter;
import lombok.val;
import net.fabricmc.loader.api.FabricLoader;
@@ -27,20 +26,20 @@
import org.lwjgl.opengl.SharedDrawable;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
-import static cyclops.control.Option.none;
-import static cyclops.control.Option.some;
-import static cyclops.function.FluentFunctions.expression;
import static org.lwjgl.opengl.GL11.*;
public class ReloadScreenManager {
+ @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@Getter
- private static @NotNull Option thread = none();
+ private static @NotNull Optional thread = Optional.empty();
+ @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@Getter
- private static @NotNull Option currentReload = none();
+ private static @NotNull Optional currentReload = Optional.empty();
static ReloadScreen reloadScreen;
static final List LOCATIONS = new CopyOnWriteArrayList<>();
private static final Executor EMPTY_EXECUTOR = command -> {};
@@ -57,18 +56,17 @@ public static void pushLocation(ResourceReloader resourceReloader, String format
public static void openEarly() throws LWJGLException {
ReloadScreenManagerImpl.isMinecraftDone = false;
applicationExecutor = ReloadScreenApplicationExecutor.INSTANCE;
- currentReload = some(new CompositeResourceReload());
+ currentReload = Optional.of(new CompositeResourceReload());
//noinspection deprecation
- thread = some(new Thread(expression(ReloadScreenManager::onStartup).partiallyApply(
- (Minecraft) FabricLoader.getInstance().getGameInstance(),
- new SharedDrawable(Display.getDrawable())
- )::get));
- thread.peek(Thread::start);
+ final Minecraft minecraft = (Minecraft) FabricLoader.getInstance().getGameInstance();
+ final Drawable drawable = new SharedDrawable(Display.getDrawable());
+ thread = Optional.of(new Thread(() -> ReloadScreenManager.onStartup(minecraft, drawable)));
+ thread.ifPresent(Thread::start);
}
public static void open() {
applicationExecutor = TickScheduler.CLIENT_RENDER_END::distributed;
- currentReload = some(new CompositeResourceReload());
+ currentReload = Optional.of(new CompositeResourceReload());
TickScheduler.CLIENT_RENDER_START.immediate(
() -> {
//noinspection deprecation
@@ -76,7 +74,7 @@ public static void open() {
val parentScreen = minecraft.currentScreen;
val reloadScreen = new ReloadScreen(
parentScreen,
- expression(minecraft::setScreen).applyLazy(parentScreen)::apply,
+ () -> minecraft.setScreen(parentScreen),
Tessellator.INSTANCE
);
minecraft.setScreen(reloadScreen);
@@ -100,7 +98,7 @@ static void onFinish() {
reloadScreen = null;
LOCATIONS.clear();
applicationExecutor = ReloadScreenManager.EMPTY_EXECUTOR;
- currentReload = none();
+ currentReload = Optional.empty();
}
private static void onStartup(
@@ -115,7 +113,7 @@ private static void onStartup(
val done = new AtomicBoolean();
val reloadScreen = new ReloadScreen(
minecraft.currentScreen,
- expression(done::set).applyLazy(true)::apply,
+ () -> done.set(true),
ReloadScreenTessellatorHolder.reloadScreenTessellator = TessellatorAccessor.stationapi_create(48)
);
val screenScaler = new class_564(minecraft.options, minecraft.displayWidth, minecraft.displayHeight);
@@ -157,6 +155,6 @@ private static void onStartup(
} catch (LWJGLException e) {
throw new RuntimeException(e);
}
- thread = none();
+ thread = Optional.empty();
}
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/CompositeResourceReload.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/CompositeResourceReload.java
index bbb1b6e80..e5f2b190c 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/CompositeResourceReload.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/CompositeResourceReload.java
@@ -1,47 +1,38 @@
package net.modificationstation.stationapi.api.resource;
import com.google.common.base.Supplier;
-import cyclops.control.Option;
-import cyclops.data.tuple.Tuple2;
-import cyclops.function.Function2;
+import com.mojang.datafixers.util.Pair;
import it.unimi.dsi.fastutil.objects.Reference2ObjectMap;
import it.unimi.dsi.fastutil.objects.Reference2ObjectMaps;
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
import lombok.val;
import net.modificationstation.stationapi.api.util.Identifier;
-import java.util.function.Function;
+import java.util.Optional;
import static com.google.common.base.Suppliers.memoize;
-import static cyclops.control.Option.none;
-import static cyclops.control.Option.some;
-import static cyclops.data.tuple.Tuple.tuple;
-import static cyclops.function.Function1.constant;
-import static cyclops.function.Function2._2;
public final class CompositeResourceReload implements ResourceReload {
private static final float DEFAULT_WEIGHT = 1;
- private static final Function2, Tuple2>, Float>, Tuple2 >, Float>> WEIGHT_MAPPER_FACTORY = Function2.>, Float>, Function, Tuple2>, Float>>λ(Tuple2::map2).reverse();
- private static final Function2>, Option>>, Tuple2>, Float>, Tuple2 >, Float>> RESOURCE_RELOAD_MAPPER_FACTORY = Function2.>, Float>, Function>, Option>>, Tuple2>, Float>>λ(Tuple2::map1).reverse();
- private final Reference2ObjectMap>, Float>> reloads = Reference2ObjectMaps.synchronize(new Reference2ObjectOpenHashMap<>());
+ private final Reference2ObjectMap>, Float>> reloads = Reference2ObjectMaps.synchronize(new Reference2ObjectOpenHashMap<>());
public void setWeight(Identifier id, float weight) {
reloads.merge(
- id, tuple(none(), weight),
- _2(WEIGHT_MAPPER_FACTORY.apply(constant(weight)))
+ id, Pair.of(Optional.empty(), weight),
+ (oldReload, newReload) -> Pair.of(oldReload.getFirst(), newReload.getSecond())
);
}
public void scheduleReload(Identifier id, Supplier reload) {
reloads.merge(
- id, tuple(some(memoize(reload)), DEFAULT_WEIGHT),
- _2(RESOURCE_RELOAD_MAPPER_FACTORY.apply(constant(some(memoize(reload)))))
+ id, Pair.of(Optional.of(memoize(reload)), DEFAULT_WEIGHT),
+ (oldReload, newReload) -> Pair.of(newReload.getFirst(), oldReload.getSecond())
);
}
public void scheduleReload(Identifier id, Supplier reload, float weight) {
- reloads.put(id, tuple(some(memoize(reload)), weight));
+ reloads.put(id, Pair.of(Optional.of(memoize(reload)), weight));
}
@Override
@@ -49,9 +40,9 @@ public float getProgress() {
var totalWeight = 0F;
var progress = 0F;
for (val weightedReload : reloads.values()) {
- totalWeight += weightedReload._2();
- if (!weightedReload._1().isPresent()) continue;
- progress += weightedReload._1().orElse(null/*safe*/).get().getProgress() * weightedReload._2();
+ totalWeight += weightedReload.getSecond();
+ if (weightedReload.getFirst().isEmpty()) continue;
+ progress += weightedReload.getFirst().get().get().getProgress() * weightedReload.getSecond();
}
return progress / totalWeight;
}
@@ -61,7 +52,7 @@ public boolean isComplete() {
if (reloads.values().isEmpty())
return false;
for (val weightedReload : reloads.values()) {
- if (weightedReload._1().isPresent() && !weightedReload._1().orElse(null/*safe*/).get().isComplete())
+ if (weightedReload.getFirst().map(reload -> !reload.get().isComplete()).orElse(false))
return false;
}
return true;
@@ -70,7 +61,6 @@ public boolean isComplete() {
@Override
public void throwException() {
for (val weightedReload : reloads.values())
- if (weightedReload._1().isPresent())
- weightedReload._1().orElse(null/*safe*/).get().throwException();
+ weightedReload.getFirst().ifPresent(reload -> reload.get().throwException());
}
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/ProfiledResourceReload.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/ProfiledResourceReload.java
index 9399916be..a864acf77 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/ProfiledResourceReload.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/ProfiledResourceReload.java
@@ -1,7 +1,6 @@
package net.modificationstation.stationapi.api.resource;
import com.google.common.base.Stopwatch;
-import cyclops.function.Consumer3;
import lombok.val;
import net.modificationstation.stationapi.api.util.Unit;
import net.modificationstation.stationapi.api.util.Util;
@@ -15,11 +14,10 @@
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
import java.util.function.Supplier;
-import static cyclops.function.FluentFunctions.expression;
-import static cyclops.function.Function0.λ;
-import static cyclops.function.Function1.lazy;
import static net.modificationstation.stationapi.api.StationAPI.LOGGER;
import static net.modificationstation.stationapi.api.util.profiler.Profiler.union;
@@ -28,12 +26,17 @@ public class ProfiledResourceReload extends SimpleResourceReload reloaders,
Executor prepareExecutor,
Executor applyExecutor,
- Consumer3 profilerListener,
+ ProfilerListener profilerListener,
CompletableFuture initialStage
) {
super(prepareExecutor, applyExecutor, manager, reloaders, (synchronizer, resourceManager, reloader, prepare, apply) -> {
@@ -44,29 +47,17 @@ public ProfiledResourceReload(
.getResourceType()
.map(ResourceType::getDirectory)
.map(StringUtils::capitalize)
- .orElseGet(
- λ(resourceManager::getClass)
- .andThen(Class::getSimpleName)
- );
+ .orElseGet(() -> resourceManager.getClass().getSimpleName());
val prepareProfiler = new ProfilerSystem(Util.nanoTimeSupplier, () -> 0, false);
val applyProfiler = new ProfilerSystem(Util.nanoTimeSupplier, () -> 0, false);
+ final BiConsumer reloaderListener = (prefix, location) -> profilerListener.push(reloader, prefix, location);
+ final Consumer preparationListener = location -> reloaderListener.accept(LOCATION_FORMAT.formatted(managerName, "%s", "preparation"), location);
+ final Consumer applicationListener = location -> reloaderListener.accept(LOCATION_FORMAT.formatted(managerName, "%s", "application"), location);
return reloader.reload(
synchronizer,
resourceManager,
- union(
- prepareProfiler,
- (ListenableProfiler) expression(profilerListener.apply(
- reloader,
- LOCATION_FORMAT.formatted(managerName, "%s", "preparation")
- )).compose(lazy(prepareProfiler::getFullPath))::apply
- ),
- union(
- applyProfiler,
- (ListenableProfiler) expression(profilerListener.apply(
- reloader,
- LOCATION_FORMAT.formatted(managerName, "%s", "application")
- )).compose(lazy(applyProfiler::getFullPath))::apply
- ),
+ union(prepareProfiler, (ListenableProfiler) location -> preparationListener.accept(prepareProfiler.getFullPath())),
+ union(applyProfiler, (ListenableProfiler) location -> applicationListener.accept(applyProfiler.getFullPath())),
preparation -> prepare.execute(() -> {
long prepareStart = Util.getMeasuringTimeNano();
preparation.run();
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/SimpleResourceReload.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/SimpleResourceReload.java
index d12fb915a..b66ceee97 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/SimpleResourceReload.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/api/resource/SimpleResourceReload.java
@@ -1,6 +1,5 @@
package net.modificationstation.stationapi.api.resource;
-import cyclops.function.Consumer3;
import net.modificationstation.stationapi.api.util.Unit;
import net.modificationstation.stationapi.api.util.Util;
import net.modificationstation.stationapi.api.util.profiler.DummyProfiler;
@@ -136,7 +135,7 @@ public static ResourceReload start(
final List reloaders,
Executor prepareExecutor,
Executor applyExecutor,
- Consumer3 profilerListener,
+ ProfiledResourceReload.ProfilerListener profilerListener,
CompletableFuture initialStage
) {
return new ProfiledResourceReload(
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java
index de569ade7..191c1529c 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/client/resource/AssetsReloaderImpl.java
@@ -16,10 +16,9 @@
import net.modificationstation.stationapi.impl.resource.TexturePackProvider;
import net.modificationstation.stationapi.impl.resource.loader.ModResourcePackCreator;
+import java.util.Optional;
import java.util.concurrent.CompletableFuture;
-import static cyclops.control.Option.none;
-import static cyclops.control.Option.some;
import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
@@ -40,11 +39,11 @@ private static void reload(TexturePackLoadedEvent.After event) {
@EventListener
private static void reloadResourceManager(final AssetsReloadEvent event) {
RESOURCE_PACK_MANAGER.scanPacks();
+ if (ReloadScreenManager.getCurrentReload().isEmpty())
+ ReloadScreenManager.open();
ReloadScreenManager.getCurrentReload()
- .onEmpty(ReloadScreenManager::open);
- ReloadScreenManager.getCurrentReload()
- .flatMap(reload1 -> reload1 instanceof CompositeResourceReload composite ? some(composite) : none())
- .peek(manager -> manager.scheduleReload(
+ .flatMap(reload1 -> reload1 instanceof CompositeResourceReload composite ? Optional.of(composite) : Optional.empty())
+ .ifPresent(manager -> manager.scheduleReload(
NAMESPACE.id("assets"),
() -> ReloadableAssetsManager.INSTANCE.reload(
Util.getMainWorkerExecutor(),
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java
index b3986725a..7d0846b95 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/DataReloaderImpl.java
@@ -16,12 +16,11 @@
import net.modificationstation.stationapi.api.util.Util;
import net.modificationstation.stationapi.impl.resource.loader.ModResourcePackCreator;
+import java.util.Optional;
import java.util.Queue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentLinkedQueue;
-import static cyclops.control.Option.none;
-import static cyclops.control.Option.some;
import static net.mine_diver.unsafeevents.listener.ListenerPriority.LOW;
import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
@@ -59,8 +58,8 @@ private static void reloadResourceManager(DataReloadEvent event) {
@EventListener(priority = LOW)
private static void reloadResourceManagerClient(DataReloadEvent event) {
ReloadScreenManager.getCurrentReload()
- .flatMap(reload1 -> reload1 instanceof CompositeResourceReload composite ? some(composite) : none())
- .peek(manager -> manager.scheduleReload(
+ .flatMap(reload1 -> reload1 instanceof CompositeResourceReload composite ? Optional.of(composite) : Optional.empty())
+ .ifPresent(manager -> manager.scheduleReload(
NAMESPACE.id("data"),
() -> DataManager.INSTANCE.reload(
Util.getMainWorkerExecutor(),
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/ReloadableResourceManager.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/ReloadableResourceManager.java
index 85347b702..61c7f2060 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/ReloadableResourceManager.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/ReloadableResourceManager.java
@@ -1,7 +1,6 @@
package net.modificationstation.stationapi.impl.resource;
import com.google.common.collect.Lists;
-import cyclops.function.Consumer3;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.util.Namespace;
import net.modificationstation.stationapi.api.resource.*;
@@ -68,7 +67,7 @@ public ResourceReload reload(
Executor prepareExecutor,
Executor applyExecutor,
CompletableFuture initialStage,
- Consumer3 profilerListener,
+ ProfiledResourceReload.ProfilerListener profilerListener,
List packs
) {
LOGGER.info("Reloading ResourceManager: {}", () -> packs.stream().map(ResourcePack::getName).collect(Collectors.joining(", ")));
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/loader/ResourceManagerHelperImpl.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/loader/ResourceManagerHelperImpl.java
index 6dc2e204c..d69d1639c 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/loader/ResourceManagerHelperImpl.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/impl/resource/loader/ResourceManagerHelperImpl.java
@@ -3,8 +3,8 @@
import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Pair;
import net.fabricmc.loader.api.ModContainer;
-import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.api.resource.*;
+import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.impl.resource.ModNioResourcePack;
import net.modificationstation.stationapi.impl.resource.ResourcePackProfile;
import org.slf4j.Logger;
@@ -47,9 +47,9 @@ public static boolean registerBuiltinResourcePack(Identifier id, String subPath,
ModNioResourcePack dataPack = ModNioResourcePack.create(id, displayName, container, subPath, ResourceType.SERVER_DATA, activationType);
if (resourcePack == null && dataPack == null) return false;
- if (resourcePack != null) builtinResourcePacks.add(new Pair<>(displayName, resourcePack));
+ if (resourcePack != null) builtinResourcePacks.add(Pair.of(displayName, resourcePack));
- if (dataPack != null) builtinResourcePacks.add(new Pair<>(displayName, dataPack));
+ if (dataPack != null) builtinResourcePacks.add(Pair.of(displayName, dataPack));
return true;
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/MinecraftMixin.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/MinecraftMixin.java
index 954f27695..cb1abbb85 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/MinecraftMixin.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/MinecraftMixin.java
@@ -1,6 +1,5 @@
package net.modificationstation.stationapi.mixin.resourceloader.client;
-import com.oath.cyclops.util.ExceptionSoftener;
import lombok.val;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -116,6 +115,12 @@ private void stationapi_applyReloadsAndWait(CallbackInfo ci) {
val command = ReloadScreenApplicationExecutor.INSTANCE.poll();
if (command != null) command.run();
}
- ReloadScreenManager.getThread().peek(ExceptionSoftener.softenConsumer(Thread::join));
+ ReloadScreenManager.getThread().ifPresent(thread -> {
+ try {
+ thread.join();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ });
}
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TextRendererMixin.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TextRendererMixin.java
index 0f12c5bfc..32de466be 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TextRendererMixin.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TextRendererMixin.java
@@ -1,7 +1,6 @@
package net.modificationstation.stationapi.mixin.resourceloader.client;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import cyclops.function.FluentFunctions;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.render.Tessellator;
import net.modificationstation.stationapi.api.client.resource.ReloadScreenManager;
@@ -23,6 +22,6 @@ class TextRendererMixin {
)
)
private Tessellator stationapi_changeTessellatorIfNecessary(Tessellator instance) {
- return ReloadScreenManager.getThread().map(FluentFunctions.of(Objects::equals).partiallyApply(Thread.currentThread())).orElse(false) ? ReloadScreenTessellatorHolder.reloadScreenTessellator : instance;
+ return ReloadScreenManager.getThread().map(thread -> Objects.equals(thread, Thread.currentThread())).orElse(false) ? ReloadScreenTessellatorHolder.reloadScreenTessellator : instance;
}
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TexturePackMixin.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TexturePackMixin.java
index e7e71b93e..5da714f38 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TexturePackMixin.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/TexturePackMixin.java
@@ -2,14 +2,13 @@
import net.minecraft.class_285;
import net.modificationstation.stationapi.api.client.resource.ReloadableAssetsManager;
-import net.modificationstation.stationapi.api.resource.Resource;
import net.modificationstation.stationapi.api.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-import uk.co.benjiweber.expressions.exception.Exceptions;
+import java.io.IOException;
import java.io.InputStream;
@Mixin(class_285.class)
@@ -20,6 +19,12 @@ class TexturePackMixin {
cancellable = true
)
private void stationapi_getFromResourceManager(String path, CallbackInfoReturnable cir) {
- ReloadableAssetsManager.INSTANCE.getResource(Identifier.of(path)).map(Exceptions.unchecked(Resource::getInputStream)).ifPresent(cir::setReturnValue);
+ ReloadableAssetsManager.INSTANCE.getResource(Identifier.of(path)).map(resource -> {
+ try {
+ return resource.getInputStream();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }).ifPresent(cir::setReturnValue);
}
}
diff --git a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/ZipTexturePackMixin.java b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/ZipTexturePackMixin.java
index c820a09b0..656eb8f88 100644
--- a/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/ZipTexturePackMixin.java
+++ b/station-resource-loader-v0/src/main/java/net/modificationstation/stationapi/mixin/resourceloader/client/ZipTexturePackMixin.java
@@ -3,14 +3,13 @@
import net.minecraft.class_285;
import net.minecraft.class_592;
import net.modificationstation.stationapi.api.client.resource.ReloadableAssetsManager;
-import net.modificationstation.stationapi.api.resource.Resource;
import net.modificationstation.stationapi.api.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-import uk.co.benjiweber.expressions.exception.Exceptions;
+import java.io.IOException;
import java.io.InputStream;
@Mixin(class_592.class)
@@ -21,6 +20,12 @@ class ZipTexturePackMixin extends class_285 {
cancellable = true
)
private void stationapi_getFromResourceManager(String path, CallbackInfoReturnable cir) {
- ReloadableAssetsManager.INSTANCE.getResource(Identifier.of(path)).map(Exceptions.unchecked(Resource::getInputStream)).ifPresent(cir::setReturnValue);
+ ReloadableAssetsManager.INSTANCE.getResource(Identifier.of(path)).map(resource -> {
+ try {
+ return resource.getInputStream();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }).ifPresent(cir::setReturnValue);
}
}
From d719b2a2e44f34df98e78aa4742ceb9c61db054a Mon Sep 17 00:00:00 2001
From: mineLdiver
Date: Sun, 3 Nov 2024 01:47:05 +0500
Subject: [PATCH 08/10] Packet types (#123)
* Implemented packet types (registry sync is broken).
* Introduced blocking packets. Fixed packet types registry sync.
* Re-enabled GCAPI and HMI
* Use WrapOperation instead of Redirect in network
---
.../FlattenedClientNetworkingInit.java | 9 +--
.../packet/FlattenedBlockChangeS2CPacket.java | 20 ++---
.../packet/FlattenedChunkDataS2CPacket.java | 20 ++---
.../FlattenedChunkSectionDataS2CPacket.java | 15 ++--
.../FlattenedMultiBlockChangeS2CPacket.java | 20 ++---
.../StationFlatteningNetworkingImpl.java | 13 ++--
.../StationItemsClientNetworkingImpl.java | 5 +-
.../packet/StationItemsNetworkingImpl.java | 17 +++--
.../c2s/play/StationClickSlotC2SPacket.java | 19 ++---
.../StationPlayerInteractBlockC2SPacket.java | 20 ++---
...StationEntityEquipmentUpdateS2CPacket.java | 19 ++---
.../s2c/play/StationInventoryS2CPacket.java | 19 ++---
.../play/StationItemEntitySpawnS2CPacket.java | 19 ++---
...ationScreenHandlerSlotUpdateS2CPacket.java | 19 ++---
.../network/packet/IdentifiablePacket.java | 39 ----------
.../api/network/packet/ManagedPacket.java | 15 ++++
.../api/network/packet/MessagePacket.java | 15 ++--
.../api/network/packet/PacketHelper.java | 2 +-
.../api/network/packet/PacketType.java | 75 +++++++++++++++++++
.../registry/IdentifiablePacketRegistry.java | 14 ----
.../api/registry/PacketTypeRegistry.java | 18 +++++
.../packet/PacketHelperClientImpl.java | 7 +-
.../packet/IdentifiablePacketImpl.java | 17 -----
.../network/packet/StationNetworkingImpl.java | 14 ++--
.../packet/PacketHelperServerImpl.java | 5 +-
.../mixin/network/ConnectionMixin.java | 51 +++++++++++--
.../stationapi/mixin/network/PacketMixin.java | 46 ++++--------
.../network/ClientRegistryNetworkingInit.java | 3 +-
.../impl/network/RegistryNetworkingInit.java | 22 ++++--
.../play/RemapClientRegistryS2CPacket.java | 20 +++--
.../src/main/resources/fabric.mod.json | 2 +-
31 files changed, 321 insertions(+), 278 deletions(-)
delete mode 100644 station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/IdentifiablePacket.java
create mode 100644 station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/ManagedPacket.java
create mode 100644 station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketType.java
delete mode 100644 station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/IdentifiablePacketRegistry.java
create mode 100644 station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/PacketTypeRegistry.java
delete mode 100644 station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/IdentifiablePacketImpl.java
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/FlattenedClientNetworkingInit.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/FlattenedClientNetworkingInit.java
index 842e77a36..924271f25 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/FlattenedClientNetworkingInit.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/FlattenedClientNetworkingInit.java
@@ -2,7 +2,6 @@
import net.fabricmc.api.ClientModInitializer;
import net.minecraft.network.NetworkHandler;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
import net.modificationstation.stationapi.impl.packet.FlattenedBlockChangeS2CPacket;
import net.modificationstation.stationapi.impl.packet.FlattenedChunkDataS2CPacket;
import net.modificationstation.stationapi.impl.packet.FlattenedChunkSectionDataS2CPacket;
@@ -16,9 +15,9 @@ public void onInitializeClient() {
// Overriding vanilla packet handler with the StationAPI one
// for flattened packets
NetworkHandler handler = new FlattenedClientPlayNetworkHandler();
- IdentifiablePacket.setHandler(FlattenedChunkDataS2CPacket.PACKET_ID, handler);
- IdentifiablePacket.setHandler(FlattenedMultiBlockChangeS2CPacket.PACKET_ID, handler);
- IdentifiablePacket.setHandler(FlattenedBlockChangeS2CPacket.PACKET_ID, handler);
- IdentifiablePacket.setHandler(FlattenedChunkSectionDataS2CPacket.PACKET_ID, handler);
+ FlattenedChunkDataS2CPacket.TYPE.setHandler(handler);
+ FlattenedMultiBlockChangeS2CPacket.TYPE.setHandler(handler);
+ FlattenedBlockChangeS2CPacket.TYPE.setHandler(handler);
+ FlattenedChunkSectionDataS2CPacket.TYPE.setHandler(handler);
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedBlockChangeS2CPacket.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedBlockChangeS2CPacket.java
index ead96bc42..b7bb8a4ef 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedBlockChangeS2CPacket.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedBlockChangeS2CPacket.java
@@ -6,25 +6,21 @@
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
import net.minecraft.world.World;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.network.StationFlatteningPacketHandler;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class FlattenedBlockChangeS2CPacket extends BlockUpdateS2CPacket implements IdentifiablePacket {
-
- public static final Identifier PACKET_ID = NAMESPACE.id("flattening/block_change");
+public class FlattenedBlockChangeS2CPacket extends BlockUpdateS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, FlattenedBlockChangeS2CPacket::new).build();
public int stateId;
- @ApiStatus.Internal
- public FlattenedBlockChangeS2CPacket() {}
+ private FlattenedBlockChangeS2CPacket() {}
@Environment(EnvType.SERVER)
public FlattenedBlockChangeS2CPacket(int x, int y, int z, World world) {
@@ -72,7 +68,7 @@ public int size() {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkDataS2CPacket.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkDataS2CPacket.java
index b1418f55c..18f601a93 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkDataS2CPacket.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkDataS2CPacket.java
@@ -5,12 +5,12 @@
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket;
import net.minecraft.world.World;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.network.StationFlatteningPacketHandler;
import net.modificationstation.stationapi.impl.world.chunk.ChunkSection;
import net.modificationstation.stationapi.impl.world.chunk.FlattenedChunk;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -21,18 +21,14 @@
import java.util.zip.Deflater;
import java.util.zip.Inflater;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class FlattenedChunkDataS2CPacket extends ChunkDataS2CPacket implements IdentifiablePacket {
-
- public static final Identifier PACKET_ID = NAMESPACE.id("flattening/chunk_data");
+public class FlattenedChunkDataS2CPacket extends ChunkDataS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, FlattenedChunkDataS2CPacket::new).build();
public int chunkX, chunkZ;
private int sectionsSize;
public byte[] sectionsData;
- @ApiStatus.Internal
- public FlattenedChunkDataS2CPacket() {}
+ private FlattenedChunkDataS2CPacket() {}
@Environment(EnvType.SERVER)
public FlattenedChunkDataS2CPacket(World world, int chunkX, int chunkZ) {
@@ -111,7 +107,7 @@ public int size() {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkSectionDataS2CPacket.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkSectionDataS2CPacket.java
index f2b1ed44c..10542840b 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkSectionDataS2CPacket.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedChunkSectionDataS2CPacket.java
@@ -3,12 +3,13 @@
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.Packet;
import net.minecraft.world.World;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.network.StationFlatteningPacketHandler;
import net.modificationstation.stationapi.impl.world.chunk.ChunkSection;
import net.modificationstation.stationapi.impl.world.chunk.FlattenedChunk;
import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -19,10 +20,8 @@
import java.util.zip.Deflater;
import java.util.zip.Inflater;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class FlattenedChunkSectionDataS2CPacket extends Packet implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("flattening/chunk_section_data");
+public class FlattenedChunkSectionDataS2CPacket extends Packet implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, FlattenedChunkSectionDataS2CPacket::new).build();
public int chunkX, chunkZ, sectionIndex;
private int sectionSize;
@@ -104,7 +103,7 @@ public int size() {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedMultiBlockChangeS2CPacket.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedMultiBlockChangeS2CPacket.java
index bfc7e1798..f4f82b908 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedMultiBlockChangeS2CPacket.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/FlattenedMultiBlockChangeS2CPacket.java
@@ -4,30 +4,26 @@
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.s2c.play.ChunkDeltaUpdateS2CPacket;
import net.minecraft.world.World;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.network.StationFlatteningPacketHandler;
import net.modificationstation.stationapi.impl.util.math.ChunkSectionPos;
import net.modificationstation.stationapi.impl.world.chunk.ChunkSection;
import net.modificationstation.stationapi.impl.world.chunk.FlattenedChunk;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Objects;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class FlattenedMultiBlockChangeS2CPacket extends ChunkDeltaUpdateS2CPacket implements IdentifiablePacket {
-
- public static final Identifier PACKET_ID = NAMESPACE.id("flattening/multi_block_change");
+public class FlattenedMultiBlockChangeS2CPacket extends ChunkDeltaUpdateS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, FlattenedMultiBlockChangeS2CPacket::new).build();
public int sectionIndex;
public int[] stateArray;
- @ApiStatus.Internal
- public FlattenedMultiBlockChangeS2CPacket() {}
+ private FlattenedMultiBlockChangeS2CPacket() {}
public FlattenedMultiBlockChangeS2CPacket(int chunkX, int chunkZ, int sectionIndex, short[] positions, int arraySize, World world) {
this.x = chunkX;
@@ -93,7 +89,7 @@ public int size() {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java
index 491a1bffb..25379bd1d 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/impl/packet/StationFlatteningNetworkingImpl.java
@@ -1,7 +1,10 @@
package net.modificationstation.stationapi.impl.packet;
import net.fabricmc.api.ModInitializer;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
+import net.modificationstation.stationapi.api.registry.PacketTypeRegistry;
+import net.modificationstation.stationapi.api.registry.Registry;
+
+import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
public class StationFlatteningNetworkingImpl implements ModInitializer {
@@ -9,9 +12,9 @@ public class StationFlatteningNetworkingImpl implements ModInitializer {
public void onInitialize() {
// Registering packets for flattened save format
- IdentifiablePacket.register(FlattenedChunkDataS2CPacket.PACKET_ID, true, false, FlattenedChunkDataS2CPacket::new);
- IdentifiablePacket.register(FlattenedMultiBlockChangeS2CPacket.PACKET_ID, true, false, FlattenedMultiBlockChangeS2CPacket::new);
- IdentifiablePacket.register(FlattenedBlockChangeS2CPacket.PACKET_ID, true, false, FlattenedBlockChangeS2CPacket::new);
- IdentifiablePacket.register(FlattenedChunkSectionDataS2CPacket.PACKET_ID, true, false, FlattenedChunkSectionDataS2CPacket::new);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/chunk_data"), FlattenedChunkDataS2CPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/multi_block_change"), FlattenedMultiBlockChangeS2CPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/block_change"), FlattenedBlockChangeS2CPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("flattening/chunk_section_data"), FlattenedChunkSectionDataS2CPacket.TYPE);
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/StationItemsClientNetworkingImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/StationItemsClientNetworkingImpl.java
index bdd987207..890023d0a 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/StationItemsClientNetworkingImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/StationItemsClientNetworkingImpl.java
@@ -2,7 +2,6 @@
import net.fabricmc.api.ClientModInitializer;
import net.minecraft.network.NetworkHandler;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationEntityEquipmentUpdateS2CPacket;
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationItemEntitySpawnS2CPacket;
@@ -10,7 +9,7 @@ public class StationItemsClientNetworkingImpl implements ClientModInitializer {
@Override
public void onInitializeClient() {
NetworkHandler handler = new StationItemsClientNetworkHandler();
- IdentifiablePacket.setHandler(StationItemEntitySpawnS2CPacket.PACKET_ID, handler);
- IdentifiablePacket.setHandler(StationEntityEquipmentUpdateS2CPacket.PACKET_ID, handler);
+ StationItemEntitySpawnS2CPacket.TYPE.setHandler(handler);
+ StationEntityEquipmentUpdateS2CPacket.TYPE.setHandler(handler);
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java
index f221d58a3..5216d3085 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java
@@ -1,7 +1,8 @@
package net.modificationstation.stationapi.impl.network.packet;
import net.fabricmc.api.ModInitializer;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
+import net.modificationstation.stationapi.api.registry.PacketTypeRegistry;
+import net.modificationstation.stationapi.api.registry.Registry;
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationClickSlotC2SPacket;
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationPlayerInteractBlockC2SPacket;
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationEntityEquipmentUpdateS2CPacket;
@@ -9,14 +10,16 @@
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationItemEntitySpawnS2CPacket;
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationScreenHandlerSlotUpdateS2CPacket;
+import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+
public class StationItemsNetworkingImpl implements ModInitializer {
@Override
public void onInitialize() {
- IdentifiablePacket.register(StationClickSlotC2SPacket.PACKET_ID, false, true, StationClickSlotC2SPacket::new);
- IdentifiablePacket.register(StationEntityEquipmentUpdateS2CPacket.PACKET_ID, true, false, StationEntityEquipmentUpdateS2CPacket::new);
- IdentifiablePacket.register(StationInventoryS2CPacket.PACKET_ID, true, false, StationInventoryS2CPacket::new);
- IdentifiablePacket.register(StationItemEntitySpawnS2CPacket.PACKET_ID, true, false, StationItemEntitySpawnS2CPacket::new);
- IdentifiablePacket.register(StationPlayerInteractBlockC2SPacket.PACKET_ID, false, true, StationPlayerInteractBlockC2SPacket::new);
- IdentifiablePacket.register(StationScreenHandlerSlotUpdateS2CPacket.PACKET_ID, true, false, StationScreenHandlerSlotUpdateS2CPacket::new);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/slot"), StationClickSlotC2SPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/equipment"), StationEntityEquipmentUpdateS2CPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/inventory"), StationInventoryS2CPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/entity_spawn"), StationItemEntitySpawnS2CPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/interact"), StationPlayerInteractBlockC2SPacket.TYPE);
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("items/slot_update"), StationScreenHandlerSlotUpdateS2CPacket.TYPE);
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationClickSlotC2SPacket.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationClickSlotC2SPacket.java
index fb494c245..b1826aeba 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationClickSlotC2SPacket.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationClickSlotC2SPacket.java
@@ -4,22 +4,19 @@
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.item.StationNBTSetter;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+public class StationClickSlotC2SPacket extends ClickSlotC2SPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(false, true, StationClickSlotC2SPacket::new).build();
-public class StationClickSlotC2SPacket extends ClickSlotC2SPacket implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("items/slot");
-
- @ApiStatus.Internal
- public StationClickSlotC2SPacket() {}
+ private StationClickSlotC2SPacket() {}
public StationClickSlotC2SPacket(int syncId, int slot, int button, boolean holdingShift, ItemStack stack, short actionType) {
super(syncId, slot, button, holdingShift, stack, actionType);
@@ -52,7 +49,7 @@ public void write(DataOutputStream stream) {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationPlayerInteractBlockC2SPacket.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationPlayerInteractBlockC2SPacket.java
index 99bb1d39e..a286a628e 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationPlayerInteractBlockC2SPacket.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/c2s/play/StationPlayerInteractBlockC2SPacket.java
@@ -3,24 +3,20 @@
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
-import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.item.StationNBTSetter;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+public class StationPlayerInteractBlockC2SPacket extends PlayerInteractBlockC2SPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(false, true, StationPlayerInteractBlockC2SPacket::new).build();
-public class StationPlayerInteractBlockC2SPacket extends PlayerInteractBlockC2SPacket implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("items/interact");
-
- @ApiStatus.Internal
- public StationPlayerInteractBlockC2SPacket() {}
+ private StationPlayerInteractBlockC2SPacket() {}
public StationPlayerInteractBlockC2SPacket(int x, int y, int z, int side, ItemStack stack) {
super(x, y, z, side, stack);
@@ -53,7 +49,7 @@ public void write(DataOutputStream stream) {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationEntityEquipmentUpdateS2CPacket.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationEntityEquipmentUpdateS2CPacket.java
index e72078a0f..c9f7db5cd 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationEntityEquipmentUpdateS2CPacket.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationEntityEquipmentUpdateS2CPacket.java
@@ -5,24 +5,21 @@
import net.minecraft.nbt.NbtElement;
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.network.StationItemsNetworkHandler;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class StationEntityEquipmentUpdateS2CPacket extends EntityEquipmentUpdateS2CPacket implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("items/equipment");
+public class StationEntityEquipmentUpdateS2CPacket extends EntityEquipmentUpdateS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, StationEntityEquipmentUpdateS2CPacket::new).build();
public NbtCompound stationNbt;
- @ApiStatus.Internal
- public StationEntityEquipmentUpdateS2CPacket() {}
+ private StationEntityEquipmentUpdateS2CPacket() {}
public StationEntityEquipmentUpdateS2CPacket(int id, int slot, ItemStack itemStack) {
super(id, slot, itemStack);
@@ -59,7 +56,7 @@ public void apply(NetworkHandler networkHandler) {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationInventoryS2CPacket.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationInventoryS2CPacket.java
index ca2711602..b59b31090 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationInventoryS2CPacket.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationInventoryS2CPacket.java
@@ -4,23 +4,20 @@
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.network.packet.s2c.play.InventoryS2CPacket;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.item.StationNBTSetter;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+public class StationInventoryS2CPacket extends InventoryS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, StationInventoryS2CPacket::new).build();
-public class StationInventoryS2CPacket extends InventoryS2CPacket implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("items/inventory");
-
- public StationInventoryS2CPacket() {
- super();
- }
+ private StationInventoryS2CPacket() {}
public StationInventoryS2CPacket(int syncId, List contents) {
super(syncId, contents);
@@ -76,7 +73,7 @@ public void write(DataOutputStream stream) {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationItemEntitySpawnS2CPacket.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationItemEntitySpawnS2CPacket.java
index 26b123a96..8c4fafb38 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationItemEntitySpawnS2CPacket.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationItemEntitySpawnS2CPacket.java
@@ -5,24 +5,21 @@
import net.minecraft.nbt.NbtElement;
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.s2c.play.ItemEntitySpawnS2CPacket;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.network.StationItemsNetworkHandler;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class StationItemEntitySpawnS2CPacket extends ItemEntitySpawnS2CPacket implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("items/entity_spawn");
+public class StationItemEntitySpawnS2CPacket extends ItemEntitySpawnS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, StationItemEntitySpawnS2CPacket::new).build();
public NbtCompound stationNbt;
- @ApiStatus.Internal
- public StationItemEntitySpawnS2CPacket() {}
+ private StationItemEntitySpawnS2CPacket() {}
public StationItemEntitySpawnS2CPacket(ItemEntity itemEntity) {
super(itemEntity);
@@ -59,7 +56,7 @@ public void apply(NetworkHandler networkHandler) {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationScreenHandlerSlotUpdateS2CPacket.java b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationScreenHandlerSlotUpdateS2CPacket.java
index 286467e23..6bc8d5b9d 100644
--- a/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationScreenHandlerSlotUpdateS2CPacket.java
+++ b/station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/StationScreenHandlerSlotUpdateS2CPacket.java
@@ -4,22 +4,19 @@
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.impl.item.StationNBTSetter;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+public class StationScreenHandlerSlotUpdateS2CPacket extends ScreenHandlerSlotUpdateS2CPacket implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, false, StationScreenHandlerSlotUpdateS2CPacket::new).build();
-public class StationScreenHandlerSlotUpdateS2CPacket extends ScreenHandlerSlotUpdateS2CPacket implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("items/slot_update");
-
- public StationScreenHandlerSlotUpdateS2CPacket() {
- super();
- }
+ private StationScreenHandlerSlotUpdateS2CPacket() {}
public StationScreenHandlerSlotUpdateS2CPacket(int syncId, int slot, ItemStack stack) {
super(syncId, slot, stack);
@@ -70,7 +67,7 @@ public void write(DataOutputStream stream) {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/IdentifiablePacket.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/IdentifiablePacket.java
deleted file mode 100644
index 14dcac4bc..000000000
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/IdentifiablePacket.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.modificationstation.stationapi.api.network.packet;
-
-import net.minecraft.network.NetworkHandler;
-import net.minecraft.network.packet.Packet;
-import net.modificationstation.stationapi.api.registry.IdentifiablePacketRegistry;
-import net.modificationstation.stationapi.api.registry.Registry;
-import net.modificationstation.stationapi.api.util.Identifier;
-import net.modificationstation.stationapi.impl.network.packet.IdentifiablePacketImpl;
-
-public interface IdentifiablePacket {
- int PACKET_ID = 254;
-
- static Factory register(Identifier id, boolean clientBound, boolean serverBound, Factory factory) {
- if (IdentifiablePacketRegistry.INSTANCE.containsId(id))
- throw new IllegalArgumentException("Duplicate packet id:" + id);
- Factory ret = Registry.register(IdentifiablePacketRegistry.INSTANCE, id, factory);
- if (clientBound) IdentifiablePacketImpl.CLIENT_BOUND_PACKETS.add(id);
- if (serverBound) IdentifiablePacketImpl.SERVER_BOUND_PACKETS.add(id);
- return ret;
- }
-
- static void setHandler(Identifier packetId, NetworkHandler handler) {
- NetworkHandler previous = IdentifiablePacketImpl.HANDLERS.put(packetId, handler);
- if (previous != null)
- throw new IllegalArgumentException("Duplicate handler for packet id \"" + packetId + "\"! Previous: \"" + previous.getClass().getName() + "\", new: \"" + handler.getClass().getName() + "\"");
- }
-
- static Packet create(Identifier id) {
- Factory factory = IdentifiablePacketRegistry.INSTANCE.get(id);
- return factory == null ? null : factory.create();
- }
-
- Identifier getId();
-
- @FunctionalInterface
- interface Factory {
- Packet create();
- }
-}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/ManagedPacket.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/ManagedPacket.java
new file mode 100644
index 000000000..b34643411
--- /dev/null
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/ManagedPacket.java
@@ -0,0 +1,15 @@
+package net.modificationstation.stationapi.api.network.packet;
+
+import net.minecraft.network.packet.Packet;
+import org.jetbrains.annotations.NotNull;
+
+public interface ManagedPacket> {
+ int PACKET_ID = 254;
+
+ @NotNull PacketType getType();
+
+ @FunctionalInterface
+ interface Factory> {
+ @NotNull T create();
+ }
+}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/MessagePacket.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/MessagePacket.java
index 64f3e64d4..cee19ba32 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/MessagePacket.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/MessagePacket.java
@@ -7,15 +7,13 @@
import net.modificationstation.stationapi.api.entity.player.PlayerHelper;
import net.modificationstation.stationapi.api.registry.MessageListenerRegistry;
import net.modificationstation.stationapi.api.util.Identifier;
-import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.function.BiConsumer;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
/**
* Universal packet class that can hold any kind of data,
* be received on both server and client, and be used locally on either server or client.
@@ -39,8 +37,8 @@
*
* @author mine_diver
*/
-public class MessagePacket extends Packet implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("message");
+public class MessagePacket extends Packet implements ManagedPacket {
+ public static final PacketType TYPE = PacketType.builder(true, true, MessagePacket::new).build();
/**
* Message's identifier.
@@ -117,8 +115,7 @@ public class MessagePacket extends Packet implements IdentifiablePacket {
/**
* Internal Message constructor for initialization when received.
*/
- @ApiStatus.Internal
- public MessagePacket() {}
+ private MessagePacket() {}
/**
* Default Message constructor.
@@ -470,8 +467,8 @@ public int size() {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
public Object[] deserializeObjects() {
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketHelper.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketHelper.java
index 7cfc4bf9f..d449bf949 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketHelper.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketHelper.java
@@ -47,7 +47,7 @@ public static void sendTo(PlayerEntity player, Packet packet) {
* Registers the given packet.
*
* For registering packets that use {@link Identifier} instead of a byte ID,
- * refer to {@link IdentifiablePacket#register(Identifier, boolean, boolean, IdentifiablePacket.Factory)}
+ * refer to {@link ManagedPacket#register(Identifier, boolean, boolean, ManagedPacket.Factory)}
*
* @param rawId the packet ID that you want to use for the packet.
* The ID is written as a byte, meaning it can be any number in the 0-255 (inclusive) range,
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketType.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketType.java
new file mode 100644
index 000000000..5e63e5404
--- /dev/null
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/network/packet/PacketType.java
@@ -0,0 +1,75 @@
+package net.modificationstation.stationapi.api.network.packet;
+
+import lombok.Setter;
+import net.minecraft.network.NetworkHandler;
+import net.minecraft.network.packet.Packet;
+import net.modificationstation.stationapi.api.registry.PacketTypeRegistry;
+import net.modificationstation.stationapi.api.registry.RegistryEntry;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Objects;
+import java.util.Optional;
+
+public final class PacketType> {
+ public final RegistryEntry.Reference> registryEntry;
+ public final boolean clientBound;
+ public final boolean serverBound;
+ public final ManagedPacket.@NotNull Factory factory;
+ @Setter
+ private @Nullable NetworkHandler handler;
+ public final boolean blocking;
+
+ private PacketType(Builder builder) {
+ //noinspection unchecked
+ registryEntry = (RegistryEntry.Reference>) (RegistryEntry.Reference>) PacketTypeRegistry.INSTANCE.createReservedEntry(builder.rawId, this);
+ clientBound = builder.clientBound;
+ serverBound = builder.serverBound;
+ factory = builder.factory;
+ blocking = builder.blocking;
+ }
+
+ public Optional getHandler() {
+ return Optional.ofNullable(handler);
+ }
+
+ public static > Builder builder(
+ boolean clientBound, boolean serverBound,
+ @NotNull ManagedPacket.Factory factory
+ ) {
+ return new Builder<>(clientBound, serverBound, factory);
+ }
+
+ public static final class Builder> {
+ private int rawId = PacketTypeRegistry.AUTO_ID;
+ private final boolean clientBound;
+ private final boolean serverBound;
+ private final ManagedPacket.Factory factory;
+ private boolean blocking;
+
+ private Builder(
+ boolean clientBound, boolean serverBound,
+ @NotNull ManagedPacket.Factory factory
+ ) {
+ this.clientBound = clientBound;
+ this.serverBound = serverBound;
+ this.factory = Objects.requireNonNull(factory, "Attempted to build a PacketType with null packet factory!");
+ }
+
+ @ApiStatus.Internal
+ public Builder rawId(int rawId) {
+ this.rawId = rawId;
+ return this;
+ }
+
+ public Builder blocking() {
+ this.blocking = true;
+ return this;
+ }
+
+ public PacketType build() {
+ return new PacketType<>(this);
+ }
+ }
+}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/IdentifiablePacketRegistry.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/IdentifiablePacketRegistry.java
deleted file mode 100644
index 0f9a3bf51..000000000
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/IdentifiablePacketRegistry.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package net.modificationstation.stationapi.api.registry;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class IdentifiablePacketRegistry {
- private static final IdentifiablePacket.Factory EMPTY = () -> null;
- public static final RegistryKey> KEY = RegistryKey.ofRegistry(NAMESPACE.id("packets"));
- public static final Registry INSTANCE = Registries.create(KEY, registry -> EMPTY);
-}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/PacketTypeRegistry.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/PacketTypeRegistry.java
new file mode 100644
index 000000000..181f0c2d3
--- /dev/null
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/api/registry/PacketTypeRegistry.java
@@ -0,0 +1,18 @@
+package net.modificationstation.stationapi.api.registry;
+
+import com.mojang.serialization.Lifecycle;
+import net.modificationstation.stationapi.api.event.registry.RegistryAttribute;
+import net.modificationstation.stationapi.api.event.registry.RegistryAttributeHolder;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
+
+import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+
+public final class PacketTypeRegistry extends SimpleRegistry> {
+ public static final RegistryKey>> KEY = RegistryKey.ofRegistry(NAMESPACE.id("packet_types"));
+ public static final Registry> INSTANCE = Registries.create(KEY, new PacketTypeRegistry(), registry -> registry.get(NAMESPACE.id("registry/remap_client")), Lifecycle.experimental());
+
+ private PacketTypeRegistry() {
+ super(KEY, Lifecycle.experimental(), true);
+ RegistryAttributeHolder.get(this).addAttribute(RegistryAttribute.SYNCED);
+ }
+}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/packet/PacketHelperClientImpl.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/packet/PacketHelperClientImpl.java
index 3a1cd12e0..789050b06 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/packet/PacketHelperClientImpl.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/packet/PacketHelperClientImpl.java
@@ -4,8 +4,7 @@
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.packet.Packet;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.impl.network.packet.IdentifiablePacketImpl;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
import net.modificationstation.stationapi.impl.network.packet.PacketHelperImpl;
public class PacketHelperClientImpl extends PacketHelperImpl {
@@ -15,12 +14,12 @@ public void send(Packet packet) {
Minecraft minecraft = (Minecraft) FabricLoader.getInstance().getGameInstance();
if (minecraft.world.isRemote)
minecraft.getNetworkHandler().sendPacket(packet);
- else packet.apply(packet instanceof IdentifiablePacket identifiablePacket ? IdentifiablePacketImpl.HANDLERS.get(identifiablePacket.getId()) : null);
+ else packet.apply(packet instanceof ManagedPacket> managedPacket ? managedPacket.getType().getHandler().orElse(null) : null);
}
@Override
public void sendTo(PlayerEntity player, Packet packet) {
if (!player.world.isRemote)
- packet.apply(packet instanceof IdentifiablePacket identifiablePacket ? IdentifiablePacketImpl.HANDLERS.get(identifiablePacket.getId()) : null);
+ packet.apply(packet instanceof ManagedPacket> managedPacket ? managedPacket.getType().getHandler().orElse(null) : null);
}
}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/IdentifiablePacketImpl.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/IdentifiablePacketImpl.java
deleted file mode 100644
index 3a748dd58..000000000
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/IdentifiablePacketImpl.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.modificationstation.stationapi.impl.network.packet;
-
-import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
-import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
-import net.minecraft.network.NetworkHandler;
-import net.modificationstation.stationapi.api.util.Identifier;
-
-import java.util.Map;
-import java.util.Set;
-
-public class IdentifiablePacketImpl {
- public static final Set
- CLIENT_BOUND_PACKETS = new ReferenceOpenHashSet<>(),
- SERVER_BOUND_PACKETS = new ReferenceOpenHashSet<>();
-
- public static final Map HANDLERS = new Reference2ReferenceOpenHashMap<>();
-}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingImpl.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingImpl.java
index b641befd2..f1e087cda 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingImpl.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationNetworkingImpl.java
@@ -1,17 +1,21 @@
package net.modificationstation.stationapi.impl.network.packet;
import net.fabricmc.api.ModInitializer;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
import net.modificationstation.stationapi.api.network.packet.MessagePacket;
+import net.modificationstation.stationapi.api.registry.PacketTypeRegistry;
+import net.modificationstation.stationapi.api.registry.Registry;
import net.modificationstation.stationapi.mixin.network.AbstractPacketAccessor;
+import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+
public class StationNetworkingImpl implements ModInitializer {
@Override
public void onInitialize() {
// Avoid side checks for IdentifiablePacket by numerical ID
- AbstractPacketAccessor.getClientBoundPackets().add(IdentifiablePacket.PACKET_ID);
- AbstractPacketAccessor.getServerBoundPackets().add(IdentifiablePacket.PACKET_ID);
-
- IdentifiablePacket.register(MessagePacket.PACKET_ID, true, true, MessagePacket::new);
+ AbstractPacketAccessor.getClientBoundPackets().add(ManagedPacket.PACKET_ID);
+ AbstractPacketAccessor.getServerBoundPackets().add(ManagedPacket.PACKET_ID);
+
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("message"), MessagePacket.TYPE);
}
}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/packet/PacketHelperServerImpl.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/packet/PacketHelperServerImpl.java
index 1f1511be7..a43b00bd9 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/packet/PacketHelperServerImpl.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/impl/server/network/packet/PacketHelperServerImpl.java
@@ -3,14 +3,13 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.packet.Packet;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.impl.network.packet.IdentifiablePacketImpl;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
import net.modificationstation.stationapi.impl.network.packet.PacketHelperImpl;
public class PacketHelperServerImpl extends PacketHelperImpl {
@Override
public void send(Packet packet) {
- packet.apply(packet instanceof IdentifiablePacket identifiablePacket ? IdentifiablePacketImpl.HANDLERS.get(identifiablePacket.getId()) : null);
+ packet.apply(packet instanceof ManagedPacket> managedPacket ? managedPacket.getType().getHandler().orElse(null) : null);
}
@Override
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/ConnectionMixin.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/ConnectionMixin.java
index ae753d3a1..81dd7aab1 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/ConnectionMixin.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/ConnectionMixin.java
@@ -2,17 +2,27 @@
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
+import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.network.Connection;
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.Packet;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.impl.network.packet.IdentifiablePacketImpl;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import java.util.concurrent.atomic.AtomicBoolean;
@Mixin(Connection.class)
class ConnectionMixin {
+ @Unique
+ private static final Object STATIONAPI$PACKET_READ_LOCK = new Object();
+ @Unique
+ private static final AtomicBoolean STATIONAPI$BLOCKNG_PACKET = new AtomicBoolean();
+
@WrapOperation(
method = "method_1129",
at = @At(
@@ -20,11 +30,36 @@ class ConnectionMixin {
target = "Lnet/minecraft/network/packet/Packet;apply(Lnet/minecraft/network/NetworkHandler;)V"
)
)
- private void stationapi_ifIdentifiable(Packet instance, NetworkHandler packetHandler, Operation original) {
- instance.apply(
- instance instanceof IdentifiablePacket identifiablePacket ?
- IdentifiablePacketImpl.HANDLERS.getOrDefault(identifiablePacket.getId(), packetHandler) :
- packetHandler
- );
+ private void stationapi_ifIdentifiable(Packet instance, NetworkHandler networkHandler, Operation original) {
+ if (instance instanceof ManagedPacket> managedPacket) {
+ instance.apply(managedPacket.getType().getHandler().orElse(networkHandler));
+ if (managedPacket.getType().blocking) {
+ synchronized (STATIONAPI$PACKET_READ_LOCK) {
+ STATIONAPI$BLOCKNG_PACKET.set(false);
+ STATIONAPI$PACKET_READ_LOCK.notifyAll();
+ }
+ }
+ } else original.call(instance, networkHandler);
+ }
+
+ @Inject(
+ method = "method_1139",
+ at = @At(
+ value = "INVOKE",
+ target = "Ljava/util/List;add(Ljava/lang/Object;)Z",
+ shift = At.Shift.AFTER
+ )
+ )
+ private void stationapi_waitOnBlockingPacket(
+ CallbackInfoReturnable cir,
+ @Local(index = 2) Packet packet
+ ) {
+ if (!(packet instanceof ManagedPacket> managedPacket) || !managedPacket.getType().blocking) return;
+ synchronized (STATIONAPI$PACKET_READ_LOCK) {
+ STATIONAPI$BLOCKNG_PACKET.set(true);
+ while (STATIONAPI$BLOCKNG_PACKET.get()) try {
+ STATIONAPI$PACKET_READ_LOCK.wait();
+ } catch (InterruptedException ignored) {}
+ }
}
}
diff --git a/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/PacketMixin.java b/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/PacketMixin.java
index ef9774ac8..bd9840c1a 100644
--- a/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/PacketMixin.java
+++ b/station-networking-v0/src/main/java/net/modificationstation/stationapi/mixin/network/PacketMixin.java
@@ -2,14 +2,12 @@
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.network.packet.Packet;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.event.network.packet.PacketRegisterEvent;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
-import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.registry.PacketTypeRegistry;
import net.modificationstation.stationapi.api.util.Null;
-import net.modificationstation.stationapi.impl.network.packet.IdentifiablePacketImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -21,25 +19,13 @@
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
+import java.util.Objects;
@Mixin(Packet.class)
abstract class PacketMixin {
@Shadow
static void register(int rawId, boolean clientBound, boolean serverBound, Class extends Packet> type) {}
- @Shadow
- public static void writeString(String string, DataOutputStream dataOutputStream) {}
-
- @Shadow
- public static String readString(DataInputStream dataInputStream, int i) {
- return Null.get();
- }
-
- @Shadow
- public static Packet create(int i) {
- return Null.get();
- }
-
@Inject(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/Packet;register(IZZLjava/lang/Class;)V", ordinal = 56, shift = At.Shift.AFTER))
private static void stationapi_afterVanillaPackets(CallbackInfo ci) {
StationAPI.EVENT_BUS.post(PacketRegisterEvent.builder().register(PacketMixin::register).build());
@@ -51,8 +37,8 @@ private static void stationapi_afterVanillaPackets(CallbackInfo ci) {
cancellable = true
)
private void stationapi_ifIdentifiable(CallbackInfoReturnable cir) {
- if (this instanceof IdentifiablePacket)
- cir.setReturnValue(IdentifiablePacket.PACKET_ID);
+ if (this instanceof ManagedPacket)
+ cir.setReturnValue(ManagedPacket.PACKET_ID);
}
@Inject(
@@ -62,9 +48,9 @@ private void stationapi_ifIdentifiable(CallbackInfoReturnable cir) {
target = "Lnet/minecraft/network/packet/Packet;write(Ljava/io/DataOutputStream;)V"
)
)
- private static void stationapi_ifIdentifiable(Packet packet, DataOutputStream out, CallbackInfo ci) {
- if (packet instanceof IdentifiablePacket idPacket)
- writeString(idPacket.getId().toString(), out);
+ private static void stationapi_ifIdentifiable(Packet packet, DataOutputStream out, CallbackInfo ci) throws IOException {
+ if (packet instanceof ManagedPacket> managedPacket)
+ out.writeInt(PacketTypeRegistry.INSTANCE.getRawId(managedPacket.getType()));
}
@WrapOperation(
@@ -74,15 +60,15 @@ private static void stationapi_ifIdentifiable(Packet packet, DataOutputStream ou
target = "Lnet/minecraft/network/packet/Packet;create(I)Lnet/minecraft/network/packet/Packet;"
)
)
- private static Packet stationapi_ifIdentifiable(int id, Operation original, @Local(argsOnly = true) DataInputStream in, @Local(argsOnly = true) boolean server) throws IOException {
- if (id == IdentifiablePacket.PACKET_ID) {
- Identifier identifier = Identifier.of(readString(in, Short.MAX_VALUE));
+ private static Packet stationapi_ifIdentifiable(int rawId, Operation original, DataInputStream stream, boolean bl) throws IOException {
+ if (rawId == ManagedPacket.PACKET_ID) {
+ var packetType = Objects.requireNonNull(PacketTypeRegistry.INSTANCE.get(stream.readInt()), "Received nonexistent managed packet!");
if (
- server && !IdentifiablePacketImpl.SERVER_BOUND_PACKETS.contains(identifier) ||
- !server && !IdentifiablePacketImpl.CLIENT_BOUND_PACKETS.contains(identifier)
- ) throw new IOException("Bad packet id " + identifier);
- return IdentifiablePacket.create(identifier);
+ bl && !packetType.serverBound ||
+ !bl && !packetType.clientBound
+ ) throw new IOException("Bad packet id " + packetType.registryEntry.registryKey().getValue());
+ return packetType.factory.create();
}
- return original.call(id);
+ return original.call(rawId);
}
}
diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientRegistryNetworkingInit.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientRegistryNetworkingInit.java
index bd926b333..c2da9d2bc 100644
--- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientRegistryNetworkingInit.java
+++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/ClientRegistryNetworkingInit.java
@@ -2,13 +2,12 @@
import net.fabricmc.api.ClientModInitializer;
import net.minecraft.network.NetworkHandler;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
import net.modificationstation.stationapi.impl.network.packet.s2c.play.RemapClientRegistryS2CPacket;
public final class ClientRegistryNetworkingInit implements ClientModInitializer {
@Override
public void onInitializeClient() {
NetworkHandler handler = new ClientRegistryNetworkHandler();
- IdentifiablePacket.setHandler(RemapClientRegistryS2CPacket.PACKET_ID, handler);
+ RemapClientRegistryS2CPacket.TYPE.setHandler(handler);
}
}
diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java
index cebaf4df0..074c68c72 100644
--- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java
+++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/RegistryNetworkingInit.java
@@ -1,12 +1,22 @@
package net.modificationstation.stationapi.impl.network;
-import net.fabricmc.api.ModInitializer;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
+import net.mine_diver.unsafeevents.listener.EventListener;
+import net.modificationstation.stationapi.api.StationAPI;
+import net.modificationstation.stationapi.api.event.network.packet.PacketRegisterEvent;
+import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
+import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
+import net.modificationstation.stationapi.api.registry.PacketTypeRegistry;
+import net.modificationstation.stationapi.api.registry.Registry;
import net.modificationstation.stationapi.impl.network.packet.s2c.play.RemapClientRegistryS2CPacket;
-public final class RegistryNetworkingInit implements ModInitializer {
- @Override
- public void onInitialize() {
- IdentifiablePacket.register(RemapClientRegistryS2CPacket.PACKET_ID, true, false, RemapClientRegistryS2CPacket::new);
+import static net.mine_diver.unsafeevents.listener.ListenerPriority.HIGH;
+import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
+
+@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
+@EventListener(phase = StationAPI.INTERNAL_PHASE, priority = HIGH)
+public final class RegistryNetworkingInit {
+ @EventListener
+ private static void onInitialize(PacketRegisterEvent event) {
+ Registry.register(PacketTypeRegistry.INSTANCE, NAMESPACE.id("registry/remap_client"), RemapClientRegistryS2CPacket.TYPE);
}
}
diff --git a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/RemapClientRegistryS2CPacket.java b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/RemapClientRegistryS2CPacket.java
index a1cade8d3..07fbbbbb0 100644
--- a/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/RemapClientRegistryS2CPacket.java
+++ b/station-registry-sync-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/s2c/play/RemapClientRegistryS2CPacket.java
@@ -9,22 +9,26 @@
import net.fabricmc.api.Environment;
import net.minecraft.network.NetworkHandler;
import net.minecraft.network.packet.Packet;
-import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
+import net.modificationstation.stationapi.api.network.packet.ManagedPacket;
+import net.modificationstation.stationapi.api.network.packet.PacketType;
import net.modificationstation.stationapi.api.util.Identifier;
import net.modificationstation.stationapi.impl.network.RegistryPacketHandler;
+import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
-
-public class RemapClientRegistryS2CPacket extends Packet implements IdentifiablePacket {
- public static final Identifier PACKET_ID = NAMESPACE.id("registry/remap_client");
+public class RemapClientRegistryS2CPacket extends Packet implements ManagedPacket {
+ public static final PacketType TYPE = PacketType
+ .builder(true, false, RemapClientRegistryS2CPacket::new)
+ .rawId(0)
+ .blocking()
+ .build();
public Reference2ReferenceMap> map;
- public RemapClientRegistryS2CPacket() {}
+ private RemapClientRegistryS2CPacket() {}
@Environment(EnvType.SERVER)
public RemapClientRegistryS2CPacket(Reference2ReferenceMap> map) {
@@ -94,7 +98,7 @@ public int size() {
}
@Override
- public Identifier getId() {
- return PACKET_ID;
+ public @NotNull PacketType getType() {
+ return TYPE;
}
}
diff --git a/station-registry-sync-v0/src/main/resources/fabric.mod.json b/station-registry-sync-v0/src/main/resources/fabric.mod.json
index 00f825647..f5d04754b 100644
--- a/station-registry-sync-v0/src/main/resources/fabric.mod.json
+++ b/station-registry-sync-v0/src/main/resources/fabric.mod.json
@@ -27,7 +27,7 @@
"net.modificationstation.stationapi.impl.client.registry.ClientServerRegistryRemapper",
"net.modificationstation.stationapi.impl.client.registry.ClientRegistryRestorer"
],
- "main": [
+ "stationapi:event_bus": [
"net.modificationstation.stationapi.impl.network.RegistryNetworkingInit"
],
"client": [
From 11cda4f84851555e304e3691548d8d69f2d77f7f Mon Sep 17 00:00:00 2001
From: mineLdiver
Date: Fri, 29 Nov 2024 23:26:03 +0500
Subject: [PATCH 09/10] Tools API (#133)
* Simpler and more flexible
* More tools API documentation
* Organized `TestContext#failed` into levels of BFS
* Allow tool levels to be equivalent to their immediate siblings
* Moved tools system implementation into mixins for easier override by custom tools. Now infinite loops during graph search are detected and logged with relevant information.
* Replaced item stack effectiveness and strength events with player ones to allow for null item stack checks
* Propagated more context to tool item effectiveness and strength tests
* Added a method for instantiating numeric tool levels
* Documentation for the resultProvider fields of tool events.
---
.../sltest/item/ItemListener.java | 16 +-
.../player/PlayerStrengthWithBlockState.java | 6 +-
.../player/StationFlatteningPlayerEntity.java | 6 +-
.../StationFlatteningPlayerInventory.java | 6 +-
.../IsPlayerUsingEffectiveToolEvent.java | 40 +++++
.../player/PlayerStrengthOnBlockEvent.java | 40 +++++
.../item/IsItemSuitableForStateEvent.java | 16 --
...ItemMiningSpeedMultiplierOnStateEvent.java | 16 --
.../item/ItemStackStrengthWithBlockState.java | 7 +-
.../api/item/ItemStrengthWithBlockState.java | 7 +-
.../api/item/StationFlatteningItem.java | 7 +-
.../api/item/StationFlatteningItemStack.java | 7 +-
.../mixin/flattening/BlockMixin.java | 6 +-
.../mixin/flattening/ItemMixin.java | 7 +-
.../mixin/flattening/ItemStackMixin.java | 26 +--
.../mixin/flattening/PlayerEntityMixin.java | 10 +-
.../flattening/PlayerInventoryMixin.java | 46 ++++--
.../SingleplayerInteractionManagerMixin.java | 7 +-
.../flattening/server/class_70Mixin.java | 7 +-
.../api/item/tool/MiningLevelManager.java | 33 ----
.../api/item/tool/StationHoeItem.java | 2 +-
.../api/item/tool/StationShearsItem.java | 2 +-
.../api/item/tool/StationSwordItem.java | 2 +-
.../stationapi/api/item/tool/StationTool.java | 18 +++
.../api/item/tool/StationToolItem.java | 2 +-
.../api/item/tool/StationToolMaterial.java | 4 +-
.../api/item/tool/TagToolLevel.java | 30 ++++
.../stationapi/api/item/tool/ToolLevel.java | 152 +++++++++++++++++-
.../impl/item/HijackShearsImplV1.java | 6 +-
.../impl/item/ToolEffectivenessImpl.java | 34 ++++
.../impl/item/ToolEffectivenessImplV1.java | 85 ----------
.../stationapi/mixin/tools/HoeItemMixin.java | 24 ++-
.../mixin/tools/ShearsItemMixin.java | 24 ++-
.../mixin/tools/SwordItemMixin.java | 24 ++-
.../stationapi/mixin/tools/ToolItemMixin.java | 24 ++-
.../mixin/tools/ToolMaterialMixin.java | 12 +-
.../src/main/resources/fabric.mod.json | 1 -
.../item/tool/VanillaToolFixImpl.java | 30 ----
.../src/main/resources/fabric.mod.json | 1 -
39 files changed, 523 insertions(+), 270 deletions(-)
create mode 100644 station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/IsPlayerUsingEffectiveToolEvent.java
create mode 100644 station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerStrengthOnBlockEvent.java
delete mode 100644 station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/IsItemSuitableForStateEvent.java
delete mode 100644 station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/ItemMiningSpeedMultiplierOnStateEvent.java
delete mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java
create mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationTool.java
create mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/TagToolLevel.java
create mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImpl.java
delete mode 100644 station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
delete mode 100644 station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
diff --git a/src/test/java/net/modificationstation/sltest/item/ItemListener.java b/src/test/java/net/modificationstation/sltest/item/ItemListener.java
index 89a2a712d..57ef9aaa4 100644
--- a/src/test/java/net/modificationstation/sltest/item/ItemListener.java
+++ b/src/test/java/net/modificationstation/sltest/item/ItemListener.java
@@ -6,7 +6,8 @@
import net.modificationstation.sltest.block.Blocks;
import net.modificationstation.sltest.block.VariationBlock;
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
-import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
+import net.modificationstation.stationapi.api.item.tool.TagToolLevel;
+import net.modificationstation.stationapi.api.item.tool.ToolLevel;
import net.modificationstation.stationapi.api.item.tool.ToolMaterialFactory;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
@@ -20,13 +21,16 @@ public class ItemListener {
@EventListener
public void registerItems(ItemRegistryEvent event) {
- MiningLevelManager.LevelNode moddedNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, NAMESPACE.id("needs_tool_level_modded")));
- MiningLevelManager.GRAPH.putEdge(ToolMaterial.STONE.getMiningLevelNode(), moddedNode);
- MiningLevelManager.GRAPH.putEdge(moddedNode, ToolMaterial.IRON.getMiningLevelNode());
- MiningLevelManager.invalidateCache();
+ ToolLevel moddedNode = new TagToolLevel(TagKey.of(BlockRegistry.KEY, NAMESPACE.id("needs_tool_level_modded")));
+ ToolLevel.GRAPH.putEdge(ToolMaterial.STONE.getToolLevel(), moddedNode);
+ ToolLevel.GRAPH.putEdge(moddedNode, ToolMaterial.IRON.getToolLevel());
+ ToolLevel siblingNode = new TagToolLevel(TagKey.of(BlockRegistry.KEY, NAMESPACE.id("needs_tool_level_sibling"))).equivalentToImmediateSiblings();
+ ToolLevel.GRAPH.putEdge(ToolMaterial.STONE.getToolLevel(), siblingNode);
+ ToolLevel.GRAPH.putEdge(siblingNode, ToolMaterial.IRON.getToolLevel());
+ ToolLevel.GRAPH.removeEdge(ToolMaterial.STONE.getToolLevel(), ToolMaterial.IRON.getToolLevel());
testItem = new ModdedItem(NAMESPACE.id("test_item")).setTranslationKey(NAMESPACE, "testItem"); //8475
- testMaterial = ToolMaterialFactory.create("testMaterial", 3, Integer.MAX_VALUE, Float.MAX_VALUE, Integer.MAX_VALUE - 2).miningLevelNode(moddedNode);
+ testMaterial = ToolMaterialFactory.create("testMaterial", 3, Integer.MAX_VALUE, Float.MAX_VALUE, Integer.MAX_VALUE - 2).toolLevel(siblingNode);
testPickaxe = new ModdedPickaxeItem(NAMESPACE.id("test_pickaxe"), testMaterial).setTranslationKey(NAMESPACE, "testPickaxe"); //8476
testNBTItem = new NBTItem(NAMESPACE.id("nbt_item")).setTranslationKey(NAMESPACE, "nbt_item"); //8477
testModelItem = new ModelItem(NAMESPACE.id("model_item")).setMaxCount(1).setTranslationKey(NAMESPACE, "idkSomething");
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerStrengthWithBlockState.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerStrengthWithBlockState.java
index 5e9c1cd49..b6d0777d3 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerStrengthWithBlockState.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/PlayerStrengthWithBlockState.java
@@ -1,10 +1,12 @@
package net.modificationstation.stationapi.api.entity.player;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
public interface PlayerStrengthWithBlockState {
- boolean canHarvest(BlockState state);
+ boolean canHarvest(BlockView blockView, BlockPos blockPos, BlockState state);
- float getBlockBreakingSpeed(BlockState state);
+ float getBlockBreakingSpeed(BlockView blockView, BlockPos blockPos, BlockState state);
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerEntity.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerEntity.java
index ed2cbdfa4..61ac35fac 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerEntity.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerEntity.java
@@ -1,17 +1,19 @@
package net.modificationstation.stationapi.api.entity.player;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.util.Util;
public interface StationFlatteningPlayerEntity extends PlayerStrengthWithBlockState {
@Override
- default boolean canHarvest(BlockState state) {
+ default boolean canHarvest(BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
@Override
- default float getBlockBreakingSpeed(BlockState state) {
+ default float getBlockBreakingSpeed(BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerInventory.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerInventory.java
index 77c2a0895..5cc111031 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerInventory.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/entity/player/StationFlatteningPlayerInventory.java
@@ -1,17 +1,19 @@
package net.modificationstation.stationapi.api.entity.player;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.util.Util;
public interface StationFlatteningPlayerInventory extends PlayerStrengthWithBlockState {
@Override
- default boolean canHarvest(BlockState state) {
+ default boolean canHarvest(BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
@Override
- default float getBlockBreakingSpeed(BlockState state) {
+ default float getBlockBreakingSpeed(BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/IsPlayerUsingEffectiveToolEvent.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/IsPlayerUsingEffectiveToolEvent.java
new file mode 100644
index 000000000..498b42eaa
--- /dev/null
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/IsPlayerUsingEffectiveToolEvent.java
@@ -0,0 +1,40 @@
+package net.modificationstation.stationapi.api.event.entity.player;
+
+import lombok.experimental.SuperBuilder;
+import net.mine_diver.unsafeevents.Event;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.block.BlockState;
+
+import java.util.function.BooleanSupplier;
+
+@SuperBuilder
+public final class IsPlayerUsingEffectiveToolEvent extends Event {
+ public final PlayerEntity player;
+ public final BlockView blockView;
+ public final BlockPos blockPos;
+ public final BlockState blockState;
+ /**
+ * The function that determines whether the player is using an effective tool.
+ *
+ *
+ * Initially, the field contains a reimplementation of the vanilla
+ * {@link net.minecraft.entity.player.PlayerInventory#method_679(Block)}.
+ *
+ *
+ * The field is non-final to allow full control over the outcome of the event, including completely
+ * canceling the original chain of execution.
+ *
+ *
+ * The results can be chained by preserving the previous resultProvider instance
+ * and using it in your own implementation, for example:
+ *
{@code
+ * var previousProvider = event.resultProvider;
+ * event.resultProvider = () -> doSomethingElse() && previousProvider.getAsBoolean()
+ * }
+ *
+ */
+ public BooleanSupplier resultProvider;
+}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerStrengthOnBlockEvent.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerStrengthOnBlockEvent.java
new file mode 100644
index 000000000..72ee2ca33
--- /dev/null
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/entity/player/PlayerStrengthOnBlockEvent.java
@@ -0,0 +1,40 @@
+package net.modificationstation.stationapi.api.event.entity.player;
+
+import lombok.experimental.SuperBuilder;
+import net.mine_diver.unsafeevents.Event;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.block.BlockState;
+
+@SuperBuilder
+public final class PlayerStrengthOnBlockEvent extends Event {
+ public interface ResultProvider { float getAsFloat(); }
+
+ public final PlayerEntity player;
+ public final BlockView blockView;
+ public final BlockPos blockPos;
+ public final BlockState blockState;
+ /**
+ * The function that determines the player's strength on the block.
+ *
+ *
+ * Initially, the field contains a reimplementation of the vanilla
+ * {@link net.minecraft.entity.player.PlayerInventory#method_674(Block)}.
+ *
+ *
+ * The field is non-final to allow full control over the outcome of the event, including completely
+ * canceling the original chain of execution.
+ *
+ *
+ * The results can be chained by preserving the previous resultProvider instance
+ * and using it in your own implementation, for example:
+ *
{@code
+ * var previousProvider = event.resultProvider;
+ * event.resultProvider = () -> doSomethingElse() && previousProvider.getAsBoolean()
+ * }
+ *
+ */
+ public ResultProvider resultProvider;
+}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/IsItemSuitableForStateEvent.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/IsItemSuitableForStateEvent.java
deleted file mode 100644
index 2dcd42d60..000000000
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/IsItemSuitableForStateEvent.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.modificationstation.stationapi.api.event.item;
-
-import lombok.experimental.SuperBuilder;
-import net.mine_diver.unsafeevents.Event;
-import net.mine_diver.unsafeevents.event.EventPhases;
-import net.minecraft.item.ItemStack;
-import net.modificationstation.stationapi.api.StationAPI;
-import net.modificationstation.stationapi.api.block.BlockState;
-
-@SuperBuilder
-@EventPhases(StationAPI.INTERNAL_PHASE)
-public final class IsItemSuitableForStateEvent extends Event {
- public final ItemStack itemStack;
- public final BlockState state;
- public boolean suitable;
-}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/ItemMiningSpeedMultiplierOnStateEvent.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/ItemMiningSpeedMultiplierOnStateEvent.java
deleted file mode 100644
index af5924f3c..000000000
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/event/item/ItemMiningSpeedMultiplierOnStateEvent.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.modificationstation.stationapi.api.event.item;
-
-import lombok.experimental.SuperBuilder;
-import net.mine_diver.unsafeevents.Event;
-import net.mine_diver.unsafeevents.event.EventPhases;
-import net.minecraft.item.ItemStack;
-import net.modificationstation.stationapi.api.StationAPI;
-import net.modificationstation.stationapi.api.block.BlockState;
-
-@SuperBuilder
-@EventPhases(StationAPI.INTERNAL_PHASE)
-public final class ItemMiningSpeedMultiplierOnStateEvent extends Event {
- public final ItemStack itemStack;
- public final BlockState state;
- public float miningSpeedMultiplier;
-}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStackStrengthWithBlockState.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStackStrengthWithBlockState.java
index 48fe7261d..0c6be3922 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStackStrengthWithBlockState.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStackStrengthWithBlockState.java
@@ -1,10 +1,13 @@
package net.modificationstation.stationapi.api.item;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
public interface ItemStackStrengthWithBlockState {
- boolean isSuitableFor(BlockState state);
+ boolean isSuitableFor(PlayerEntity player, BlockView blockView, BlockPos blockPos, BlockState state);
- float getMiningSpeedMultiplier(BlockState state);
+ float getMiningSpeedMultiplier(PlayerEntity player, BlockView blockView, BlockPos blockPos, BlockState state);
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStrengthWithBlockState.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStrengthWithBlockState.java
index 60681c2d7..d4e6b8305 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStrengthWithBlockState.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/ItemStrengthWithBlockState.java
@@ -1,11 +1,14 @@
package net.modificationstation.stationapi.api.item;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
public interface ItemStrengthWithBlockState {
- boolean isSuitableFor(ItemStack itemStack, BlockState state);
+ boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state);
- float getMiningSpeedMultiplier(ItemStack itemStack, BlockState state);
+ float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state);
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItem.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItem.java
index 0d2e70fab..cba6c1777 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItem.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItem.java
@@ -2,8 +2,11 @@
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.registry.RegistryEntry;
import net.modificationstation.stationapi.api.registry.RemappableRawIdHolder;
@@ -32,12 +35,12 @@ default RegistryEntry.Reference- getRegistryEntry() {
}
@Override
- default boolean isSuitableFor(ItemStack itemStack, BlockState state) {
+ default boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
@Override
- default float getMiningSpeedMultiplier(ItemStack itemStack, BlockState state) {
+ default float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItemStack.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItemStack.java
index 119bb7124..89e26b126 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItemStack.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/api/item/StationFlatteningItemStack.java
@@ -1,6 +1,9 @@
package net.modificationstation.stationapi.api.item;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.registry.RegistryEntry;
import net.modificationstation.stationapi.api.tag.TagKey;
@@ -17,12 +20,12 @@ default boolean isIn(TagKey
- tag) {
}
@Override
- default boolean isSuitableFor(BlockState state) {
+ default boolean isSuitableFor(PlayerEntity player, BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
@Override
- default float getMiningSpeedMultiplier(BlockState state) {
+ default float getMiningSpeedMultiplier(PlayerEntity player, BlockView blockView, BlockPos blockPos, BlockState state) {
return Util.assertImpl();
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java
index 00846d5cb..bb8ebebce 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/BlockMixin.java
@@ -1,6 +1,5 @@
package net.modificationstation.stationapi.mixin.flattening;
-import com.llamalad7.mixinextras.injector.WrapWithCondition;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.Block;
@@ -8,7 +7,6 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
-import net.minecraft.stat.Stat;
import net.minecraft.stat.Stats;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
@@ -247,8 +245,8 @@ public float getHardness(BlockState state, BlockView blockView, BlockPos pos) {
public float calcBlockBreakingDelta(BlockState state, PlayerEntity player, BlockView world, BlockPos pos) {
float hardness = getHardness(state, world, pos);
if (hardness < 0.0f) return 0.0f;
- if (!player.canHarvest(state)) return 1.0f / hardness / 100.0f;
- return player.getBlockBreakingSpeed(state) / hardness / 30.0f;
+ if (!player.canHarvest(world, pos, state)) return 1.0f / hardness / 100.0f;
+ return player.getBlockBreakingSpeed(world, pos, state) / hardness / 30.0f;
}
@Override
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemMixin.java
index 7c4658632..5b936d26f 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemMixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemMixin.java
@@ -1,8 +1,11 @@
package net.modificationstation.stationapi.mixin.flattening;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
@@ -64,13 +67,13 @@ private static void stationapi_afterItemRegister(CallbackInfo ci) {
@Override
@Unique
- public boolean isSuitableFor(ItemStack itemStack, BlockState state) {
+ public boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
return isSuitableFor(state.getBlock());
}
@Override
@Unique
- public float getMiningSpeedMultiplier(ItemStack itemStack, BlockState state) {
+ public float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
return getMiningSpeedMultiplier(itemStack, state.getBlock());
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemStackMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemStackMixin.java
index 486ad9bbf..5aee6d6f9 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemStackMixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/ItemStackMixin.java
@@ -3,13 +3,13 @@
import lombok.val;
import net.mine_diver.unsafeevents.listener.Listener;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
-import net.modificationstation.stationapi.api.StationAPI;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.modificationstation.stationapi.api.block.BlockState;
-import net.modificationstation.stationapi.api.event.item.IsItemSuitableForStateEvent;
-import net.modificationstation.stationapi.api.event.item.ItemMiningSpeedMultiplierOnStateEvent;
import net.modificationstation.stationapi.api.event.registry.RegistryIdRemapEvent;
import net.modificationstation.stationapi.api.item.StationFlatteningItemStack;
import net.modificationstation.stationapi.api.registry.ItemRegistry;
@@ -124,26 +124,14 @@ public RegistryEntry.Reference
- getRegistryEntry() {
@Override
@Unique
- public boolean isSuitableFor(BlockState state) {
- return StationAPI.EVENT_BUS.post(
- IsItemSuitableForStateEvent.builder()
- .itemStack(ItemStack.class.cast(this))
- .state(state)
- .suitable(getItem().isSuitableFor(ItemStack.class.cast(this), state))
- .build()
- ).suitable;
+ public boolean isSuitableFor(PlayerEntity player, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return getItem().isSuitableFor(player, ItemStack.class.cast(this), blockView, blockPos, state);
}
@Override
@Unique
- public float getMiningSpeedMultiplier(BlockState state) {
- return StationAPI.EVENT_BUS.post(
- ItemMiningSpeedMultiplierOnStateEvent.builder()
- .itemStack(ItemStack.class.cast(this))
- .state(state)
- .miningSpeedMultiplier(getItem().getMiningSpeedMultiplier(ItemStack.class.cast(this), state))
- .build()
- ).miningSpeedMultiplier;
+ public float getMiningSpeedMultiplier(PlayerEntity player, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return getItem().getMiningSpeedMultiplier(player, ItemStack.class.cast(this), blockView, blockPos, state);
}
@Override
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerEntityMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerEntityMixin.java
index 101254e19..947f7a53d 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerEntityMixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerEntityMixin.java
@@ -4,6 +4,8 @@
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.entity.player.StationFlatteningPlayerEntity;
@@ -21,14 +23,14 @@ private PlayerEntityMixin(World arg) {
@Override
@Unique
- public boolean canHarvest(BlockState state) {
- return inventory.canHarvest(state);
+ public boolean canHarvest(BlockView blockView, BlockPos blockPos, BlockState state) {
+ return inventory.canHarvest(blockView, blockPos, state);
}
@Override
@Unique
- public float getBlockBreakingSpeed(BlockState state) {
- float f = inventory.getBlockBreakingSpeed(state);
+ public float getBlockBreakingSpeed(BlockView blockView, BlockPos blockPos, BlockState state) {
+ float f = inventory.getBlockBreakingSpeed(blockView, blockPos, state);
if (isInFluid(Material.WATER)) f /= 5.0f;
if (!field_1623) f /= 5.0f;
return f;
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerInventoryMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerInventoryMixin.java
index 313508c36..9ada242c6 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerInventoryMixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/PlayerInventoryMixin.java
@@ -1,9 +1,15 @@
package net.modificationstation.stationapi.mixin.flattening;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.StationAPI;
import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.entity.player.StationFlatteningPlayerInventory;
+import net.modificationstation.stationapi.api.event.entity.player.IsPlayerUsingEffectiveToolEvent;
+import net.modificationstation.stationapi.api.event.entity.player.PlayerStrengthOnBlockEvent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
@@ -16,21 +22,41 @@ abstract class PlayerInventoryMixin implements StationFlatteningPlayerInventory
@Shadow public abstract ItemStack getStack(int i);
+ @Shadow public PlayerEntity player;
+
@Override
@Unique
- public float getBlockBreakingSpeed(BlockState state) {
- float var2 = 1.0F;
- if (main[selectedSlot] != null)
- var2 *= main[this.selectedSlot].getMiningSpeedMultiplier(state);
- return var2;
+ public float getBlockBreakingSpeed(BlockView blockView, BlockPos blockPos, BlockState state) {
+ return StationAPI.EVENT_BUS.post(PlayerStrengthOnBlockEvent.builder()
+ .player(player)
+ .blockView(blockView)
+ .blockPos(blockPos)
+ .blockState(state)
+ .resultProvider(() -> {
+ float var2 = 1.0F;
+ if (main[selectedSlot] != null)
+ var2 *= main[this.selectedSlot].getMiningSpeedMultiplier(player, blockView, blockPos, state);
+ return var2;
+ })
+ .build()
+ ).resultProvider.getAsFloat();
}
@Override
@Unique
- public boolean canHarvest(BlockState state) {
- if (state.isToolRequired()) {
- ItemStack var2 = getStack(this.selectedSlot);
- return var2 != null && var2.isSuitableFor(state);
- } else return true;
+ public boolean canHarvest(BlockView blockView, BlockPos blockPos, BlockState state) {
+ return StationAPI.EVENT_BUS.post(IsPlayerUsingEffectiveToolEvent.builder()
+ .player(player)
+ .blockView(blockView)
+ .blockPos(blockPos)
+ .blockState(state)
+ .resultProvider(() -> {
+ if (state.isToolRequired()) {
+ ItemStack var2 = getStack(this.selectedSlot);
+ return var2 != null && var2.isSuitableFor(player, blockView, blockPos, state);
+ } else return true;
+ })
+ .build()
+ ).resultProvider.getAsBoolean();
}
}
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/SingleplayerInteractionManagerMixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/SingleplayerInteractionManagerMixin.java
index 0eb225518..7dc90347e 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/SingleplayerInteractionManagerMixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/client/SingleplayerInteractionManagerMixin.java
@@ -9,6 +9,7 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.modificationstation.stationapi.api.block.BlockState;
+import net.modificationstation.stationapi.api.util.math.MutableBlockPos;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@@ -20,6 +21,8 @@
class SingleplayerInteractionManagerMixin extends InteractionManager {
@Unique
private BlockState stationapi_method_1716_state;
+ @Unique
+ private final MutableBlockPos stationapi_blockPos = new MutableBlockPos();
private SingleplayerInteractionManagerMixin(Minecraft minecraft) {
super(minecraft);
@@ -58,8 +61,8 @@ private void stationapi_cacheBlockState(int x, int y, int z, int distance, Callb
target = "Lnet/minecraft/entity/player/ClientPlayerEntity;method_514(Lnet/minecraft/block/Block;)Z"
)
)
- private boolean stationapi_canRemoveBlock(ClientPlayerEntity abstractClientPlayer, Block arg) {
- return abstractClientPlayer.canHarvest(stationapi_method_1716_state);
+ private boolean stationapi_canRemoveBlock(ClientPlayerEntity abstractClientPlayer, Block arg, int i, int j, int k, int l) {
+ return abstractClientPlayer.canHarvest(minecraft.world, stationapi_blockPos.set(i, j, k), stationapi_method_1716_state);
}
@Redirect(
diff --git a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/server/class_70Mixin.java b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/server/class_70Mixin.java
index 46096d406..a80a1f289 100644
--- a/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/server/class_70Mixin.java
+++ b/station-flattening-v0/src/main/java/net/modificationstation/stationapi/mixin/flattening/server/class_70Mixin.java
@@ -8,6 +8,7 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.modificationstation.stationapi.api.block.BlockState;
+import net.modificationstation.stationapi.api.util.math.MutableBlockPos;
import net.modificationstation.stationapi.impl.packet.FlattenedBlockChangeS2CPacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -24,6 +25,8 @@ class class_70Mixin {
@Unique
private BlockState stationapi_method_1834_state;
+ @Unique
+ private final MutableBlockPos stationapi_blockPos = new MutableBlockPos();
@Redirect(
method = "method_1828",
@@ -77,8 +80,8 @@ private void stationapi_cacheBlockState(int x, int y, int z, CallbackInfoReturna
target = "Lnet/minecraft/entity/player/PlayerEntity;method_514(Lnet/minecraft/block/Block;)Z"
)
)
- private boolean stationapi_canRemoveBlock(PlayerEntity playerBase, Block arg) {
- return playerBase.canHarvest(stationapi_method_1834_state);
+ private boolean stationapi_canRemoveBlock(PlayerEntity playerBase, Block arg, int i, int j, int k) {
+ return playerBase.canHarvest(field_2310, stationapi_blockPos.set(i, j, k), stationapi_method_1834_state);
}
@Redirect(
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java
deleted file mode 100644
index 205f3b7db..000000000
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/MiningLevelManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.modificationstation.stationapi.api.item.tool;
-
-import com.google.common.graph.GraphBuilder;
-import com.google.common.graph.MutableGraph;
-import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
-import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap;
-import lombok.val;
-import net.minecraft.block.Block;
-import net.modificationstation.stationapi.api.block.BlockState;
-import net.modificationstation.stationapi.api.tag.TagKey;
-
-import java.util.stream.Collectors;
-
-public final class MiningLevelManager {
- public record LevelNode(TagKey
blockTag) {}
- private record CacheKey(LevelNode levelNode, BlockState state) {}
-
- public static final MutableGraph GRAPH = GraphBuilder.directed().build();
- private static final Object2BooleanMap CACHE = new Object2BooleanOpenHashMap<>();
-
- public static boolean isSuitable(LevelNode levelNode, BlockState state) {
- return CACHE.computeIfAbsent(new CacheKey(levelNode, state), (CacheKey key) -> {
- val nodes = GRAPH.nodes().stream().filter(node -> key.state.isIn(node.blockTag)).collect(Collectors.toSet());
- if (nodes.isEmpty()) return true;
- val pred = GRAPH.predecessors(key.levelNode);
- return nodes.stream().anyMatch(node -> key.levelNode.equals(node) || pred.contains(node));
- });
- }
-
- public static void invalidateCache() {
- CACHE.clear();
- }
-}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java
index 9115fe99e..6b869e821 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationHoeItem.java
@@ -6,7 +6,7 @@
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Util;
-public interface StationHoeItem extends ToolLevel {
+public interface StationHoeItem extends StationTool {
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java
index b6904d204..ff628e69e 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationShearsItem.java
@@ -6,7 +6,7 @@
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Util;
-public interface StationShearsItem extends ToolLevel {
+public interface StationShearsItem extends StationTool {
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java
index 0f648e8d9..2cde051bf 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationSwordItem.java
@@ -6,7 +6,7 @@
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Util;
-public interface StationSwordItem extends ToolLevel {
+public interface StationSwordItem extends StationTool {
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationTool.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationTool.java
new file mode 100644
index 000000000..efc82b5a3
--- /dev/null
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationTool.java
@@ -0,0 +1,18 @@
+package net.modificationstation.stationapi.api.item.tool;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ToolMaterial;
+import net.modificationstation.stationapi.api.tag.TagKey;
+
+/**
+ * This interface is injected into all tool items and "pseudo" tool items (such as {@link StationHoeItem},
+ * {@link StationShearsItem} and {@link StationSwordItem}) to provide the StationAPI's extended tools functionality.
+ */
+public interface StationTool {
+ void setEffectiveBlocks(TagKey effectiveBlocks);
+
+ TagKey getEffectiveBlocks(ItemStack stack);
+
+ ToolMaterial getMaterial(ItemStack stack);
+}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java
index f23cdbc75..9cab5054d 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolItem.java
@@ -6,7 +6,7 @@
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Util;
-public interface StationToolItem extends ToolLevel {
+public interface StationToolItem extends StationTool {
@Override
default void setEffectiveBlocks(TagKey effectiveBlocks) {
Util.assertImpl();
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
index a8aa7d932..61a32d7e0 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/StationToolMaterial.java
@@ -4,11 +4,11 @@
import net.modificationstation.stationapi.api.util.Util;
public interface StationToolMaterial {
- default ToolMaterial miningLevelNode(MiningLevelManager.LevelNode levelNode) {
+ default ToolMaterial toolLevel(ToolLevel toolLevel) {
return Util.assertImpl();
}
- default MiningLevelManager.LevelNode getMiningLevelNode() {
+ default ToolLevel getToolLevel() {
return Util.assertImpl();
}
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/TagToolLevel.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/TagToolLevel.java
new file mode 100644
index 000000000..fcf3ad989
--- /dev/null
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/TagToolLevel.java
@@ -0,0 +1,30 @@
+package net.modificationstation.stationapi.api.item.tool;
+
+import net.minecraft.block.Block;
+import net.modificationstation.stationapi.api.tag.TagKey;
+
+/**
+ * This class is a simple implementation of {@link ToolLevel} in a tag-based approach.
+ *
+ *
+ * It tests if the block state in the context is tagged with the {@link TagKey}
+ * that this tool level was instantiated with. For example, needs_iron_tool.
+ *
+ */
+public class TagToolLevel extends ToolLevel {
+ public final TagKey tag;
+
+ public TagToolLevel(TagKey tag) {
+ this.tag = tag;
+ }
+
+ @Override
+ protected boolean isSuitable(TestContext context) {
+ return context.blockState().isIn(tag);
+ }
+
+ @Override
+ public String toString() {
+ return tag.toString();
+ }
+}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java
index d12cf4528..756500df3 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/api/item/tool/ToolLevel.java
@@ -1,14 +1,154 @@
package net.modificationstation.stationapi.api.item.tool;
-import net.minecraft.block.Block;
-import net.minecraft.item.ItemStack;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.graph.GraphBuilder;
+import com.google.common.graph.MutableGraph;
+import it.unimi.dsi.fastutil.objects.Reference2BooleanMap;
+import it.unimi.dsi.fastutil.objects.Reference2BooleanOpenHashMap;
import net.minecraft.item.ToolMaterial;
+import net.modificationstation.stationapi.api.block.BlockState;
+import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
+import net.modificationstation.stationapi.api.util.Util;
-public interface ToolLevel {
- void setEffectiveBlocks(TagKey effectiveBlocks);
+import java.util.*;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
- TagKey getEffectiveBlocks(ItemStack stack);
+import static net.modificationstation.stationapi.api.util.Identifier.of;
- ToolMaterial getMaterial(ItemStack stack);
+public abstract class ToolLevel {
+ /**
+ * @param blockState the block state the tool level is being tested against.
+ * @param failed a collection of successor tool levels (as defined in {@link #GRAPH}) already tested in a run of
+ * {@link #isSuitable(ToolLevel, BlockState)} that ended up being not suitable.
+ * Each index corresponds to a level of the search down to the current point,
+ * 0 being the tool level assigned to the tool item itself, and size-1 being immediate successors
+ * (and siblings of successors) of the current level.
+ * Current level isn't reflected in the collection, as its iteration isn't deterministic.
+ * Can be used for complex context-aware suitability testing - e.g. limiting suitability
+ * to a fixed set of levels in the graph instead of making all succeeding levels also suitable.
+ * Special cases:
+ *
+ *
+ * Optional is empty - this means that the level is being tested in an unordered manner,
+ * thus keeping track of failed levels would yield no useful context. For example, this is done
+ * in {@link #isSuitable(ToolLevel, BlockState)} when the initial level's hierarchy was exhausted,
+ * but no match was found. In this case we need to iterate through {@link #ALL_LEVELS}
+ * in order to determine if the tested block state requires any level at all,
+ * thus if a tool level performs a test involving the absent collection,
+ * it must assume the collection matches the conditions, as to not hide a case where the level
+ * can actually be suitable.
+ *
+ *
+ * Collection is empty - this means that this tool level is the first one to be tested,
+ * thus it's also the one that the tool item was assigned to.
+ * Shouldn't normally require any special handling.
+ *
+ *
+ */
+ protected record TestContext(
+ BlockState blockState,
+ Optional>> failed
+ ) {}
+
+ private static final Set ALL_LEVELS_MUTABLE = Collections.newSetFromMap(new WeakHashMap<>());
+ public static final Set ALL_LEVELS = Collections.unmodifiableSet(ALL_LEVELS_MUTABLE);
+ public static final MutableGraph GRAPH = GraphBuilder.directed().build();
+ private static final List NUMERIC_LEVELS = Util.make(new ArrayList<>(), list -> {
+ var stone = new TagToolLevel(TagKey.of(BlockRegistry.KEY, of("needs_stone_tool")));
+ var iron = new TagToolLevel(TagKey.of(BlockRegistry.KEY, of("needs_iron_tool")));
+ var diamond = new TagToolLevel(TagKey.of(BlockRegistry.KEY, of("needs_diamond_tool")));
+ list.add(null);
+ list.add(stone);
+ list.add(iron);
+ list.add(diamond);
+ GRAPH.putEdge(stone, iron);
+ GRAPH.putEdge(iron, diamond);
+ ToolMaterial.STONE.toolLevel(stone);
+ ToolMaterial.IRON.toolLevel(iron);
+ ToolMaterial.DIAMOND.toolLevel(diamond);
+ });
+
+ public static ToolLevel getNumeric(int level) {
+ if (level >= NUMERIC_LEVELS.size())
+ for (int i = NUMERIC_LEVELS.size(); i < level + 1; i++) {
+ var toolLevel = new TagToolLevel(TagKey.of(BlockRegistry.KEY, of("needs_tool_level_" + i)));
+ NUMERIC_LEVELS.add(toolLevel);
+ GRAPH.putEdge(NUMERIC_LEVELS.get(i - 1), toolLevel);
+ }
+ return NUMERIC_LEVELS.get(level);
+ }
+
+ public static boolean isSuitable(ToolLevel toolLevel, BlockState state) {
+ if (toolLevel == null) {
+ // Tool provides no level - can only mine blocks that don't require a level
+ var context = new TestContext(state, Optional.empty());
+ return ALL_LEVELS.stream().noneMatch(level -> level.isSuitable(context));
+ }
+ return toolLevel.cache.computeIfAbsent(state, key -> {
+ var failed = new ArrayList>();
+ var context = new TestContext(state, Optional.of(Collections.unmodifiableList(failed)));
+ var toolLevels = new HashSet();
+ toolLevels.add(toolLevel);
+
+ // Breadth-first search for a suitable level in the hierarchy
+ while (!toolLevels.isEmpty()) {
+ // Add immediate siblings of levels that allow them
+ toolLevels.addAll(toolLevels.stream()
+ .filter(level -> level.equivalentToImmediateSiblings)
+ .flatMap(level -> Stream.concat(
+ GRAPH.predecessors(level).stream().map(GRAPH::successors).flatMap(Set::stream),
+ GRAPH.successors(level).stream().map(GRAPH::predecessors).flatMap(Set::stream)
+ )).collect(Collectors.toSet())
+ );
+
+ var failedBuilder = ImmutableSet.builder();
+ var nextSet = new HashSet();
+ for (var level : toolLevels) {
+ if (level.isSuitable(context)) return true;
+ failedBuilder.add(level);
+ nextSet.addAll(GRAPH.predecessors(level));
+ }
+ failed.add(failedBuilder.build());
+ toolLevels = nextSet;
+
+ // Check for loops
+ var reoccurred = failed.stream().flatMap(Set::stream).filter(toolLevels::contains).collect(Collectors.toSet());
+ if (!reoccurred.isEmpty()) throw new IllegalStateException(
+ "Infinite loop detected in tool levels graph. Tested level - %s, search depth - %d, reoccurred levels - %s"
+ .formatted(toolLevel, failed.size(), reoccurred)
+ );
+ }
+
+ // Hierarchy exhausted, but no exit,
+ // So we need to test if the block requires any level,
+ // Because if it doesn't, the tool level is suitable.
+ var noFailedContext = new TestContext(context.blockState, Optional.empty());
+ var failedFlat = failed.stream().flatMap(Set::stream).collect(Collectors.toSet());
+ return ALL_LEVELS.stream().filter(Predicate.not(failedFlat::contains)).noneMatch(level -> level.isSuitable(noFailedContext));
+ });
+ }
+
+ protected final Reference2BooleanMap cache = new Reference2BooleanOpenHashMap<>();
+ protected boolean equivalentToImmediateSiblings;
+
+ protected ToolLevel() {
+ ALL_LEVELS_MUTABLE.add(this);
+ }
+
+ public ToolLevel equivalentToImmediateSiblings() {
+ equivalentToImmediateSiblings = true;
+ return this;
+ }
+
+ /**
+ * @param context the record containing available parameters for testing this tool level's suitability.
+ * @return whether this and only this tool level is suitable in the given context.
+ * Unless you know what you're doing, preceding tool levels must NOT be taken into account,
+ * as they will be tested directly, with their own implementation and better context,
+ * if this specific level isn't suitable.
+ */
+ protected abstract boolean isSuitable(TestContext context);
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java
index 873ee30c3..8a59790fc 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/HijackShearsImplV1.java
@@ -2,7 +2,7 @@
import net.mine_diver.unsafeevents.listener.EventListener;
import net.modificationstation.stationapi.api.StationAPI;
-import net.modificationstation.stationapi.api.item.tool.ToolLevel;
+import net.modificationstation.stationapi.api.item.tool.StationTool;
import net.modificationstation.stationapi.api.util.Identifier;
@EventListener(phase = StationAPI.INTERNAL_PHASE)
@@ -10,7 +10,7 @@ public class HijackShearsImplV1 {
//TODO: Make this match anything that has shear tool properties. Not sure how to go around this at the moment.
@EventListener
private static void hijackShearsEvent(ShearsOverrideEvent event) {
- if(!event.overrideShears && event.itemStack.getItem() instanceof ToolLevel)
- event.overrideShears = ((ToolLevel) event.itemStack.getItem()).getEffectiveBlocks(event.itemStack).id().equals(Identifier.of("mineable/shears"));
+ if(!event.overrideShears && event.itemStack.getItem() instanceof StationTool)
+ event.overrideShears = ((StationTool) event.itemStack.getItem()).getEffectiveBlocks(event.itemStack).id().equals(Identifier.of("mineable/shears"));
}
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImpl.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImpl.java
new file mode 100644
index 000000000..34537e966
--- /dev/null
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImpl.java
@@ -0,0 +1,34 @@
+package net.modificationstation.stationapi.impl.item;
+
+import net.minecraft.item.ItemStack;
+import net.modificationstation.stationapi.api.block.BlockState;
+import net.modificationstation.stationapi.api.item.tool.StationTool;
+import net.modificationstation.stationapi.api.item.tool.ToolLevel;
+import net.modificationstation.stationapi.api.registry.BlockRegistry;
+import net.modificationstation.stationapi.api.registry.ItemRegistry;
+import net.modificationstation.stationapi.api.util.Namespace;
+
+import java.util.Objects;
+
+public class ToolEffectivenessImpl {
+ public static boolean shouldApplyCustomLogic(ItemStack item, BlockState state) {
+ // 1. Disable custom tool logic if both the block and the tool are vanilla
+ // This is done to preserve the vanilla mining speeds
+ // 2. Disable custom tool logic if the tool doesn't provide its tool type tag
+ // This is done to allow tools to handle suitability and speed the vanilla way
+ return (Objects.requireNonNull(ItemRegistry.INSTANCE.getId(item.getItem())).namespace != Namespace.MINECRAFT
+ || Objects.requireNonNull(BlockRegistry.INSTANCE.getId(state.getBlock())).namespace != Namespace.MINECRAFT)
+ && (!(item.getItem() instanceof StationTool stationTool)
+ || stationTool.getEffectiveBlocks(item) != null);
+ }
+
+ public static boolean isSuitableFor(ItemStack item, BlockState state) {
+ return item.getItem() instanceof StationTool stationTool
+ && state.isIn(stationTool.getEffectiveBlocks(item))
+ && ToolLevel.isSuitable(stationTool.getMaterial(item).getToolLevel(), state);
+ }
+
+ public static float getMiningSpeedMultiplier(ItemStack item) {
+ return ((StationTool) item.getItem()).getMaterial(item).getMiningSpeedMultiplier();
+ }
+}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
deleted file mode 100644
index 9f4d161d6..000000000
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/impl/item/ToolEffectivenessImplV1.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package net.modificationstation.stationapi.impl.item;
-
-import com.google.common.graph.GraphBuilder;
-import net.mine_diver.unsafeevents.listener.EventListener;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.modificationstation.stationapi.api.StationAPI;
-import net.modificationstation.stationapi.api.block.BlockState;
-import net.modificationstation.stationapi.api.event.item.IsItemSuitableForStateEvent;
-import net.modificationstation.stationapi.api.event.item.ItemMiningSpeedMultiplierOnStateEvent;
-import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
-import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
-import net.modificationstation.stationapi.api.item.tool.ToolLevel;
-import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
-import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
-import net.modificationstation.stationapi.api.registry.BlockRegistry;
-import net.modificationstation.stationapi.api.registry.ItemRegistry;
-import net.modificationstation.stationapi.api.util.Identifier;
-import net.modificationstation.stationapi.api.util.Namespace;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-import static net.mine_diver.unsafeevents.listener.ListenerPriority.LOW;
-
-@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
-@EventListener(phase = StationAPI.INTERNAL_PHASE)
-public class ToolEffectivenessImplV1 {
- public static final List VANILLA_TOOLS = new ArrayList<>();
-
- @EventListener(priority = LOW)
- private static void getItems(ItemRegistryEvent event) {
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.SHEARS));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.WOODEN_AXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.WOODEN_PICKAXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.WOODEN_SHOVEL));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.WOODEN_SWORD));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.STONE_HATCHET));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.STONE_PICKAXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.STONE_SHOVEL));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.STONE_SWORD));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.IRON_AXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.IRON_PICKAXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.IRON_SHOVEL));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.IRON_SWORD));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.DIAMOND_AXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.DIAMOND_PICKAXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.DIAMOND_SHOVEL));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.DIAMOND_SWORD));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.GOLDEN_AXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.GOLDEN_PICKAXE));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.GOLDEN_SHOVEL));
- VANILLA_TOOLS.add(ItemRegistry.INSTANCE.getId(Item.GOLDEN_SWORD));
- }
-
- @EventListener
- private static void isEffective(IsItemSuitableForStateEvent event) {
- // Disable custom tool logic if both the block and the tool are vanilla
- // This is done to preserve the vanilla mining speeds
- if (VANILLA_TOOLS.contains(ItemRegistry.INSTANCE.getId(event.itemStack.getItem()))
- && Objects.requireNonNull(BlockRegistry.INSTANCE.getId(event.state.getBlock())).namespace == Namespace.MINECRAFT) return;
-
- event.suitable = isSuitable(event.itemStack, event.state);
- }
-
- @EventListener
- private static void getStrength(ItemMiningSpeedMultiplierOnStateEvent event) {
- // Disable custom tool logic if both the block and the tool are vanilla
- // This is done to preserve the vanilla mining speeds
- if (VANILLA_TOOLS.contains(ItemRegistry.INSTANCE.getId(event.itemStack.getItem()))
- && Objects.requireNonNull(BlockRegistry.INSTANCE.getId(event.state.getBlock())).namespace == Namespace.MINECRAFT) return;
-
- if (!isSuitable(event.itemStack, event.state)) return;
-
- GraphBuilder.directed().allowsSelfLoops(true).build();
- event.miningSpeedMultiplier = ((ToolLevel) event.itemStack.getItem()).getMaterial(event.itemStack).getMiningSpeedMultiplier();
- }
-
- private static boolean isSuitable(ItemStack item, BlockState state) {
- return item.getItem() instanceof ToolLevel toolLevel
- && state.isIn(toolLevel.getEffectiveBlocks(item))
- && MiningLevelManager.isSuitable(toolLevel.getMaterial(item).getMiningLevelNode(), state);
- }
-}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/HoeItemMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/HoeItemMixin.java
index d29881aae..13582b068 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/HoeItemMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/HoeItemMixin.java
@@ -1,13 +1,19 @@
package net.modificationstation.stationapi.mixin.tools;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.HoeItem;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ToolMaterial;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.item.tool.StationHoeItem;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.impl.item.ToolEffectivenessImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@@ -15,12 +21,16 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(HoeItem.class)
-class HoeItemMixin implements StationHoeItem {
+class HoeItemMixin extends Item implements StationHoeItem {
@Unique
private ToolMaterial stationapi_toolMaterial;
@Unique
private TagKey stationapi_effectiveBlocks;
+ protected HoeItemMixin(int id) {
+ super(id);
+ }
+
@Inject(method = "", at = @At("RETURN"))
private void stationapi_captureToolMaterial(int i, ToolMaterial arg, CallbackInfo ci) {
stationapi_toolMaterial = arg;
@@ -41,4 +51,16 @@ public TagKey getEffectiveBlocks(ItemStack stack) {
public ToolMaterial getMaterial(ItemStack stack) {
return stationapi_toolMaterial;
}
+
+ @Override
+ public boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state)
+ ? ToolEffectivenessImpl.isSuitableFor(itemStack, state) : super.isSuitableFor(player, itemStack, blockView, blockPos, state);
+ }
+
+ @Override
+ public float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state) && ToolEffectivenessImpl.isSuitableFor(itemStack, state)
+ ? ToolEffectivenessImpl.getMiningSpeedMultiplier(itemStack) : super.getMiningSpeedMultiplier(player, itemStack, blockView, blockPos, state);
+ }
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ShearsItemMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ShearsItemMixin.java
index add09f3fa..2804e8d10 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ShearsItemMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ShearsItemMixin.java
@@ -1,13 +1,19 @@
package net.modificationstation.stationapi.mixin.tools;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ShearsItem;
import net.minecraft.item.ToolMaterial;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.item.tool.StationShearsItem;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.impl.item.ToolEffectivenessImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@@ -15,12 +21,16 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ShearsItem.class)
-class ShearsItemMixin implements StationShearsItem {
+class ShearsItemMixin extends Item implements StationShearsItem {
@Unique
private ToolMaterial stationapi_toolMaterial;
@Unique
private TagKey stationapi_effectiveBlocks;
+ protected ShearsItemMixin(int id) {
+ super(id);
+ }
+
@Inject(method = "", at = @At("RETURN"))
private void stationapi_captureToolMaterial(int i, CallbackInfo ci) {
stationapi_toolMaterial = ToolMaterial.IRON;
@@ -41,4 +51,16 @@ public TagKey getEffectiveBlocks(ItemStack stack) {
public ToolMaterial getMaterial(ItemStack stack) {
return stationapi_toolMaterial;
}
+
+ @Override
+ public boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state)
+ ? ToolEffectivenessImpl.isSuitableFor(itemStack, state) : super.isSuitableFor(player, itemStack, blockView, blockPos, state);
+ }
+
+ @Override
+ public float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state) && ToolEffectivenessImpl.isSuitableFor(itemStack, state)
+ ? ToolEffectivenessImpl.getMiningSpeedMultiplier(itemStack) : super.getMiningSpeedMultiplier(player, itemStack, blockView, blockPos, state);
+ }
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/SwordItemMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/SwordItemMixin.java
index a98d59a6f..e6ef693b2 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/SwordItemMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/SwordItemMixin.java
@@ -1,13 +1,19 @@
package net.modificationstation.stationapi.mixin.tools;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.SwordItem;
import net.minecraft.item.ToolMaterial;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.item.tool.StationSwordItem;
import net.modificationstation.stationapi.api.registry.BlockRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.util.Identifier;
+import net.modificationstation.stationapi.impl.item.ToolEffectivenessImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@@ -15,12 +21,16 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(SwordItem.class)
-class SwordItemMixin implements StationSwordItem {
+class SwordItemMixin extends Item implements StationSwordItem {
@Unique
private ToolMaterial stationapi_toolMaterial;
@Unique
private TagKey stationapi_effectiveBlocks;
+ protected SwordItemMixin(int id) {
+ super(id);
+ }
+
@Inject(method = "", at = @At("RETURN"))
private void stationapi_captureToolMaterial(int i, ToolMaterial arg, CallbackInfo ci) {
stationapi_toolMaterial = arg;
@@ -41,4 +51,16 @@ public TagKey getEffectiveBlocks(ItemStack stack) {
public ToolMaterial getMaterial(ItemStack stack) {
return stationapi_toolMaterial;
}
+
+ @Override
+ public boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state)
+ ? ToolEffectivenessImpl.isSuitableFor(itemStack, state) : super.isSuitableFor(player, itemStack, blockView, blockPos, state);
+ }
+
+ @Override
+ public float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state) && ToolEffectivenessImpl.isSuitableFor(itemStack, state)
+ ? ToolEffectivenessImpl.getMiningSpeedMultiplier(itemStack) : super.getMiningSpeedMultiplier(player, itemStack, blockView, blockPos, state);
+ }
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolItemMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolItemMixin.java
index f1c4270a5..3c8cff61a 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolItemMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolItemMixin.java
@@ -1,21 +1,31 @@
package net.modificationstation.stationapi.mixin.tools;
import net.minecraft.block.Block;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ToolItem;
import net.minecraft.item.ToolMaterial;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.modificationstation.stationapi.api.block.BlockState;
import net.modificationstation.stationapi.api.item.tool.StationToolItem;
import net.modificationstation.stationapi.api.tag.TagKey;
+import net.modificationstation.stationapi.impl.item.ToolEffectivenessImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
@Mixin(ToolItem.class)
-class ToolItemMixin implements StationToolItem {
+class ToolItemMixin extends Item implements StationToolItem {
@Shadow protected ToolMaterial toolMaterial;
@Unique
private TagKey stationapi_effectiveBlocks;
+ private ToolItemMixin(int id) {
+ super(id);
+ }
+
@Override
public void setEffectiveBlocks(TagKey effectiveBlocks) {
stationapi_effectiveBlocks = effectiveBlocks;
@@ -30,4 +40,16 @@ public TagKey getEffectiveBlocks(ItemStack stack) {
public ToolMaterial getMaterial(ItemStack stack) {
return toolMaterial;
}
+
+ @Override
+ public boolean isSuitableFor(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state)
+ ? ToolEffectivenessImpl.isSuitableFor(itemStack, state) : super.isSuitableFor(player, itemStack, blockView, blockPos, state);
+ }
+
+ @Override
+ public float getMiningSpeedMultiplier(PlayerEntity player, ItemStack itemStack, BlockView blockView, BlockPos blockPos, BlockState state) {
+ return ToolEffectivenessImpl.shouldApplyCustomLogic(itemStack, state) && ToolEffectivenessImpl.isSuitableFor(itemStack, state)
+ ? ToolEffectivenessImpl.getMiningSpeedMultiplier(itemStack) : super.getMiningSpeedMultiplier(player, itemStack, blockView, blockPos, state);
+ }
}
diff --git a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
index aa4265349..d18906574 100644
--- a/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
+++ b/station-tools-api-v1/src/main/java/net/modificationstation/stationapi/mixin/tools/ToolMaterialMixin.java
@@ -1,26 +1,26 @@
package net.modificationstation.stationapi.mixin.tools;
import net.minecraft.item.ToolMaterial;
-import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
import net.modificationstation.stationapi.api.item.tool.StationToolMaterial;
+import net.modificationstation.stationapi.api.item.tool.ToolLevel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@Mixin(ToolMaterial.class)
class ToolMaterialMixin implements StationToolMaterial {
@Unique
- private MiningLevelManager.LevelNode stationapi_levelNode;
+ private ToolLevel stationapi_toolLevel;
@Override
@Unique
- public ToolMaterial miningLevelNode(MiningLevelManager.LevelNode levelNode) {
- stationapi_levelNode = levelNode;
+ public ToolMaterial toolLevel(ToolLevel toolLevel) {
+ stationapi_toolLevel = toolLevel;
return ToolMaterial.class.cast(this);
}
@Override
@Unique
- public MiningLevelManager.LevelNode getMiningLevelNode() {
- return stationapi_levelNode;
+ public ToolLevel getToolLevel() {
+ return stationapi_toolLevel;
}
}
diff --git a/station-tools-api-v1/src/main/resources/fabric.mod.json b/station-tools-api-v1/src/main/resources/fabric.mod.json
index 74820c91d..486cd263e 100644
--- a/station-tools-api-v1/src/main/resources/fabric.mod.json
+++ b/station-tools-api-v1/src/main/resources/fabric.mod.json
@@ -20,7 +20,6 @@
"environment": "*",
"entrypoints": {
"stationapi:event_bus": [
- "net.modificationstation.stationapi.impl.item.ToolEffectivenessImplV1",
"net.modificationstation.stationapi.impl.item.HijackShearsImplV1"
]
},
diff --git a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java b/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
deleted file mode 100644
index f51cceb4c..000000000
--- a/station-vanilla-fix-v0/src/main/java/net/modificationstation/stationapi/impl/vanillafix/item/tool/VanillaToolFixImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.modificationstation.stationapi.impl.vanillafix.item.tool;
-
-import net.mine_diver.unsafeevents.listener.EventListener;
-import net.minecraft.item.ToolMaterial;
-import net.modificationstation.stationapi.api.StationAPI;
-import net.modificationstation.stationapi.api.event.registry.ItemRegistryEvent;
-import net.modificationstation.stationapi.api.item.tool.MiningLevelManager;
-import net.modificationstation.stationapi.api.mod.entrypoint.Entrypoint;
-import net.modificationstation.stationapi.api.mod.entrypoint.EventBusPolicy;
-import net.modificationstation.stationapi.api.registry.BlockRegistry;
-import net.modificationstation.stationapi.api.tag.TagKey;
-
-import static net.modificationstation.stationapi.api.util.Identifier.of;
-
-@Entrypoint(eventBus = @EventBusPolicy(registerInstance = false))
-@EventListener(phase = StationAPI.INTERNAL_PHASE)
-public final class VanillaToolFixImpl {
- @EventListener
- private static void fixToolMaterials(ItemRegistryEvent event) {
- MiningLevelManager.LevelNode stoneNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, of("needs_stone_tool")));
- MiningLevelManager.LevelNode ironNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, of("needs_iron_tool")));
- MiningLevelManager.LevelNode diamondNode = new MiningLevelManager.LevelNode(TagKey.of(BlockRegistry.KEY, of("needs_diamond_tool")));
- MiningLevelManager.GRAPH.putEdge(stoneNode, ironNode);
- MiningLevelManager.GRAPH.putEdge(ironNode, diamondNode);
- MiningLevelManager.invalidateCache();
- ToolMaterial.STONE.miningLevelNode(stoneNode);
- ToolMaterial.IRON.miningLevelNode(ironNode);
- ToolMaterial.DIAMOND.miningLevelNode(diamondNode);
- }
-}
diff --git a/station-vanilla-fix-v0/src/main/resources/fabric.mod.json b/station-vanilla-fix-v0/src/main/resources/fabric.mod.json
index 3a62cd009..c795cf13d 100644
--- a/station-vanilla-fix-v0/src/main/resources/fabric.mod.json
+++ b/station-vanilla-fix-v0/src/main/resources/fabric.mod.json
@@ -23,7 +23,6 @@
"net.modificationstation.stationapi.impl.vanillafix.block.VanillaBlockFixImpl",
"net.modificationstation.stationapi.impl.vanillafix.item.VanillaItemFixImpl",
"net.modificationstation.stationapi.impl.vanillafix.dimension.VanillaDimensionFixImpl",
- "net.modificationstation.stationapi.impl.vanillafix.item.tool.VanillaToolFixImpl",
"net.modificationstation.stationapi.impl.vanillafix.recipe.VanillaFuelItemFixImpl",
"net.modificationstation.stationapi.impl.vanillafix.datafixer.VanillaDataFixerImpl"
],
From 197f9644de423bfb80b7b5d22155b904b45cc6cc Mon Sep 17 00:00:00 2001
From: mine_diver
Date: Sat, 30 Nov 2024 00:54:58 +0500
Subject: [PATCH 10/10] Change version
---
gradle.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle.properties b/gradle.properties
index 13e224124..971fa8d37 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -22,7 +22,7 @@ fabric.loom.multiProjectOptimisation=true
spasm_version = 0.2.2
# Mod Properties
- mod_version = 2.0-alpha.2.4
+ mod_version = 2.0-alpha.3
maven_group = net.modificationstation
archives_base_name = StationAPI