-
Notifications
You must be signed in to change notification settings - Fork 755
/
FlexBlockTypes.java
81 lines (76 loc) · 4.01 KB
/
FlexBlockTypes.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package slimeknights.tconstruct.plugin.jsonthings;
import dev.gigaherz.jsonthings.things.IFlexBlock;
import dev.gigaherz.jsonthings.things.serializers.FlexBlockType;
import dev.gigaherz.jsonthings.things.serializers.IBlockSerializer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.common.util.Lazy;
import slimeknights.mantle.data.loadable.Loadables;
import slimeknights.mantle.data.loadable.primitive.ResourceLocationLoadable;
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.plugin.jsonthings.block.FlexBurningLiquidBlock;
import slimeknights.tconstruct.plugin.jsonthings.block.FlexMobEffectLiquidBlock;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
/** Collection of custom block types added by Tinkers */
public class FlexBlockTypes {
/** Creates the supplier for a fluid in a fluid block */
private static Supplier<FlowingFluid> fluidSupplier(ResourceLocation name) {
return Lazy.of(() -> {
// TODO: make Mantle loadables resource location
if (((ResourceLocationLoadable<Fluid>)Loadables.FLUID).fromKey(name, "fluid") instanceof FlowingFluid flowing) {
return flowing;
} else {
throw new RuntimeException("LiquidBlock requires a flowing fluid");
}
});
}
/** Initializes the block types */
public static void init() {
register("burning_liquid", data -> {
ResourceLocation fluidField = Loadables.RESOURCE_LOCATION.getOrDefault(data, "fluid", null);
int burnTime = GsonHelper.getAsInt(data, "burn_time");
float damage = GsonHelper.getAsFloat(data, "damage");
return (props, builder) -> {
final List<Property<?>> _properties = builder.getProperties();
return new FlexBurningLiquidBlock(props, builder.getPropertyDefaultValues(), fluidSupplier(Objects.requireNonNullElse(fluidField, builder.getRegistryName())), burnTime, damage) {
@Override
protected void createBlockStateDefinition(Builder<Block,BlockState> stateBuilder) {
super.createBlockStateDefinition(stateBuilder);
_properties.forEach(stateBuilder::add);
}
};
};
}, Material.LAVA);
register("mob_effect_liquid", data -> {
ResourceLocation fluidField = Loadables.RESOURCE_LOCATION.getOrDefault(data, "fluid", null);
ResourceLocation effectName = Loadables.RESOURCE_LOCATION.getIfPresent(data, "effect");
int effectLevel = GsonHelper.getAsInt(data, "burn_time");
return (props, builder) -> {
final List<Property<?>> _properties = builder.getProperties();
Lazy<MobEffect> effect = Lazy.of(() -> ((ResourceLocationLoadable<MobEffect>)Loadables.MOB_EFFECT).fromKey(effectName, "effect"));
return new FlexMobEffectLiquidBlock(props, builder.getPropertyDefaultValues(), fluidSupplier(Objects.requireNonNullElse(fluidField, builder.getRegistryName())), () -> new MobEffectInstance(effect.get(), 5*20, effectLevel - 1)) {
@Override
protected void createBlockStateDefinition(Builder<Block,BlockState> stateBuilder) {
super.createBlockStateDefinition(stateBuilder);
_properties.forEach(stateBuilder::add);
}
};
};
}, Material.WATER);
}
/** Local helper to register our stuff */
private static <T extends Block & IFlexBlock> void register(String name, IBlockSerializer<T> factory, Material defaultMaterial) {
FlexBlockType.register(TConstruct.resourceString(name), factory, "translucent", true, defaultMaterial);
}
}