Skip to content

Commit 1713df8

Browse files
committed
Move Hopperhock and Rannuncarpus settings to state properties
1 parent df437b6 commit 1713df8

24 files changed

+250
-125
lines changed

Xplat/src/main/java/vazkii/botania/api/state/BotaniaStateProperties.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import vazkii.botania.api.state.enums.AlfheimPortalState;
1717
import vazkii.botania.api.state.enums.CraftyCratePattern;
18+
import vazkii.botania.api.state.enums.HopperhockFilterType;
19+
import vazkii.botania.api.state.enums.RannuncarpusMode;
1820

1921
/**
2022
* Holds all Botania block state properties. Use these to set botania blockstates
@@ -46,6 +48,10 @@ public final class BotaniaStateProperties {
4648
// ManaPoolBlock
4749
public static final BooleanProperty OUTPUTTING = BooleanProperty.create("outputting");
4850

51+
// various special flowers
52+
public static final EnumProperty<HopperhockFilterType> HOPPERHOCK_FILTER = EnumProperty.create("filter_type", HopperhockFilterType.class);
53+
public static final EnumProperty<RannuncarpusMode> RANNUNCARPUS_MODE = EnumProperty.create("mode", RannuncarpusMode.class);
54+
4955
private BotaniaStateProperties() {}
5056

5157
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package vazkii.botania.api.state.enums;
2+
3+
import net.minecraft.util.StringRepresentable;
4+
5+
public enum HopperhockFilterType implements StringRepresentable {
6+
ACCEPT_IN_FRAME("items_in_frames"),
7+
ACCEPT_NOT_IN_FRAME("items_not_in_frames"),
8+
ACCEPT_ALL("all_items");
9+
10+
private final String name;
11+
12+
HopperhockFilterType(String name) {
13+
this.name = name;
14+
}
15+
16+
@Override
17+
public String getSerializedName() {
18+
return name;
19+
}
20+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package vazkii.botania.api.state.enums;
2+
3+
import net.minecraft.util.StringRepresentable;
4+
5+
public enum RannuncarpusMode implements StringRepresentable {
6+
STATE_INSENSITIVE("state_insensitive"),
7+
STATE_SENSITIVE("state_sensitive");
8+
9+
private final String name;
10+
11+
RannuncarpusMode(String name) {
12+
this.name = name;
13+
}
14+
15+
@Override
16+
public String getSerializedName() {
17+
return name;
18+
}
19+
}

Xplat/src/main/java/vazkii/botania/common/block/BotaniaBlocks.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -400,10 +400,10 @@ public final class BotaniaBlocks {
400400
public static final Block agricarnationPotted = make(potted(LibBlockNames.SUBTILE_AGRICARNATION), BotaniaBlocks.flowerPot(agricarnation, 0));
401401
public static final Block agricarnationChibiPotted = make(chibi(potted(LibBlockNames.SUBTILE_AGRICARNATION)), BotaniaBlocks.flowerPot(agricarnationChibi, 0));
402402

403-
public static final Block hopperhock = make(LibBlockNames.SUBTILE_HOPPERHOCK, new PoweredSpecialFlowerBlock(MobEffects.MOVEMENT_SPEED, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK));
404-
public static final Block hopperhockChibi = make(chibi(LibBlockNames.SUBTILE_HOPPERHOCK), new PoweredSpecialFlowerBlock(MobEffects.MOVEMENT_SPEED, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK_CHIBI));
405-
public static final Block hopperhockFloating = make(floating(LibBlockNames.SUBTILE_HOPPERHOCK), new PoweredFloatingSpecialFlowerBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK));
406-
public static final Block hopperhockChibiFloating = make(chibi(floating(LibBlockNames.SUBTILE_HOPPERHOCK)), new PoweredFloatingSpecialFlowerBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK_CHIBI));
403+
public static final Block hopperhock = make(LibBlockNames.SUBTILE_HOPPERHOCK, new HopperhockBlock(MobEffects.MOVEMENT_SPEED, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK));
404+
public static final Block hopperhockChibi = make(chibi(LibBlockNames.SUBTILE_HOPPERHOCK), new HopperhockBlock(MobEffects.MOVEMENT_SPEED, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK_CHIBI));
405+
public static final Block hopperhockFloating = make(floating(LibBlockNames.SUBTILE_HOPPERHOCK), new FloatingHopperhockBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK));
406+
public static final Block hopperhockChibiFloating = make(chibi(floating(LibBlockNames.SUBTILE_HOPPERHOCK)), new FloatingHopperhockBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.HOPPERHOCK_CHIBI));
407407
public static final Block hopperhockPotted = make(potted(LibBlockNames.SUBTILE_HOPPERHOCK), BotaniaBlocks.flowerPot(hopperhock, 0));
408408
public static final Block hopperhockChibiPotted = make(chibi(potted(LibBlockNames.SUBTILE_HOPPERHOCK)), BotaniaBlocks.flowerPot(hopperhockChibi, 0));
409409

@@ -421,10 +421,10 @@ public final class BotaniaBlocks {
421421
public static final Block jiyuuliaPotted = make(potted(LibBlockNames.SUBTILE_JIYUULIA), BotaniaBlocks.flowerPot(jiyuulia, 0));
422422
public static final Block jiyuuliaChibiPotted = make(chibi(potted(LibBlockNames.SUBTILE_JIYUULIA)), BotaniaBlocks.flowerPot(jiyuuliaChibi, 0));
423423

424-
public static final Block rannuncarpus = make(LibBlockNames.SUBTILE_RANNUNCARPUS, new PoweredSpecialFlowerBlock(MobEffects.JUMP, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS));
425-
public static final Block rannuncarpusChibi = make(chibi(LibBlockNames.SUBTILE_RANNUNCARPUS), new PoweredSpecialFlowerBlock(MobEffects.JUMP, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS_CHIBI));
426-
public static final Block rannuncarpusFloating = make(floating(LibBlockNames.SUBTILE_RANNUNCARPUS), new PoweredFloatingSpecialFlowerBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS));
427-
public static final Block rannuncarpusChibiFloating = make(chibi(floating(LibBlockNames.SUBTILE_RANNUNCARPUS)), new PoweredFloatingSpecialFlowerBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS_CHIBI));
424+
public static final Block rannuncarpus = make(LibBlockNames.SUBTILE_RANNUNCARPUS, new RannuncarpusBlock(MobEffects.JUMP, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS));
425+
public static final Block rannuncarpusChibi = make(chibi(LibBlockNames.SUBTILE_RANNUNCARPUS), new RannuncarpusBlock(MobEffects.JUMP, 30, FLOWER_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS_CHIBI));
426+
public static final Block rannuncarpusFloating = make(floating(LibBlockNames.SUBTILE_RANNUNCARPUS), new FloatingRannuncarpusBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS));
427+
public static final Block rannuncarpusChibiFloating = make(chibi(floating(LibBlockNames.SUBTILE_RANNUNCARPUS)), new FloatingRannuncarpusBlock(FLOATING_PROPS, () -> BotaniaBlockEntities.RANNUNCARPUS_CHIBI));
428428
public static final Block rannuncarpusPotted = make(potted(LibBlockNames.SUBTILE_RANNUNCARPUS), BotaniaBlocks.flowerPot(rannuncarpus, 0));
429429
public static final Block rannuncarpusChibiPotted = make(chibi(potted(LibBlockNames.SUBTILE_RANNUNCARPUS)), BotaniaBlocks.flowerPot(rannuncarpusChibi, 0));
430430

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package vazkii.botania.common.block;
2+
3+
import net.minecraft.world.level.block.Block;
4+
import net.minecraft.world.level.block.entity.BlockEntityType;
5+
import net.minecraft.world.level.block.state.BlockState;
6+
import net.minecraft.world.level.block.state.StateDefinition;
7+
8+
import vazkii.botania.api.block_entity.SpecialFlowerBlockEntity;
9+
import vazkii.botania.api.state.BotaniaStateProperties;
10+
import vazkii.botania.api.state.enums.HopperhockFilterType;
11+
12+
import java.util.function.Supplier;
13+
14+
public class FloatingHopperhockBlock extends PoweredFloatingSpecialFlowerBlock {
15+
16+
public FloatingHopperhockBlock(Properties props,
17+
Supplier<BlockEntityType<? extends SpecialFlowerBlockEntity>> blockEntityType) {
18+
super(props, blockEntityType);
19+
registerDefaultState(defaultBlockState()
20+
.setValue(BotaniaStateProperties.HOPPERHOCK_FILTER, HopperhockFilterType.ACCEPT_IN_FRAME));
21+
}
22+
23+
@Override
24+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
25+
super.createBlockStateDefinition(builder);
26+
builder.add(BotaniaStateProperties.HOPPERHOCK_FILTER);
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package vazkii.botania.common.block;
2+
3+
import net.minecraft.world.level.block.Block;
4+
import net.minecraft.world.level.block.entity.BlockEntityType;
5+
import net.minecraft.world.level.block.state.BlockState;
6+
import net.minecraft.world.level.block.state.StateDefinition;
7+
8+
import vazkii.botania.api.block_entity.SpecialFlowerBlockEntity;
9+
import vazkii.botania.api.state.BotaniaStateProperties;
10+
import vazkii.botania.api.state.enums.RannuncarpusMode;
11+
12+
import java.util.function.Supplier;
13+
14+
public class FloatingRannuncarpusBlock extends PoweredFloatingSpecialFlowerBlock {
15+
16+
public FloatingRannuncarpusBlock(Properties props,
17+
Supplier<BlockEntityType<? extends SpecialFlowerBlockEntity>> blockEntityType) {
18+
super(props, blockEntityType);
19+
registerDefaultState(defaultBlockState()
20+
.setValue(BotaniaStateProperties.RANNUNCARPUS_MODE, RannuncarpusMode.STATE_INSENSITIVE));
21+
}
22+
23+
@Override
24+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
25+
super.createBlockStateDefinition(builder);
26+
builder.add(BotaniaStateProperties.RANNUNCARPUS_MODE);
27+
}
28+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package vazkii.botania.common.block;
2+
3+
import net.minecraft.core.Holder;
4+
import net.minecraft.world.effect.MobEffect;
5+
import net.minecraft.world.level.block.Block;
6+
import net.minecraft.world.level.block.entity.BlockEntityType;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
import net.minecraft.world.level.block.state.StateDefinition;
9+
10+
import vazkii.botania.api.block_entity.SpecialFlowerBlockEntity;
11+
import vazkii.botania.api.state.BotaniaStateProperties;
12+
import vazkii.botania.api.state.enums.HopperhockFilterType;
13+
14+
import java.util.function.Supplier;
15+
16+
public class HopperhockBlock extends PoweredSpecialFlowerBlock {
17+
18+
public HopperhockBlock(Holder<MobEffect> stewEffect, int stewDuration,
19+
Properties props,
20+
Supplier<BlockEntityType<? extends SpecialFlowerBlockEntity>> blockEntityType) {
21+
super(stewEffect, stewDuration, props, blockEntityType);
22+
registerDefaultState(defaultBlockState()
23+
.setValue(BotaniaStateProperties.HOPPERHOCK_FILTER, HopperhockFilterType.ACCEPT_IN_FRAME));
24+
}
25+
26+
@Override
27+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
28+
super.createBlockStateDefinition(builder);
29+
builder.add(BotaniaStateProperties.HOPPERHOCK_FILTER);
30+
}
31+
32+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package vazkii.botania.common.block;
2+
3+
import net.minecraft.core.Holder;
4+
import net.minecraft.world.effect.MobEffect;
5+
import net.minecraft.world.level.block.Block;
6+
import net.minecraft.world.level.block.entity.BlockEntityType;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
import net.minecraft.world.level.block.state.StateDefinition;
9+
10+
import vazkii.botania.api.block_entity.SpecialFlowerBlockEntity;
11+
import vazkii.botania.api.state.BotaniaStateProperties;
12+
import vazkii.botania.api.state.enums.RannuncarpusMode;
13+
14+
import java.util.function.Supplier;
15+
16+
public class RannuncarpusBlock extends PoweredSpecialFlowerBlock {
17+
public RannuncarpusBlock(Holder<MobEffect> stewEffect, int stewDuration,
18+
Properties props,
19+
Supplier<BlockEntityType<? extends SpecialFlowerBlockEntity>> blockEntityType) {
20+
super(stewEffect, stewDuration, props, blockEntityType);
21+
registerDefaultState(defaultBlockState()
22+
.setValue(BotaniaStateProperties.RANNUNCARPUS_MODE, RannuncarpusMode.STATE_INSENSITIVE));
23+
}
24+
25+
@Override
26+
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
27+
super.createBlockStateDefinition(builder);
28+
builder.add(BotaniaStateProperties.RANNUNCARPUS_MODE);
29+
}
30+
31+
}

Xplat/src/main/java/vazkii/botania/common/block/flower/functional/HopperhockBlockEntity.java

Lines changed: 23 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
import net.minecraft.client.resources.language.I18n;
1616
import net.minecraft.core.BlockPos;
1717
import net.minecraft.core.Direction;
18-
import net.minecraft.core.HolderLookup;
19-
import net.minecraft.nbt.CompoundTag;
2018
import net.minecraft.world.entity.item.ItemEntity;
2119
import net.minecraft.world.entity.player.Player;
2220
import net.minecraft.world.item.ItemStack;
21+
import net.minecraft.world.level.block.Block;
2322
import net.minecraft.world.level.block.entity.BlockEntityType;
2423
import net.minecraft.world.level.block.state.BlockState;
2524
import net.minecraft.world.phys.AABB;
@@ -29,6 +28,8 @@
2928
import vazkii.botania.api.block.Wandable;
3029
import vazkii.botania.api.block_entity.FunctionalFlowerBlockEntity;
3130
import vazkii.botania.api.block_entity.RadiusDescriptor;
31+
import vazkii.botania.api.state.BotaniaStateProperties;
32+
import vazkii.botania.api.state.enums.HopperhockFilterType;
3233
import vazkii.botania.common.block.block_entity.BotaniaBlockEntities;
3334
import vazkii.botania.common.helper.*;
3435
import vazkii.botania.common.internal_caps.ItemFlagsComponent;
@@ -42,15 +43,12 @@
4243
import java.util.function.Predicate;
4344

4445
public class HopperhockBlockEntity extends FunctionalFlowerBlockEntity implements Wandable {
45-
private static final String TAG_FILTER_TYPE = "filterType";
4646
private static final int RANGE_MANA = 10;
4747
private static final int RANGE = 6;
4848

4949
private static final int RANGE_MANA_MINI = 2;
5050
private static final int RANGE_MINI = 1;
5151

52-
private int filterType = 0;
53-
5452
protected HopperhockBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
5553
super(type, pos, state);
5654
}
@@ -89,6 +87,11 @@ public void tickFlower() {
8987
}
9088
}
9189

90+
public HopperhockFilterType getFilterType() {
91+
return getBlockState().getOptionalValue(BotaniaStateProperties.HOPPERHOCK_FILTER)
92+
.orElse(HopperhockFilterType.ACCEPT_IN_FRAME);
93+
}
94+
9295
private List<ItemEntity> getItemEntities(BlockPos inPos, int range) {
9396
Predicate<ItemEntity> shouldPickup = item -> {
9497
if (XplatAbstractions.INSTANCE.preventsRemoteMovement(item)) {
@@ -113,10 +116,9 @@ private void findFilterDirections(BlockPos outPos, Set<Direction> unfilteredDire
113116
Direction sideOfInventory = dir.getOpposite();
114117

115118
if (XplatAbstractions.INSTANCE.hasInventory(level, inventoryPos, sideOfInventory)) {
116-
// TODO: filter type handling is not great
117-
List<ItemStack> filter = filterType != 2
119+
List<ItemStack> filter = getFilterType() != HopperhockFilterType.ACCEPT_ALL
118120
// don't bother looking for filters if the flower ignores them anyway
119-
? FilterHelper.getFiltersOnBlock(getLevel(), inventoryPos, true)
121+
? FilterHelper.getFiltersOnBlock(level, inventoryPos, true)
120122
: List.of();
121123
if (filter.isEmpty()) {
122124
unfilteredDirections.add(dir);
@@ -159,49 +161,36 @@ private ItemStack insertStack(BlockPos outPos, Direction dir, ItemStack stack, L
159161
BlockPos inventoryPos = outPos.relative(dir);
160162
Direction sideOfInventory = dir.getOpposite();
161163
return XplatAbstractions.INSTANCE.hasInventory(level, inventoryPos, sideOfInventory)
162-
&& canAcceptItem(stack, filter, filterType)
164+
&& canAcceptItem(stack, filter, getFilterType())
163165
? XplatAbstractions.INSTANCE.insertToInventory(level, inventoryPos, sideOfInventory, stack, false)
164166
: stack;
165167
}
166168

167-
public static boolean canAcceptItem(ItemStack stack, List<ItemStack> filter, int filterType) {
169+
public static boolean canAcceptItem(ItemStack stack, List<ItemStack> filter, HopperhockFilterType filterType) {
168170
if (stack.isEmpty()) {
169171
return false;
170172
}
171173

172-
if (filter.isEmpty()) {
174+
if (filter.isEmpty() || filterType == HopperhockFilterType.ACCEPT_ALL) {
173175
return true;
174176
}
175177

176-
switch (filterType) {
177-
case 0: { // Accept items in frames only
178-
boolean anyFilter = false;
179-
for (ItemStack filterEntry : filter) {
180-
if (filterEntry == null || filterEntry.isEmpty()) {
181-
continue;
182-
}
183-
anyFilter = true;
184-
185-
if (DataComponentHelper.matchTagAndManaFullness(stack, filterEntry)) {
186-
return true;
187-
}
188-
}
189-
190-
return !anyFilter;
178+
for (ItemStack filterEntry : filter) {
179+
if (filterEntry.isEmpty()) {
180+
continue;
181+
}
182+
if (DataComponentHelper.matchTagAndManaFullness(stack, filterEntry)) {
183+
return filterType == HopperhockFilterType.ACCEPT_IN_FRAME;
191184
}
192-
case 1:
193-
return !canAcceptItem(stack, filter, 0); // Accept items not in frames only
194-
default:
195-
return true; // Accept all items
196185
}
186+
187+
return filterType == HopperhockFilterType.ACCEPT_NOT_IN_FRAME;
197188
}
198189

199190
@Override
200191
public boolean onUsedByWand(@Nullable Player player, ItemStack wand, Direction side) {
201192
if (player == null || player.isShiftKeyDown()) {
202-
filterType = filterType == 2 ? 0 : filterType + 1;
203-
sync();
204-
193+
level.setBlock(getBlockPos(), getBlockState().cycle(BotaniaStateProperties.HOPPERHOCK_FILTER), Block.UPDATE_CLIENTS);
205194
return true;
206195
}
207196
return false;
@@ -226,28 +215,14 @@ public int getRange() {
226215
return getMana() > 0 ? RANGE_MANA : RANGE;
227216
}
228217

229-
@Override
230-
public void writeToPacketNBT(CompoundTag cmp, HolderLookup.Provider registries) {
231-
super.writeToPacketNBT(cmp, registries);
232-
233-
cmp.putInt(TAG_FILTER_TYPE, filterType);
234-
}
235-
236-
@Override
237-
public void readFromPacketNBT(CompoundTag cmp, HolderLookup.Provider registries) {
238-
super.readFromPacketNBT(cmp, registries);
239-
240-
filterType = cmp.getInt(TAG_FILTER_TYPE);
241-
}
242-
243218
public static class WandHud extends BindableFlowerWandHud<HopperhockBlockEntity> {
244219
public WandHud(HopperhockBlockEntity flower) {
245220
super(flower);
246221
}
247222

248223
@Override
249224
public void renderHUD(GuiGraphics gui, Window window, Font font, float partialTick) {
250-
String filter = I18n.get("botaniamisc.filter" + flower.filterType);
225+
String filter = I18n.get("botaniamisc.filter." + flower.getFilterType().getSerializedName());
251226
int filterWidth = font.width(filter);
252227
int filterTextStart = (window.getGuiScaledWidth() - filterWidth) / 2;
253228
int halfMinWidth = (filterWidth + 4) / 2;

0 commit comments

Comments
 (0)