Skip to content

Commit bce563e

Browse files
Make TemplateDoorItem and TemplateDoorBlock Actually Usable (#195)
* Okay it all works * Oops * This should probably change * Couple of prefixes * Better mixin * I *really* don't like this field, but I can't come up with anything better, so I'll just mark it as internal for now. * Atlas#of fix --------- Co-authored-by: mineLdiver <arsbsdn@gmail.com>
1 parent b25e9ac commit bce563e

9 files changed

Lines changed: 118 additions & 6 deletions

File tree

src/test/java/net/modificationstation/sltest/block/Blocks.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.modificationstation.stationapi.api.event.registry.BlockRegistryEvent;
88
import net.modificationstation.stationapi.api.mod.entrypoint.EntrypointManager;
99
import net.modificationstation.stationapi.api.template.block.TemplateBlock;
10+
import net.modificationstation.stationapi.api.template.block.TemplateDoorBlock;
1011
import net.modificationstation.stationapi.api.template.block.TemplateLeavesBlock;
1112
import net.modificationstation.stationapi.api.template.block.TemplateLogBlock;
1213
import net.modificationstation.stationapi.api.util.Identifier;
@@ -32,7 +33,8 @@ public enum Blocks {
3233
MODDED_LOG("modded_log", "moddedLog", TemplateLogBlock::new),
3334
EFFECT_BLOCK("effect_block", "effectBlock", EffectBlock::new),
3435
EFFECT_BLOCK_INF("effect_block_inf", "effectBlockInf", EffectBlockInf::new),
35-
EFFECT_BLOCK_CLEAR("effect_block_clear", "effectBlockClear", EffectBlockClear::new);
36+
EFFECT_BLOCK_CLEAR("effect_block_clear", "effectBlockClear", EffectBlockClear::new),
37+
FANCY_WOOD_DOOR("fancy_wood_door_block", "fancyWoodDoor", id -> new TemplateDoorBlock(id, Material.WOOD));
3638

3739
private final Runnable register;
3840
private Block block;

src/test/java/net/modificationstation/sltest/item/ItemListener.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.modificationstation.sltest.item;
22

33
import net.mine_diver.unsafeevents.listener.EventListener;
4+
import net.minecraft.block.Material;
45
import net.minecraft.item.Item;
56
import net.minecraft.item.ToolMaterial;
67
import net.modificationstation.sltest.block.Blocks;
@@ -13,6 +14,7 @@
1314
import net.modificationstation.stationapi.api.registry.ItemRegistry;
1415
import net.modificationstation.stationapi.api.tag.TagKey;
1516
import net.modificationstation.stationapi.api.template.item.BlockStateItem;
17+
import net.modificationstation.stationapi.api.template.item.TemplateDoorItem;
1618

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

@@ -41,7 +43,7 @@ public void registerItems(ItemRegistryEvent event) {
4143
testShears = new TestShearsItem(NAMESPACE.id("test_shears")).setTranslationKey(NAMESPACE, "test_shears");
4244
pacifistSword = new PacifistSwordItem(NAMESPACE.id("pacifist_sword")).setTranslationKey(NAMESPACE, "pacifist_sword");
4345
dullPickaxe = new DullPickaxeItem(NAMESPACE.id("dull_pickaxe")).setTranslationKey(NAMESPACE, "dull_pickaxe");
44-
46+
fancyDoor = new TemplateDoorItem(NAMESPACE.id("fancy_wood_door"), Material.WOOD, Blocks.FANCY_WOOD_DOOR.get()).setTranslationKey(NAMESPACE, "fancyWoodDoor");
4547

4648
}
4749

@@ -58,4 +60,5 @@ public void registerItems(ItemRegistryEvent event) {
5860
public static Item testShears;
5961
public static Item pacifistSword;
6062
public static Item dullPickaxe;
63+
public static Item fancyDoor;
6164
}

src/test/java/net/modificationstation/sltest/texture/TextureListener.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import net.modificationstation.stationapi.api.client.render.model.json.JsonUnbakedModel;
99
import net.modificationstation.stationapi.api.client.texture.atlas.Atlases;
1010
import net.modificationstation.stationapi.api.client.texture.atlas.ExpandableAtlas;
11+
import net.modificationstation.stationapi.api.template.block.TemplateDoorBlock;
12+
import net.modificationstation.stationapi.api.util.Namespace;
1113
import net.modificationstation.stationapi.api.util.math.Direction;
1214

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

5456
// farlandsBlockModel = JsonUnbakedModel.get(of(MODID, "farlandsBlock"));
5557
// testItemModel = JsonUnbakedModel.get(of(MODID, "item/testItem"));
58+
59+
((TemplateDoorBlock) FANCY_WOOD_DOOR.get()).topTextureId = terrain.getTexture(Namespace.MINECRAFT.id("block/oak_door_top")).index;
60+
((TemplateDoorBlock) FANCY_WOOD_DOOR.get()).bottomTextureId = terrain.getTexture(Namespace.MINECRAFT.id("block/oak_door_bottom")).index;
5661
}
5762

5863
public static final int[] altarTextures = new int[6];

station-renderer-api-v0/src/main/java/net/modificationstation/stationapi/api/client/texture/atlas/Atlas.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public final <T extends Atlas> T of(int textureIndex) {
7979

8080
public final <T extends Atlas> T of(Identifier texture) {
8181
Atlas atlas = this;
82-
do if (atlas.getTexture(texture).id != atlas.getMissingTexture().id)
82+
do if (atlas.idToTex.containsKey(texture))
8383
//noinspection unchecked
8484
return (T) atlas;
8585
while ((atlas = atlas.parent) != null);

station-templates-v0/src/main/java/net/modificationstation/stationapi/api/template/block/TemplateDoorBlock.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,19 @@
22

33
import net.minecraft.block.DoorBlock;
44
import net.minecraft.block.Material;
5+
import net.minecraft.item.Item;
56
import net.modificationstation.stationapi.api.util.Identifier;
7+
import org.jetbrains.annotations.ApiStatus;
8+
9+
import java.util.Random;
610

711
public class TemplateDoorBlock extends DoorBlock implements BlockTemplate {
12+
public int topTextureId = 0;
13+
public int bottomTextureId = 0;
14+
15+
@ApiStatus.Internal
16+
public Item doorItem = null;
17+
818
public TemplateDoorBlock(Identifier identifier, Material material) {
919
this(BlockTemplate.getNextId(), material);
1020
BlockTemplate.onConstructor(this, identifier);
@@ -13,4 +23,35 @@ public TemplateDoorBlock(Identifier identifier, Material material) {
1323
public TemplateDoorBlock(int i, Material arg) {
1424
super(i, arg);
1525
}
26+
27+
public boolean isTop(int meta) {
28+
return (meta & 8) != 0;
29+
}
30+
31+
@Override
32+
public int getTexture(int side, int meta) {
33+
if (side == 0 || side == 1) {
34+
return bottomTextureId;
35+
}
36+
37+
if (!isTop(meta)) {
38+
return bottomTextureId;
39+
}
40+
41+
int var3 = this.method_839(meta);
42+
if ((var3 == 0 || var3 == 2) ^ side <= 3) {
43+
return this.bottomTextureId;
44+
} else {
45+
return this.topTextureId;
46+
}
47+
}
48+
49+
@Override
50+
public int getDroppedItemId(int blockMeta, Random random) {
51+
if (isTop(blockMeta)) {
52+
return 0;
53+
} else {
54+
return doorItem.id;
55+
}
56+
}
1657
}
Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
package net.modificationstation.stationapi.api.template.item;
22

3+
import lombok.Getter;
4+
import net.minecraft.block.Block;
35
import net.minecraft.block.Material;
46
import net.minecraft.item.DoorItem;
7+
import net.modificationstation.stationapi.api.template.block.TemplateDoorBlock;
58
import net.modificationstation.stationapi.api.util.Identifier;
69

10+
@Getter
711
public class TemplateDoorItem extends DoorItem implements ItemTemplate {
8-
public TemplateDoorItem(Identifier identifier, Material arg) {
9-
this(ItemTemplate.getNextId(), arg);
12+
/**
13+
* Used in a mixin to override the door block placed.
14+
*/
15+
protected final Block doorBlock;
16+
17+
public TemplateDoorItem(Identifier identifier, Material arg, Block doorBlock) {
18+
this(ItemTemplate.getNextId(), arg, doorBlock);
1019
ItemTemplate.onConstructor(this, identifier);
1120
}
1221

13-
public TemplateDoorItem(int id, Material arg) {
22+
public TemplateDoorItem(int id, Material arg, Block doorBlock) {
1423
super(id, arg);
24+
this.doorBlock = doorBlock;
25+
if (doorBlock instanceof TemplateDoorBlock templateDoorBlock) {
26+
templateDoorBlock.doorItem = this;
27+
}
1528
}
29+
1630
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package net.modificationstation.stationapi.mixin.template.item;
2+
3+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
4+
import net.minecraft.block.Block;
5+
import net.minecraft.item.DoorItem;
6+
import net.modificationstation.stationapi.api.template.item.TemplateDoorItem;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
10+
@Mixin(DoorItem.class)
11+
class DoorItemMixin {
12+
@ModifyExpressionValue(
13+
method = "useOnBlock",
14+
at = {
15+
@At(
16+
value = "FIELD",
17+
target = "Lnet/minecraft/block/Block;DOOR:Lnet/minecraft/block/Block;"
18+
),
19+
@At(
20+
value = "FIELD",
21+
target = "Lnet/minecraft/block/Block;IRON_DOOR:Lnet/minecraft/block/Block;"
22+
)
23+
}
24+
)
25+
private Block stationapi_hijackBlock(Block original) {
26+
return (DoorItem) (Object) this instanceof TemplateDoorItem doorItem ? doorItem.getDoorBlock() : original;
27+
}
28+
}

station-templates-v0/src/main/resources/fabric.mod.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
"icon": "assets/station-templates-v0/icon.png",
1919

2020
"environment": "*",
21+
"mixins": [
22+
"station-templates-v0.mixins.json"
23+
],
2124

2225
"depends": {
2326
"fabricloader": "*",
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"required": true,
3+
"minVersion": "0.8",
4+
"package": "net.modificationstation.stationapi.mixin.template",
5+
"compatibilityLevel": "JAVA_17",
6+
"mixins": [
7+
"item.DoorItemMixin"
8+
],
9+
"server": [
10+
],
11+
"client": [
12+
],
13+
"injectors": {
14+
"defaultRequire": 1
15+
}
16+
}

0 commit comments

Comments
 (0)