diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/api/block/BlocksExtension.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/api/block/BlocksExtension.java deleted file mode 100644 index ff20e27f2..000000000 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/api/block/BlocksExtension.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.ornithemc.osl.blocks.api.block; - -import net.minecraft.block.Block; - -public interface BlocksExtension { - - Block AIR = Block.REGISTRY.get("air"); - -} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java index 51569a41a..3707a727b 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java +++ b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java @@ -5,7 +5,9 @@ import net.minecraft.block.Block; import net.ornithemc.osl.blocks.api.BlockEvents; +import net.ornithemc.osl.blocks.impl.block.BlockStateRegistryFixer; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; import net.ornithemc.osl.registries.api.registry.DefaultedRegistry; import net.ornithemc.osl.registries.api.registry.Registry; import net.ornithemc.osl.registries.api.registry.RegistryKeys; @@ -78,6 +80,7 @@ public static T register(int id, NamespacedIdentifier key, T b public static void init() { SyncedRegistries.register(RegistryKeys.BLOCK); + SyncedRegistries.registerFixer(RegistryKeys.BLOCK, NamespacedIdentifiers.from("blockstate"), new BlockStateRegistryFixer()); } public static void unlock() { diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java new file mode 100644 index 000000000..45985d8bb --- /dev/null +++ b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java @@ -0,0 +1,26 @@ +package net.ornithemc.osl.blocks.impl.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blocks.api.BlockRegistry; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.registries.api.registry.sync.IdFixer; + +public class BlockStateRegistryFixer implements IdFixer { + + @Override + public void apply() { + Block.STATE_REGISTRY.clear(); + + for (Block block : BlockRegistry.REGISTRY) { + int blockId = BlockRegistry.getId(block); + + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } +} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlocksExtensionImpl.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlocksExtensionImpl.java deleted file mode 100644 index 8f2f6e1b9..000000000 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlocksExtensionImpl.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.ornithemc.osl.blocks.impl.block; - -import net.ornithemc.osl.blocks.api.block.BlocksExtension; - -public interface BlocksExtensionImpl extends BlocksExtension { -} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java deleted file mode 100644 index 0fd9972c5..000000000 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.block.AirBlock; - -import net.ornithemc.osl.blocks.api.block.BlockExtension; - -@Mixin(AirBlock.class) -public class AirBlockMixin implements BlockExtension { - - @Override - public boolean isAir() { - return true; - } -} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java index 1d773b63c..009d30f81 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java +++ b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java @@ -11,10 +11,7 @@ import net.minecraft.entity.living.mob.monster.EndermanEntity; import net.ornithemc.osl.blocks.api.BlockRegistry; -import net.ornithemc.osl.blocks.api.block.BlockExtension; import net.ornithemc.osl.blocks.impl.BlockRegistryImpl; -import net.ornithemc.osl.blocks.impl.BlocksMixinPlugin; -import net.ornithemc.osl.blocks.impl.block.AirBlock; import net.ornithemc.osl.blocks.impl.block.BlockPostInit; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; @@ -24,7 +21,7 @@ import net.ornithemc.osl.registries.api.registry.sync.BooleanArrayMapper; @Mixin(Block.class) -public class BlockMixin implements BlockExtension { +public class BlockMixin { @Shadow private String key; @@ -37,10 +34,6 @@ public class BlockMixin implements BlockExtension { ) private static void osl$blocks$unlockBlockRegistry(CallbackInfo ci) { BlockRegistryImpl.unlock(); - - if (!BlocksMixinPlugin.AIR_BLOCK_EXISTS) { - Block.REGISTRY.register(0, "air", new AirBlock()); - } } @Inject( @@ -92,9 +85,4 @@ public class BlockMixin implements BlockExtension { public String toString() { return "Block{" + BlockRegistryImpl.getIdentifier((Block) (Object) this) + "}"; } - - @Override - public boolean isAir() { - return false; - } } diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlocksMixin.java b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlocksMixin.java deleted file mode 100644 index 1ac4e781e..000000000 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlocksMixin.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.block.Blocks; - -import net.ornithemc.osl.blocks.api.block.BlocksExtension; - -@Mixin(Blocks.class) -public class BlocksMixin implements BlocksExtension { -} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/fabric.mod.json index 6c202bc7d..9a597289d 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/fabric.mod.json @@ -22,7 +22,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.classtweaker b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.classtweaker index 7ea8571ed..c635e1a8f 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.classtweaker +++ b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.classtweaker @@ -11,8 +11,5 @@ transitive-accessible method net/minecraft/block/Block setKey (Ljava/lang/String transitive-accessible method net/minecraft/block/Block setCreativeModeTab (Lnet/minecraft/item/CreativeModeTab;)Lnet/minecraft/block/Block; transitive-accessible method net/minecraft/block/Block setSpriteName (Ljava/lang/String;)Lnet/minecraft/block/Block; -transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl -transitive-inject-interface net/minecraft/block/Blocks net/ornithemc/osl/blocks/impl/block/BlocksExtensionImpl - accessible field net/minecraft/entity/living/mob/monster/EndermanEntity HOLDABLE_BLOCKS [Z diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.mixins.json b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.mixins.json index f6bd4d28c..6e988f97a 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.mixins.json +++ b/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/resources/osl.blocks.mixins.json @@ -3,11 +3,8 @@ "minVersion": "0.8", "package": "net.ornithemc.osl.blocks.impl.mixin", "compatibilityLevel": "JAVA_8", - "plugin": "net.ornithemc.osl.blocks.impl.BlocksMixinPlugin", "mixins": [ - "common.AirBlockMixin", "common.BlockMixin", - "common.BlocksMixin", "common.EndermanEntityMixin", "common.FireBlockMixin", "common.StatsMixin" diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java index 9f42817d0..3b64a9308 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java +++ b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java @@ -2,6 +2,7 @@ import net.minecraft.block.Block; import net.minecraft.block.state.BlockState; + import net.ornithemc.osl.blocks.api.BlockRegistry; import net.ornithemc.osl.registries.api.registry.sync.IdFixer; import net.ornithemc.osl.registries.impl.access.Clearable; diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java deleted file mode 100644 index 0fd9972c5..000000000 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.block.AirBlock; - -import net.ornithemc.osl.blocks.api.block.BlockExtension; - -@Mixin(AirBlock.class) -public class AirBlockMixin implements BlockExtension { - - @Override - public boolean isAir() { - return true; - } -} diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java index 95961cce2..31d372599 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java +++ b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java @@ -10,13 +10,12 @@ import net.minecraft.block.Block; import net.ornithemc.osl.blocks.api.BlockRegistry; -import net.ornithemc.osl.blocks.api.block.BlockExtension; import net.ornithemc.osl.blocks.impl.BlockRegistryImpl; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.impl.util.Util; @Mixin(Block.class) -public class BlockMixin implements BlockExtension { +public class BlockMixin { @Shadow private String key; @@ -59,9 +58,4 @@ public class BlockMixin implements BlockExtension { } } } - - @Override - public boolean isAir() { - return false; - } } diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/fabric.mod.json index 327d98306..d41c30fbe 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/fabric.mod.json @@ -22,7 +22,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.classtweaker b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.classtweaker index 73c405d73..faa27cbb8 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.classtweaker +++ b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.classtweaker @@ -10,5 +10,3 @@ transitive-accessible method net/minecraft/block/Block setTicksRandomly (Z)Lnet/ transitive-accessible method net/minecraft/block/Block setKey (Ljava/lang/String;)Lnet/minecraft/block/Block; transitive-accessible method net/minecraft/block/Block disableStats ()Lnet/minecraft/block/Block; transitive-accessible method net/minecraft/block/Block setCreativeModeTab (Lnet/minecraft/item/CreativeModeTab;)Lnet/minecraft/block/Block; - -transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl \ No newline at end of file diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.mixins.json b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.mixins.json index 0b4c0fa73..dde85aeb1 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.mixins.json +++ b/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/resources/osl.blocks.mixins.json @@ -4,7 +4,6 @@ "package": "net.ornithemc.osl.blocks.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "common.AirBlockMixin", "common.BlockMixin", "common.StatsMixin" ], diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java index 9f42817d0..3b64a9308 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java +++ b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java @@ -2,6 +2,7 @@ import net.minecraft.block.Block; import net.minecraft.block.state.BlockState; + import net.ornithemc.osl.blocks.api.BlockRegistry; import net.ornithemc.osl.registries.api.registry.sync.IdFixer; import net.ornithemc.osl.registries.impl.access.Clearable; diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java deleted file mode 100644 index 0fd9972c5..000000000 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/AirBlockMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.block.AirBlock; - -import net.ornithemc.osl.blocks.api.block.BlockExtension; - -@Mixin(AirBlock.class) -public class AirBlockMixin implements BlockExtension { - - @Override - public boolean isAir() { - return true; - } -} diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java index 95961cce2..31d372599 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java +++ b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixin.java @@ -10,13 +10,12 @@ import net.minecraft.block.Block; import net.ornithemc.osl.blocks.api.BlockRegistry; -import net.ornithemc.osl.blocks.api.block.BlockExtension; import net.ornithemc.osl.blocks.impl.BlockRegistryImpl; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.impl.util.Util; @Mixin(Block.class) -public class BlockMixin implements BlockExtension { +public class BlockMixin { @Shadow private String key; @@ -59,9 +58,4 @@ public class BlockMixin implements BlockExtension { } } } - - @Override - public boolean isAir() { - return false; - } } diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/fabric.mod.json index ab37de25e..1bd406004 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/fabric.mod.json @@ -22,7 +22,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.classtweaker b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.classtweaker index 324b5d4a4..c3c0b3b3e 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.classtweaker +++ b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.classtweaker @@ -10,5 +10,3 @@ transitive-accessible method net/minecraft/block/Block setTicksRandomly (Z)Lnet/ transitive-accessible method net/minecraft/block/Block setKey (Ljava/lang/String;)Lnet/minecraft/block/Block; transitive-accessible method net/minecraft/block/Block disableStats ()Lnet/minecraft/block/Block; transitive-accessible method net/minecraft/block/Block setCreativeModeTab (Lnet/minecraft/item/CreativeModeTab;)Lnet/minecraft/block/Block; - -transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl \ No newline at end of file diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.mixins.json b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.mixins.json index ff43e2f92..1839f2117 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.mixins.json +++ b/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/resources/osl.blocks.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_8", "plugin": "net.ornithemc.osl.blocks.impl.BlocksMixinPlugin", "mixins": [ - "common.AirBlockMixin", "common.BlockMixin", "common.StatsMixin" ], diff --git a/libraries/blocks/blocks-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json index 121e4b981..6194fc4e2 100644 --- a/libraries/blocks/blocks-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json @@ -21,7 +21,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json index c38a1d4d1..0bc0fdc59 100644 --- a/libraries/blocks/blocks-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json @@ -21,7 +21,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json index 402d32025..1dc21d2fe 100644 --- a/libraries/blocks/blocks-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json @@ -21,7 +21,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java index 8d70e623b..872eab96e 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java @@ -10,14 +10,4 @@ public interface BlockExtension { DefaultedRegistry REGISTRY = BlockRegistryImpl.REGISTRY; int AUTO_ASSIGN_ID = -172; - /** - * @return whether this block is air. - */ - boolean isAir(); - - /** - * @return whether this block is the same as the given block. - */ - boolean is(Block block); - } diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/Blocks.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/Blocks.java deleted file mode 100644 index ee036a38b..000000000 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/api/block/Blocks.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.ornithemc.osl.blocks.api.block; - -import net.minecraft.block.Block; - -import net.ornithemc.osl.blocks.impl.block.AirBlock; - -public final class Blocks { - - public static final Block AIR = new AirBlock(); - -} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java index 2d48ebc18..f48b0ed49 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlockRegistryImpl.java @@ -6,6 +6,7 @@ import net.ornithemc.osl.blocks.api.BlockEvents; import net.ornithemc.osl.blocks.impl.block.BlockIdFixer; +import net.ornithemc.osl.blocks.impl.block.BlockStateRegistryFixer; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; import net.ornithemc.osl.registries.api.registry.DefaultedRegistry; @@ -88,6 +89,7 @@ public static T register(int id, NamespacedIdentifier key, T b public static void init() { SyncedRegistries.register(RegistryKeys.BLOCK); SyncedRegistries.registerFixer(RegistryKeys.BLOCK, NamespacedIdentifiers.from("block/id"), new BlockIdFixer()); + SyncedRegistries.registerFixer(RegistryKeys.BLOCK, NamespacedIdentifiers.from("blockstate"), new BlockStateRegistryFixer()); } public static void unlock() { diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java index 4c3377076..4bf5f7bba 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java @@ -16,7 +16,6 @@ public class BlocksMixinPlugin implements IMixinConfigPlugin { public static final boolean CLIENT_SIDE = FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; - public static final boolean BLOCK_IS_METHOD_PRESENT = MinecraftVersion.resolve().compareTo("13w01a") >= 0; public static final boolean BLOCK_IDS_BEYOND_255_SUPPORTED = MinecraftVersion.resolve().compareTo("12w07a") >= 0; @Override @@ -30,18 +29,6 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if ("net.ornithemc.osl.blocks.impl.mixin.common.BlockMixinNew".equals(mixinClassName)) { - return BLOCK_IS_METHOD_PRESENT; - } - if ("net.ornithemc.osl.blocks.impl.mixin.common.BlockMixinOld".equals(mixinClassName)) { - return !BLOCK_IS_METHOD_PRESENT; - } - if ("net.ornithemc.osl.blocks.impl.mixin.common.RedstoneTorchBlockMixin".equals(mixinClassName)) { - return !BLOCK_IS_METHOD_PRESENT && MinecraftVersion.resolve().compareTo("a1.0.1") >= 0; - } - if ("net.ornithemc.osl.blocks.impl.mixin.common.RepeaterBlockMixin".equals(mixinClassName)) { - return !BLOCK_IS_METHOD_PRESENT && MinecraftVersion.resolve().compareTo("b1.3") >= 0; - } if ("net.ornithemc.osl.blocks.impl.mixin.common.BlockMixin_1_3_1_13w01a".equals(mixinClassName)) { return MinecraftVersion.resolve().compareTo("1.3.1") >= 0 && MinecraftVersion.resolve().compareTo("13w01a") <= 0; } @@ -67,9 +54,6 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { if ("net.ornithemc.osl.blocks.impl.mixin.common.BlockMixin_b1_9_pre5_12w38b".equals(mixinClassName)) { return MinecraftVersion.resolve().compareTo("b1.9-pre5") >= 0 && MinecraftVersion.resolve().compareTo("12w38b") <= 0; } - if ("net.ornithemc.osl.blocks.impl.mixin.common.WorldMixin".equals(mixinClassName)) { - return MinecraftVersion.resolve().compareTo("12w03a") <= 0; - } if ("net.ornithemc.osl.blocks.impl.mixin.common.EndermanEntityMixin".equals(mixinClassName)) { return MinecraftVersion.resolve().compareTo("b1.8") >= 0; } diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/VanillaBlocks.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/VanillaBlocks.java index 51c098c68..024094411 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/VanillaBlocks.java +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/VanillaBlocks.java @@ -5,7 +5,7 @@ import net.minecraft.block.Block; -import net.ornithemc.osl.blocks.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.Blocks; import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; public final class VanillaBlocks { @@ -218,7 +218,7 @@ public final class VanillaBlocks { public static final int MAX_ID = 255; static void init() { - // Air block added by OSL + // Air block added by Block States API register(Blocks.AIR); for (Field f : Block.class.getDeclaredFields()) { @@ -235,13 +235,12 @@ static void init() { } } - @SuppressWarnings("deprecation") private static void register(Block block) { if (block.id >= 0 && block.id < IDENTIFIERS.length) { String identifier = IDENTIFIERS[block.id]; if (identifier != null) { - BlockRegistryImpl.register(block.id, NamespacedIdentifiers.from(identifier), block); + BlockRegistryImpl.register(NamespacedIdentifiers.from(identifier), block); } } } diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java index a34f02590..ced4707a5 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java @@ -1,18 +1,6 @@ package net.ornithemc.osl.blocks.impl.block; -import net.minecraft.block.Block; - import net.ornithemc.osl.blocks.api.block.BlockExtension; public interface BlockExtensionImpl extends BlockExtension { - - @Override - default boolean isAir() { - throw new AbstractMethodError(); - } - - @Override - default boolean is(Block block) { - throw new AbstractMethodError(); - } } diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java new file mode 100644 index 000000000..45985d8bb --- /dev/null +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockStateRegistryFixer.java @@ -0,0 +1,26 @@ +package net.ornithemc.osl.blocks.impl.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blocks.api.BlockRegistry; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.registries.api.registry.sync.IdFixer; + +public class BlockStateRegistryFixer implements IdFixer { + + @Override + public void apply() { + Block.STATE_REGISTRY.clear(); + + for (Block block : BlockRegistry.REGISTRY) { + int blockId = BlockRegistry.getId(block); + + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } +} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixinNew.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixinNew.java deleted file mode 100644 index 51098abb8..000000000 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixinNew.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.block.Block; - -import net.ornithemc.osl.blocks.api.block.BlockExtension; - -@Mixin(Block.class) -public class BlockMixinNew implements BlockExtension { - - @Override - public boolean isAir() { - return false; - } - - @Override - public boolean is(Block block) { - return ((Block) (Object) this).is(block.id); - } -} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixinOld.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixinOld.java deleted file mode 100644 index 15a537b7d..000000000 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/BlockMixinOld.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; - -import net.minecraft.block.Block; - -import net.ornithemc.osl.blocks.api.block.BlockExtension; - -@Mixin(Block.class) -public class BlockMixinOld implements BlockExtension { - - @Override - public boolean isAir() { - return false; - } - - @Override - public boolean is(Block block) { - return (Block) (Object) this == block; - } -} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/WorldMixin.java b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/WorldMixin.java deleted file mode 100644 index fe43e27f2..000000000 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/WorldMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -import net.minecraft.block.Block; -import net.minecraft.world.World; - -import net.ornithemc.osl.blocks.api.block.Blocks; - -@Mixin(World.class) -public class WorldMixin { - - @ModifyVariable( - method = "canPlace", - ordinal = 0, - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" - ) - ) - private Block osl$blocks$makeAirReplaceable(Block block) { - return block == Blocks.AIR ? null : block; - } -} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json index 56e52256a..f3741a3a2 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json @@ -22,7 +22,8 @@ "osl-text-components": "\u003e\u003d0.1.0-", "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", - "osl-registries": "\u003e\u003d0.1.0" + "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-" }, "name": "OSL Blocks", "description": "Blocks API and events.", diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/osl.blocks.mixins.json b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/osl.blocks.mixins.json index 560ab5ee9..95209a4b1 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/osl.blocks.mixins.json +++ b/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/resources/osl.blocks.mixins.json @@ -15,15 +15,10 @@ "common.BlockMixin_b1_6_tb3_1_4_7", "common.BlockMixin_b1_9_pre5_12w38b", "common.BlockMixin", - "common.BlockMixinNew", - "common.BlockMixinOld", "common.EndermanEntityMixin", "common.FireBlockMixin", "common.ItemMixin", - "common.RedstoneTorchBlockMixin", - "common.RepeaterBlockMixin", - "common.StatsMixin", - "common.WorldMixin" + "common.StatsMixin" ], "client": [ "client.BlockMixin_13w02a", diff --git a/libraries/blocks/gradle.properties b/libraries/blocks/gradle.properties index ae3574a36..fbd9a0941 100644 --- a/libraries/blocks/gradle.properties +++ b/libraries/blocks/gradle.properties @@ -4,4 +4,4 @@ library_description = Blocks API and events. library_version = 0.2.0 entrypoint_init = net.ornithemc.osl.blocks.impl.BlockRegistryImpl::init -osl_dependencies = core:0.10.0,entrypoints:0.5.0,registries:0.1.0 +osl_dependencies = core:0.10.0,entrypoints:0.5.0,blockstates:0.1.0-,registries:0.1.0 diff --git a/libraries/blockstates/README.md b/libraries/blockstates/README.md new file mode 100644 index 000000000..166d7d02f --- /dev/null +++ b/libraries/blockstates/README.md @@ -0,0 +1,65 @@ +# Block States API + +The Block States API implements a block state system in Minecraft versions 1.7.10 and below. + +## Usage + +To make use of block states, extend `StatefulBlock` and implement the three methods to define the block states and metadata conversion. The `StatefulBlock` class deprecates many methods in `Block` that take in `int` parameters for block metadata, block positions, or directions, in favor of equivalent methods that use `BlockState`, `BlockPos`, and `Direction` parameters. Calls to the original methods are forwarded to the new methods so all block logic can be defined in those with no further compatibility code needed. + +```java +package com.example; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.world.World; + +import net.ornithemc.osl.blockstates.api.block.StatefulBlock; +import net.ornithemc.osl.blockstates.api.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.BooleanProperty; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public class CookieBlock extends StatefulBlock { + + public static final IntegerProperty BITES_TAKEN = IntegerProperty.of("bites_taken", 0, 7); + public static final BooleanProperty BAKED = BooleanProperty.of("baked"); + + public CookieBlock() { + super(Material.COOKIE); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + builder.add(BITES_TAKEN, BAKED); + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + int bitesTaken = metadata & 0x7 + boolean baked = (metadata & 0x8) != 0; + + return this.defaultState() + .set(BITES_TAKEN, bitesTaken) + .set(BAKED, baked); + } + + @Override + public int getMetadataFromState(BlockState state) { + int bitesTaken = state.get(BITES_TAKEN); + int baked = state.get(BAKED) ? 0x8 : 0; + + return baked | bitesTaken; + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + ... + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + ... + } +} +``` diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/build.gradle b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/gradle.properties b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/gradle.properties new file mode 100644 index 000000000..bfd163cc4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/gradle.properties @@ -0,0 +1,7 @@ +min_mc_version = 1.2 +max_mc_version = 1.2.5 + +minecraft_version = 1.2.5 +client_raven_build = 1 +client_nests_build = 10 +server_nests_build = 4 diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..6c8af8917 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,94 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel); + + void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..10225214c --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,308 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { + return this.getAmbientOcclusionLight(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return super.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canWalkThrough(WorldView world, int x, int y, int z) { + return this.canWalkThrough(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return super.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..eece91381 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..c66a8e011 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,83 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean isSolid(); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningTime(); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java new file mode 100644 index 000000000..15e1a9681 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; + +public interface WorldChunkSectionExtension { + + BlockState getBlockState(int x, int y, int z); + + void setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..103216792 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 255; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java similarity index 53% rename from libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/AirBlock.java rename to libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java index d597e30c5..5e4885a18 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/AirBlock.java +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -1,14 +1,30 @@ -package net.ornithemc.osl.blocks.impl.block; +package net.ornithemc.osl.blockstates.impl.block; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.util.math.Box; import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; public class AirBlock extends Block { - public AirBlock() { - super(Material.AIR); + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; } @Override @@ -35,8 +51,4 @@ public boolean isSolidRender() { public boolean canRayTrace(int metadata, boolean allowLiquids) { return false; } - - @Override - public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { - } } diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..ff92334f6 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,187 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..18d8dab6c --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,249 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return this.owner.ticksRandomly(); + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public boolean usesNeighborLight() { + return Block.USES_NEIGHBOR_LIGHT[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.owner.getAmbientOcclusionLight(world, pos); + } + + @Override + public boolean isSolid() { + return Block.isSolid(this.owner.id); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningTime() { + return this.owner.getMiningTime(); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.owner.canWalkThrough(world, pos); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.owner.dropItems(world, pos, this, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.owner.dropItems(world, pos, this, luck, fortuneLevel); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java new file mode 100644 index 000000000..1bd3ad7e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldRegion; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "isAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..d2655da9f --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,315 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { return 0.0F; } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canWalkThrough(WorldView world, int x, int y, int z) { return false; } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata, int fortuneLevel) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java similarity index 89% rename from libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/RedstoneTorchBlockMixin.java rename to libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java index 2339ee235..c6be030a9 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/RedstoneTorchBlockMixin.java +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; +package net.ornithemc.osl.blockstates.impl.mixin.common; import org.spongepowered.asm.mixin.Mixin; diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java similarity index 88% rename from libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/RepeaterBlockMixin.java rename to libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java index 8ffde7e87..15af6eb8c 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/mixin/common/RepeaterBlockMixin.java +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.blocks.impl.mixin.common; +package net.ornithemc.osl.blockstates.impl.mixin.common; import org.spongepowered.asm.mixin.Mixin; diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java new file mode 100644 index 000000000..0502a4e20 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunkSection; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +@Mixin(WorldChunkSection.class) +public class WorldChunkSectionMixin implements WorldChunkSectionExtension { + + @Shadow + private int getBlock(int x, int y, int z) { return 0; } + @Shadow + private int getBlockMetadata(int x, int y, int z) { return 0; } + @Shadow + private void setBlock(int x, int y, int z, int block) { } + @Shadow + private void setBlockMetadata(int x, int y, int z, int metadata) { } + + @Override + public BlockState getBlockState(int x, int y, int z) { + Block block = Block.BY_ID[this.getBlock(x, y, z)]; + int metadata = this.getBlockMetadata(x, y, z); + + return block.getStateFromMetadata(metadata); + } + + @Override + public void setBlockState(int x, int y, int z, BlockState state) { + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + this.setBlock(x, y, z, block.id); + this.setBlockMetadata(x, y, z, metadata); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..808dd92bd --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,87 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void checkLight(int x, int y, int z) { } + @Shadow + private void notifyBlockChanged(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + Profiler.push("checkLight"); + this.checkLight(x, y, z); + Profiler.pop(); + } + + if ((this.isMultiplayer || chunk.full) && (!state.is(replacedBlock) || state.updateClients())) { + this.notifyBlockChanged(x, y, z); + } + + if (!this.isMultiplayer && notify) { + this.onBlockChanged(x, y, z, replacedBlock.id); + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java new file mode 100644 index 000000000..2cec459e6 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +@Mixin(World.class) +public class WorldMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java new file mode 100644 index 000000000..c78a50022 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +public interface WorldChunkSectionExtensionImpl extends WorldChunkSectionExtension { + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default void setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..c539f7ed1 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc1.2-mc1.2.5", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.2 \u003c\u003d1.2.5", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..e2e25fe57 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,7 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunkSection net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..e91fe95e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.2-mc1.2.5/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,28 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkSectionMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + "client.WorldRegionMixin" + ], + "server": [ + "server.WorldMixin", + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/build.gradle b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/gradle.properties b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/gradle.properties new file mode 100644 index 000000000..990ef0256 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/gradle.properties @@ -0,0 +1,4 @@ +min_mc_version = 1.9.3-pre2 +max_mc_version = 1.10.2 + +minecraft_version = 1.10.2 diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java similarity index 68% rename from libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java rename to libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java index d3cc82edc..2a59d8bfb 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.blocks.api.block; +package net.ornithemc.osl.blockstates.api.block; public interface BlockExtension { diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..e7ee96841 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,38 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; + +public interface BlockBehaviors { + + boolean doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void randomTick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, ItemStack item, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..842492643 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +public interface BlockProperties { + + boolean isAir(); + + boolean ticksRandomly(); + + Box getShape(WorldView world, BlockPos pos); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBeReplaced(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java new file mode 100644 index 000000000..fee719a6b --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +public interface BlockStateExtension extends BlockProperties, BlockBehaviors { + + boolean is(Block block); + +} diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java similarity index 55% rename from libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java rename to libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java index 5f35a77d9..419f5094f 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -1,6 +1,6 @@ -package net.ornithemc.osl.blocks.impl.block; +package net.ornithemc.osl.blockstates.impl.block; -import net.ornithemc.osl.blocks.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.BlockExtension; public interface BlockExtensionImpl extends BlockExtension { diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java new file mode 100644 index 000000000..eb3d4aec4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java @@ -0,0 +1,109 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +public interface BlockStateExtensionImpl extends BlockStateExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default boolean ticksRandomly() { + throw new AbstractMethodError(); + } + + @Override + default Box getShape(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBeReplaced(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean doEvent(World world, BlockPos pos, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, ItemStack item, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java new file mode 100644 index 000000000..1a31d2599 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java @@ -0,0 +1,19 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.AirBlock; +import net.minecraft.block.Block; + +@Mixin(AirBlock.class) +public class AirBlockMixin extends Block { + + private AirBlockMixin() { + super(null); + } + + @Override + public boolean isAir() { + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..f9ef7361a --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Override + public boolean isAir() { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java new file mode 100644 index 000000000..203566d6c --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java @@ -0,0 +1,117 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.state.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +@Mixin(BlockState.class) +public interface BlockStateMixin extends BlockStateExtension { + + @Shadow + Block getBlock(); + + @Override + default boolean is(Block block) { + return this.getBlock().is(block); + } + + @Override + default boolean isAir() { + return this.getBlock().isAir(); + } + + @Override + default boolean ticksRandomly() { + return this.getBlock().ticksRandomly(); + } + + @Override + default Box getShape(WorldView world, BlockPos pos) { + return this.getBlock().getShape((BlockState) this, world, pos); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.getBlock().canWalkThrough(world, pos); + } + + @Override + default boolean canBeReplaced(WorldView world, BlockPos pos) { + return this.getBlock().canBeReplaced(world, pos); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + return this.getBlock().canBePlaced(world, pos); + } + + @Override + default boolean doEvent(World world, BlockPos pos, int type, int data) { + return this.getBlock().doEvent((BlockState) this, world, pos, type, data); + } + + @Override + default void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.getBlock().neighborChanged((BlockState) this, world, pos, neighborBlock); + } + + @Override + default void onAdded(World world, BlockPos pos) { + this.getBlock().onAdded(world, pos, (BlockState) this); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + this.getBlock().onRemoved(world, pos, (BlockState) this); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + this.getBlock().tick(world, pos, (BlockState) this, random); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + this.getBlock().randomTick(world, pos, (BlockState) this, random); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.getBlock().onEntityCollision(world, pos, (BlockState) this, entity); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, fortuneLevel); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, luck, fortuneLevel); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, ItemStack item, Direction face, float faceX, float faceY, float faceZ) { + return this.getBlock().use(world, pos, (BlockState) this, player, hand, item, face, faceX, faceY, faceZ); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + this.getBlock().startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..118064782 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc1.9.3-pre2-mc1.10.2", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.9.3-rc.2 \u003c\u003d1.10.2", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..be07a3ac5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/block/state/BlockState net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl diff --git a/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..6615ecbec --- /dev/null +++ b/libraries/blockstates/blockstates-mc1.9.3-pre2-mc1.10.2/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.AirBlockMixin", + "common.BlockMixin", + "common.BlockStateMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/build.gradle b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/gradle.properties b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/gradle.properties new file mode 100644 index 000000000..34a3935c1 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/gradle.properties @@ -0,0 +1,5 @@ +min_mc_version = 12w25a +max_mc_version = 12w38b + +minecraft_version = 1.3.2 +nests_build = 8 diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..6e95a94de --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,98 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel); + + void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..ac714f33b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,329 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { + return this.getAmbientOcclusionLight(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return super.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public float getMiningTime(World world, int x, int y, int z) { + return this.getMiningTime(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return super.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { + return this.getMiningSpeed(player, world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return super.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions, entity); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canWalkThrough(WorldView world, int x, int y, int z) { + return this.canWalkThrough(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return super.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z, int block, int metadata) { + this.onRemoved(world, BlockPos.pooled(x, y, z), Block.BY_ID[block].getStateFromMetadata(metadata)); + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock().id, state.getBlock().getMetadataFromState(state)); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player, Direction.byData3d(face), faceX, faceY, faceZ); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return super.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..9b63a2539 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,35 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..ad4fe7182 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,84 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean isSolid(); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java new file mode 100644 index 000000000..15e1a9681 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; + +public interface WorldChunkSectionExtension { + + BlockState getBlockState(int x, int y, int z); + + void setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..103216792 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 255; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java similarity index 52% rename from libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/AirBlock.java rename to libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java index 1aed2f628..5e4885a18 100644 --- a/libraries/blocks/blocks-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/blocks/impl/block/AirBlock.java +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -1,14 +1,30 @@ -package net.ornithemc.osl.blocks.impl.block; +package net.ornithemc.osl.blockstates.impl.block; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.util.math.Box; import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; public class AirBlock extends Block { - public AirBlock() { - super(0, Material.AIR); + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; } @Override diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..bd95a0051 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,197 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningTime(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..cefc6969e --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,249 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return this.owner.ticksRandomly(); + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public boolean usesNeighborLight() { + return Block.USES_NEIGHBOR_LIGHT[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.owner.getAmbientOcclusionLight(world, pos); + } + + @Override + public boolean isSolid() { + return Block.isSolid(this.owner.id); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.owner.getMiningTime(world, pos); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.owner.getMiningSpeed(player, world, pos); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity) { + this.owner.addCollisions(world, pos, this, shape, collisions, entity); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.owner.canWalkThrough(world, pos); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.owner.dropItems(world, pos, this, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.owner.dropItems(world, pos, this, luck, fortuneLevel); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.owner.use(world, pos, this, player, face, faceX, faceY, faceZ); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java new file mode 100644 index 000000000..1bd3ad7e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldRegion; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "isAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..801bbae6e --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,330 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { return 0.0F; } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public float getMiningTime(World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canWalkThrough(WorldView world, int x, int y, int z) { return false; } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z, int block, int metadata) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock().id, state.getBlock().getMetadataFromState(state)); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata, int fortuneLevel) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java new file mode 100644 index 000000000..0502a4e20 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunkSection; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +@Mixin(WorldChunkSection.class) +public class WorldChunkSectionMixin implements WorldChunkSectionExtension { + + @Shadow + private int getBlock(int x, int y, int z) { return 0; } + @Shadow + private int getBlockMetadata(int x, int y, int z) { return 0; } + @Shadow + private void setBlock(int x, int y, int z, int block) { } + @Shadow + private void setBlockMetadata(int x, int y, int z, int metadata) { } + + @Override + public BlockState getBlockState(int x, int y, int z) { + Block block = Block.BY_ID[this.getBlock(x, y, z)]; + int metadata = this.getBlockMetadata(x, y, z); + + return block.getStateFromMetadata(metadata); + } + + @Override + public void setBlockState(int x, int y, int z, BlockState state) { + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + this.setBlock(x, y, z, block.id); + this.setBlockMetadata(x, y, z, metadata); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..0e93eb60b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,113 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + @Shadow + private Profiler profiler; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void checkLight(int x, int y, int z) { } + @Shadow + private void notifyBlockChanged(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + this.profiler.push("checkLight"); + this.checkLight(x, y, z); + this.profiler.pop(); + } + + if ((this.isMultiplayer || chunk.full) && (!state.is(replacedBlock) || state.updateClients())) { + this.notifyBlockChanged(x, y, z); + } + + if (!this.isMultiplayer && notify) { + this.onBlockChanged(x, y, z, replacedBlock.id); + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java new file mode 100644 index 000000000..c78a50022 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +public interface WorldChunkSectionExtensionImpl extends WorldChunkSectionExtension { + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default void setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..c6a3df2ba --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc12w25a-mc12w38b", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.3-alpha.12.25.a \u003c\u003d1.4-alpha.12.38.b", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..e2e25fe57 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,7 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunkSection net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..e00f23e1e --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w25a-mc12w38b/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,27 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkSectionMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + "client.WorldRegionMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/build.gradle b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/gradle.properties b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/gradle.properties new file mode 100644 index 000000000..dbb7c1dff --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/gradle.properties @@ -0,0 +1,5 @@ +min_mc_version = 12w42a +max_mc_version = 1.4.7 + +minecraft_version = 1.4.7 +nests_build = 8 diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..b2b7c5f7e --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,98 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + boolean hasDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel); + + void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..5431008cf --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,329 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { + return this.getAmbientOcclusionLight(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return super.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public float getMiningTime(World world, int x, int y, int z) { + return this.getMiningTime(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return super.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { + return this.getMiningSpeed(player, world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return super.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions, entity); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canWalkThrough(WorldView world, int x, int y, int z) { + return this.canWalkThrough(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return super.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z, int block, int metadata) { + this.onRemoved(world, BlockPos.pooled(x, y, z), Block.BY_ID[block].getStateFromMetadata(metadata)); + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock().id, state.getBlock().getMetadataFromState(state)); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player, Direction.byData3d(face), faceX, faceY, faceZ); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return super.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..9b63a2539 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,35 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..23e974efa --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,84 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean isSolid(); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + boolean hasDirectSignal(WorldView world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java new file mode 100644 index 000000000..15e1a9681 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; + +public interface WorldChunkSectionExtension { + + BlockState getBlockState(int x, int y, int z); + + void setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..103216792 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 255; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..5e4885a18 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..211dad042 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,197 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningTime(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..1dba8778d --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,249 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return this.owner.ticksRandomly(); + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public boolean usesNeighborLight() { + return Block.USES_NEIGHBOR_LIGHT[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.owner.getAmbientOcclusionLight(world, pos); + } + + @Override + public boolean isSolid() { + return Block.isSolid(this.owner.id); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.owner.getMiningTime(world, pos); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.owner.getMiningSpeed(player, world, pos); + } + + @Override + public boolean hasDirectSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity) { + this.owner.addCollisions(world, pos, this, shape, collisions, entity); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.owner.canWalkThrough(world, pos); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.owner.dropItems(world, pos, this, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.owner.dropItems(world, pos, this, luck, fortuneLevel); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.owner.use(world, pos, this, player, face, faceX, faceY, faceZ); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java new file mode 100644 index 000000000..1bd3ad7e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldRegion; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "isAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..5b38301a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,330 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { return 0.0F; } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public float getMiningTime(World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasDirectSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canWalkThrough(WorldView world, int x, int y, int z) { return false; } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z, int block, int metadata) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock().id, state.getBlock().getMetadataFromState(state)); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata, int fortuneLevel) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java new file mode 100644 index 000000000..0502a4e20 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunkSection; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +@Mixin(WorldChunkSection.class) +public class WorldChunkSectionMixin implements WorldChunkSectionExtension { + + @Shadow + private int getBlock(int x, int y, int z) { return 0; } + @Shadow + private int getBlockMetadata(int x, int y, int z) { return 0; } + @Shadow + private void setBlock(int x, int y, int z, int block) { } + @Shadow + private void setBlockMetadata(int x, int y, int z, int metadata) { } + + @Override + public BlockState getBlockState(int x, int y, int z) { + Block block = Block.BY_ID[this.getBlock(x, y, z)]; + int metadata = this.getBlockMetadata(x, y, z); + + return block.getStateFromMetadata(metadata); + } + + @Override + public void setBlockState(int x, int y, int z, BlockState state) { + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + this.setBlock(x, y, z, block.id); + this.setBlockMetadata(x, y, z, metadata); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..3d212141b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,127 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.util.crash.CrashException; +import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.crash.CrashReportCategory; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + @Shadow + private Profiler profiler; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void checkLight(int x, int y, int z) { } + @Shadow + private void notifyBlockChanged(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = null; + + try { + chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } catch (Throwable t) { + CrashReport report = CrashReport.of(t, "Exception getting block state in world"); + CrashReportCategory category = report.addCategory("Requested block coordinates"); + category.add("Found chunk", chunk == null); + category.add("Location", CrashReportCategory.formatPosition(x, y, z)); + + throw new CrashException(report); + } + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + this.profiler.push("checkLight"); + this.checkLight(x, y, z); + this.profiler.pop(); + } + + if ((this.isMultiplayer || chunk.full) && (!state.is(replacedBlock) || state.updateClients())) { + this.notifyBlockChanged(x, y, z); + } + + if (!this.isMultiplayer && notify) { + this.onBlockChanged(x, y, z, replacedBlock.id); + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java new file mode 100644 index 000000000..c78a50022 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +public interface WorldChunkSectionExtensionImpl extends WorldChunkSectionExtension { + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default void setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..49b053d4e --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc12w42a-mc1.4.7", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.4-alpha.12.42.a \u003c\u003d1.4.7", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..e2e25fe57 --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,7 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunkSection net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..e00f23e1e --- /dev/null +++ b/libraries/blockstates/blockstates-mc12w42a-mc1.4.7/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,27 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkSectionMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + "client.WorldRegionMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/build.gradle b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/gradle.properties b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/gradle.properties new file mode 100644 index 000000000..17e588136 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/gradle.properties @@ -0,0 +1,7 @@ +min_mc_version = 13w06a +max_mc_version = 1.6.4 + +minecraft_version = 1.6.4 +raven_build = 1 +sparrow_build = 1 +nests_build = 3 diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..01be59d1e --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,101 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + Sprite getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + int getAnalogSignal(World world, BlockPos pos, BlockState state); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + + boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel); + + void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..e5c1342a5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,352 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public boolean is(int block) { + return this.is(Block.BY_ID[block]); + } + + @Override + public boolean is(Block block) { + return super.is(block.id); + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public Sprite getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public Sprite getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { + return this.getAmbientOcclusionLight(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return super.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSignal(WorldView world, int x, int y, int z, int dir) { + return this.getSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.getSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public int getAnalogSignal(World world, int x, int y, int z, int metadata) { + return this.getAnalogSignal(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata)); + } + + @Override + public int getAnalogSignal(World world, BlockPos pos, BlockState state) { + return super.getAnalogSignal(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public float getMiningTime(World world, int x, int y, int z) { + return this.getMiningTime(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return super.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { + return this.getMiningSpeed(player, world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return super.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getDirectSignal(WorldView world, int x, int y, int z, int dir) { + return this.getDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.getDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions, entity); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canWalkThrough(WorldView world, int x, int y, int z) { + return this.canWalkThrough(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return super.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean doEvent(World world, int x, int y, int z, int type, int data) { + return this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + return super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z, int block, int metadata) { + this.onRemoved(world, BlockPos.pooled(x, y, z), Block.BY_ID[block].getStateFromMetadata(metadata)); + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock().id, state.getBlock().getMetadataFromState(state)); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player, Direction.byData3d(face), faceX, faceY, faceZ); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return super.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..a2ced9153 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,35 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockBehaviors { + + boolean doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..6696e7aff --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,87 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + Sprite getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean isSolid(); + + boolean isSignalSource(); + + int getSignal(WorldView world, BlockPos pos, Direction dir); + + boolean isAnalogSignalSource(); + + int getAnalogSignal(World world, BlockPos pos); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + int getDirectSignal(WorldView world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java new file mode 100644 index 000000000..15e1a9681 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; + +public interface WorldChunkSectionExtension { + + BlockState getBlockState(int x, int y, int z); + + void setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..dde25f0dc --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, int flags); + + boolean setBlockState(int x, int y, int z, BlockState state, int flags); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..103216792 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 255; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..5e4885a18 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..3a30aa41a --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,203 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Sprite getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default int getAnalogSignal(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningTime(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..af622d7cf --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,255 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return this.owner.ticksRandomly(); + } + + @Override + public boolean usesNeighborLight() { + return Block.USES_NEIGHBOR_LIGHT[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public Sprite getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.owner.getAmbientOcclusionLight(world, pos); + } + + @Override + public boolean isSolid() { + return Block.isSolid(this.owner.id); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public int getSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.getSignal(world, pos, this, dir); + } + + @Override + public boolean isAnalogSignalSource() { + return this.owner.isAnalogSignalSource(); + } + + @Override + public int getAnalogSignal(World world, BlockPos pos) { + return this.owner.getAnalogSignal(world, pos, this); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.owner.getMiningTime(world, pos); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.owner.getMiningSpeed(player, world, pos); + } + + @Override + public int getDirectSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.getDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity) { + this.owner.addCollisions(world, pos, this, shape, collisions, entity); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.owner.canWalkThrough(world, pos); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public boolean doEvent(World world, BlockPos pos, int type, int data) { + return this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.owner.dropItems(world, pos, this, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.owner.dropItems(world, pos, this, luck, fortuneLevel); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.owner.use(world, pos, this, player, face, faceX, faceY, faceZ); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java new file mode 100644 index 000000000..1bd3ad7e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldRegion; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "isAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..0352a20c1 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,342 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Shadow + public boolean is(int block) { return false; } + + @Override + public boolean is(Block block) { + return this.is(block.id); + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public Sprite getSprite(int face, int metadata) { return null; } + + @Override + public Sprite getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { return 0.0F; } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSignal(WorldView world, int x, int y, int z, int dir) { return 0; } + + @Override + public int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.getSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public int getAnalogSignal(World world, int x, int y, int z, int metadata) { return 0; } + + @Override + public int getAnalogSignal(World world, BlockPos pos, BlockState state) { + return this.getAnalogSignal(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public float getMiningTime(World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getDirectSignal(WorldView world, int x, int y, int z, int dir) { return 0; } + + @Override + public int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.getDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canWalkThrough(WorldView world, int x, int y, int z) { return false; } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean doEvent(World world, int x, int y, int z, int type, int data) { return false; } + + @Override + public boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + return this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z, int block, int metadata) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock().id, state.getBlock().getMetadataFromState(state)); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata, int fortuneLevel) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java new file mode 100644 index 000000000..0502a4e20 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunkSection; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +@Mixin(WorldChunkSection.class) +public class WorldChunkSectionMixin implements WorldChunkSectionExtension { + + @Shadow + private int getBlock(int x, int y, int z) { return 0; } + @Shadow + private int getBlockMetadata(int x, int y, int z) { return 0; } + @Shadow + private void setBlock(int x, int y, int z, int block) { } + @Shadow + private void setBlockMetadata(int x, int y, int z, int metadata) { } + + @Override + public BlockState getBlockState(int x, int y, int z) { + Block block = Block.BY_ID[this.getBlock(x, y, z)]; + int metadata = this.getBlockMetadata(x, y, z); + + return block.getStateFromMetadata(metadata); + } + + @Override + public void setBlockState(int x, int y, int z, BlockState state) { + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + this.setBlock(x, y, z, block.id); + this.setBlockMetadata(x, y, z, metadata); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..c2ab06e19 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,135 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.util.crash.CrashException; +import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.crash.CrashReportCategory; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.feather.constants.SetBlockFlags; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + @Shadow + private Profiler profiler; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void checkLight(int x, int y, int z) { } + @Shadow + private void notifyBlockChanged(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + @Shadow + private void updateNeighborComparators(int x, int y, int z, int block) { } + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = null; + + try { + chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } catch (Throwable t) { + CrashReport report = CrashReport.of(t, "Exception getting block state in world"); + CrashReportCategory category = report.addCategory("Requested block coordinates"); + category.add("Found chunk", chunk == null); + category.add("Location", CrashReportCategory.formatPosition(x, y, z)); + + throw new CrashException(report); + } + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, int flags) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, flags); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, int flags) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + this.profiler.push("checkLight"); + this.checkLight(x, y, z); + this.profiler.pop(); + } + + if ((flags & SetBlockFlags.NOTIFY_LISTENERS) != 0 && (!this.isMultiplayer || (flags & SetBlockFlags.NO_REDRAW) == 0)) { + this.notifyBlockChanged(x, y, z); + } + + if (!this.isMultiplayer && (flags & SetBlockFlags.NOTIFY_NEIGHBORS) != 0) { + this.onBlockChanged(x, y, z, replacedBlock.id); + + if (replaced.isAnalogSignalSource()) { + this.updateNeighborComparators(x, y, z, replacedBlock.id); + } + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java new file mode 100644 index 000000000..c78a50022 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +public interface WorldChunkSectionExtensionImpl extends WorldChunkSectionExtension { + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default void setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..357d7a4f9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, int flags) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, int flags) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..f91ef8bd9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc13w06a-mc1.6.4", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.5-alpha.13.6.a \u003c\u003d1.6.4", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..e2e25fe57 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,7 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunkSection net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..903661113 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w06a-mc1.6.4/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,25 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.WorldChunkSectionMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + "client.WorldRegionMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/build.gradle b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/gradle.properties b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/gradle.properties new file mode 100644 index 000000000..d864dc5f5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/gradle.properties @@ -0,0 +1,7 @@ +min_mc_version = 13w42a +max_mc_version = 1.7.10 + +minecraft_version = 1.7.2 +raven_build = 1 +sparrow_build = 1 +nests_build = 3 diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..06632c024 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,100 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean isAir(); + + MapColor getMapColor(BlockState state); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + Sprite getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + int getAnalogSignal(World world, BlockPos pos, BlockState state); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + + boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel); + + void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..7b75299b9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,342 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(Material material) { + super(material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public MapColor getMapColor(int metadata) { + return this.getMapColor(this.getStateFromMetadata(metadata)); + } + + @Override + public MapColor getMapColor(BlockState state) { + return super.getMapColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public Sprite getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public Sprite getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSignal(WorldView world, int x, int y, int z, int dir) { + return this.getSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.getSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public int getAnalogSignal(World world, int x, int y, int z, int metadata) { + return this.getAnalogSignal(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata)); + } + + @Override + public int getAnalogSignal(World world, BlockPos pos, BlockState state) { + return super.getAnalogSignal(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public float getMiningTime(World world, int x, int y, int z) { + return this.getMiningTime(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return super.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { + return this.getMiningSpeed(player, world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return super.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getDirectSignal(WorldView world, int x, int y, int z, int dir) { + return this.getDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.getDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions, entity); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canWalkThrough(WorldView world, int x, int y, int z) { + return this.canWalkThrough(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return super.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean doEvent(World world, int x, int y, int z, int type, int data) { + return this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + return super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, Block neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), neighborBlock); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z, Block block, int metadata) { + this.onRemoved(world, BlockPos.pooled(x, y, z), block.getStateFromMetadata(metadata)); + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock(), state.getBlock().getMetadataFromState(state)); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player, Direction.byData3d(face), faceX, faceY, faceZ); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return super.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..a2ced9153 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,35 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockBehaviors { + + boolean doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..bc6cdd7be --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,91 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + boolean isOpaque(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + Sprite getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(); + + boolean blocksAmbientLight(); + + boolean isSolid(); + + boolean isSignalSource(); + + int getSignal(WorldView world, BlockPos pos, Direction dir); + + boolean isAnalogSignalSource(); + + int getAnalogSignal(World world, BlockPos pos); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + int getDirectSignal(WorldView world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java new file mode 100644 index 000000000..15e1a9681 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkSectionExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; + +public interface WorldChunkSectionExtension { + + BlockState getBlockState(int x, int y, int z); + + void setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..dde25f0dc --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, int flags); + + boolean setBlockState(int x, int y, int z, BlockState state, int flags); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..103216792 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 255; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..2ea164e0a --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,199 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default MapColor getMapColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Sprite getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default int getAnalogSignal(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningTime(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..8218b2f13 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,265 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.getMaterial(); + } + + @Override + public boolean isOpaque() { + return this.owner.isOpaque(); + } + + @Override + public int getOpacity() { + return this.owner.getOpacity(); + } + + @Override + public int getLight() { + return this.owner.getLight(); + } + + @Override + public boolean isTranslucent() { + return this.owner.isTranslucent(); + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return this.owner.ticksRandomly(); + } + + @Override + public boolean usesNeighborLight() { + return this.owner.usesNeighborLight(); + } + + @Override + public MapColor getMapColor() { + return this.owner.getMapColor(this); + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public Sprite getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight() { + return this.owner.getAmbientOcclusionLight(); + } + + @Override + public boolean blocksAmbientLight() { + return this.owner.blocksAmbientLight(); + } + + @Override + public boolean isSolid() { + return this.owner.isSolid(); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public int getSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.getSignal(world, pos, this, dir); + } + + @Override + public boolean isAnalogSignalSource() { + return this.owner.isAnalogSignalSource(); + } + + @Override + public int getAnalogSignal(World world, BlockPos pos) { + return this.owner.getAnalogSignal(world, pos, this); + } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.owner.getMiningTime(world, pos); + } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.owner.getMiningSpeed(player, world, pos); + } + + @Override + public int getDirectSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.getDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity) { + this.owner.addCollisions(world, pos, this, shape, collisions, entity); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.owner.canWalkThrough(world, pos); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public boolean doEvent(World world, BlockPos pos, int type, int data) { + return this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.owner.dropItems(world, pos, this, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.owner.dropItems(world, pos, this, luck, fortuneLevel); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.owner.use(world, pos, this, player, face, faceX, faceY, faceZ); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java new file mode 100644 index 000000000..3e6024acb --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java @@ -0,0 +1,36 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.AirBlock; +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +@Mixin(AirBlock.class) +public class AirBlockMixin extends Block { + + private AirBlockMixin() { + super(null); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..d336ee5a1 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,331 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.client.render.texture.Sprite; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "init", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (Block block : Block.REGISTRY) { + int blockId = Block.REGISTRY.getId(block); + + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + builder.add(DATA_VALUE); + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return state.get(DATA_VALUE); + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public MapColor getMapColor(int metadata) { return null; } + + @Override + public MapColor getMapColor(BlockState state) { + return this.getMapColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public Sprite getSprite(int face, int metadata) { return null; } + + @Override + public Sprite getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSignal(WorldView world, int x, int y, int z, int dir) { return 0; } + + @Override + public int getSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.getSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public int getAnalogSignal(World world, int x, int y, int z, int metadata) { return 0; } + + @Override + public int getAnalogSignal(World world, BlockPos pos, BlockState state) { + return this.getAnalogSignal(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public float getMiningTime(World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningTime(World world, BlockPos pos) { + return this.getMiningTime(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getMiningSpeed(PlayerEntity player, World world, int x, int y, int z) { return 0.0F; } + + @Override + public float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.getMiningSpeed(player, world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getDirectSignal(WorldView world, int x, int y, int z, int dir) { return 0; } + + @Override + public int getDirectSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.getDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, List collisions, Entity entity) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions, Entity entity) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions, entity); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canWalkThrough(WorldView world, int x, int y, int z) { return false; } + + @Override + public boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.canWalkThrough(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean doEvent(World world, int x, int y, int z, int type, int data) { return false; } + + @Override + public boolean doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + return this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, Block neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z, Block block, int metadata) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z(), state.getBlock(), state.getBlock().getMetadataFromState(state)); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata, int fortuneLevel) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player, int face, float faceX, float faceY, float faceZ) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.use(world, pos.x(), pos.y(), pos.z(), player, face.data3d(), faceX, faceY, faceZ); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..94b5fd2e5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private Block getBlockAt(int localX, int y, int localZ) { return null; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, Block block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = this.getBlockAt(localX, y, localZ); + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java new file mode 100644 index 000000000..8313ca944 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkSectionMixin.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunkSection; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +@Mixin(WorldChunkSection.class) +public class WorldChunkSectionMixin implements WorldChunkSectionExtension { + + @Shadow + private Block getBlock(int x, int y, int z) { return null; } + @Shadow + private int getBlockMetadata(int x, int y, int z) { return 0; } + @Shadow + private void setBlock(int x, int y, int z, Block block) { } + @Shadow + private void setBlockMetadata(int x, int y, int z, int metadata) { } + + @Override + public BlockState getBlockState(int x, int y, int z) { + Block block = this.getBlock(x, y, z); + int metadata = this.getBlockMetadata(x, y, z); + + return block.getStateFromMetadata(metadata); + } + + @Override + public void setBlockState(int x, int y, int z, BlockState state) { + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + this.setBlock(x, y, z, block); + this.setBlockMetadata(x, y, z, metadata); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..60240d283 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,111 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.util.crash.CrashException; +import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.crash.CrashReportCategory; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.feather.constants.SetBlockFlags; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + @Shadow + private Profiler profiler; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private boolean checkLight(int x, int y, int z) { return false; } + @Shadow + private void notifyBlockChanged(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, Block block) { } + @Shadow + private void updateNeighborComparators(int x, int y, int z, Block block) { } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = null; + + try { + chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } catch (Throwable t) { + CrashReport report = CrashReport.of(t, "Exception getting block state in world"); + CrashReportCategory category = report.addCategory("Requested block coordinates"); + category.add("Found chunk", chunk == null); + category.add("Location", CrashReportCategory.formatPosition(x, y, z)); + + throw new CrashException(report); + } + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, int flags) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, flags); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, int flags) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + this.profiler.push("checkLight"); + this.checkLight(x, y, z); + this.profiler.pop(); + } + + if ((flags & SetBlockFlags.NOTIFY_LISTENERS) != 0 && (!this.isMultiplayer || (flags & SetBlockFlags.NO_REDRAW) == 0) && chunk.isPopulated()) { + this.notifyBlockChanged(x, y, z); + } + + if (!this.isMultiplayer && (flags & SetBlockFlags.NOTIFY_NEIGHBORS) != 0) { + this.onBlockChanged(x, y, z, replacedBlock); + + if (replaced.isAnalogSignalSource()) { + this.updateNeighborComparators(x, y, z, replacedBlock); + } + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..17ff3a9bf --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Blocks; +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java new file mode 100644 index 000000000..c78a50022 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkSectionExtension; + +public interface WorldChunkSectionExtensionImpl extends WorldChunkSectionExtension { + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default void setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..357d7a4f9 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, int flags) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, int flags) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..2a928626d --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc13w42a-mc1.7.10", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.7-alpha.13.42.a \u003c\u003d1.7.10", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..72da7396c --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,7 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunkSection net/ornithemc/osl/blockstates/impl/world/WorldChunkSectionExtensionImpl diff --git a/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..b6317e96f --- /dev/null +++ b/libraries/blockstates/blockstates-mc13w42a-mc1.7.10/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,22 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.AirBlockMixin", + "common.BlockMixin", + "common.WorldChunkMixin", + "common.WorldChunkSectionMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/build.gradle b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/gradle.properties b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/gradle.properties new file mode 100644 index 000000000..29961f4dc --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/gradle.properties @@ -0,0 +1,4 @@ +min_mc_version = 14w32c +max_mc_version = 1.8.9 + +minecraft_version = 1.8.9 diff --git a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java similarity index 68% rename from libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java rename to libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java index d3cc82edc..2a59d8bfb 100644 --- a/libraries/blocks/blocks-mc14w27a-mc15w35a/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.blocks.api.block; +package net.ornithemc.osl.blockstates.api.block; public interface BlockExtension { diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..35a108130 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,36 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public interface BlockBehaviors { + + boolean doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void randomTick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..a0c5d6da3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,92 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +public interface BlockProperties { + + Material getMaterial(); + + boolean isOpaque(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(); + + boolean blocksAmbientLight(); + + boolean isSolid(); + + boolean isSignalSource(); + + int getSignal(WorldView world, BlockPos pos, Direction dir); + + boolean isAnalogSignalSource(); + + int getAnalogSignal(World world, BlockPos pos); + + float getMiningTime(World world, BlockPos pos); + + float getMiningSpeed(PlayerEntity player, World world, BlockPos pos); + + int getDirectSignal(WorldView world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + BlockState getStateForItemModel(); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBeReplaced(World world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java new file mode 100644 index 000000000..fee719a6b --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +public interface BlockStateExtension extends BlockProperties, BlockBehaviors { + + boolean is(Block block); + +} diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java similarity index 55% rename from libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java rename to libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java index 5f35a77d9..419f5094f 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -1,6 +1,6 @@ -package net.ornithemc.osl.blocks.impl.block; +package net.ornithemc.osl.blockstates.impl.block; -import net.ornithemc.osl.blocks.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.BlockExtension; public interface BlockExtensionImpl extends BlockExtension { diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java new file mode 100644 index 000000000..47a037f08 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java @@ -0,0 +1,263 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +public interface BlockStateExtensionImpl extends BlockStateExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default Material getMaterial() { + throw new AbstractMethodError(); + } + + @Override + default boolean isOpaque() { + throw new AbstractMethodError(); + } + + @Override + default int getOpacity() { + throw new AbstractMethodError(); + } + + @Override + default int getLight() { + throw new AbstractMethodError(); + } + + @Override + default boolean isTranslucent() { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default boolean ticksRandomly() { + throw new AbstractMethodError(); + } + + @Override + default boolean usesNeighborLight() { + throw new AbstractMethodError(); + } + + @Override + default MapColor getMapColor() { + throw new AbstractMethodError(); + } + + @Override + default boolean isCube() { + throw new AbstractMethodError(); + } + + @Override + default int getRenderType() { + throw new AbstractMethodError(); + } + + @Override + default int getColor() { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight() { + throw new AbstractMethodError(); + } + + @Override + default boolean blocksAmbientLight() { + throw new AbstractMethodError(); + } + + @Override + default boolean isSolid() { + throw new AbstractMethodError(); + } + + @Override + default boolean isSignalSource() { + throw new AbstractMethodError(); + } + + @Override + default int getSignal(WorldView world, BlockPos pos, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAnalogSignalSource() { + throw new AbstractMethodError(); + } + + @Override + default int getAnalogSignal(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningTime(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getDirectSignal(WorldView world, BlockPos pos, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default int getPistonMoveBehavior() { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateForItemModel() { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default boolean isSolidRender() { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBeReplaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean doEvent(World world, BlockPos pos, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java new file mode 100644 index 000000000..1a31d2599 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java @@ -0,0 +1,19 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.AirBlock; +import net.minecraft.block.Block; + +@Mixin(AirBlock.class) +public class AirBlockMixin extends Block { + + private AirBlockMixin() { + super(null); + } + + @Override + public boolean isAir() { + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..f9ef7361a --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Override + public boolean isAir() { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java new file mode 100644 index 000000000..46e0fe27a --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java @@ -0,0 +1,270 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +@Mixin(BlockState.class) +public interface BlockStateMixin extends BlockStateExtension { + + @Shadow + Block getBlock(); + + @Override + default boolean is(Block block) { + return this.getBlock().is(block); + } + + @Override + default Material getMaterial() { + return this.getBlock().getMaterial(); + } + + @Override + default boolean isOpaque() { + return this.getBlock().isOpaque(); + } + + @Override + default int getOpacity() { + return this.getBlock().getOpacity(); + } + + @Override + default int getLight() { + return this.getBlock().getLight(); + } + + @Override + default boolean isTranslucent() { + return this.getBlock().isTranslucent(); + } + + @Override + default boolean isAir() { + return this.getBlock().isAir(); + } + + @Override + default boolean ticksRandomly() { + return this.getBlock().ticksRandomly(); + } + + @Override + default boolean usesNeighborLight() { + return this.getBlock().usesNeighborLight(); + } + + @Override + default MapColor getMapColor() { + return this.getBlock().getMapColor((BlockState) this); + } + + @Override + default boolean isCube() { + return this.getBlock().isCube(); + } + + @Override + default int getRenderType() { + return this.getBlock().getRenderType(); + } + + @Override + default int getColor() { + return this.getBlock().getColor((BlockState) this); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + return this.getBlock().getColor(world, pos); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + return this.getBlock().getLightColor(world, pos); + } + + @Override + default float getAmbientOcclusionLight() { + return this.getBlock().getAmbientOcclusionLight(); + } + + @Override + default boolean blocksAmbientLight() { + return this.getBlock().blocksAmbientLight(); + } + + @Override + default boolean isSolid() { + return this.getBlock().isSolid(); + } + + @Override + default boolean isSignalSource() { + return this.getBlock().isSignalSource(); + } + + @Override + default int getSignal(WorldView world, BlockPos pos, Direction dir) { + return this.getBlock().getSignal(world, pos, (BlockState) this, dir); + } + + @Override + default boolean isAnalogSignalSource() { + return this.getBlock().isAnalogSignalSource(); + } + + @Override + default int getAnalogSignal(World world, BlockPos pos) { + return this.getBlock().getAnalogSignal(world, pos); + } + + @Override + default float getMiningTime(World world, BlockPos pos) { + return this.getBlock().getMiningTime(world, pos); + } + + @Override + default float getMiningSpeed(PlayerEntity player, World world, BlockPos pos) { + return this.getBlock().getMiningSpeed(player, world, pos); + } + + @Override + default int getDirectSignal(WorldView world, BlockPos pos, Direction dir) { + return this.getBlock().getDirectSignal(world, pos, (BlockState) this, dir); + } + + @Override + default int getPistonMoveBehavior() { + return this.getBlock().getPistonMoveBehavior(); + } + + @Override + default BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.getBlock().resolveVirtualProperties((BlockState) this, world, pos); + } + + @Override + default BlockState getStateForItemModel() { + return this.getBlock().getStateForRendering((BlockState) this); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + return this.getBlock().getOutlineShape(world, pos); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.getBlock().shouldRenderFace(world, pos, face); + } + + @Override + default boolean isSolidRender() { + return this.getBlock().isSolidRender(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos) { + return this.getBlock().getCollisionShape(world, pos, (BlockState) this); + } + + @Override + default void addCollisions(World world, BlockPos pos, Box shape, List collisions, Entity entity) { + this.getBlock().addCollisions(world, pos, (BlockState) this, shape, collisions, entity); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.getBlock().rayTrace(world, pos, from, to); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.getBlock().canWalkThrough(world, pos); + } + + @Override + default boolean canBeReplaced(World world, BlockPos pos) { + return this.getBlock().canBeReplaced(world, pos); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + return this.getBlock().canBePlaced(world, pos); + } + + @Override + default boolean doEvent(World world, BlockPos pos, int type, int data) { + return this.getBlock().doEvent(world, pos, (BlockState) this, type, data); + } + + @Override + default void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.getBlock().neighborChanged(world, pos, (BlockState) this, neighborBlock); + } + + @Override + default void onAdded(World world, BlockPos pos) { + this.getBlock().onAdded(world, pos, (BlockState) this); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + this.getBlock().onRemoved(world, pos, (BlockState) this); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + this.getBlock().tick(world, pos, (BlockState) this, random); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + this.getBlock().randomTick(world, pos, (BlockState) this, random); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.getBlock().onEntityCollision(world, pos, (BlockState) this, entity); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, fortuneLevel); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, luck, fortuneLevel); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, Direction face, float faceX, float faceY, float faceZ) { + return this.getBlock().use(world, pos, (BlockState) this, player, face, faceX, faceY, faceZ); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + this.getBlock().startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..58539c796 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc14w32c-mc1.8.9", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.8-alpha.14.32.c \u003c\u003d1.8.9", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..be07a3ac5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/block/state/BlockState net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl diff --git a/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..6615ecbec --- /dev/null +++ b/libraries/blockstates/blockstates-mc14w32c-mc1.8.9/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.AirBlockMixin", + "common.BlockMixin", + "common.BlockStateMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/build.gradle b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/gradle.properties b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/gradle.properties new file mode 100644 index 000000000..d5980a893 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/gradle.properties @@ -0,0 +1,4 @@ +min_mc_version = 1.9.3-pre2 +max_mc_version = 1.9.3-pre1 + +minecraft_version = 1.9.3-pre1 diff --git a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java similarity index 68% rename from libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java rename to libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java index d3cc82edc..2a59d8bfb 100644 --- a/libraries/blocks/blocks-mc15w36a-mc17w46a/src/main/java/net/ornithemc/osl/blocks/api/block/BlockExtension.java +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.blocks.api.block; +package net.ornithemc.osl.blockstates.api.block; public interface BlockExtension { diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..e7ee96841 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,38 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; + +public interface BlockBehaviors { + + boolean doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void randomTick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, ItemStack item, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..842492643 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +public interface BlockProperties { + + boolean isAir(); + + boolean ticksRandomly(); + + Box getShape(WorldView world, BlockPos pos); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBeReplaced(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java new file mode 100644 index 000000000..fee719a6b --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +public interface BlockStateExtension extends BlockProperties, BlockBehaviors { + + boolean is(Block block); + +} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java similarity index 55% rename from libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java rename to libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java index 5f35a77d9..419f5094f 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/block/BlockExtensionImpl.java +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -1,6 +1,6 @@ -package net.ornithemc.osl.blocks.impl.block; +package net.ornithemc.osl.blockstates.impl.block; -import net.ornithemc.osl.blocks.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.BlockExtension; public interface BlockExtensionImpl extends BlockExtension { diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java new file mode 100644 index 000000000..eb3d4aec4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java @@ -0,0 +1,109 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +public interface BlockStateExtensionImpl extends BlockStateExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default boolean ticksRandomly() { + throw new AbstractMethodError(); + } + + @Override + default Box getShape(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBeReplaced(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean doEvent(World world, BlockPos pos, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, ItemStack item, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java new file mode 100644 index 000000000..1a31d2599 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java @@ -0,0 +1,19 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.AirBlock; +import net.minecraft.block.Block; + +@Mixin(AirBlock.class) +public class AirBlockMixin extends Block { + + private AirBlockMixin() { + super(null); + } + + @Override + public boolean isAir() { + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..f9ef7361a --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Override + public boolean isAir() { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java new file mode 100644 index 000000000..8f922d0a4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java @@ -0,0 +1,117 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.state.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +@Mixin(BlockState.class) +public interface BlockStateMixin extends BlockStateExtension { + + @Shadow + Block getBlock(); + + @Override + default boolean is(Block block) { + return this.getBlock().is(block); + } + + @Override + default boolean isAir() { + return this.getBlock().isAir(); + } + + @Override + default boolean ticksRandomly() { + return this.getBlock().ticksRandomly(); + } + + @Override + default Box getShape(WorldView world, BlockPos pos) { + return this.getBlock().getShape((BlockState) this, world, pos); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.getBlock().canWalkThrough(world, pos); + } + + @Override + default boolean canBeReplaced(WorldView world, BlockPos pos) { + return this.getBlock().canBeReplaced(world, pos); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + return this.getBlock().canBePlaced(world, pos); + } + + @Override + default boolean doEvent(World world, BlockPos pos, int type, int data) { + return this.getBlock().doEvent(world, pos, (BlockState) this, type, data); + } + + @Override + default void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.getBlock().neighborChanged(world, pos, (BlockState) this, neighborBlock); + } + + @Override + default void onAdded(World world, BlockPos pos) { + this.getBlock().onAdded(world, pos, (BlockState) this); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + this.getBlock().onRemoved(world, pos, (BlockState) this); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + this.getBlock().tick(world, pos, (BlockState) this, random); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + this.getBlock().randomTick(world, pos, (BlockState) this, random); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.getBlock().onEntityCollision(world, pos, (BlockState) this, entity); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, fortuneLevel); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, luck, fortuneLevel); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, ItemStack item, Direction face, float faceX, float faceY, float faceZ) { + return this.getBlock().use(world, pos, (BlockState) this, player, hand, item, face, faceX, faceY, faceZ); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + this.getBlock().startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..08963c815 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc1.9.3-pre2-mc1.9.3-pre1", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.9.3-rc.2 \u003c\u003d1.9.3-rc.1", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..be07a3ac5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/block/state/BlockState net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl diff --git a/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..6615ecbec --- /dev/null +++ b/libraries/blockstates/blockstates-mc15w47a-mc1.9.3-pre1/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.AirBlockMixin", + "common.BlockMixin", + "common.BlockStateMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/build.gradle b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/gradle.properties b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/gradle.properties new file mode 100644 index 000000000..0f2c9f862 --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/gradle.properties @@ -0,0 +1,4 @@ +min_mc_version = 16w39a +max_mc_version = 17w46a + +minecraft_version = 1.12.2 diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..2a59d8bfb --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.blockstates.api.block; + +public interface BlockExtension { + + /** + * @return whether this block is air. + */ + boolean isAir(); + +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..1da3b786c --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,32 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; + +public interface BlockBehaviors { + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void randomTick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, Direction face, float faceX, float faceY, float faceZ); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..842492643 --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +public interface BlockProperties { + + boolean isAir(); + + boolean ticksRandomly(); + + Box getShape(WorldView world, BlockPos pos); + + boolean canWalkThrough(WorldView world, BlockPos pos); + + boolean canBeReplaced(WorldView world, BlockPos pos); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java new file mode 100644 index 000000000..fee719a6b --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +public interface BlockStateExtension extends BlockProperties, BlockBehaviors { + + boolean is(Block block); + +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..419f5094f --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java new file mode 100644 index 000000000..2c7d51731 --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java @@ -0,0 +1,98 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +public interface BlockStateExtensionImpl extends BlockStateExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default boolean ticksRandomly() { + throw new AbstractMethodError(); + } + + @Override + default Box getShape(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBeReplaced(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, Direction face, float faceX, float faceY, float faceZ) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java new file mode 100644 index 000000000..1a31d2599 --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/AirBlockMixin.java @@ -0,0 +1,19 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.AirBlock; +import net.minecraft.block.Block; + +@Mixin(AirBlock.class) +public class AirBlockMixin extends Block { + + private AirBlockMixin() { + super(null); + } + + @Override + public boolean isAir() { + return true; + } +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..f9ef7361a --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Override + public boolean isAir() { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java new file mode 100644 index 000000000..06e22419d --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java @@ -0,0 +1,106 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.state.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.living.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +@Mixin(BlockState.class) +public interface BlockStateMixin extends BlockStateExtension { + + @Shadow + Block getBlock(); + + @Override + default boolean is(Block block) { + return this.getBlock().is(block); + } + + @Override + default boolean isAir() { + return this.getBlock().isAir(); + } + + @Override + default boolean ticksRandomly() { + return this.getBlock().ticksRandomly(); + } + + @Override + default Box getShape(WorldView world, BlockPos pos) { + return this.getBlock().getShape((BlockState) this, world, pos); + } + + @Override + default boolean canWalkThrough(WorldView world, BlockPos pos) { + return this.getBlock().canWalkThrough(world, pos); + } + + @Override + default boolean canBeReplaced(WorldView world, BlockPos pos) { + return this.getBlock().canBeReplaced(world, pos); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + return this.getBlock().canBePlaced(world, pos); + } + + @Override + default void onAdded(World world, BlockPos pos) { + this.getBlock().onAdded(world, pos, (BlockState) this); + } + + @Override + default void onRemoved(World world, BlockPos pos) { + this.getBlock().onRemoved(world, pos, (BlockState) this); + } + + @Override + default void tick(World world, BlockPos pos, Random random) { + this.getBlock().tick(world, pos, (BlockState) this, random); + } + + @Override + default void randomTick(World world, BlockPos pos, Random random) { + this.getBlock().randomTick(world, pos, (BlockState) this, random); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.getBlock().onEntityCollision(world, pos, (BlockState) this, entity); + } + + @Override + default void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, fortuneLevel); + } + + @Override + default void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.getBlock().dropItems(world, pos, (BlockState) this, luck, fortuneLevel); + } + + @Override + default boolean use(World world, BlockPos pos, PlayerEntity player, InteractionHand hand, Direction face, float faceX, float faceY, float faceZ) { + return this.getBlock().use(world, pos, (BlockState) this, player, hand, face, faceX, faceY, faceZ); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + this.getBlock().startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..71101878b --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc16w39a-mc17w46a", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.11-alpha.16.39.a \u003c\u003d1.13-alpha.17.46.a", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..be07a3ac5 --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/block/state/BlockState net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl diff --git a/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..6615ecbec --- /dev/null +++ b/libraries/blockstates/blockstates-mc16w39a-mc17w46a/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.AirBlockMixin", + "common.BlockMixin", + "common.BlockStateMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/build.gradle b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/gradle.properties b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/gradle.properties new file mode 100644 index 000000000..32d17f30c --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/gradle.properties @@ -0,0 +1,4 @@ +min_mc_version = 18w19a +max_mc_version = 1.13.2 + +minecraft_version = 1.13.2 diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..1cac784bf --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +public interface BlockExtension { + + boolean is(Block block); + +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java new file mode 100644 index 000000000..cd26a42f2 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +public interface BlockStateExtension { + + boolean is(Block block); + +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/fluid/state/FluidStateExtension.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/fluid/state/FluidStateExtension.java new file mode 100644 index 000000000..191f47e74 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/api/fluid/state/FluidStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.fluid.state; + +import net.minecraft.fluid.Fluid; + +public interface FluidStateExtension { + + boolean is(Fluid fluid); + +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..539dae556 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java new file mode 100644 index 000000000..cc4079ade --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +public interface BlockStateExtensionImpl extends BlockStateExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl.java new file mode 100644 index 000000000..1b261483c --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.blockstates.impl.fluid.state; + +import net.minecraft.fluid.Fluid; + +import net.ornithemc.osl.blockstates.api.fluid.state.FluidStateExtension; + +public interface FluidStateExtensionImpl extends FluidStateExtension { + + @Override + default boolean is(Fluid fluid) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..4e106e2f8 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Override + public boolean is(Block block) { + return this == (Object) block; + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java new file mode 100644 index 000000000..6d2f85e95 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.state.BlockState; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +@Mixin(BlockState.class) +public interface BlockStateMixin extends BlockStateExtension { + + @Shadow + Block getBlock(); + + @Override + default boolean is(Block block) { + return this.getBlock().is(block); + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/FluidStateMixin.java b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/FluidStateMixin.java new file mode 100644 index 000000000..cede07109 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/FluidStateMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.state.FluidState; + +import net.ornithemc.osl.blockstates.api.fluid.state.FluidStateExtension; + +@Mixin(FluidState.class) +public interface FluidStateMixin extends FluidStateExtension { + + @Shadow + Fluid getFluid(); + + @Override + default boolean is(Fluid fluid) { + return this.getFluid().is(fluid); + } +} diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..92d72d8e4 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc18w19a-mc1.13.2", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.13-alpha.18.19.a \u003c\u003d1.13.2", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..2fc27b104 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,5 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/block/state/BlockState net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl +transitive-inject-interface net/minecraft/fluid/state/FluidState net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..e06507735 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w19a-mc1.13.2/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.BlockStateMixin", + "common.FluidStateMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/build.gradle b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/gradle.properties b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/gradle.properties new file mode 100644 index 000000000..54620cacd --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/gradle.properties @@ -0,0 +1,4 @@ +min_mc_version = 18w43a +max_mc_version = 1.14.4 + +minecraft_version = 1.14.4 diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..1cac784bf --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +public interface BlockExtension { + + boolean is(Block block); + +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java new file mode 100644 index 000000000..cd26a42f2 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +public interface BlockStateExtension { + + boolean is(Block block); + +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/fluid/state/FluidStateExtension.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/fluid/state/FluidStateExtension.java new file mode 100644 index 000000000..191f47e74 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/api/fluid/state/FluidStateExtension.java @@ -0,0 +1,9 @@ +package net.ornithemc.osl.blockstates.api.fluid.state; + +import net.minecraft.fluid.Fluid; + +public interface FluidStateExtension { + + boolean is(Fluid fluid); + +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..539dae556 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java new file mode 100644 index 000000000..cc4079ade --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +public interface BlockStateExtensionImpl extends BlockStateExtension { + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl.java new file mode 100644 index 000000000..1b261483c --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.blockstates.impl.fluid.state; + +import net.minecraft.fluid.Fluid; + +import net.ornithemc.osl.blockstates.api.fluid.state.FluidStateExtension; + +public interface FluidStateExtensionImpl extends FluidStateExtension { + + @Override + default boolean is(Fluid fluid) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..4e106e2f8 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Override + public boolean is(Block block) { + return this == (Object) block; + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java new file mode 100644 index 000000000..45b472b7f --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockStateMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.block.state.BlockState; + +import net.ornithemc.osl.blockstates.api.block.state.BlockStateExtension; + +@Mixin(BlockState.class) +public class BlockStateMixin implements BlockStateExtension { + + @Shadow + private Block getBlock() { return null; } + + @Override + public boolean is(Block block) { + return this.getBlock().is(block); + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/FluidStateMixin.java b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/FluidStateMixin.java new file mode 100644 index 000000000..cede07109 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/FluidStateMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.state.FluidState; + +import net.ornithemc.osl.blockstates.api.fluid.state.FluidStateExtension; + +@Mixin(FluidState.class) +public interface FluidStateMixin extends FluidStateExtension { + + @Shadow + Fluid getFluid(); + + @Override + default boolean is(Fluid fluid) { + return this.getFluid().is(fluid); + } +} diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..6aa6e8073 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mc18w43a-mc1.14.4", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.14-alpha.18.43.a \u003c\u003d1.14.4", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..2fc27b104 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,5 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/block/state/BlockState net/ornithemc/osl/blockstates/impl/block/state/BlockStateExtensionImpl +transitive-inject-interface net/minecraft/fluid/state/FluidState net/ornithemc/osl/blockstates/impl/fluid/state/FluidStateExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..e06507735 --- /dev/null +++ b/libraries/blockstates/blockstates-mc18w43a-mc1.14.4/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.BlockStateMixin", + "common.FluidStateMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/build.gradle b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/gradle.properties b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/gradle.properties new file mode 100644 index 000000000..8587bd6f7 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/gradle.properties @@ -0,0 +1,10 @@ +min_mc_version = a1.0.1_01 +max_mc_version = b1.1_02 + +minecraft_version = b1.0 +client_raven_build = 1 +server_raven_build = 1 +client_sparrow_build = 2 +server_sparrow_build = 2 +client_nests_build = 7 +server_nests_build = 3 diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..3c1020e49 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,84 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state); + + void dropItems(World world, BlockPos pos, BlockState state, float luck); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..f08b8839f --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,253 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..693929602 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,32 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos); + + void dropItems(World world, BlockPos pos, float luck); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..290aab882 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,62 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean isCube(); + + int getRenderType(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + boolean isSolid(); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..721f0eef0 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 127; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..36dd8eb7a --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolid() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..1f1f286b9 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,162 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..f357be433 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,193 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return Block.TICKS_RANDOMLY[this.owner.id]; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public boolean isSolid() { + return this.owner.isSolid(); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos) { + this.owner.dropItems(world, pos, this); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck) { + this.owner.dropItems(world, pos, this, luck); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..cf1fa69a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,275 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..edacd712e --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,84 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + + @ModifyVariable( + method = "canPlace", + ordinal = 0, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" + ) + ) + private Block osl$blockstates$makeAirReplaceable(Block block) { + return block == Blocks.AIR ? null : block; + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + if (!this.isMultiplayer && notify) { + this.onBlockChanged(x, y, z, state.getBlock().id); + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..b17b5bc2d --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mca1.0.1_01-mcb1.1_02", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.0.0-alpha.0.1.1 \u003c\u003d1.0.0-beta.1.2", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..bcc6e4d44 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,6 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..244898166 --- /dev/null +++ b/libraries/blockstates/blockstates-mca1.0.1_01-mcb1.1_02/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,21 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/build.gradle b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/gradle.properties b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/gradle.properties new file mode 100644 index 000000000..87b681dcd --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/gradle.properties @@ -0,0 +1,10 @@ +min_mc_version = b1.2 +max_mc_version = b1.5_02 + +minecraft_version = b1.5_01 +client_raven_build = 1 +server_raven_build = 1 +client_sparrow_build = 2 +server_sparrow_build = 2 +client_nests_build = 7 +server_nests_build = 4 diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..036ff17ac --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,86 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state); + + void dropItems(World world, BlockPos pos, BlockState state, float luck); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..551cb120f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,264 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..ae0395026 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos); + + void dropItems(World world, BlockPos pos, float luck); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..290aab882 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,62 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean isCube(); + + int getRenderType(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + boolean isSolid(); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..721f0eef0 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 127; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/BlockStatesMixinPlugin.java similarity index 67% rename from libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java rename to libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/BlockStatesMixinPlugin.java index a242d334c..454090a37 100644 --- a/libraries/blocks/blocks-mc13w36a-mc14w26c/src/main/java/net/ornithemc/osl/blocks/impl/BlocksMixinPlugin.java +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/BlockStatesMixinPlugin.java @@ -1,4 +1,4 @@ -package net.ornithemc.osl.blocks.impl; +package net.ornithemc.osl.blockstates.impl; import java.util.List; import java.util.Set; @@ -10,9 +10,7 @@ import net.ornithemc.osl.core.impl.util.MinecraftVersion; -public class BlocksMixinPlugin implements IMixinConfigPlugin { - - public static final boolean AIR_BLOCK_EXISTS = MinecraftVersion.resolve().compareTo("13w38b") >= 0; +public class BlockStatesMixinPlugin implements IMixinConfigPlugin { @Override public void onLoad(String mixinPackage) { @@ -25,11 +23,8 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if ("net.ornithemc.osl.blocks.impl.mixin.common.AirBlockMixin".equals(mixinClassName)) { - return AIR_BLOCK_EXISTS; - } - if ("net.ornithemc.osl.blocks.impl.mixin.common.BlocksMixin".equals(mixinClassName)) { - return !AIR_BLOCK_EXISTS; + if ("net.ornithemc.osl.blockstates.impl.mixin.server.WorldMixin".equals(mixinClassName)) { + return MinecraftVersion.resolve().compareTo("b1.5") >= 0; } return true; diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..36dd8eb7a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolid() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..fcf69b2f9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,167 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..2373615ea --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,198 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return Block.TICKS_RANDOMLY[this.owner.id]; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public boolean isSolid() { + return this.owner.isSolid(); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos) { + this.owner.dropItems(world, pos, this); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck) { + this.owner.dropItems(world, pos, this, luck); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..9221eeab3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,283 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..edacd712e --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,84 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + + @ModifyVariable( + method = "canPlace", + ordinal = 0, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" + ) + ) + private Block osl$blockstates$makeAirReplaceable(Block block) { + return block == Blocks.AIR ? null : block; + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + if (!this.isMultiplayer && notify) { + this.onBlockChanged(x, y, z, state.getBlock().id); + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java new file mode 100644 index 000000000..2cec459e6 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +@Mixin(World.class) +public class WorldMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..e6c81e5b0 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mcb1.2-mcb1.5_02", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.0.0-beta.2 \u003c\u003d1.0.0-beta.5.2", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..bcc6e4d44 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,6 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..6793fac4e --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.2-mcb1.5_02/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,27 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "plugin": "net.ornithemc.osl.blockstates.impl.BlockStatesMixinPlugin", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + ], + "server": [ + "server.WorldMixin", + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/build.gradle b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/gradle.properties b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/gradle.properties new file mode 100644 index 000000000..cbba8dd84 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/gradle.properties @@ -0,0 +1,10 @@ +min_mc_version = b1.6-trailer +max_mc_version = b1.6.6 + +minecraft_version = b1.6.6 +client_raven_build = 1 +server_raven_build = 1 +client_sparrow_build = 1 +server_sparrow_build = 1 +client_nests_build = 6 +server_nests_build = 4 diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..036ff17ac --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,86 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state); + + void dropItems(World world, BlockPos pos, BlockState state, float luck); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..551cb120f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,264 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..ae0395026 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos); + + void dropItems(World world, BlockPos pos, float luck); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..a82b9fb69 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,67 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..721f0eef0 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 127; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..5e4885a18 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..fcf69b2f9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,167 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..60c9d8f07 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,209 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return Block.TICKS_RANDOMLY[this.owner.id]; + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos) { + this.owner.dropItems(world, pos, this); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck) { + this.owner.dropItems(world, pos, this, luck); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..9221eeab3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,283 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..51c04abb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,93 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + @Shadow + private void updateNeighbors(int x, int y, int z, int block) { } + + @ModifyVariable( + method = "canPlace", + ordinal = 0, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" + ) + ) + private Block osl$blockstates$makeAirReplaceable(Block block) { + return block == Blocks.AIR ? null : block; + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block block = state.getBlock(); + Block replacedBlock = replaced.getBlock(); + + if (!this.isMultiplayer && notify) { + if (!state.is(replacedBlock) || Block.UPDATE_CLIENTS[block.id]) { + this.onBlockChanged(x, y, z, block.id); + } else { + this.updateNeighbors(x, y, z, block.id); + } + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java new file mode 100644 index 000000000..2cec459e6 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +@Mixin(World.class) +public class WorldMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..f390b7028 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mcb1.6-trailer-mcb1.6.6", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.0.0-beta.6.0.0 \u003c\u003d1.0.0-beta.6.6", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..bcc6e4d44 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,6 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..dbd9234e4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.6-trailer-mcb1.6.6/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,26 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + ], + "server": [ + "server.WorldMixin", + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/build.gradle b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/gradle.properties b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/gradle.properties new file mode 100644 index 000000000..021d57d3d --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/gradle.properties @@ -0,0 +1,10 @@ +min_mc_version = b1.7 +max_mc_version = b1.7.3 + +minecraft_version = b1.7.3 +client_raven_build = 2 +server_raven_build = 2 +client_sparrow_build = 2 +server_sparrow_build = 2 +client_nests_build = 7 +server_nests_build = 4 diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..99be66929 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,88 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state); + + void dropItems(World world, BlockPos pos, BlockState state, float luck); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..4b6cf1c28 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,275 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..ae0395026 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos); + + void dropItems(World world, BlockPos pos, float luck); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..d3213bf69 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,73 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningTime(); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..721f0eef0 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 127; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..5e4885a18 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..71da4757a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,172 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..e65e537b7 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,224 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return Block.TICKS_RANDOMLY[this.owner.id]; + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningTime() { + return this.owner.getMiningTime(); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos) { + this.owner.dropItems(world, pos, this); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck) { + this.owner.dropItems(world, pos, this, luck); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..d93b9b37e --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,291 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..b842d44f1 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,93 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + @Shadow + private void updateNeighbors(int x, int y, int z, int block) { } + + @ModifyVariable( + method = "canPlace", + ordinal = 0, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" + ) + ) + private Block osl$blockstates$makeAirReplaceable(Block block) { + return block == Blocks.AIR ? null : block; + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block block = state.getBlock(); + Block replacedBlock = replaced.getBlock(); + + if (!this.isMultiplayer && notify) { + if (!state.is(replacedBlock) || state.updateClients()) { + this.onBlockChanged(x, y, z, block.id); + } else { + this.updateNeighbors(x, y, z, block.id); + } + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java new file mode 100644 index 000000000..2cec459e6 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +@Mixin(World.class) +public class WorldMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..5cd2116d4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mcb1.7-mcb1.7.3", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.0.0-beta.7 \u003c\u003d1.0.0-beta.7.3", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..bcc6e4d44 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,6 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..dbd9234e4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.7-mcb1.7.3/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,26 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + ], + "server": [ + "server.WorldMixin", + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/build.gradle b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/gradle.properties b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/gradle.properties new file mode 100644 index 000000000..423a210c8 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/gradle.properties @@ -0,0 +1,10 @@ +min_mc_version = b1.8-pre1 +max_mc_version = b1.9-pre3 + +minecraft_version = b1.8.1 +client_raven_build = 1 +server_raven_build = 1 +client_sparrow_build = 1 +server_sparrow_build = 1 +client_nests_build = 8 +server_nests_build = 5 diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..de9b33c9d --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,92 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state); + + void dropItems(World world, BlockPos pos, BlockState state, float luck); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..048bb57bb --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,297 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { + return this.getAmbientOcclusionLight(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return super.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..ae0395026 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos); + + void dropItems(World world, BlockPos pos, float luck); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..23f97290d --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,77 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningTime(); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..721f0eef0 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 127; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..5e4885a18 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..17c12b904 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,182 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..7a0227398 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,234 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return Block.TICKS_RANDOMLY[this.owner.id]; + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.owner.getAmbientOcclusionLight(world, pos); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningTime() { + return this.owner.getMiningTime(); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos) { + this.owner.dropItems(world, pos, this); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck) { + this.owner.dropItems(world, pos, this, luck); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java new file mode 100644 index 000000000..1bd3ad7e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldRegion; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "isAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..b2fa192b3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,307 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { return 0.0F; } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state)); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..5a9e8d67f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,99 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void checkLight(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + @Shadow + private void updateNeighbors(int x, int y, int z, int block) { } + + @ModifyVariable( + method = "canPlace", + ordinal = 0, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" + ) + ) + private Block osl$blockstates$makeAirReplaceable(Block block) { + return block == Blocks.AIR ? null : block; + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block block = state.getBlock(); + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + this.checkLight(x, y, z); + } + + if (!this.isMultiplayer && notify) { + if (!state.is(replacedBlock) || state.updateClients()) { + this.onBlockChanged(x, y, z, block.id); + } else { + this.updateNeighbors(x, y, z, block.id); + } + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java new file mode 100644 index 000000000..2cec459e6 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +@Mixin(World.class) +public class WorldMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..ef989a20f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mcb1.8-pre1-mcb1.9-pre3", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.0.0-beta.8.0.1 \u003c\u003d1.0.0-beta.9.0.3", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..bcc6e4d44 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,6 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..607d708a5 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.8-pre1-mcb1.9-pre3/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,27 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + "client.WorldRegionMixin" + ], + "server": [ + "server.WorldMixin", + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/build.gradle b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/build.gradle new file mode 100644 index 000000000..0a350fdb3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/gradle.properties b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/gradle.properties new file mode 100644 index 000000000..1157a6990 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/gradle.properties @@ -0,0 +1,10 @@ +min_mc_version = b1.9-pre4 +max_mc_version = 12w03a + +minecraft_version = 1.1 +client_raven_build = 1 +server_raven_build = 1 +client_sparrow_build = 1 +server_sparrow_build = 1 +client_nests_build = 11 +server_nests_build = 6 diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java new file mode 100644 index 000000000..921ee0ba6 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/BlockExtension.java @@ -0,0 +1,92 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.IntegerProperty; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; +import net.ornithemc.osl.registries.api.registry.IdMap; + +public interface BlockExtension { + + IdMap STATE_REGISTRY = new IdMap<>(); + + IntegerProperty DATA_VALUE = IntegerProperty.of("data_value", 0, 15); + + void buildStateDefinition(StateDefinition.Builder builder); + + StateDefinition stateDefinition(); + + void setDefaultState(BlockState state); + + BlockState defaultState(); + + BlockState getStateFromMetadata(int metadata); + + int getMetadataFromState(BlockState state); + + boolean is(Block block); + + boolean isAir(); + + int getColor(BlockState state); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(BlockState state, Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir); + + boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir); + + BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + Box getCollisionShape(World world, BlockPos pos, BlockState state); + + void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + + void doEvent(World world, BlockPos pos, BlockState state, int type, int data); + + void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock); + + void onAdded(World world, BlockPos pos, BlockState state); + + void onRemoved(World world, BlockPos pos, BlockState state); + + void tick(World world, BlockPos pos, BlockState state, Random random); + + void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity); + + void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel); + + void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java new file mode 100644 index 000000000..3d150febe --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/Blocks.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.block; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.impl.block.AirBlock; + +public final class Blocks { + + /* + * We cannot add this to the BlockExtension interface because + * the Block.BY_ID array must exist when blocks are created. + * Other mods (like StAPI) may also add air, only one can exist! + */ + public static final Block AIR = Block.BY_ID[0] != null ? Block.BY_ID[0] : new AirBlock(0); + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java new file mode 100644 index 000000000..b3e194b05 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/StatefulBlock.java @@ -0,0 +1,297 @@ +package net.ornithemc.osl.blockstates.api.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +/** + * A base implementation of {@linkplain Block} that is designed to be used with {@linkplain BlockState}s. + * All methods that make use of int coordinates, int directions, and int data values, have their calls + * forwarded to equivalent methods provided by OSL that make use of {@linkplain BlockPos}, + * {@linkplain Direction}, and {@linkplain BlockState} instead. This allows sub-classes to place all + * their logic in these methods without the need to duplicate it for interoperability with most Vanilla + * systems. + */ +public class StatefulBlock extends Block { + + public StatefulBlock(int id, Material material) { + super(id, material); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + @Deprecated + public int getColor(int metadata) { + return this.getColor(this.getStateFromMetadata(metadata)); + } + + @Override + public int getColor(BlockState state) { + return super.getColor(this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getColor(WorldView world, int x, int y, int z) { + return this.getColorTint(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return super.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public int getSprite(int face, int metadata) { + return this.getSprite(this.getStateFromMetadata(metadata), Direction.byData3d(face)); + } + + @Override + public int getSprite(BlockState state, Direction face) { + return super.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Override + @Deprecated + public int getLightColor(WorldView world, int x, int y, int z) { + return this.getLightColor(world, BlockPos.pooled(x, y, z)); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return super.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { + return this.getAmbientOcclusionLight(world, BlockPos.pooled(x, y, z)); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return super.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { + return this.hasSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return super.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { + return this.hasDirectSignal(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Direction.byData3d(dir)); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return super.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + @Deprecated + public Box getOutlineShape(World world, int x, int y, int z) { + return this.getOutlineShape(world, BlockPos.pooled(x, y, z)); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return super.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { + return this.shouldRenderFace(world, BlockPos.pooled(x, y, z), Direction.byData3d(face)); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return super.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Override + @Deprecated + public Box getCollisionShape(World world, int x, int y, int z) { + return this.getCollisionShape(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return super.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { + this.addCollisions(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), shape, collisions); + } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + super.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Override + @Deprecated + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { + return this.rayTrace(world, BlockPos.pooled(x, y, z), from, to); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return super.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Override + @Deprecated + public boolean canBePlaced(World world, int x, int y, int z) { + return this.canBePlaced(world, BlockPos.pooled(x, y, z)); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return super.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void doEvent(World world, int x, int y, int z, int type, int data) { + this.doEvent(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), type, data); + } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + super.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Override + @Deprecated + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { + this.neighborChanged(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), Block.BY_ID[neighborBlock]); + } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + super.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Override + @Deprecated + public void onAdded(World world, int x, int y, int z) { + this.onAdded(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z)); + } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + super.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void onRemoved(World world, int x, int y, int z) { + this.onRemoved(world, BlockPos.pooled(x, y, z), this.defaultState()); // TODO: is this ok? or should the BlockState arg just be removed? + } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + super.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Override + @Deprecated + public void tick(World world, int x, int y, int z, Random random) { + this.tick(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), random); + } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + super.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Override + @Deprecated + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { + this.onEntityCollision(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), entity); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + super.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Override + // Block::dropItems(World, int, int, int, int, int) is final! + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Override + @Deprecated + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { + this.dropItems(world, BlockPos.pooled(x, y, z), this.getStateFromMetadata(metadata), luck, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + super.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Override + @Deprecated + public boolean use(World world, int x, int y, int z, PlayerEntity player) { + return this.use(world, BlockPos.pooled(x, y, z), world.getBlockState(x, y, z), player); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return super.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Override + @Deprecated + public void startMining(World world, int x, int y, int z, PlayerEntity player) { + this.startMining(world, BlockPos.pooled(x, y, z), player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + super.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java new file mode 100644 index 000000000..eece91381 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockBehaviors.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.world.World; + +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface BlockBehaviors { + + void doEvent(World world, BlockPos pos, int type, int data); + + void neighborChanged(World world, BlockPos pos, Block neighborBlock); + + void onAdded(World world, BlockPos pos); + + void onRemoved(World world, BlockPos pos); + + void tick(World world, BlockPos pos, Random random); + + void onEntityCollision(World world, BlockPos pos, Entity entity); + + void dropItems(World world, BlockPos pos, int fortuneLevel); + + void dropItems(World world, BlockPos pos, float luck, int fortuneLevel); + + boolean use(World world, BlockPos pos, PlayerEntity player); + + void startMining(World world, BlockPos pos, PlayerEntity player); + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java new file mode 100644 index 000000000..cc766b60a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockProperties.java @@ -0,0 +1,79 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import java.util.List; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockProperties { + + Material getMaterial(); + + int getOpacity(); + + int getLight(); + + boolean isTranslucent(); + + boolean isAir(); + + boolean ticksRandomly(); + + boolean updateClients(); + + boolean usesNeighborLight(); + + MapColor getMapColor(); + + boolean isCube(); + + int getRenderType(); + + int getColor(); + + int getColorTint(WorldView world, BlockPos pos); + + int getSprite(Direction face); + + int getLightColor(WorldView world, BlockPos pos); + + float getAmbientOcclusionLight(WorldView world, BlockPos pos); + + boolean isSignalSource(); + + boolean hasSignal(WorldView world, BlockPos pos, Direction dir); + + float getMiningTime(); + + float getMiningSpeed(PlayerEntity player); + + boolean hasDirectSignal(World world, BlockPos pos, Direction dir); + + int getPistonMoveBehavior(); + + BlockState resolveVirtualProperties(WorldView world, BlockPos pos); + + Box getOutlineShape(World world, BlockPos pos); + + boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face); + + boolean isSolidRender(); + + Box getCollisionShape(World world, BlockPos pos); + + void addCollisions(World world, BlockPos pos, Box shape, List collisions); + + HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to); + + boolean canBePlaced(World world, BlockPos pos); + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java new file mode 100644 index 000000000..19ada172f --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/block/state/BlockState.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.api.block.state; + +import net.minecraft.block.Block; + +import net.ornithemc.osl.blockstates.api.state.State; + +public interface BlockState extends State, BlockProperties, BlockBehaviors { + + Block getBlock(); + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java new file mode 100644 index 000000000..91b038d8b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldChunkExtension.java @@ -0,0 +1,16 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtension { + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + BlockState setBlockState(BlockPos pos, BlockState state); + + BlockState setBlockState(int x, int y, int z, BlockState state); + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java new file mode 100644 index 000000000..3b6a68d94 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldExtension.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtension extends WorldViewExtension { + + int WORLD_RADIUS = 30000000; + + WorldChunk getChunk(BlockPos pos); + + boolean setBlockState(BlockPos pos, BlockState state, boolean notify); + + boolean setBlockState(int x, int y, int z, BlockState state, boolean notify); + + static boolean isInsideWorld(BlockPos pos) { + return isInsideWorld(pos.x(), pos.y(), pos.z()); + } + + static boolean isInsideWorld(int x, int y, int z) { + return x >= -WORLD_RADIUS && x < WORLD_RADIUS && z >= -WORLD_RADIUS && z < WORLD_RADIUS && y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java new file mode 100644 index 000000000..721f0eef0 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/api/world/WorldViewExtension.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.blockstates.api.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtension { + + int WORLD_MIN_Y = 0; + int WORLD_MAX_Y = 127; + + BlockState getBlockState(BlockPos pos); + + BlockState getBlockState(int x, int y, int z); + + static boolean isInsideWorldHeight(BlockPos pos) { + return isInsideWorldHeight(pos.y()); + } + + static boolean isInsideWorldHeight(int y) { + return y >= WORLD_MIN_Y && y <= WORLD_MAX_Y; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java new file mode 100644 index 000000000..5e4885a18 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/AirBlock.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; + +public class AirBlock extends Block { + + public AirBlock(int id) { + super(id, Material.AIR); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.defaultState(); + } + + @Override + public int getMetadataFromState(BlockState state) { + return 0; + } + + @Override + public boolean isAir() { + return true; + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public Box getCollisionShape(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isSolidRender() { + return false; + } + + @Override + public boolean canRayTrace(int metadata, boolean allowLiquids) { + return false; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java new file mode 100644 index 000000000..a2a202ac1 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl.java @@ -0,0 +1,182 @@ +package net.ornithemc.osl.blockstates.impl.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public interface BlockExtensionImpl extends BlockExtension { + + @Override + default void buildStateDefinition(StateDefinition.Builder builder) { + throw new AbstractMethodError(); + } + + @Override + default StateDefinition stateDefinition() { + throw new AbstractMethodError(); + } + + @Override + default void setDefaultState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState defaultState() { + throw new AbstractMethodError(); + } + + @Override + default BlockState getStateFromMetadata(int metadata) { + throw new AbstractMethodError(); + } + + @Override + default int getMetadataFromState(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default boolean is(Block block) { + throw new AbstractMethodError(); + } + + @Override + default boolean isAir() { + throw new AbstractMethodError(); + } + + @Override + default int getColor(BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default int getColorTint(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default int getSprite(BlockState state, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default int getLightColor(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + throw new AbstractMethodError(); + } + + @Override + default BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default Box getOutlineShape(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + throw new AbstractMethodError(); + } + + @Override + default Box getCollisionShape(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + throw new AbstractMethodError(); + } + + @Override + default HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + throw new AbstractMethodError(); + } + + @Override + default boolean canBePlaced(World world, BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + throw new AbstractMethodError(); + } + + @Override + default void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + throw new AbstractMethodError(); + } + + @Override + default void onAdded(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void onRemoved(World world, BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default void tick(World world, BlockPos pos, BlockState state, Random random) { + throw new AbstractMethodError(); + } + + @Override + default void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + throw new AbstractMethodError(); + } + + @Override + default boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + throw new AbstractMethodError(); + } + + @Override + default void startMining(World world, BlockPos pos, PlayerEntity player) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java new file mode 100644 index 000000000..ace90b7cd --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/block/state/BlockStateImpl.java @@ -0,0 +1,239 @@ +package net.ornithemc.osl.blockstates.impl.block.state; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.AbstractState; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +public class BlockStateImpl extends AbstractState implements BlockState { + + public BlockStateImpl(Block owner, Property[] properties, Comparable[] values, State[][] neighbors) { + super(owner, properties, values, neighbors); + } + + @Override + public Block getBlock() { + return this.owner; + } + + @Override + public boolean is(Block block) { + return this.owner.is(block); + } + + @Override + public Material getMaterial() { + return this.owner.material; + } + + @Override + public int getOpacity() { + return Block.OPACITIES[this.owner.id]; + } + + @Override + public int getLight() { + return Block.LIGHT[this.owner.id]; + } + + @Override + public boolean isTranslucent() { + return Block.IS_TRANSLUCENT[this.owner.id]; + } + + @Override + public boolean isAir() { + return this.owner.isAir(); + } + + @Override + public boolean ticksRandomly() { + return Block.TICKS_RANDOMLY[this.owner.id]; + } + + @Override + public boolean updateClients() { + return Block.UPDATE_CLIENTS[this.owner.id]; + } + + @Override + public boolean usesNeighborLight() { + return Block.USES_NEIGHBOR_LIGHT[this.owner.id]; + } + + @Override + public MapColor getMapColor() { + return this.owner.material.color; + } + + @Override + public boolean isCube() { + return this.owner.isCube(); + } + + @Override + public int getRenderType() { + return this.owner.getRenderType(); + } + + @Override + public int getColor() { + return this.owner.getColor(this); + } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.owner.getColorTint(world, pos); + } + + @Override + public int getSprite(Direction face) { + return this.owner.getSprite(this, face); + } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.owner.getLightColor(world, pos); + } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.owner.getAmbientOcclusionLight(world, pos); + } + + @Override + public boolean isSignalSource() { + return this.owner.isSignalSource(); + } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, Direction dir) { + return this.owner.hasSignal(world, pos, this, dir); + } + + @Override + public float getMiningTime() { + return this.owner.getMiningTime(); + } + + @Override + public float getMiningSpeed(PlayerEntity player) { + return this.owner.getMiningSpeed(player); + } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, Direction dir) { + return this.owner.hasDirectSignal(world, pos, this, dir); + } + + @Override + public int getPistonMoveBehavior() { + return this.owner.getPistonMoveBehavior(); + } + + @Override + public BlockState resolveVirtualProperties(WorldView world, BlockPos pos) { + return this.owner.resolveVirtualProperties(this, world, pos); + } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.owner.getOutlineShape(world, pos); + } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.owner.shouldRenderFace(world, pos, face); + } + + @Override + public boolean isSolidRender() { + return this.owner.isSolidRender(); + } + + @Override + public Box getCollisionShape(World world, BlockPos pos) { + return this.owner.getCollisionShape(world, pos, this); + } + + @Override + public void addCollisions(World world, BlockPos pos, Box shape, List collisions) { + this.owner.addCollisions(world, pos, this, shape, collisions); + } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.owner.rayTrace(world, pos, from, to); + } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.owner.canBePlaced(world, pos); + } + + @Override + public void doEvent(World world, BlockPos pos, int type, int data) { + this.owner.doEvent(world, pos, this, type, data); + } + + @Override + public void neighborChanged(World world, BlockPos pos, Block neighborBlock) { + this.owner.neighborChanged(world, pos, this, neighborBlock); + } + + @Override + public void onAdded(World world, BlockPos pos) { + this.owner.onAdded(world, pos, this); + } + + @Override + public void onRemoved(World world, BlockPos pos) { + this.owner.onRemoved(world, pos, this); + } + + @Override + public void tick(World world, BlockPos pos, Random random) { + this.owner.tick(world, pos, this, random); + } + + @Override + public void onEntityCollision(World world, BlockPos pos, Entity entity) { + this.owner.onEntityCollision(world, pos, this, entity); + } + + @Override + public void dropItems(World world, BlockPos pos, int fortuneLevel) { + this.owner.dropItems(world, pos, this, fortuneLevel); + } + + @Override + public void dropItems(World world, BlockPos pos, float luck, int fortuneLevel) { + this.owner.dropItems(world, pos, this, luck, fortuneLevel); + } + + @Override + public boolean use(World world, BlockPos pos, PlayerEntity player) { + return this.owner.use(world, pos, this, player); + } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.owner.startMining(world, pos, player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java new file mode 100644 index 000000000..1bd3ad7e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/client/WorldRegionMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldRegion; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "isAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java new file mode 100644 index 000000000..e35b4b5db --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/BlockMixin.java @@ -0,0 +1,307 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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 net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.mob.player.PlayerEntity; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.HitResult; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.block.BlockExtension; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.impl.block.state.BlockStateImpl; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.api.util.math.BlockPos; +import net.ornithemc.osl.core.api.util.math.Direction; + +@Mixin(Block.class) +public class BlockMixin implements BlockExtension { + + @Unique + private StateDefinition stateDefinition; + @Unique + private BlockState defaultState; + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private static void osl$blockstates$registerBlockStates(CallbackInfo ci) { + for (int blockId = 0; blockId < Block.BY_ID.length; blockId++) { + Block block = Block.BY_ID[blockId]; + + if (block != null) { + for (BlockState state : block.stateDefinition().all()) { + int metadata = block.getMetadataFromState(state); + int stateId = blockId << 4 | metadata; + + Block.STATE_REGISTRY.put(state, stateId); + } + } + } + } + + @Inject( + method = "", + at = @At( + value = "TAIL" + ) + ) + private void osl$blockstates$createStateDefinition(CallbackInfo ci) { + StateDefinition.Builder stateDefinition = new StateDefinitionImpl.Builder<>((Block) (Object) this); + this.buildStateDefinition(stateDefinition); + + this.stateDefinition = stateDefinition.build(BlockStateImpl::new); + this.defaultState = this.stateDefinition.any(); + } + + @Override + public void buildStateDefinition(StateDefinition.Builder builder) { + // add data_value property by default, this ensures block/metadata + // can always be converted to block states even for blocks that do + // not define their properties properly + if (!this.isAir()) { + builder.add(DATA_VALUE); + } + } + + @Override + public StateDefinition stateDefinition() { + return this.stateDefinition; + } + + @Override + public void setDefaultState(BlockState state) { + this.defaultState = state; + } + + @Override + public BlockState defaultState() { + return this.defaultState; + } + + @Override + public BlockState getStateFromMetadata(int metadata) { + return this.isAir() ? this.defaultState : this.defaultState.set(DATA_VALUE, metadata); + } + + @Override + public int getMetadataFromState(BlockState state) { + return this.isAir() ? 0 : state.get(DATA_VALUE); + } + + @Override + public boolean is(Block block) { + return this == (Object) block; + } + + @Override + public boolean isAir() { + return false; + } + + @Shadow + public int getColor(int metadata) { return 0; } + + @Override + public int getColor(BlockState state) { + return this.getColor(this.getMetadataFromState(state)); + } + + @Shadow + public int getColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getColorTint(WorldView world, BlockPos pos) { + return this.getColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public int getSprite(int face, int metadata) { return 0; } + + @Override + public int getSprite(BlockState state, Direction face) { + return this.getSprite(face.data3d(), this.getMetadataFromState(state)); + } + + @Shadow + public int getLightColor(WorldView world, int x, int y, int z) { return 0; } + + @Override + public int getLightColor(WorldView world, BlockPos pos) { + return this.getLightColor(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public float getAmbientOcclusionLight(WorldView world, int x, int y, int z) { return 0.0F; } + + @Override + public float getAmbientOcclusionLight(WorldView world, BlockPos pos) { + return this.getAmbientOcclusionLight(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean hasSignal(WorldView world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasSignal(WorldView world, BlockPos pos, BlockState state, Direction dir) { + return this.hasSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Shadow + public boolean hasDirectSignal(World world, int x, int y, int z, int dir) { return false; } + + @Override + public boolean hasDirectSignal(World world, BlockPos pos, BlockState state, Direction dir) { + return this.hasDirectSignal(world, pos.x(), pos.y(), pos.z(), dir.data3d()); + } + + @Override + public BlockState resolveVirtualProperties(BlockState state, WorldView world, BlockPos pos) { + return state; + } + + @Shadow + public Box getOutlineShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getOutlineShape(World world, BlockPos pos) { + return this.getOutlineShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public boolean shouldRenderFace(WorldView world, int x, int y, int z, int face) { return false; } + + @Override + public boolean shouldRenderFace(WorldView world, BlockPos pos, Direction face) { + return this.shouldRenderFace(world, pos.x(), pos.y(), pos.z(), face.data3d()); + } + + @Shadow + public Box getCollisionShape(World world, int x, int y, int z) { return null; } + + @Override + public Box getCollisionShape(World world, BlockPos pos, BlockState state) { + return this.getCollisionShape(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void addCollisions(World world, int x, int y, int z, Box shape, ArrayList collisions) { } + + @Override + public void addCollisions(World world, BlockPos pos, BlockState state, Box shape, List collisions) { + this.addCollisions(world, pos.x(), pos.y(), pos.z(), shape, collisions instanceof ArrayList ? (ArrayList) collisions : new ArrayList<>(collisions)); + } + + @Shadow + public HitResult rayTrace(World world, int x, int y, int z, Vec3d from, Vec3d to) { return null; } + + @Override + public HitResult rayTrace(World world, BlockPos pos, Vec3d from, Vec3d to) { + return this.rayTrace(world, pos.x(), pos.y(), pos.z(), from, to); + } + + @Shadow + public boolean canBePlaced(World world, int x, int y, int z) { return false; } + + @Override + public boolean canBePlaced(World world, BlockPos pos) { + return this.canBePlaced(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void doEvent(World world, int x, int y, int z, int type, int data) { } + + @Override + public void doEvent(World world, BlockPos pos, BlockState state, int type, int data) { + this.doEvent(world, pos.x(), pos.y(), pos.z(), type, data); + } + + @Shadow + public void neighborChanged(World world, int x, int y, int z, int neighborBlock) { } + + @Override + public void neighborChanged(World world, BlockPos pos, BlockState state, Block neighborBlock) { + this.neighborChanged(world, pos.x(), pos.y(), pos.z(), neighborBlock.id); + } + + @Shadow + public void onAdded(World world, int x, int y, int z) { } + + @Override + public void onAdded(World world, BlockPos pos, BlockState state) { + this.onAdded(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void onRemoved(World world, int x, int y, int z) { } + + @Override + public void onRemoved(World world, BlockPos pos, BlockState state) { + this.onRemoved(world, pos.x(), pos.y(), pos.z()); + } + + @Shadow + public void tick(World world, int x, int y, int z, Random random) { } + + @Override + public void tick(World world, BlockPos pos, BlockState state, Random random) { + this.tick(world, pos.x(), pos.y(), pos.z(), random); + } + + @Shadow + public void onEntityCollision(World world, int x, int y, int z, Entity entity) { } + + @Override + public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { + this.onEntityCollision(world, pos.x(), pos.y(), pos.z(), entity); + } + + @Shadow + public final void dropItems(World world, int x, int y, int z, int metadata, int fortuneLevel) { } + + @Override + public final void dropItems(World world, BlockPos pos, BlockState state, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), fortuneLevel); + } + + @Shadow + public void dropItems(World world, int x, int y, int z, int metadata, float luck, int fortuneLevel) { } + + @Override + public void dropItems(World world, BlockPos pos, BlockState state, float luck, int fortuneLevel) { + this.dropItems(world, pos.x(), pos.y(), pos.z(), this.getMetadataFromState(state), luck, fortuneLevel); + } + + @Shadow + public boolean use(World world, int x, int y, int z, PlayerEntity player) { return false; } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player) { + return this.use(world, pos.x(), pos.y(), pos.z(), player); + } + + @Shadow + public void startMining(World world, int x, int y, int z, PlayerEntity player) { } + + @Override + public void startMining(World world, BlockPos pos, PlayerEntity player) { + this.startMining(world, pos.x(), pos.y(), pos.z(), player); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java new file mode 100644 index 000000000..c6be030a9 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RedstoneTorchBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RedstoneTorchBlock; +import net.minecraft.block.material.Material; + +@Mixin(RedstoneTorchBlock.class) +public class RedstoneTorchBlockMixin extends Block { + + private RedstoneTorchBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REDSTONE_TORCH || block == Block.UNLIT_REDSTONE_TORCH; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java new file mode 100644 index 000000000..15af6eb8c --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/RepeaterBlockMixin.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.material.Material; + +@Mixin(RepeaterBlock.class) +public class RepeaterBlockMixin extends Block { + + private RepeaterBlockMixin(int id, Material material) { + super(id, material); + } + + @Override + public boolean is(Block block) { + return block == Block.REPEATER || block == Block.POWERED_REPEATER; + } + +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java new file mode 100644 index 000000000..c63359f2a --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldChunkMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.block.Block; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldChunk.class) +public class WorldChunkMixin implements WorldChunkExtension { + + @Shadow + private int getBlockAt(int localX, int y, int localZ) { return 0; } + @Shadow + private int getBlockMetadataAt(int localX, int y, int localZ) { return 0; } + @Shadow + private boolean setBlockWithMetadataAt(int localX, int y, int localZ, int block, int metadata) { return false; } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = Block.BY_ID[this.getBlockAt(localX, y, localZ)]; + int metadata = this.getBlockMetadataAt(localX, y, localZ); + + return block.getStateFromMetadata(metadata); + } + + @Override + public BlockState setBlockState(BlockPos pos, BlockState state) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state) { + BlockState oldState = this.getBlockState(x, y, z); + + int localX = x & 0xF; + int localZ = z & 0xF; + + Block block = state.getBlock(); + int metadata = block.getMetadataFromState(state); + + if (this.setBlockWithMetadataAt(localX, y, localZ, block.id, metadata)) { + return oldState; + } else { + return null; + } + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java new file mode 100644 index 000000000..66793a6e3 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldMixin.java @@ -0,0 +1,102 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import net.minecraft.block.Block; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(World.class) +public class WorldMixin implements WorldExtension { + + @Shadow + private boolean isMultiplayer; + + @Shadow + private WorldChunk getChunk(int x, int z) { return null; } + @Shadow + private void checkLight(int x, int y, int z) { } + @Shadow + private void onBlockChanged(int x, int y, int z, int block) { } + @Shadow + private void updateNeighbors(int x, int y, int z, int block) { } + + @ModifyVariable( + method = "canPlace", + ordinal = 0, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/Block;getCollisionShape(Lnet/minecraft/world/World;III)Lnet/minecraft/util/math/Box;" + ) + ) + private Block osl$blockstates$makeAirReplaceable(Block block) { + return block == Blocks.AIR ? null : block; + } + + @Override + public WorldChunk getChunk(BlockPos pos) { + return this.getChunk(pos.x(), pos.z()); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return Blocks.AIR.defaultState(); + } + + WorldChunk chunk = this.getChunk(x, z); + return chunk.getBlockState(x, y, z); + } + + @Override + public boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + return this.setBlockState(pos.x(), pos.y(), pos.z(), state, notify); + } + + @Override + public boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + if (!WorldExtension.isInsideWorld(x, y, z)) { + return false; + } + + WorldChunk chunk = this.getChunk(x, z); + BlockState replaced = chunk.setBlockState(x, y, z, state); + + if (replaced == null) { + return false; + } + + Block block = state.getBlock(); + Block replacedBlock = replaced.getBlock(); + + if (!state.is(replacedBlock)) { + Profiler.push("checkLight"); + this.checkLight(x, y, z); + Profiler.pop(); + } + + if (!this.isMultiplayer && notify) { + if (!state.is(replacedBlock) || state.updateClients()) { + this.onBlockChanged(x, y, z, block.id); + } else { + this.updateNeighbors(x, y, z, block.id); + } + } + + return true; + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java new file mode 100644 index 000000000..de0bf5f3b --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldRegionMixin.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldRegion; +import net.minecraft.world.chunk.WorldChunk; + +import net.ornithemc.osl.blockstates.api.block.Blocks; +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +@Mixin(WorldRegion.class) +public class WorldRegionMixin implements WorldViewExtension { + + @Shadow + private int chunkX; + @Shadow + private int chunkZ; + @Shadow + private WorldChunk[][] chunks; + + @Override + public BlockState getBlockState(BlockPos pos) { + return this.getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + if (WorldViewExtension.isInsideWorldHeight(y)) { + int indexX = (x >> 4) - this.chunkX; + int indexZ = (z >> 4) - this.chunkZ; + + if (indexX >= 0 && indexX < this.chunks.length && indexZ >= 0 && indexZ < this.chunks[indexX].length) { + WorldChunk chunk = this.chunks[indexX][indexZ]; + + if (chunk != null) { + return chunk.getBlockState(x, y, z); + } + } + } + + return Blocks.AIR.defaultState(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java new file mode 100644 index 000000000..6b7dd3088 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/common/WorldViewMixin.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.blockstates.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.WorldView; + +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; + +@Mixin(WorldView.class) +public interface WorldViewMixin extends WorldViewExtension { +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java new file mode 100644 index 000000000..2cec459e6 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/mixin/server/WorldMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.blockstates.impl.mixin.server; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +@Mixin(World.class) +public class WorldMixin { + + @Definition( + id = "block", + local = @Local( + type = Block.class + ) + ) + @Expression("block != null") + @WrapOperation( + method = "containsNonAir", + at = @At( + value = "MIXINEXTRAS:EXPRESSION" + ) + ) + private boolean osl$blockstates$fixNotAirCheck(Object block, Object _null, Operation op) { + return op.call(block, _null) && !((Block) block).isAir(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java new file mode 100644 index 000000000..3bb2a2579 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldChunkExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldChunkExtensionImpl extends WorldChunkExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(BlockPos pos, BlockState state) { + throw new AbstractMethodError(); + } + + @Override + default BlockState setBlockState(int x, int y, int z, BlockState state) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java new file mode 100644 index 000000000..56afdb5f4 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldExtensionImpl extends WorldViewExtensionImpl, WorldExtension { + + @Override + default boolean setBlockState(BlockPos pos, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } + + @Override + default boolean setBlockState(int x, int y, int z, BlockState state, boolean notify) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java new file mode 100644 index 000000000..5c307f813 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/java/net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.blockstates.impl.world; + +import net.ornithemc.osl.blockstates.api.block.state.BlockState; +import net.ornithemc.osl.blockstates.api.world.WorldViewExtension; +import net.ornithemc.osl.core.api.util.math.BlockPos; + +public interface WorldViewExtensionImpl extends WorldViewExtension { + + @Override + default BlockState getBlockState(BlockPos pos) { + throw new AbstractMethodError(); + } + + @Override + default BlockState getBlockState(int x, int y, int z) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/fabric.mod.json b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..01cccc223 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/fabric.mod.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "id": "osl-blockstates", + "version": "0.1.0-alpha.1+mcb1.9-pre4-mc12w03a", + "environment": "*", + "mixins": [ + "osl.blockstates.mixins.json" + ], + "accessWidener": "osl.blockstates.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.0.0-beta.9.0.4 \u003c\u003d1.2-alpha.12.3.a", + "osl-core": "\u003e\u003d0.8.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0" + }, + "name": "OSL Block States", + "description": "Block States API.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/osl.blockstates.classtweaker b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/osl.blockstates.classtweaker new file mode 100644 index 000000000..bcc6e4d44 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/osl.blockstates.classtweaker @@ -0,0 +1,6 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/block/Block net/ornithemc/osl/blockstates/impl/block/BlockExtensionImpl +transitive-inject-interface net/minecraft/world/WorldView net/ornithemc/osl/blockstates/impl/world/WorldViewExtensionImpl +transitive-inject-interface net/minecraft/world/World net/ornithemc/osl/blockstates/impl/world/WorldExtensionImpl +transitive-inject-interface net/minecraft/world/chunk/WorldChunk net/ornithemc/osl/blockstates/impl/world/WorldChunkExtensionImpl \ No newline at end of file diff --git a/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/osl.blockstates.mixins.json b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/osl.blockstates.mixins.json new file mode 100644 index 000000000..607d708a5 --- /dev/null +++ b/libraries/blockstates/blockstates-mcb1.9-pre4-mc12w03a/src/main/resources/osl.blockstates.mixins.json @@ -0,0 +1,27 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.blockstates.impl.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "common.BlockMixin", + "common.RedstoneTorchBlockMixin", + "common.RepeaterBlockMixin", + "common.WorldChunkMixin", + "common.WorldMixin", + "common.WorldRegionMixin", + "common.WorldViewMixin" + ], + "client": [ + "client.WorldRegionMixin" + ], + "server": [ + "server.WorldMixin", + ], + "injectors": { + "defaultRequire": 1 + }, + "mixinextras": { + "minVersion": "0.5.0" + } +} diff --git a/libraries/blockstates/build.gradle b/libraries/blockstates/build.gradle new file mode 100644 index 000000000..b002c64b6 --- /dev/null +++ b/libraries/blockstates/build.gradle @@ -0,0 +1,5 @@ +setUpLibrary(project) + +dependencies { + implementation 'com.google.guava:guava:17.0' +} \ No newline at end of file diff --git a/libraries/blockstates/gradle.properties b/libraries/blockstates/gradle.properties new file mode 100644 index 000000000..3b992aaaf --- /dev/null +++ b/libraries/blockstates/gradle.properties @@ -0,0 +1,6 @@ +library_id = blockstates +library_name = Block States +library_description = Block States API. +library_version = 0.1.0-alpha.1 + +osl_dependencies = core:0.7.0,registries:0.1.0 diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/State.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/State.java new file mode 100644 index 000000000..c4c929e36 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/State.java @@ -0,0 +1,26 @@ +package net.ornithemc.osl.blockstates.api.state; + +import java.util.Collection; + +import net.ornithemc.osl.blockstates.api.state.property.Property; + +public interface State> { + + boolean is(O o); + + Collection> properties(); + + > boolean has(Property property); + + > T get(Property property); + + , V extends T> S set(Property property, V value); + + > S cycle(Property property); + + interface Factory> { + + S buildState(O owner, Property[] properties, Comparable[] values, State[][] neighbors); + + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/StateDefinition.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/StateDefinition.java new file mode 100644 index 000000000..58b5ccadf --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/StateDefinition.java @@ -0,0 +1,27 @@ +package net.ornithemc.osl.blockstates.api.state; + +import java.util.Collection; +import java.util.List; + +import net.ornithemc.osl.blockstates.api.state.property.Property; + +public interface StateDefinition> { + + O owner(); + + List all(); + + S any(); + + Collection> properties(); + + Property getProperty(String name); + + interface Builder> { + + Builder add(Property... properties); + + StateDefinition build(State.Factory factory); + + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/AbstractProperty.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/AbstractProperty.java new file mode 100644 index 000000000..1848eaf85 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/AbstractProperty.java @@ -0,0 +1,46 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +public abstract class AbstractProperty> implements Property { + + private final Class type; + private final String name; + + protected AbstractProperty(String name, Class type) { + this.type = type; + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (this.getClass() != o.getClass()) { + return false; + } + + @SuppressWarnings("rawtypes") + AbstractProperty that = (AbstractProperty) o; + return this.type.equals(that.type) && this.name.equals(that.name); + } + + @Override + public int hashCode() { + return 31 * this.type.hashCode() + this.name.hashCode(); + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "[name: " + this.name + ", type: " + this.type + ", values: " + this.values() + "]"; + } + + @Override + public Class getType() { + return this.type; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/BooleanProperty.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/BooleanProperty.java new file mode 100644 index 000000000..23895757b --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/BooleanProperty.java @@ -0,0 +1,39 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BooleanProperty extends AbstractProperty { + + public static BooleanProperty of(String name) { + return new BooleanProperty(name); + } + + private final List values; + + private BooleanProperty(String name) { + super(name, Boolean.class); + + List values = new ArrayList<>(2); + values.add(Boolean.TRUE); + values.add(Boolean.FALSE); + + this.values = Collections.unmodifiableList(values); + } + + @Override + public List values() { + return this.values; + } + + @Override + public String getName(Boolean value) { + return value.toString(); + } + + @Override + public int indexOf(Boolean value) { + return value ? 0 : 1; + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/DirectionProperty.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/DirectionProperty.java new file mode 100644 index 000000000..5f435bf49 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/DirectionProperty.java @@ -0,0 +1,31 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +import java.util.Arrays; +import java.util.Collection; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import net.ornithemc.osl.core.api.util.math.Direction; + +public class DirectionProperty extends EnumProperty { + + public static DirectionProperty of(String name) { + return of(name, dir -> true); + } + + public static DirectionProperty of(String name, Predicate filter) { + return of(name, Arrays.stream(Direction.VALUES).filter(filter).collect(Collectors.toList())); + } + + public static DirectionProperty of(String name, Direction... directions) { + return of(name, Arrays.asList(directions)); + } + + public static DirectionProperty of(String name, Collection directions) { + return new DirectionProperty(name, directions); + } + + private DirectionProperty(String name, Collection directions) { + super(name, Direction.class, directions); + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/EnumProperty.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/EnumProperty.java new file mode 100644 index 000000000..4e3a421f7 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/EnumProperty.java @@ -0,0 +1,104 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class EnumProperty> extends AbstractProperty { + + public static & StringSerializable> EnumProperty of(String name, Class type) { + return of(name, type, value -> true); + } + + public static & StringSerializable> EnumProperty of(String name, Class type, Predicate filter) { + return of(name, type, Arrays.asList(type.getEnumConstants()), filter); + } + + @SafeVarargs + public static & StringSerializable> EnumProperty of(String name, Class type, T... values) { + return of(name, type, Arrays.asList(values)); + } + + public static & StringSerializable> EnumProperty of(String name, Class type, Collection values) { + return of(name, type, values, value -> true); + } + + private static & StringSerializable> EnumProperty of(String name, Class type, Collection values, Predicate filter) { + values = values.stream() + .filter(filter) + .collect(Collectors.toList()); + + return new EnumProperty<>(name, type, StringSerializable::serializeName, values); + } + + private final Function serializer; + private final List values; + private final Map valuesByName; + private final int[] valueIndices; + + protected EnumProperty(String name, Class type, Collection values) { + this(name, type, T::toString, values); + } + + protected EnumProperty(String name, Class type, Function serializer, Collection values) { + super(name, type); + + this.serializer = serializer; + this.values = Collections.unmodifiableList(new ArrayList<>(values)); + this.valuesByName = new HashMap<>(); + this.valueIndices = new int[values.size()]; + + for (T value : values) { + String valueName = serializer.apply(value); + if (this.valuesByName.containsKey(valueName)) { + throw new IllegalArgumentException("Multiple values have the same name '" + valueName + "'"); + } + + this.valuesByName.put(valueName, value); + } + for (T value : type.getEnumConstants()) { + this.valueIndices[value.ordinal()] = this.values.indexOf(value); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EnumProperty)) { + return false; + } + + @SuppressWarnings("rawtypes") + EnumProperty that = (EnumProperty) o; + return super.equals(o) && this.values.equals(that.values); + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + this.values.hashCode(); + } + + @Override + public List values() { + return this.values; + } + + @Override + public String getName(T value) { + return this.serializer.apply(value); + } + + @Override + public int indexOf(T value) { + return this.valueIndices[value.ordinal()]; + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/IntegerProperty.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/IntegerProperty.java new file mode 100644 index 000000000..c28024e16 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/IntegerProperty.java @@ -0,0 +1,69 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class IntegerProperty extends AbstractProperty { + + public static IntegerProperty of(String name, int min, int max) { + return new IntegerProperty(name, min, max); + } + + private final int min; + private final int max; + private final List values; + + private IntegerProperty(String name, int min, int max) { + super(name, Integer.class); + + if (min < 0) { + throw new IllegalArgumentException("Min value of " + name + " must be 0 or greater"); + } + if (max <= min) { + throw new IllegalArgumentException("Max value of " + name + " must be greater than min (" + min + ")"); + } + + List values = new ArrayList<>(max - min + 1); + for (int value = min; value <= max; value++) { + values.add(value); + } + + this.min = min; + this.max = max; + this.values = Collections.unmodifiableList(values); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EnumProperty)) { + return false; + } + + IntegerProperty that = (IntegerProperty) o; + return super.equals(o) && this.values.equals(that.values); + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + this.values.hashCode(); + } + + @Override + public List values() { + return this.values; + } + + @Override + public String getName(Integer value) { + return value.toString(); + } + + @Override + public int indexOf(Integer value) { + return value >= this.min && value <= this.max ? value - this.min : -1; + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/Property.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/Property.java new file mode 100644 index 000000000..1b3744322 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/Property.java @@ -0,0 +1,26 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +import java.util.List; + +public interface Property> { + + Class getType(); + + String getName(); + + List values(); + + String getName(T value); + + int indexOf(T value); + + @SuppressWarnings("unchecked") + static > String getName(Property property, Comparable value) { + return property.getName((T) value); + } + + @SuppressWarnings("unchecked") + static > int indexOf(Property property, Comparable value) { + return property.indexOf((T) value); + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/StringSerializable.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/StringSerializable.java new file mode 100644 index 000000000..edd75db83 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/api/state/property/StringSerializable.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.blockstates.api.state.property; + +public interface StringSerializable { + + String serializeName(); + +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/impl/state/AbstractState.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/impl/state/AbstractState.java new file mode 100644 index 000000000..e66f8137b --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/impl/state/AbstractState.java @@ -0,0 +1,113 @@ +package net.ornithemc.osl.blockstates.impl.state; + +import java.util.Arrays; +import java.util.Collection; + +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.property.Property; + +public abstract class AbstractState> implements State { + + protected final O owner; + + private final Property[] properties; + private final Comparable[] values; + private final S[][] neighbors; + + @SuppressWarnings("unchecked") + protected AbstractState(O owner, Property[] properties, Comparable[] values, State[][] neighbors) { + this.owner = owner; + this.properties = properties; + this.values = values; + this.neighbors = (S[][]) neighbors; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append(this.owner); + if (this.properties.length > 0) { + sb.append('['); + for (int i = 0; i < this.properties.length; i++) { + Property property = this.properties[i]; + Comparable value = this.values[i]; + + if (i > 0) { + sb.append(','); + } + sb.append(property.getName()); + sb.append('='); + sb.append(Property.getName(property, value)); + } + sb.append(']'); + } + + return sb.toString(); + } + + @Override + public Collection> properties() { + return Arrays.asList(this.properties); + } + + private int indexOf(Property property) { + for (int i = 0; i < this.properties.length; i++) { + if (property == this.properties[i]) { + return i; + } + } + + return -1; + } + + @Override + public > boolean has(Property property) { + return this.indexOf(property) != -1; + } + + @Override + public > T get(Property property) { + int index = this.indexOf(property); + + if (index == -1) { + throw new IllegalArgumentException("Cannot get property " + property + " as it does not exist in " + this.owner); + } else { + return property.getType().cast(this.values[index]); + } + } + + @Override + public , V extends T> S set(Property property, V value) { + int index = this.indexOf(property); + + if (index == -1) { + throw new IllegalArgumentException("Cannot set property " + property + " as it does not exist in " + this.owner); + } + + int valueIndex = property.indexOf(value); + + if (valueIndex == -1) { + throw new IllegalArgumentException("Cannot set property " + property + " to " + value + " on " + this.owner + ", it is not an allowed value"); + } + + return this.neighbors[index][valueIndex]; + } + + @Override + public > S cycle(Property property) { + int index = this.indexOf(property); + + if (index == -1) { + throw new IllegalArgumentException("Cannot set property " + property + " as it does not exist in " + this.owner); + } + + int valueIndex = property.indexOf(this.get(property)) + 1; + + if (valueIndex >= this.neighbors[index].length) { + valueIndex = 0; + } + + return this.neighbors[index][valueIndex]; + } +} diff --git a/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/impl/state/StateDefinitionImpl.java b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/impl/state/StateDefinitionImpl.java new file mode 100644 index 000000000..87b87da56 --- /dev/null +++ b/libraries/blockstates/src/main/java/net/ornithemc/osl/blockstates/impl/state/StateDefinitionImpl.java @@ -0,0 +1,199 @@ +package net.ornithemc.osl.blockstates.impl.state; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Pattern; + +import net.ornithemc.osl.blockstates.api.state.State; +import net.ornithemc.osl.blockstates.api.state.StateDefinition; +import net.ornithemc.osl.blockstates.api.state.property.Property; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; +import net.ornithemc.osl.core.impl.util.Util; +import net.ornithemc.osl.blockstates.impl.state.StateDefinitionImpl; + +public class StateDefinitionImpl> implements StateDefinition { + + private final O owner; + private final Map> properties; + private final List states; + + private StateDefinitionImpl(O owner, Map> properties, List states) { + this.owner = owner; + this.properties = Collections.unmodifiableMap(new TreeMap<>(properties)); + this.states = Collections.unmodifiableList(new ArrayList<>(states)); + } + + @Override + public O owner() { + return this.owner; + } + + @Override + public List all() { + return this.states; + } + + @Override + public S any() { + return this.states.get(0); + } + + @Override + public Collection> properties() { + return this.properties.values(); + } + + @Override + public Property getProperty(String name) { + return this.properties.get(name); + } + + public static class Builder> implements StateDefinition.Builder { + + private static final Pattern VALID_NAME_PATTERN = Pattern.compile("^[a-z0-9_]+$"); + + private static final Property[] NO_PROPERTIES = new Property[0]; + private static final Comparable[] NO_VALUES = new Comparable[0]; + private static final State[][] NO_NEIGHBORS = new State[0][]; + + private final O owner; + private final Map> properties; + + public Builder(O owner) { + this.owner = owner; + this.properties = new HashMap<>(); + } + + private > Property validateProperty(Property property) { + String name = property.getName(); + + if (!VALID_NAME_PATTERN.matcher(name).matches()) { + throw new IllegalArgumentException(this.owner + " has invalidly named property: " + name); + } + + Collection values = property.values(); + + if (values.size() <= 1) { + throw new IllegalArgumentException(this.owner + " attempted use property " + name + " with <= 1 possible values"); + } + + for (T value : values) { + String valueName = property.getName(value); + + if (!VALID_NAME_PATTERN.matcher(valueName).matches()) { + throw new IllegalArgumentException(this.owner + " has property: " + name + " with invalidly named value: " + valueName); + } + } + + if (this.properties.containsKey(name)) { + throw new IllegalArgumentException(this.owner + " has duplicate property: " + name); + } + + return property; + } + + @Override + public StateDefinition.Builder add(Property... properties) { + for (Property property : properties) { + this.properties.put(property.getName(), this.validateProperty(property)); + } + + return this; + } + + @Override + public StateDefinition build(State.Factory factory) { + return new StateDefinitionImpl<>(this.owner, this.properties, this.buildStates(factory)); + } + + private List buildStates(State.Factory factory) { + if (this.properties.isEmpty()) { + return buildSingletonState(this.owner, factory); + } else if (this.properties.size() == 1) { + return buildStatesForSingleProperty(this.owner, this.properties.values().iterator().next(), factory); + } else { + return buildStatesForMultipleProperties(this.owner, this.properties.values().toArray(new Property[this.properties.size()]), factory); + } + } + + @SuppressWarnings("unchecked") + private static > List buildSingletonState(O owner, State.Factory factory) { + return Collections.singletonList(factory.buildState(owner, NO_PROPERTIES, NO_VALUES, (S[][]) NO_NEIGHBORS)); + } + + private static , T extends Comparable> List buildStatesForSingleProperty(O owner, Property property, State.Factory factory) { + Property[] properties = new Property[] { property }; + Collection values = property.values(); + @SuppressWarnings("unchecked") + S[] neighborsForState = (S[]) new State[values.size()]; + @SuppressWarnings("unchecked") + S[][] neighbors = (S[][]) new State[][] { neighborsForState }; + + List states = new ArrayList<>(values.size()); + + for (T value : values) { + int index = property.indexOf(value); + S state = factory.buildState(owner, properties, new Comparable[] { value }, neighbors); + + neighborsForState[index] = state; + states.add(state); + } + + return states; + } + + @SuppressWarnings("unchecked") + private static > List buildStatesForMultipleProperties(O owner, Property[] properties, State.Factory factory) { + List>> valuesForStates = new ArrayList<>(); + Map>, S[]> neighborsLookup = new HashMap<>(); + + for (Property property : properties) { + valuesForStates.add((List>) property.values()); + } + + valuesForStates = Util.cartesianProduct(valuesForStates); + + for (List> valuesForState : valuesForStates) { + for (int i = 0; i < properties.length; i++) { + Property property = properties[i]; + List> values = new ArrayList<>(property.values().size()); + S[] neighbors = (S[]) new State[property.values().size()]; + + values.addAll(valuesForState); + values.set(i, null); + neighborsLookup.put(values, neighbors); + } + } + + List states = new ArrayList<>(valuesForStates.size()); + + for (List> valuesForState : valuesForStates) { + Comparable[] values = valuesForState.toArray(new Comparable[properties.length]); + S[][] neighbors = (S[][]) new State[properties.length][]; + + S state = factory.buildState(owner, properties, values, neighbors); + + for (int i = 0; i < properties.length; i++) { + Property property = properties[i]; + Comparable value = valuesForState.get(i); + int index = Property.indexOf(property, value); + + valuesForState.set(i, null); + neighbors[i] = neighborsLookup.get(valuesForState); + valuesForState.set(i, value); + + neighbors[i][index] = state; + } + + states.add(state); + } + + return states; + } + } +} diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/math/BlockPos.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/math/BlockPos.java new file mode 100644 index 000000000..684d801cf --- /dev/null +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/math/BlockPos.java @@ -0,0 +1,377 @@ +package net.ornithemc.osl.core.api.util.math; + +import java.util.ArrayList; +import java.util.List; + +public class BlockPos implements Comparable { + + private static final int PACKED_X_LENGTH = 26; + private static final int PACKED_Z_LENGTH = PACKED_X_LENGTH; + private static final int PACKED_Y_LENGTH = 64 - PACKED_X_LENGTH - PACKED_Z_LENGTH; + private static final long PACKED_X_MASK = (1 << PACKED_X_LENGTH) - 1; + private static final long PACKED_Y_MASK = (1 << PACKED_Y_LENGTH) - 1; + private static final long PACKED_Z_MASK = (1 << PACKED_Z_LENGTH) - 1; + private static final int Y_OFFSET = 0; + private static final int Z_OFFSET = PACKED_Y_LENGTH; + private static final int X_OFFSET = PACKED_Y_LENGTH + PACKED_Z_LENGTH; + + public static BlockPos of(int x, int y, int z) { + return new BlockPos(x, y, z); + } + + public static BlockPos pooled(int x, int y, int z) { + return PooledMutable.acquire(x, y, z); + } + + public static long pack(BlockPos pos) { + return pack(pos.x(), pos.y(), pos.z()); + } + + public static long pack(int x, int y, int z) { + return packX(x) | packY(y) | packZ(z); + } + + public static long packX(int x) { + return (x & PACKED_X_MASK) << X_OFFSET; + } + + public static long packY(int y) { + return (y & PACKED_Y_MASK) << Y_OFFSET; + } + + public static long packZ(int z) { + return (z & PACKED_Z_MASK) << Z_OFFSET; + } + + public static BlockPos unpack(long pos) { + return new BlockPos(unpackX(pos), unpackY(pos), unpackZ(pos)); + } + + public static int unpackX(long pos) { + return (int) ((pos << (64 - (X_OFFSET + PACKED_X_LENGTH))) >> (64 - PACKED_X_LENGTH)); + } + + public static int unpackY(long pos) { + return (int) ((pos << (64 - (Y_OFFSET + PACKED_Y_LENGTH))) >> (64 - PACKED_Y_LENGTH)); + } + + public static int unpackZ(long pos) { + return (int) ((pos << (64 - (Z_OFFSET + PACKED_Z_LENGTH))) >> (64 - PACKED_Z_LENGTH)); + } + + private final int x; + private final int y; + private final int z; + + public BlockPos(BlockPos pos) { + this(pos.x(), pos.y(), pos.z()); + } + + public BlockPos(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (!(that instanceof BlockPos)) { + return false; + } + + BlockPos pos = (BlockPos) that; + return this.x() == pos.x() && this.y() == pos.y() && this.z() == pos.z(); + } + + @Override + public int hashCode() { + return this.x() + 31 * (this.y() + 31 * this.z()); + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "{x=" + this.x() + ",y=" + this.y() + ",z=" + this.z() + "}"; + } + + @Override + public int compareTo(BlockPos that) { + if (this.y() == that.y()) { + if (this.z() == that.z()) { + return this.x() - that.x(); + } + + return this.z() - that.z(); + } + + return this.y() - that.y(); + } + + public int x() { + return this.x; + } + + public int y() { + return this.y; + } + + public int z() { + return this.z; + } + + public long pack() { + return pack(this); + } + + public double distanceSquared(BlockPos pos) { + return this.distanceSquared(pos, true); + } + + public double distanceSquared(BlockPos pos, boolean center) { + return this.distanceSquared(pos.x(), pos.y(), pos.z(), center); + } + + public double distanceSquared(double x, double y, double z, boolean center) { + double off = center ? 0.5D : 0.0D; + double dx = this.x() + off - x; + double dy = this.y() + off - y; + double dz = this.z() + off - z; + + return dx * dx + dy * dy + dz * dz; + } + + public int distanceManhattan(BlockPos pos) { + int dx = Math.abs(this.x() - pos.x()); + int dy = Math.abs(this.y() - pos.y()); + int dz = Math.abs(this.z() - pos.z()); + + return dx + dy + dz; + } + + public BlockPos add(int dx, int dy, int dz) { + return dx == 0 && dy == 0 && dz == 0 ? this : new BlockPos(this.x() + dx, this.y() + dy, this.z() + dz); + } + + public BlockPos add(BlockPos pos) { + return this.add(pos.x(), pos.y(), pos.z()); + } + + public BlockPos subtract(BlockPos pos) { + return this.add(-pos.x(), -pos.y(), -pos.z()); + } + + public BlockPos up() { + return this.offset(Direction.UP); + } + + public BlockPos up(int amount) { + return this.offset(Direction.UP, amount); + } + + public BlockPos down() { + return this.offset(Direction.DOWN); + } + + public BlockPos down(int amount) { + return this.offset(Direction.DOWN, amount); + } + + public BlockPos north() { + return this.offset(Direction.NORTH); + } + + public BlockPos north(int amount) { + return this.offset(Direction.NORTH, amount); + } + + public BlockPos south() { + return this.offset(Direction.SOUTH); + } + + public BlockPos south(int amount) { + return this.offset(Direction.SOUTH, amount); + } + + public BlockPos west() { + return this.offset(Direction.WEST); + } + + public BlockPos west(int amount) { + return this.offset(Direction.WEST, amount); + } + + public BlockPos east() { + return this.offset(Direction.EAST); + } + + public BlockPos east(int amount) { + return this.offset(Direction.EAST, amount); + } + + public BlockPos offset(Direction dir) { + return this.offset(dir, 1); + } + + public BlockPos offset(Direction dir, int amount) { + return this.add(dir.offsetX() * amount, dir.offsetY() * amount, dir.offsetZ() * amount); + } + + public BlockPos immutable() { + return this; + } + + public static class Mutable extends BlockPos { + + private int x; + private int y; + private int z; + + public Mutable(BlockPos pos) { + this(pos.x(), pos.y(), pos.z()); + } + + public Mutable(int x, int y, int z) { + super(x, y, z); + } + + @Override + public int x() { + return this.x; + } + + @Override + public int y() { + return this.y; + } + + @Override + public int z() { + return this.z; + } + + @Override + public BlockPos add(int dx, int dy, int dz) { + return super.add(dx, dy, dz).immutable(); + } + + @Override + public BlockPos immutable() { + return new BlockPos(this); + } + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + + public void setZ(int z) { + this.z = z; + } + + public Mutable set(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + + return this; + } + + public Mutable set(BlockPos pos) { + return this.set(pos.x(), pos.y(), pos.z()); + } + + public Mutable move(int dx, int dy, int dz) { + return this.set(this.x() + dx, this.y() + dy, this.z() + dz); + } + + public Mutable move(BlockPos dpos) { + return this.move(dpos.x(), dpos.y(), dpos.z()); + } + + public Mutable move(Direction dir) { + return this.move(dir, 1); + } + + public Mutable move(Direction dir, int amount) { + return this.move(dir.offsetX() * amount, dir.offsetY() * amount, dir.offsetZ() * amount); + } + } + + public static class PooledMutable extends Mutable implements AutoCloseable { + + private static final List POOL = new ArrayList<>(); + + public static PooledMutable acquire() { + return acquire(0, 0, 0); + } + + public static PooledMutable acquire(int x, int y, int z) { + synchronized (POOL) { + if (!POOL.isEmpty()) { + PooledMutable pos = POOL.remove(POOL.size() - 1); + + if (pos != null && pos.free) { + pos.free = false; + pos.set(x, y, z); + + return pos; + } + } + } + + return new PooledMutable(x, y, z); + } + + private boolean free; + + private PooledMutable(int x, int y, int z) { + super(x, y, z); + } + + @Override + public PooledMutable set(int x, int y, int z) { + return (PooledMutable) super.set(x, y, z); + } + + @Override + public PooledMutable set(BlockPos pos) { + return (PooledMutable) super.set(pos); + } + + @Override + public PooledMutable move(int dx, int dy, int dz) { + return (PooledMutable) super.move(dx, dy, dz); + } + + @Override + public PooledMutable move(BlockPos dpos) { + return (PooledMutable) super.move(dpos); + } + + @Override + public PooledMutable move(Direction dir) { + return (PooledMutable) super.move(dir); + } + + @Override + public PooledMutable move(Direction dir, int amount) { + return (PooledMutable) super.move(dir, amount); + } + + @Override + public void close() { + synchronized (POOL) { + if (POOL.size() < 100) { + POOL.add(this); + } + + this.free = true; + } + } + } +} diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/math/Direction.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/math/Direction.java new file mode 100644 index 000000000..60997b663 --- /dev/null +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/math/Direction.java @@ -0,0 +1,327 @@ +package net.ornithemc.osl.core.api.util.math; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Iterator; +import java.util.Map; +import java.util.Random; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public enum Direction { + + DOWN ( "down", -1, 0, 1, Axis.Y, AxisDirection.NEGATIVE), + UP ( "up", -1, 1, 0, Axis.Y, AxisDirection.POSITIVE), + NORTH("north", 2, 2, 3, Axis.Z, AxisDirection.NEGATIVE), + SOUTH("south", 0, 3, 2, Axis.Z, AxisDirection.POSITIVE), + WEST ( "west", 1, 4, 5, Axis.X, AxisDirection.NEGATIVE), + EAST ( "east", 3, 5, 4, Axis.X, AxisDirection.POSITIVE); + + private final String name; + private final int data3d; + private final int data2d; + private final int opposite; + private final Axis axis; + private final AxisDirection axisDirection; + + private Direction(String name, int data2d, int data3d, int opposite, Axis axis, AxisDirection axisDirection) { + this.name = name; + this.data3d = data2d; + this.data2d = data3d; + this.opposite = opposite; + this.axis = axis; + this.axisDirection = axisDirection; + + if (this.axis.plane == Plane.VERTICAL) { + this.axis.plane.faces[this.data3d] = this; + } + if (this.axis.plane == Plane.HORIZONTAL) { + this.axis.plane.faces[this.data2d] = this; + } + } + + public static final Direction[] VALUES = values(); + + private static final Map BY_NAME = Arrays.stream(VALUES) + .collect(Collectors.toMap(Direction::toString, Function.identity())); + private static final Direction[] BY_DATA2D = Arrays.stream(VALUES) + .filter(Plane.HORIZONTAL) + .sorted(Comparator.comparingInt(Direction::data2d)) + .toArray(Direction[]::new); + private static final Direction[] BY_DATA3D = Arrays.stream(VALUES) + .sorted(Comparator.comparingInt(Direction::data3d)) + .toArray(Direction[]::new); + + public static Direction byName(String name) { + return name == null ? null : BY_NAME.get(name); + } + + public static Direction byData2d(int data2d) { + return BY_DATA2D[Math.abs(data2d % BY_DATA2D.length)]; + } + + public static Direction byData3d(int data3d) { + return BY_DATA3D[Math.abs(data3d % BY_DATA3D.length)]; + } + + @Override + public String toString() { + return this.name; + } + + public int data2d() { + return this.data2d; + } + + public int data3d() { + return this.data3d; + } + + public Axis axis() { + return this.axis; + } + + public AxisDirection axisDirection() { + return this.axisDirection; + } + + public int offsetX() { + return this.axis == Axis.X ? this.axisDirection.offset() : 0; + } + + public int offsetY() { + return this.axis == Axis.Y ? this.axisDirection.offset() : 0; + } + + public int offsetZ() { + return this.axis == Axis.Z ? this.axisDirection.offset() : 0; + } + + public Direction opposite() { + return BY_DATA3D[this.opposite]; + } + + public Direction clockwise() { + return this.clockwiseY(); + } + + public Direction counterClockwise() { + return this.counterClockwiseY(); + } + + public Direction clockwiseX() { + switch (this) { + case DOWN: + return SOUTH; + case UP: + return NORTH; + case SOUTH: + return UP; + case NORTH: + return DOWN; + default: + throw new IllegalStateException("Unable to get x-clockwise rotation of " + this); + } + } + + public Direction clockwiseY() { + switch (this) { + case NORTH: + return EAST; + case SOUTH: + return WEST; + case WEST: + return NORTH; + case EAST: + return SOUTH; + default: + throw new IllegalStateException("Unable to get y-clockwise rotation of " + this); + } + } + + public Direction clockwiseZ() { + switch (this) { + case DOWN: + return WEST; + case UP: + return EAST; + case WEST: + return UP; + case EAST: + return DOWN; + default: + throw new IllegalStateException("Unable to get z-clockwise rotation of " + this); + } + } + + public Direction counterClockwiseX() { + switch (this) { + case DOWN: + return NORTH; + case UP: + return SOUTH; + case SOUTH: + return DOWN; + case NORTH: + return UP; + default: + throw new IllegalStateException("Unable to get x-counter-clockwise rotation of " + this); + } + } + + public Direction counterClockwiseY() { + switch (this) { + case NORTH: + return WEST; + case SOUTH: + return EAST; + case WEST: + return SOUTH; + case EAST: + return NORTH; + default: + throw new IllegalStateException("Unable to get y-counter-clockwise rotation of " + this); + } + } + + public Direction counterClockwiseZ() { + switch (this) { + case DOWN: + return EAST; + case UP: + return WEST; + case WEST: + return DOWN; + case EAST: + return UP; + default: + throw new IllegalStateException("Unable to get z-counter-clockwise rotation of " + this); + } + } + + public enum Axis implements Predicate { + + X("x", Plane.HORIZONTAL) { + + @Override + public int choose(int x, int y, int z) { + return x; + } + + @Override + public double choose(double x, double y, double z) { + return x; + } + }, + Y("y", Plane.VERTICAL) { + + @Override + public int choose(int x, int y, int z) { + return y; + } + + @Override + public double choose(double x, double y, double z) { + return y; + } + }, + Z("z", Plane.HORIZONTAL) { + + @Override + public int choose(int x, int y, int z) { + return z; + } + + @Override + public double choose(double x, double y, double z) { + return z; + } + }; + + private final String name; + private final Plane plane; + + private Axis(String name, Plane plane) { + this.name = name; + this.plane = plane; + } + + @Override + public String toString() { + return this.name; + } + + @Override + public boolean test(Direction dir) { + return dir != null && dir.axis() == this; + } + + public Plane plane() { + return this.plane; + } + + public boolean isVertical() { + return this.plane == Plane.VERTICAL; + } + + public boolean isHorizontal() { + return this.plane == Plane.HORIZONTAL; + } + + public abstract int choose(int x, int y, int z); + + public abstract double choose(double x, double y, double z); + + } + + public enum AxisDirection { + + POSITIVE("towards positive", 1), + NEGATIVE("towards negative", -1); + + private final String name; + private final int offset; + + private AxisDirection(String name, int offset) { + this.name = name; + this.offset = offset; + } + + @Override + public String toString() { + return this.name; + } + + public int offset() { + return this.offset; + } + } + + public enum Plane implements Iterable, Predicate { + + VERTICAL (2), + HORIZONTAL(4); + + private final Direction[] faces; + + private Plane(int faceCount) { + // filled in Direction:: + this.faces = new Direction[faceCount]; + } + + @Override + public Iterator iterator() { + return Arrays.stream(this.faces).iterator(); + } + + @Override + public boolean test(Direction dir) { + return dir != null && dir.axis().plane() == this; + } + + public Direction pickDirection(Random random) { + return this.faces[random.nextInt(this.faces.length)]; + } + } +} diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/Util.java b/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/Util.java index deff3908e..077a9bbe9 100644 --- a/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/Util.java +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/impl/util/Util.java @@ -41,4 +41,39 @@ public static CompletableFuture> sequence(List results); } + + public static List> cartesianProduct(List> lists) { + int[] sectionSizes = new int[lists.size()]; + + for (int layer = lists.size() - 1; layer >= 0; layer--) { + sectionSizes[layer] = lists.get(layer).size(); + + if (layer + 1 < lists.size()) { + sectionSizes[layer] *= sectionSizes[layer + 1]; + } + } + + int productSize = sectionSizes[0]; + List> product = new ArrayList<>(productSize); + + for (int i = 0; i < productSize; i++) { + product.add(new ArrayList<>(lists.size())); + } + + for (int layer = 0; layer < lists.size(); layer++) { + List list = lists.get(layer); + int sectionSize = sectionSizes[layer]; + int sectionRepeat = sectionSize / list.size(); + + for (int index = 0; index < productSize; ) { + for (T value : list) { + for (int i = 0; i < sectionRepeat; i++) { + product.get(index++).add(layer, value); + } + } + } + } + + return product; + } } diff --git a/libraries/items/items-mc13w36a-mc14w25b/src/main/resources/fabric.mod.json b/libraries/items/items-mc13w36a-mc14w25b/src/main/resources/fabric.mod.json index dd5d95150..29f447422 100644 --- a/libraries/items/items-mc13w36a-mc14w25b/src/main/resources/fabric.mod.json +++ b/libraries/items/items-mc13w36a-mc14w25b/src/main/resources/fabric.mod.json @@ -23,6 +23,7 @@ "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-", "osl-blocks": "\u003e\u003d0.2.0" }, "name": "OSL Items", diff --git a/libraries/items/items-mc14w26a-mc17w46a/src/main/resources/fabric.mod.json b/libraries/items/items-mc14w26a-mc17w46a/src/main/resources/fabric.mod.json index 1d7a34a28..85f296a6b 100644 --- a/libraries/items/items-mc14w26a-mc17w46a/src/main/resources/fabric.mod.json +++ b/libraries/items/items-mc14w26a-mc17w46a/src/main/resources/fabric.mod.json @@ -23,6 +23,7 @@ "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-", "osl-blocks": "\u003e\u003d0.2.0" }, "name": "OSL Items", diff --git a/libraries/items/items-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json b/libraries/items/items-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json index 15de24da9..ec24052d9 100644 --- a/libraries/items/items-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json +++ b/libraries/items/items-mc17w47a-mc18w31a/src/main/resources/fabric.mod.json @@ -22,6 +22,7 @@ "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-", "osl-blocks": "\u003e\u003d0.2.0" }, "name": "OSL Items", diff --git a/libraries/items/items-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json b/libraries/items/items-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json index ba1ac4be5..b6559f8ed 100644 --- a/libraries/items/items-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json +++ b/libraries/items/items-mc18w32a-mc1.13.2/src/main/resources/fabric.mod.json @@ -22,6 +22,7 @@ "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-", "osl-blocks": "\u003e\u003d0.2.0" }, "name": "OSL Items", diff --git a/libraries/items/items-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json b/libraries/items/items-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json index fc018e11d..3da9acf19 100644 --- a/libraries/items/items-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json +++ b/libraries/items/items-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json @@ -22,6 +22,7 @@ "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-", "osl-blocks": "\u003e\u003d0.2.0" }, "name": "OSL Items", diff --git a/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/items/impl/VanillaBlockItems.java b/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/items/impl/VanillaBlockItems.java index 3f86916c9..76ef59943 100644 --- a/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/items/impl/VanillaBlockItems.java +++ b/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/java/net/ornithemc/osl/items/impl/VanillaBlockItems.java @@ -6,9 +6,9 @@ import net.minecraft.block.Block; import net.minecraft.item.Item; -import net.ornithemc.osl.blocks.api.block.Blocks; import net.ornithemc.osl.blocks.impl.BlockRegistryImpl; import net.ornithemc.osl.blocks.impl.VanillaBlocks; +import net.ornithemc.osl.blockstates.api.block.Blocks; import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.items.impl.item.ItemUtil; diff --git a/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json b/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json index 108e07c0d..4bd1ebd1f 100644 --- a/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json +++ b/libraries/items/items-mca1.0.1_01-mc1.6.4/src/main/resources/fabric.mod.json @@ -23,6 +23,7 @@ "osl-networking": "\u003e\u003d0.10.0", "osl-networking-impl": "\u003e\u003d0.2.0", "osl-registries": "\u003e\u003d0.1.0", + "osl-blockstates": "\u003e\u003d0.1.0-", "osl-blocks": "\u003e\u003d0.2.0" }, "name": "OSL Items", diff --git a/settings.gradle b/settings.gradle index e53df0695..3d4e2a679 100644 --- a/settings.gradle +++ b/settings.gradle @@ -31,6 +31,25 @@ include ':libraries:blocks:blocks-mc17w47a-mc18w31a' include ':libraries:blocks:blocks-mc18w32a-mc1.13.2' include ':libraries:blocks:blocks-mc18w43a-mc1.14.4' +include ':libraries:blockstates' +include ':libraries:blockstates:blockstates-mca1.0.1_01-mcb1.1_02' +include ':libraries:blockstates:blockstates-mcb1.2-mcb1.5_02' +include ':libraries:blockstates:blockstates-mcb1.6-trailer-mcb1.6.6' +include ':libraries:blockstates:blockstates-mcb1.7-mcb1.7.3' +include ':libraries:blockstates:blockstates-mcb1.8-pre1-mcb1.9-pre3' +include ':libraries:blockstates:blockstates-mcb1.9-pre4-mc12w03a' +include ':libraries:blockstates:blockstates-mc1.2-mc1.2.5' +include ':libraries:blockstates:blockstates-mc12w25a-mc12w38b' +include ':libraries:blockstates:blockstates-mc12w42a-mc1.4.7' +include ':libraries:blockstates:blockstates-mc13w06a-mc1.6.4' +include ':libraries:blockstates:blockstates-mc13w42a-mc1.7.10' +include ':libraries:blockstates:blockstates-mc14w32c-mc1.8.9' +include ':libraries:blockstates:blockstates-mc15w47a-mc1.9.3-pre1' +include ':libraries:blockstates:blockstates-mc1.9.3-pre2-mc1.10.2' +include ':libraries:blockstates:blockstates-mc16w39a-mc17w46a' +include ':libraries:blockstates:blockstates-mc18w19a-mc1.13.2' +include ':libraries:blockstates:blockstates-mc18w43a-mc1.14.4' + include ':libraries:branding' include ':libraries:branding:branding-mcin-20100206-2103-mca1.2.1_01' include ':libraries:branding:branding-mca1.2.2-mc14w29b'