Skip to content

Make TemplateDoorItem and TemplateDoorBlock Actually Usable #195

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jul 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent;
import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
import net.modificationstation.stationapi.api.template.block.TemplateBlock;
import net.modificationstation.stationapi.api.template.block.TemplateDoorBlock;
import net.modificationstation.stationapi.api.template.block.TemplateLeavesBlock;
import net.modificationstation.stationapi.api.template.block.TemplateLogBlock;
import net.modificationstation.stationapi.api.util.Identifier;
Expand All @@ -32,7 +33,8 @@ public enum Blocks {
MODDED_LOG("modded_log", "moddedLog", TemplateLogBlock::new),
EFFECT_BLOCK("effect_block", "effectBlock", EffectBlock::new),
EFFECT_BLOCK_INF("effect_block_inf", "effectBlockInf", EffectBlockInf::new),
EFFECT_BLOCK_CLEAR("effect_block_clear", "effectBlockClear", EffectBlockClear::new);
EFFECT_BLOCK_CLEAR("effect_block_clear", "effectBlockClear", EffectBlockClear::new),
FANCY_WOOD_DOOR("fancy_wood_door_block", "fancyWoodDoor", id -> new TemplateDoorBlock(id, Material.WOOD));

private final Runnable register;
private Block block;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.modificationstation.sltest.item;

import net.mine_diver.unsafeevents.listener.EventListener;
import net.minecraft.block.Material;
import net.minecraft.item.Item;
import net.minecraft.item.ToolMaterial;
import net.modificationstation.sltest.block.Blocks;
Expand All @@ -13,6 +14,7 @@
import net.modificationstation.stationapi.api.registry.ItemRegistry;
import net.modificationstation.stationapi.api.tag.TagKey;
import net.modificationstation.stationapi.api.template.item.BlockStateItem;
import net.modificationstation.stationapi.api.template.item.TemplateDoorItem;

import static net.modificationstation.sltest.SLTest.NAMESPACE;

Expand Down Expand Up @@ -41,7 +43,7 @@ public void registerItems(ItemRegistryEvent event) {
testShears = new TestShearsItem(NAMESPACE.id("test_shears")).setTranslationKey(NAMESPACE, "test_shears");
pacifistSword = new PacifistSwordItem(NAMESPACE.id("pacifist_sword")).setTranslationKey(NAMESPACE, "pacifist_sword");
dullPickaxe = new DullPickaxeItem(NAMESPACE.id("dull_pickaxe")).setTranslationKey(NAMESPACE, "dull_pickaxe");

fancyDoor = new TemplateDoorItem(NAMESPACE.id("fancy_wood_door"), Material.WOOD, Blocks.FANCY_WOOD_DOOR.get()).setTranslationKey(NAMESPACE, "fancyWoodDoor");

}

Expand All @@ -58,4 +60,5 @@ public void registerItems(ItemRegistryEvent event) {
public static Item testShears;
public static Item pacifistSword;
public static Item dullPickaxe;
public static Item fancyDoor;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import net.modificationstation.stationapi.api.client.render.model.json.JsonUnbakedModel;
import net.modificationstation.stationapi.api.client.texture.atlas.Atlases;
import net.modificationstation.stationapi.api.client.texture.atlas.ExpandableAtlas;
import net.modificationstation.stationapi.api.template.block.TemplateDoorBlock;
import net.modificationstation.stationapi.api.util.Namespace;
import net.modificationstation.stationapi.api.util.math.Direction;

import static net.modificationstation.sltest.SLTest.NAMESPACE;
Expand Down Expand Up @@ -53,6 +55,9 @@ public void registerTextures(TextureRegisterEvent event) {

// farlandsBlockModel = JsonUnbakedModel.get(of(MODID, "farlandsBlock"));
// testItemModel = JsonUnbakedModel.get(of(MODID, "item/testItem"));

((TemplateDoorBlock) FANCY_WOOD_DOOR.get()).topTextureId = terrain.getTexture(Namespace.MINECRAFT.id("block/oak_door_top")).index;
((TemplateDoorBlock) FANCY_WOOD_DOOR.get()).bottomTextureId = terrain.getTexture(Namespace.MINECRAFT.id("block/oak_door_bottom")).index;
}

public static final int[] altarTextures = new int[6];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public final <T extends Atlas> T of(int textureIndex) {

public final <T extends Atlas> T of(Identifier texture) {
Atlas atlas = this;
do if (atlas.getTexture(texture).id != atlas.getMissingTexture().id)
do if (atlas.idToTex.containsKey(texture))
//noinspection unchecked
return (T) atlas;
while ((atlas = atlas.parent) != null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,19 @@

import net.minecraft.block.DoorBlock;
import net.minecraft.block.Material;
import net.minecraft.item.Item;
import net.modificationstation.stationapi.api.util.Identifier;
import org.jetbrains.annotations.ApiStatus;

import java.util.Random;

public class TemplateDoorBlock extends DoorBlock implements BlockTemplate {
public int topTextureId = 0;
public int bottomTextureId = 0;

@ApiStatus.Internal
public Item doorItem = null;

public TemplateDoorBlock(Identifier identifier, Material material) {
this(BlockTemplate.getNextId(), material);
BlockTemplate.onConstructor(this, identifier);
Expand All @@ -13,4 +23,35 @@ public TemplateDoorBlock(Identifier identifier, Material material) {
public TemplateDoorBlock(int i, Material arg) {
super(i, arg);
}

public boolean isTop(int meta) {
return (meta & 8) != 0;
}

@Override
public int getTexture(int side, int meta) {
if (side == 0 || side == 1) {
return bottomTextureId;
}

if (!isTop(meta)) {
return bottomTextureId;
}

int var3 = this.method_839(meta);
if ((var3 == 0 || var3 == 2) ^ side <= 3) {
return this.bottomTextureId;
} else {
return this.topTextureId;
}
}

@Override
public int getDroppedItemId(int blockMeta, Random random) {
if (isTop(blockMeta)) {
return 0;
} else {
return doorItem.id;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
package net.modificationstation.stationapi.api.template.item;

import lombok.Getter;
import net.minecraft.block.Block;
import net.minecraft.block.Material;
import net.minecraft.item.DoorItem;
import net.modificationstation.stationapi.api.template.block.TemplateDoorBlock;
import net.modificationstation.stationapi.api.util.Identifier;

@Getter
public class TemplateDoorItem extends DoorItem implements ItemTemplate {
public TemplateDoorItem(Identifier identifier, Material arg) {
this(ItemTemplate.getNextId(), arg);
/**
* Used in a mixin to override the door block placed.
*/
protected final Block doorBlock;

public TemplateDoorItem(Identifier identifier, Material arg, Block doorBlock) {
this(ItemTemplate.getNextId(), arg, doorBlock);
ItemTemplate.onConstructor(this, identifier);
}

public TemplateDoorItem(int id, Material arg) {
public TemplateDoorItem(int id, Material arg, Block doorBlock) {
super(id, arg);
this.doorBlock = doorBlock;
if (doorBlock instanceof TemplateDoorBlock templateDoorBlock) {
templateDoorBlock.doorItem = this;
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package net.modificationstation.stationapi.mixin.template.item;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.block.Block;
import net.minecraft.item.DoorItem;
import net.modificationstation.stationapi.api.template.item.TemplateDoorItem;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(DoorItem.class)
class DoorItemMixin {
@ModifyExpressionValue(
method = "useOnBlock",
at = {
@At(
value = "FIELD",
target = "Lnet/minecraft/block/Block;DOOR:Lnet/minecraft/block/Block;"
),
@At(
value = "FIELD",
target = "Lnet/minecraft/block/Block;IRON_DOOR:Lnet/minecraft/block/Block;"
)
}
)
private Block stationapi_hijackBlock(Block original) {
return (DoorItem) (Object) this instanceof TemplateDoorItem doorItem ? doorItem.getDoorBlock() : original;
}
}
3 changes: 3 additions & 0 deletions station-templates-v0/src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
"icon": "assets/station-templates-v0/icon.png",

"environment": "*",
"mixins": [
"station-templates-v0.mixins.json"
],

"depends": {
"fabricloader": "*",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"required": true,
"minVersion": "0.8",
"package": "net.modificationstation.stationapi.mixin.template",
"compatibilityLevel": "JAVA_17",
"mixins": [
"item.DoorItemMixin"
],
"server": [
],
"client": [
],
"injectors": {
"defaultRequire": 1
}
}