Skip to content

Commit 560823c

Browse files
committed
Display data about the member block in the icon and tooltip
1 parent d6e1687 commit 560823c

File tree

5 files changed

+363
-6
lines changed

5 files changed

+363
-6
lines changed

src/client/java/aztech/modern_industrialization/MIClient.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import aztech.modern_industrialization.blocks.storage.tank.TankRenderer;
3232
import aztech.modern_industrialization.blocks.structure.StructureMultiblockBER;
3333
import aztech.modern_industrialization.blocks.structure.StructureMultiblockControllerBER;
34+
import aztech.modern_industrialization.blocks.structure.member.StructureMemberMode;
35+
import aztech.modern_industrialization.blocks.structure.member.StructureMultiblockMemberBlockItem;
3436
import aztech.modern_industrialization.datagen.MIDatagenClient;
3537
import aztech.modern_industrialization.datagen.MIDatagenServer;
3638
import aztech.modern_industrialization.datagen.model.DelegatingModelBuilder;
@@ -43,6 +45,7 @@
4345
import aztech.modern_industrialization.items.armor.HudRenderer;
4446
import aztech.modern_industrialization.items.armor.JetpackParticleAdder;
4547
import aztech.modern_industrialization.items.client.ClientConfigCardTooltip;
48+
import aztech.modern_industrialization.items.client.ClientStructureMemberBlockTooltip;
4649
import aztech.modern_industrialization.machines.MachineBlock;
4750
import aztech.modern_industrialization.machines.MachineBlockEntityRenderer;
4851
import aztech.modern_industrialization.machines.MachineOverlayClient;
@@ -253,6 +256,7 @@ private static void registerClientTooltipComponents(RegisterClientTooltipCompone
253256
event.register(BarrelTooltipData.class, BarrelTooltipComponent::new);
254257
event.register(ConfigCardItem.TooltipData.class, ClientConfigCardTooltip::new);
255258
event.register(SteamDrillItem.SteamDrillTooltipData.class, SteamDrillTooltipComponent::new);
259+
event.register(StructureMultiblockMemberBlockItem.TooltipData.class, ClientStructureMemberBlockTooltip::new);
256260
}
257261

258262
@SubscribeEvent
@@ -272,6 +276,18 @@ private static void registerItemProperties(FMLClientSetupEvent event) {
272276
(stack, level, entity, seed) -> {
273277
return RedstoneControlModuleItem.isRequiresLowSignal(stack) ? 0 : 1;
274278
});
279+
ItemProperties.register(MIBlock.STRUCTURE_MULTIBLOCK_MEMBER.asItem(), MI.id("member_mode"),
280+
(stack, level, entity, seed) -> {
281+
StructureMemberMode mode = StructureMultiblockMemberBlockItem.getMode(stack);
282+
if (mode == null) {
283+
return 0;
284+
}
285+
return switch (mode) {
286+
case SIMPLE -> 0.0f;
287+
case HATCH -> 0.5f;
288+
case VARIABLE -> 1.0f;
289+
};
290+
});
275291
});
276292
}
277293
}
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
/*
2+
* MIT License
3+
*
4+
* Copyright (c) 2020 Azercoco & Technici4n
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in all
14+
* copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
* SOFTWARE.
23+
*/
24+
package aztech.modern_industrialization.items.client;
25+
26+
import aztech.modern_industrialization.MITooltips;
27+
import aztech.modern_industrialization.blocks.structure.member.StructureMemberMode;
28+
import aztech.modern_industrialization.blocks.structure.member.StructureMultiblockMemberBlockItem;
29+
import aztech.modern_industrialization.machines.multiblocks.HatchType;
30+
import aztech.modern_industrialization.machines.multiblocks.structure.member.test.StateStructureMemberTest;
31+
import aztech.modern_industrialization.machines.multiblocks.structure.member.test.StructureMemberTest;
32+
import aztech.modern_industrialization.util.RenderHelper;
33+
import java.util.ArrayList;
34+
import java.util.List;
35+
import java.util.Locale;
36+
import net.minecraft.ChatFormatting;
37+
import net.minecraft.client.gui.Font;
38+
import net.minecraft.client.gui.GuiGraphics;
39+
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
40+
import net.minecraft.client.renderer.MultiBufferSource;
41+
import net.minecraft.network.chat.Component;
42+
import net.minecraft.world.item.ItemStack;
43+
import org.joml.Matrix4f;
44+
45+
// TODO SWEDZ: there has to be a better way to align all the text and stuff. maybe some kind of builder?
46+
public final class ClientStructureMemberBlockTooltip implements ClientTooltipComponent {
47+
private static final int TEXT_ROW_HEIGHT = 9;
48+
private static final int TEXT_BEFORE_IMAGE_ROW_HEIGHT = TEXT_ROW_HEIGHT + 4;
49+
private static final int IMAGE_ROW_HEIGHT = 20;
50+
51+
private final StructureMultiblockMemberBlockItem.TooltipData data;
52+
53+
private final ItemStack preview;
54+
private final List<ItemStack> members;
55+
56+
public ClientStructureMemberBlockTooltip(StructureMultiblockMemberBlockItem.TooltipData data) {
57+
this.data = data;
58+
59+
preview = data.preview().getBlock().asItem().getDefaultInstance();
60+
61+
members = new ArrayList<>();
62+
for (StructureMemberTest member : data.members()) {
63+
if (member instanceof StateStructureMemberTest stateTest) {
64+
members.add(stateTest.blockState().getBlock().asItem().getDefaultInstance());
65+
}
66+
}
67+
}
68+
69+
@Override
70+
public int getHeight() {
71+
int height = 0;
72+
73+
height += TEXT_ROW_HEIGHT;
74+
75+
if (renderName()) {
76+
height += TEXT_ROW_HEIGHT;
77+
}
78+
79+
if (renderCasing()) {
80+
height += TEXT_ROW_HEIGHT;
81+
}
82+
83+
if (renderPreview()) {
84+
height += TEXT_BEFORE_IMAGE_ROW_HEIGHT;
85+
height += IMAGE_ROW_HEIGHT;
86+
}
87+
88+
if (renderMembers()) {
89+
height += TEXT_BEFORE_IMAGE_ROW_HEIGHT;
90+
height += IMAGE_ROW_HEIGHT;
91+
}
92+
93+
if (renderHatch()) {
94+
height += TEXT_ROW_HEIGHT;
95+
for (HatchType hatchType : HatchType.values()) {
96+
if (data.hatchFlags().allows(hatchType)) {
97+
height += TEXT_ROW_HEIGHT;
98+
}
99+
}
100+
}
101+
102+
return height;
103+
}
104+
105+
@Override
106+
public int getWidth(Font font) {
107+
// TODO SWEDZ: get actual width
108+
return 18 * 6;
109+
}
110+
111+
private void renderRowImage(List<ItemStack> stacks, Font font, int x, int y, GuiGraphics graphics) {
112+
int i = 0;
113+
for (var stack : stacks) {
114+
RenderHelper.renderAndDecorateItem(graphics, font, stack, x + i * 18, y);
115+
if (++i >= 5) {
116+
break;
117+
}
118+
}
119+
}
120+
121+
private void renderRowImageText(int count, Font font, int x, int y, Matrix4f matrix, MultiBufferSource.BufferSource buffer) {
122+
if (count >= 6) {
123+
font.drawInBatch(Component.literal("+ ...").withStyle(MITooltips.DEFAULT_STYLE), x + 18 * 5, y + 5, -1, true, matrix, buffer,
124+
Font.DisplayMode.NORMAL, 0, 0xF000F0);
125+
}
126+
}
127+
128+
private void renderRowText(Component text, Font font, int x, int y, Matrix4f matrix, MultiBufferSource.BufferSource buffer) {
129+
font.drawInBatch(text, x, y, -1, true, matrix, buffer, Font.DisplayMode.NORMAL, 0, 0xF000F0);
130+
}
131+
132+
private boolean renderName() {
133+
return data.mode() == StructureMemberMode.VARIABLE;
134+
}
135+
136+
private boolean renderPreview() {
137+
return data.mode() == StructureMemberMode.SIMPLE || data.mode() == StructureMemberMode.HATCH;
138+
}
139+
140+
private boolean renderMembers() {
141+
return data.mode() == StructureMemberMode.SIMPLE || data.mode() == StructureMemberMode.HATCH;
142+
}
143+
144+
private boolean renderCasing() {
145+
return data.mode() == StructureMemberMode.HATCH;
146+
}
147+
148+
private boolean renderHatch() {
149+
return data.mode() == StructureMemberMode.HATCH && data.hatchFlags().flags != 0;
150+
}
151+
152+
@Override
153+
public void renderImage(Font font, int x, int y, GuiGraphics graphics) {
154+
int lineY = y;
155+
156+
lineY += TEXT_ROW_HEIGHT;
157+
158+
if (renderName()) {
159+
lineY += TEXT_ROW_HEIGHT;
160+
}
161+
162+
if (renderCasing()) {
163+
lineY += TEXT_ROW_HEIGHT;
164+
}
165+
166+
if (renderPreview()) {
167+
lineY += TEXT_BEFORE_IMAGE_ROW_HEIGHT;
168+
renderRowImage(List.of(preview), font, x, lineY, graphics);
169+
lineY += IMAGE_ROW_HEIGHT;
170+
}
171+
172+
if (renderMembers()) {
173+
lineY += TEXT_BEFORE_IMAGE_ROW_HEIGHT;
174+
renderRowImage(members, font, x, lineY, graphics);
175+
lineY += IMAGE_ROW_HEIGHT;
176+
}
177+
178+
if (renderHatch()) {
179+
lineY += TEXT_ROW_HEIGHT;
180+
for (HatchType hatchType : HatchType.values()) {
181+
if (data.hatchFlags().allows(hatchType)) {
182+
lineY += TEXT_ROW_HEIGHT;
183+
}
184+
}
185+
}
186+
}
187+
188+
@Override
189+
public void renderText(Font font, int x, int y, Matrix4f matrix, MultiBufferSource.BufferSource buffer) {
190+
int lineY = y;
191+
192+
// TODO SWEDZ: use translations
193+
renderRowText(Component.literal("Mode: ").append(data.mode().text()), font, x, lineY, matrix, buffer);
194+
lineY += TEXT_ROW_HEIGHT;
195+
196+
if (renderName()) {
197+
renderRowText(Component.literal("Name: %s".formatted(data.name())), font, x, lineY, matrix, buffer);
198+
lineY += TEXT_ROW_HEIGHT;
199+
}
200+
201+
if (renderCasing()) {
202+
renderRowText(Component.literal("Casing: %s".formatted(data.casing().key.getPath())), font, x, lineY, matrix, buffer);
203+
lineY += TEXT_ROW_HEIGHT;
204+
}
205+
206+
if (renderPreview()) {
207+
renderRowText(Component.literal("Preview").withStyle(ChatFormatting.UNDERLINE), font, x, lineY, matrix, buffer);
208+
lineY += TEXT_BEFORE_IMAGE_ROW_HEIGHT;
209+
lineY += IMAGE_ROW_HEIGHT;
210+
}
211+
212+
if (renderMembers()) {
213+
renderRowText(Component.literal("Members").withStyle(ChatFormatting.UNDERLINE), font, x, lineY, matrix, buffer);
214+
lineY += TEXT_BEFORE_IMAGE_ROW_HEIGHT;
215+
renderRowImageText(members.size(), font, x, lineY, matrix, buffer);
216+
lineY += IMAGE_ROW_HEIGHT;
217+
}
218+
219+
if (renderHatch()) {
220+
renderRowText(Component.literal("Hatches").withStyle(ChatFormatting.UNDERLINE), font, x, lineY, matrix, buffer);
221+
lineY += TEXT_ROW_HEIGHT;
222+
for (HatchType hatchType : HatchType.values()) {
223+
if (data.hatchFlags().allows(hatchType)) {
224+
renderRowText(Component.literal("- %s".formatted(hatchType.name().toLowerCase(Locale.ROOT))), font, x, lineY, matrix, buffer);
225+
lineY += TEXT_ROW_HEIGHT;
226+
}
227+
}
228+
}
229+
}
230+
}
Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
11
{
2-
"parent": "modern_industrialization:block/structure_multiblock_member_simple"
2+
"parent": "modern_industrialization:block/structure_multiblock_member_simple",
3+
"overrides": [
4+
{
5+
"model": "modern_industrialization:block/structure_multiblock_member_simple",
6+
"predicate": {
7+
"modern_industrialization:member_mode": 0.0
8+
}
9+
},
10+
{
11+
"model": "modern_industrialization:block/structure_multiblock_member_hatch",
12+
"predicate": {
13+
"modern_industrialization:member_mode": 0.5
14+
}
15+
},
16+
{
17+
"model": "modern_industrialization:block/structure_multiblock_member_variable",
18+
"predicate": {
19+
"modern_industrialization:member_mode": 1.0
20+
}
21+
}
22+
]
323
}

src/main/java/aztech/modern_industrialization/MIBlock.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
import aztech.modern_industrialization.blocks.storage.tank.TankItem;
3737
import aztech.modern_industrialization.blocks.storage.tank.creativetank.CreativeTankBlockEntity;
3838
import aztech.modern_industrialization.blocks.structure.controller.StructureMultiblockControllerBlock;
39+
import aztech.modern_industrialization.blocks.structure.member.StructureMemberMode;
3940
import aztech.modern_industrialization.blocks.structure.member.StructureMultiblockMemberBlock;
41+
import aztech.modern_industrialization.blocks.structure.member.StructureMultiblockMemberBlockItem;
4042
import aztech.modern_industrialization.datagen.loot.MIBlockLoot;
4143
import aztech.modern_industrialization.datagen.model.BaseModelProvider;
4244
import aztech.modern_industrialization.definition.BlockDefinition;
@@ -151,17 +153,23 @@ public static void init(IEventBus modBus) {
151153
public static final BlockDefinition<StructureMultiblockMemberBlock> STRUCTURE_MULTIBLOCK_MEMBER = block("Structure Multiblock Member",
152154
"structure_multiblock_member", BlockDefinitionParams.defaultCreativeOnly()
153155
.withBlockConstructor(StructureMultiblockMemberBlock::new)
154-
.withBlockItemConstructor((block, p) -> new BlockItem(block, p.rarity(Rarity.EPIC)))
156+
.withBlockItemConstructor((block, p) -> new StructureMultiblockMemberBlockItem(block, p.rarity(Rarity.EPIC)))
155157
.withModel((block, gen) -> {
158+
Function<StructureMemberMode, ModelFile> modelCreator = (mode) -> {
159+
String texture = "structure_multiblock_member_" + mode.getSerializedName();
160+
return gen.models().cubeAll(texture, gen.blockTexture(texture));
161+
};
156162
gen.getVariantBuilder(block).forAllStates(state -> {
157163
var mode = state.getValue(StructureMultiblockMemberBlock.MODE);
158-
String texture = "structure_multiblock_member_" + mode.getSerializedName();
159164
return ConfiguredModel.builder()
160-
.modelFile(gen.models().cubeAll(texture, gen.blockTexture(texture)))
165+
.modelFile(modelCreator.apply(mode))
161166
.build();
162167
});
163-
String simpleTexture = "structure_multiblock_member_simple";
164-
gen.simpleBlockItem(block, gen.models().cubeAll(simpleTexture, gen.blockTexture(simpleTexture)));
168+
gen.itemModels().getBuilder(gen.name(block))
169+
.parent(modelCreator.apply(StructureMemberMode.SIMPLE))
170+
.override().predicate(MI.id("member_mode"), 0.0f).model(modelCreator.apply(StructureMemberMode.SIMPLE)).end()
171+
.override().predicate(MI.id("member_mode"), 0.5f).model(modelCreator.apply(StructureMemberMode.HATCH)).end()
172+
.override().predicate(MI.id("member_mode"), 1.0f).model(modelCreator.apply(StructureMemberMode.VARIABLE)).end();
165173
}));
166174

167175
// Materials

0 commit comments

Comments
 (0)