commit
f6d4684427
533 changed files with 7457 additions and 7570 deletions
19
Convert.java
19
Convert.java
|
@ -1,4 +1,3 @@
|
|||
|
||||
class ModelPart {
|
||||
static java.util.ArrayList<ModelPart> parts = new java.util.ArrayList<>(20);
|
||||
final String name;
|
||||
|
@ -14,6 +13,7 @@ class ModelPart {
|
|||
|
||||
|
||||
boolean hadBox = false;
|
||||
|
||||
ModelPart(Convert c, String name) {
|
||||
this(c, 0, 0, name);
|
||||
|
||||
|
@ -59,6 +59,7 @@ class ModelPart {
|
|||
this.v = v;
|
||||
return this;
|
||||
}
|
||||
|
||||
ModelPart addBox(float x, float y, float z, float a, float b, float c) {
|
||||
return addBox(x, y, z, a, b, c, 1);
|
||||
}
|
||||
|
@ -74,6 +75,7 @@ class ModelPart {
|
|||
hadBox = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d, boolean mirror) {
|
||||
this.mirror = mirror;
|
||||
bx = x;
|
||||
|
@ -100,17 +102,19 @@ class ModelPart {
|
|||
s += "\n";
|
||||
if (scale != 1)
|
||||
s += ".addBox(" + bx + "f, " + by + "f, " + bz + "f, " + ba + "f, " + bb + "f, " + bc + "f, deformation_" + name + "),\n";
|
||||
else
|
||||
s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f),\n";
|
||||
} else {
|
||||
else s += ".addBox(" + bx + "f, " + by + "f, " + bz + "f, " + ba + "f, " + bb + "f, " + bc + "f),\n";
|
||||
}
|
||||
else {
|
||||
s += ",\n";
|
||||
}
|
||||
|
||||
if (x == 0 && y == 0 && z == 0 && rx == 0 && ry == 0 && rz == 0) {
|
||||
s += "PartPose.ZERO";
|
||||
} else if (rx==0 && ry==0 && rz==0){
|
||||
}
|
||||
else if (rx == 0 && ry == 0 && rz == 0) {
|
||||
s += "PartPose.offset(" + x + "f, " + y + "f, " + z + "f)";
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
s += "PartPose.offsetAndRotation(" + x + "f, " + y + "f, " + z + "f, \n" + rx + "f, " + ry + "f, " + rz + "f)";
|
||||
}
|
||||
s += ");";
|
||||
|
@ -138,15 +142,18 @@ class ModelPart {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Convert {
|
||||
public static void main(String[] args) {
|
||||
new Convert().c();
|
||||
|
||||
ModelPart.print();
|
||||
}
|
||||
|
||||
void setRotationAngle(ModelPart p, float x, float y, float z) {
|
||||
p.setRotationAngle(x, y, z);
|
||||
}
|
||||
|
||||
public void c() {
|
||||
float scale = 1;
|
||||
ModelPart partC = new ModelPart(64, 64, 0, 19, "partC");
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
[](https://jitpack.io/#paulevsGitch/BetterEnd)
|
||||
|
||||
# Better End
|
||||
|
||||
Better End Mod for Fabric, MC 1.17.1
|
||||
|
||||
Importing:
|
||||
|
||||
* Clone repo
|
||||
* Edit gradle.properties if necessary
|
||||
* Run command line in folder: gradlew genSources eclipse (or Another-IDE-Name)
|
||||
* Import project to IDE
|
||||
|
||||
Building:
|
||||
|
||||
* Clone repo
|
||||
* Run command line in folder: gradlew build
|
||||
* Mod .jar will be in ./build/libs
|
||||
|
|
|
@ -1,21 +1,18 @@
|
|||
# Done to increase the memory available to gradle.
|
||||
org.gradle.jvmargs=-Xmx2G
|
||||
|
||||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/use
|
||||
minecraft_version=1.17.1
|
||||
yarn_mappings=6
|
||||
loader_version=0.11.6
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 0.10.2-pre
|
||||
mod_version=0.10.3-pre
|
||||
maven_group=ru.betterend
|
||||
archives_base_name=better-end
|
||||
|
||||
# Dependencies
|
||||
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
|
||||
patchouli_version=55-FABRIC-SNAPSHOT
|
||||
fabric_version=0.36.1+1.17
|
||||
bclib_version = 0.2.0
|
||||
bclib_version=0.2.1
|
||||
rei_version=6.0.262-alpha
|
||||
canvas_version=1.0.+
|
||||
|
|
|
@ -1,7 +1,16 @@
|
|||
{
|
||||
"variants": {
|
||||
"axis=x": { "model": "betterend:block/%name%_pillar", "x": 90, "y": 90 },
|
||||
"axis=y": { "model": "betterend:block/%name%_pillar" },
|
||||
"axis=z": { "model": "betterend:block/%name%_pillar", "x": 90 }
|
||||
"axis=x": {
|
||||
"model": "betterend:block/%name%_pillar",
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
"axis=y": {
|
||||
"model": "betterend:block/%name%_pillar"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "betterend:block/%name%_pillar",
|
||||
"x": 90
|
||||
}
|
||||
}
|
||||
}
|
|
@ -14,11 +14,7 @@ import ru.bclib.blocks.BaseBlock;
|
|||
public class AeterniumBlock extends BaseBlock {
|
||||
|
||||
public AeterniumBlock() {
|
||||
super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY)
|
||||
.hardness(65F)
|
||||
.resistance(1200F)
|
||||
.requiresCorrectToolForDrops()
|
||||
.sound(SoundType.NETHERITE_BLOCK));
|
||||
super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY).hardness(65F).resistance(1200F).requiresCorrectToolForDrops().sound(SoundType.NETHERITE_BLOCK));
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
|
|
|
@ -33,15 +33,7 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp
|
|||
private static final int MAX_DROP = 4;
|
||||
|
||||
public AuroraCrystalBlock() {
|
||||
super(FabricBlockSettings.of(Material.GLASS)
|
||||
.breakByTool(FabricToolTags.PICKAXES)
|
||||
.breakByTool(TagAPI.HAMMERS)
|
||||
.hardness(1F)
|
||||
.resistance(1F)
|
||||
.luminance(15)
|
||||
.noOcclusion()
|
||||
.isSuffocating((state, world, pos) -> false)
|
||||
.sound(SoundType.GLASS));
|
||||
super(FabricBlockSettings.of(Material.GLASS).breakByTool(FabricToolTags.PICKAXES).breakByTool(TagAPI.HAMMERS).hardness(1F).resistance(1F).luminance(15).noOcclusion().isSuffocating((state, world, pos) -> false).sound(SoundType.GLASS));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -109,11 +101,6 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp
|
|||
}
|
||||
|
||||
static {
|
||||
COLORS = new Vec3i[]{
|
||||
new Vec3i(247, 77, 161),
|
||||
new Vec3i(120, 184, 255),
|
||||
new Vec3i(120, 255, 168),
|
||||
new Vec3i(243, 58, 255)
|
||||
};
|
||||
COLORS = new Vec3i[]{new Vec3i(247, 77, 161), new Vec3i(120, 184, 255), new Vec3i(120, 255, 168), new Vec3i(243, 58, 255)};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,10 +87,7 @@ public class BrimstoneBlock extends BaseBlock {
|
|||
}
|
||||
}
|
||||
else if (sideState.getFluidState().getType() == Fluids.WATER) {
|
||||
BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState()
|
||||
.setValue(SulphurCrystalBlock.FACING, dir)
|
||||
.setValue(SulphurCrystalBlock.WATERLOGGED, true)
|
||||
.setValue(SulphurCrystalBlock.AGE, 0);
|
||||
BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState().setValue(SulphurCrystalBlock.FACING, dir).setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.AGE, 0);
|
||||
world.setBlockAndUpdate(side, crystal);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,11 +24,7 @@ public class BubbleCoralBlock extends EndUnderwaterPlantBlock {
|
|||
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16);
|
||||
|
||||
public BubbleCoralBlock() {
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.CORAL_BLOCK)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.CORAL_BLOCK).noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -32,14 +32,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType
|
|||
private static final VoxelShape SHAPE_FLOOR = Block.box(4, 0, 4, 12, 12, 12);
|
||||
|
||||
public BulbVineLanternBlock() {
|
||||
this(FabricBlockSettings.of(Material.METAL)
|
||||
.hardness(1)
|
||||
.resistance(1)
|
||||
.breakByTool(FabricToolTags.PICKAXES)
|
||||
.materialColor(MaterialColor.COLOR_LIGHT_GRAY)
|
||||
.luminance(15)
|
||||
.requiresCorrectToolForDrops()
|
||||
.sound(SoundType.LANTERN));
|
||||
this(FabricBlockSettings.of(Material.METAL).hardness(1).resistance(1).breakByTool(FabricToolTags.PICKAXES).materialColor(MaterialColor.COLOR_LIGHT_GRAY).luminance(15).requiresCorrectToolForDrops().sound(SoundType.LANTERN));
|
||||
}
|
||||
|
||||
public BulbVineLanternBlock(Properties settings) {
|
||||
|
@ -62,9 +55,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType
|
|||
Map<String, String> textures = Maps.newHashMap();
|
||||
textures.put("%glow%", getGlowTexture());
|
||||
textures.put("%metal%", getMetalTexture(resourceLocation));
|
||||
Optional<String> pattern = blockState.getValue(IS_FLOOR) ?
|
||||
Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, textures) :
|
||||
Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, textures);
|
||||
Optional<String> pattern = blockState.getValue(IS_FLOOR) ? Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, textures) : Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, textures);
|
||||
return ModelsHelper.fromPattern(pattern);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,13 +2,15 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class DragonTreeSaplingBlock extends FeatureSaplingBlock {
|
||||
public class DragonTreeSaplingBlock extends PottableFeatureSapling {
|
||||
public DragonTreeSaplingBlock() {
|
||||
super();
|
||||
}
|
||||
|
@ -22,4 +24,9 @@ public class DragonTreeSaplingBlock extends FeatureSaplingBlock {
|
|||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.SHADOW_GRASS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.SHADOW_GRASS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,16 +12,13 @@ public class EndBlockProperties extends BlockProperties {
|
|||
public static final EnumProperty<PedestalState> PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class);
|
||||
public static final EnumProperty<CactusBottom> CACTUS_BOTTOM = EnumProperty.create("bottom", CactusBottom.class);
|
||||
|
||||
public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item");
|
||||
public static final IntegerProperty PORTAL = IntegerProperty.create("portal", 0, EndPortals.getCount());
|
||||
public static final IntegerProperty PLANT_ID = IntegerProperty.create("plant_id", 0, 63);
|
||||
public static final IntegerProperty SOIL_ID = IntegerProperty.create("soil_id", 0, 15);
|
||||
public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item");
|
||||
|
||||
public enum PedestalState implements StringRepresentable {
|
||||
PEDESTAL_TOP("pedestal_top"),
|
||||
COLUMN_TOP("column_top"),
|
||||
BOTTOM("bottom"),
|
||||
PILLAR("pillar"),
|
||||
COLUMN("column"),
|
||||
DEFAULT("default");
|
||||
PEDESTAL_TOP("pedestal_top"), COLUMN_TOP("column_top"), BOTTOM("bottom"), PILLAR("pillar"), COLUMN("column"), DEFAULT("default");
|
||||
|
||||
private final String name;
|
||||
|
||||
|
@ -41,12 +38,7 @@ public class EndBlockProperties extends BlockProperties {
|
|||
}
|
||||
|
||||
public enum HydraluxShape implements StringRepresentable {
|
||||
FLOWER_BIG_BOTTOM("flower_big_bottom", true),
|
||||
FLOWER_BIG_TOP("flower_big_top", true),
|
||||
FLOWER_SMALL_BOTTOM("flower_small_bottom", true),
|
||||
FLOWER_SMALL_TOP("flower_small_top", true),
|
||||
VINE("vine", false),
|
||||
ROOTS("roots", false);
|
||||
FLOWER_BIG_BOTTOM("flower_big_bottom", true), FLOWER_BIG_TOP("flower_big_top", true), FLOWER_SMALL_BOTTOM("flower_small_bottom", true), FLOWER_SMALL_TOP("flower_small_top", true), VINE("vine", false), ROOTS("roots", false);
|
||||
|
||||
private final String name;
|
||||
private final boolean glow;
|
||||
|
@ -72,13 +64,7 @@ public class EndBlockProperties extends BlockProperties {
|
|||
}
|
||||
|
||||
public enum LumecornShape implements StringRepresentable {
|
||||
LIGHT_TOP("light_top", 15),
|
||||
LIGHT_TOP_MIDDLE("light_top_middle", 15),
|
||||
LIGHT_MIDDLE("light_middle", 15),
|
||||
LIGHT_BOTTOM("light_bottom", 15),
|
||||
MIDDLE("middle", 0),
|
||||
BOTTOM_BIG("bottom_big", 0),
|
||||
BOTTOM_SMALL("bottom_small", 0);
|
||||
LIGHT_TOP("light_top", 15), LIGHT_TOP_MIDDLE("light_top_middle", 15), LIGHT_MIDDLE("light_middle", 15), LIGHT_BOTTOM("light_bottom", 15), MIDDLE("middle", 0), BOTTOM_BIG("bottom_big", 0), BOTTOM_SMALL("bottom_small", 0);
|
||||
|
||||
private final String name;
|
||||
private final int light;
|
||||
|
@ -104,9 +90,7 @@ public class EndBlockProperties extends BlockProperties {
|
|||
}
|
||||
|
||||
public enum CactusBottom implements StringRepresentable {
|
||||
EMPTY("empty"),
|
||||
SAND("sand"),
|
||||
MOSS("moss");
|
||||
EMPTY("empty"), SAND("sand"), MOSS("moss");
|
||||
|
||||
private final String name;
|
||||
|
||||
|
|
|
@ -42,12 +42,7 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock {
|
|||
private static final VoxelShape SHAPE_TOP = Block.box(2, 0, 2, 14, 6, 14);
|
||||
|
||||
public EndLilyBlock() {
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.WET_GRASS)
|
||||
.lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.WET_GRASS).lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0).noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -110,8 +110,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock {
|
|||
p.setX(pos.getX() + x);
|
||||
for (int z = -1; z < 2; z++) {
|
||||
p.setZ(pos.getZ() + z);
|
||||
if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty())
|
||||
count++;
|
||||
if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty()) count++;
|
||||
}
|
||||
}
|
||||
return count == 9;
|
||||
|
|
|
@ -95,8 +95,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
|
|||
BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity);
|
||||
if (exitPos == null) return;
|
||||
if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) {
|
||||
((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(),
|
||||
exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot());
|
||||
((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot());
|
||||
}
|
||||
else {
|
||||
((TeleportingEntity) entity).be_setExitPos(exitPos);
|
||||
|
@ -106,8 +105,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
|
|||
}
|
||||
|
||||
private boolean validate(Entity entity) {
|
||||
return !entity.isPassenger() && !entity.isVehicle() &&
|
||||
entity.canChangeDimensions() && !entity.isOnPortalCooldown();
|
||||
return !entity.isPassenger() && !entity.isVehicle() && entity.canChangeDimensions() && !entity.isOnPortalCooldown();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -127,8 +125,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
|
|||
MutableBlockPos checkPos = basePos.mutable();
|
||||
BlockState currentState = currentWorld.getBlockState(currentPos);
|
||||
int radius = (EternalRitual.SEARCH_RADIUS >> 4) + 1;
|
||||
checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.is(this) &&
|
||||
state.getValue(PORTAL).equals(currentState.getValue(PORTAL)));
|
||||
checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.is(this) && state.getValue(PORTAL).equals(currentState.getValue(PORTAL)));
|
||||
if (checkPos != null) {
|
||||
BlockState checkState = targetWorld.getBlockState(checkPos);
|
||||
Axis axis = checkState.getValue(AXIS);
|
||||
|
|
|
@ -49,12 +49,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
|
|||
public static final String ID = "end_stone_smelter";
|
||||
|
||||
public EndStoneSmelter() {
|
||||
super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY)
|
||||
.luminance(state -> state.getValue(LIT) ? 15 : 0)
|
||||
.hardness(4F)
|
||||
.resistance(100F)
|
||||
.requiresCorrectToolForDrops()
|
||||
.sound(SoundType.STONE));
|
||||
super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY).luminance(state -> state.getValue(LIT) ? 15 : 0).hardness(4F).resistance(100F).requiresCorrectToolForDrops().sound(SoundType.STONE));
|
||||
registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(LIT, false));
|
||||
}
|
||||
|
||||
|
|
|
@ -14,11 +14,7 @@ import ru.bclib.blocks.BaseBlock;
|
|||
public class EnderBlock extends BaseBlock {
|
||||
|
||||
public EnderBlock() {
|
||||
super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK)
|
||||
.hardness(5F)
|
||||
.resistance(6F)
|
||||
.requiresCorrectToolForDrops()
|
||||
.sound(SoundType.STONE));
|
||||
super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK).hardness(5F).resistance(6F).requiresCorrectToolForDrops().sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
|
|
|
@ -21,9 +21,7 @@ public class EndstoneDustBlock extends FallingBlock {
|
|||
private static final int COLOR = ColorUtil.color(226, 239, 168);
|
||||
|
||||
public EndstoneDustBlock() {
|
||||
super(FabricBlockSettings.copyOf(Blocks.SAND)
|
||||
.breakByTool(FabricToolTags.SHOVELS)
|
||||
.materialColor(Blocks.END_STONE.defaultMaterialColor()));
|
||||
super(FabricBlockSettings.copyOf(Blocks.SAND).breakByTool(FabricToolTags.SHOVELS).materialColor(Blocks.END_STONE.defaultMaterialColor()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -24,10 +24,7 @@ public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem {
|
|||
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16);
|
||||
|
||||
public FlamaeaBlock() {
|
||||
super(FabricBlockSettings.of(Material.PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.WET_GRASS));
|
||||
super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.WET_GRASS));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -59,4 +56,9 @@ public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem {
|
|||
public boolean canPlaceOnWater() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addToPot() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
355
src/main/java/ru/betterend/blocks/FlowerPotBlock.java
Normal file
355
src/main/java/ru/betterend/blocks/FlowerPotBlock.java
Normal file
|
@ -0,0 +1,355 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.math.Transformation;
|
||||
import com.mojang.math.Vector3f;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||
import net.minecraft.client.resources.model.UnbakedModel;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.BlockItem;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.SaplingBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.block.state.properties.IntegerProperty;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.Shapes;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import ru.bclib.blocks.BaseBlockNotFull;
|
||||
import ru.bclib.client.models.BasePatterns;
|
||||
import ru.bclib.client.models.ModelsHelper;
|
||||
import ru.bclib.client.models.ModelsHelper.MultiPartBuilder;
|
||||
import ru.bclib.client.models.PatternsHelper;
|
||||
import ru.bclib.client.render.BCLRenderLayer;
|
||||
import ru.bclib.interfaces.IPostInit;
|
||||
import ru.bclib.interfaces.IRenderTyped;
|
||||
import ru.bclib.util.BlocksHelper;
|
||||
import ru.bclib.util.JsonFactory;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.blocks.basis.PottableLeavesBlock;
|
||||
import ru.betterend.client.models.Patterns;
|
||||
import ru.betterend.config.Configs;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
import ru.betterend.interfaces.PottableTerrain;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class FlowerPotBlock extends BaseBlockNotFull implements IRenderTyped, IPostInit {
|
||||
private static final IntegerProperty PLANT_ID = EndBlockProperties.PLANT_ID;
|
||||
private static final IntegerProperty SOIL_ID = EndBlockProperties.SOIL_ID;
|
||||
private static final VoxelShape SHAPE_EMPTY;
|
||||
private static final VoxelShape SHAPE_FULL;
|
||||
private static Block[] plants;
|
||||
private static Block[] soils;
|
||||
|
||||
public FlowerPotBlock(Block source) {
|
||||
super(FabricBlockSettings.copyOf(source));
|
||||
this.registerDefaultState(this.defaultBlockState().setValue(PLANT_ID, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
super.createBlockStateDefinition(builder);
|
||||
builder.add(PLANT_ID, SOIL_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postInit() {
|
||||
if (FlowerPotBlock.plants != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Block[] plants = new Block[128];
|
||||
Block[] soils = new Block[16];
|
||||
|
||||
Map<String, Integer> reservedPlantsIDs = Maps.newHashMap();
|
||||
Map<String, Integer> reservedSoilIDs = Maps.newHashMap();
|
||||
|
||||
JsonObject obj = JsonFactory.getJsonObject(new File(FabricLoader.getInstance().getConfigDir().toFile(), BetterEnd.MOD_ID + "/blocks.json"));
|
||||
if (obj.get("flower_pots") != null) {
|
||||
JsonElement plantsObj = obj.get("flower_pots").getAsJsonObject().get("plants");
|
||||
JsonElement soilsObj = obj.get("flower_pots").getAsJsonObject().get("soils");
|
||||
if (plantsObj != null) {
|
||||
plantsObj.getAsJsonObject().entrySet().forEach(entry -> {
|
||||
String name = entry.getKey().substring(0, entry.getKey().indexOf(' '));
|
||||
reservedPlantsIDs.put(name, entry.getValue().getAsInt());
|
||||
});
|
||||
}
|
||||
if (soilsObj != null) {
|
||||
soilsObj.getAsJsonObject().entrySet().forEach(entry -> {
|
||||
String name = entry.getKey().substring(0, entry.getKey().indexOf(' '));
|
||||
reservedSoilIDs.put(name, entry.getValue().getAsInt());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
EndBlocks.getModBlocks().forEach(block -> {
|
||||
if (block instanceof PottablePlant && ((PottablePlant) block).addToPot()) {//&& canBeAdded(block)) {
|
||||
processBlock(plants, block, "flower_pots.plants", reservedPlantsIDs);
|
||||
}
|
||||
else if (block instanceof PottableTerrain) {
|
||||
processBlock(soils, block, "flower_pots.soils", reservedSoilIDs);
|
||||
}
|
||||
});
|
||||
Configs.BLOCK_CONFIG.saveChanges();
|
||||
|
||||
FlowerPotBlock.plants = new Block[maxNotNull(plants) + 1];
|
||||
System.arraycopy(plants, 0, FlowerPotBlock.plants, 0, FlowerPotBlock.plants.length);
|
||||
|
||||
FlowerPotBlock.soils = new Block[maxNotNull(soils) + 1];
|
||||
System.arraycopy(soils, 0, FlowerPotBlock.soils, 0, FlowerPotBlock.soils.length);
|
||||
|
||||
if (PLANT_ID.getValue(Integer.toString(FlowerPotBlock.plants.length)).isEmpty()) {
|
||||
throw new RuntimeException("There are too much plant ID values!");
|
||||
}
|
||||
if (SOIL_ID.getValue(Integer.toString(FlowerPotBlock.soils.length)).isEmpty()) {
|
||||
throw new RuntimeException("There are too much soil ID values!");
|
||||
}
|
||||
}
|
||||
|
||||
private int maxNotNull(Block[] array) {
|
||||
int max = 0;
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (array[i] != null) {
|
||||
max = i;
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
private void processBlock(Block[] target, Block block, String path, Map<String, Integer> idMap) {
|
||||
ResourceLocation location = Registry.BLOCK.getKey(block);
|
||||
if (idMap.containsKey(location.getPath())) {
|
||||
target[idMap.get(location.getPath())] = block;
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < target.length; i++) {
|
||||
if (!idMap.values().contains(i)) {
|
||||
target[i] = block;
|
||||
idMap.put(location.getPath(), i);
|
||||
Configs.BLOCK_CONFIG.getInt(path, location.getPath(), i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
|
||||
if (level.isClientSide) {
|
||||
return InteractionResult.CONSUME;
|
||||
}
|
||||
ItemStack itemStack = player.getItemInHand(hand);
|
||||
int soilID = state.getValue(SOIL_ID);
|
||||
if (soilID == 0 || soilID > soils.length || soils[soilID - 1] == null) {
|
||||
if (!(itemStack.getItem() instanceof BlockItem)) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
Block block = ((BlockItem) itemStack.getItem()).getBlock();
|
||||
for (int i = 0; i < soils.length; i++) {
|
||||
if (block == soils[i]) {
|
||||
BlocksHelper.setWithUpdate(level, pos, state.setValue(SOIL_ID, i + 1));
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
int plantID = state.getValue(PLANT_ID);
|
||||
if (itemStack.isEmpty()) {
|
||||
if (plantID > 0 && plantID <= plants.length && plants[plantID - 1] != null) {
|
||||
BlocksHelper.setWithUpdate(level, pos, state.setValue(PLANT_ID, 0));
|
||||
player.addItem(new ItemStack(plants[plantID - 1]));
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
if (soilID > 0 && soilID <= soils.length && soils[soilID - 1] != null) {
|
||||
BlocksHelper.setWithUpdate(level, pos, state.setValue(SOIL_ID, 0));
|
||||
player.addItem(new ItemStack(soils[soilID - 1]));
|
||||
}
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
if (!(itemStack.getItem() instanceof BlockItem)) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
BlockItem item = (BlockItem) itemStack.getItem();
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
if (item.getBlock() == plants[i]) {
|
||||
if (!((PottablePlant) plants[i]).canPlantOn(soils[soilID - 1])) {
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
BlocksHelper.setWithUpdate(level, pos, state.setValue(PLANT_ID, i + 1));
|
||||
level.playLocalSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1, 1, false);
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation blockId) {
|
||||
Optional<String> pattern = PatternsHelper.createJson(Patterns.BLOCK_FLOWER_POT, blockId);
|
||||
return ModelsHelper.fromPattern(pattern);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
|
||||
MultiPartBuilder model = MultiPartBuilder.create(stateDefinition);
|
||||
model.part(new ModelResourceLocation(stateId.getNamespace(), stateId.getPath(), "inventory")).add();
|
||||
Transformation offset = new Transformation(new Vector3f(0, 7.5F / 16F, 0), null, null, null);
|
||||
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
if (plants[i] == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final int compareID = i + 1;
|
||||
ResourceLocation modelPath = Registry.BLOCK.getKey(plants[i]);
|
||||
ResourceLocation objSource = new ResourceLocation(modelPath.getNamespace(), "models/block/" + modelPath.getPath() + "_potted.json");
|
||||
|
||||
if (Minecraft.getInstance().getResourceManager().hasResource(objSource)) {
|
||||
objSource = new ResourceLocation(modelPath.getNamespace(), "block/" + modelPath.getPath() + "_potted");
|
||||
model.part(objSource).setTransformation(offset).setCondition(state -> state.getValue(PLANT_ID) == compareID).add();
|
||||
continue;
|
||||
}
|
||||
|
||||
else if (plants[i] instanceof SaplingBlock) {
|
||||
ResourceLocation loc = Registry.BLOCK.getKey(plants[i]);
|
||||
modelPath = new ResourceLocation(loc.getNamespace(), "block/" + loc.getPath() + "_potted");
|
||||
Map<String, String> textures = Maps.newHashMap();
|
||||
textures.put("%modid%", loc.getNamespace());
|
||||
textures.put("%texture%", loc.getPath());
|
||||
Optional<String> pattern = Patterns.createJson(BasePatterns.BLOCK_CROSS, textures);
|
||||
UnbakedModel unbakedModel = ModelsHelper.fromPattern(pattern);
|
||||
modelCache.put(modelPath, unbakedModel);
|
||||
model.part(modelPath).setTransformation(offset).setCondition(state -> state.getValue(PLANT_ID) == compareID).add();
|
||||
continue;
|
||||
}
|
||||
else if (plants[i] instanceof PottableLeavesBlock) {
|
||||
ResourceLocation loc = Registry.BLOCK.getKey(plants[i]);
|
||||
modelPath = new ResourceLocation(loc.getNamespace(), "block/" + loc.getPath() + "_potted");
|
||||
Map<String, String> textures = Maps.newHashMap();
|
||||
textures.put("%leaves%", loc.getPath().contains("lucernia") ? loc.getPath() + "_1" : loc.getPath());
|
||||
textures.put("%stem%", loc.getPath().replace("_leaves", "_log_side"));
|
||||
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_POTTED_LEAVES, textures);
|
||||
UnbakedModel unbakedModel = ModelsHelper.fromPattern(pattern);
|
||||
modelCache.put(modelPath, unbakedModel);
|
||||
model.part(modelPath).setTransformation(offset).setCondition(state -> state.getValue(PLANT_ID) == compareID).add();
|
||||
continue;
|
||||
}
|
||||
|
||||
objSource = new ResourceLocation(modelPath.getNamespace(), "blockstates/" + modelPath.getPath() + ".json");
|
||||
JsonObject obj = JsonFactory.getJsonObject(objSource);
|
||||
if (obj != null) {
|
||||
JsonElement variants = obj.get("variants");
|
||||
JsonElement list = null;
|
||||
String path = null;
|
||||
|
||||
if (variants == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (variants.isJsonArray()) {
|
||||
list = variants.getAsJsonArray().get(0);
|
||||
}
|
||||
else if (variants.isJsonObject()) {
|
||||
list = variants.getAsJsonObject().get(((PottablePlant) plants[i]).getPottedState());
|
||||
}
|
||||
|
||||
if (list == null) {
|
||||
BetterEnd.LOGGER.warning("Incorrect json for pot plant " + objSource + ", no matching variants");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (list.isJsonArray()) {
|
||||
path = list.getAsJsonArray().get(0).getAsJsonObject().get("model").getAsString();
|
||||
}
|
||||
else {
|
||||
path = list.getAsJsonObject().get("model").getAsString();
|
||||
}
|
||||
|
||||
if (path == null) {
|
||||
BetterEnd.LOGGER.warning("Incorrect json for pot plant " + objSource + ", no matching variants");
|
||||
continue;
|
||||
}
|
||||
|
||||
model.part(new ResourceLocation(path)).setTransformation(offset).setCondition(state -> state.getValue(PLANT_ID) == compareID).add();
|
||||
}
|
||||
else {
|
||||
for (ResourceLocation location: modelCache.keySet()) {
|
||||
if (location.getPath().equals(modelPath.getPath())) {
|
||||
model.part(location).setTransformation(offset).setCondition(state -> state.getValue(PLANT_ID) == compareID).add();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < soils.length; i++) {
|
||||
if (soils[i] == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ResourceLocation soilLoc = BetterEnd.makeID("flower_pot_soil_" + i);
|
||||
if (!modelCache.containsKey(soilLoc)) {
|
||||
String texture = Registry.BLOCK.getKey(soils[i]).getPath() + "_top";
|
||||
if (texture.contains("rutiscus")) {
|
||||
texture += "_1";
|
||||
}
|
||||
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_FLOWER_POT_SOIL, texture);
|
||||
UnbakedModel soil = ModelsHelper.fromPattern(pattern);
|
||||
modelCache.put(soilLoc, soil);
|
||||
}
|
||||
final int compareID = i + 1;
|
||||
model.part(soilLoc).setCondition(state -> state.getValue(SOIL_ID) == compareID).add();
|
||||
}
|
||||
|
||||
UnbakedModel result = model.build();
|
||||
modelCache.put(stateId, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) {
|
||||
int id = state.getValue(PLANT_ID);
|
||||
return id > 0 && id <= plants.length ? SHAPE_FULL : SHAPE_EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) {
|
||||
return SHAPE_EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BCLRenderLayer getRenderLayer() {
|
||||
return BCLRenderLayer.CUTOUT;
|
||||
}
|
||||
|
||||
static {
|
||||
SHAPE_EMPTY = Shapes.or(Block.box(4, 1, 4, 12, 8, 12), Block.box(5, 0, 5, 11, 1, 11));
|
||||
SHAPE_FULL = Shapes.or(SHAPE_EMPTY, Block.box(3, 8, 3, 13, 16, 13));
|
||||
}
|
||||
}
|
|
@ -21,12 +21,7 @@ public class GlowingPillarLuminophorBlock extends BaseBlock {
|
|||
public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL;
|
||||
|
||||
public GlowingPillarLuminophorBlock() {
|
||||
super(FabricBlockSettings.of(Material.LEAVES)
|
||||
.materialColor(MaterialColor.COLOR_ORANGE)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.strength(0.2F)
|
||||
.luminance(15)
|
||||
.sound(SoundType.GRASS));
|
||||
super(FabricBlockSettings.of(Material.LEAVES).materialColor(MaterialColor.COLOR_ORANGE).breakByTool(FabricToolTags.SHEARS).strength(0.2F).luminance(15).sound(SoundType.GRASS));
|
||||
this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false));
|
||||
}
|
||||
|
||||
|
|
|
@ -23,13 +23,7 @@ import java.util.Random;
|
|||
public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock {
|
||||
|
||||
public GlowingPillarSeedBlock() {
|
||||
super(FabricBlockSettings.of(Material.PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.GRASS)
|
||||
.lightLevel(state -> state.getValue(AGE) * 3 + 3)
|
||||
.randomTicks()
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.GRASS).lightLevel(state -> state.getValue(AGE) * 3 + 3).randomTicks().noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -34,12 +34,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider {
|
|||
private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0);
|
||||
|
||||
public HelixTreeLeavesBlock() {
|
||||
super(FabricBlockSettings.of(Material.LEAVES)
|
||||
.materialColor(MaterialColor.COLOR_ORANGE)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.sound(SoundType.WART_BLOCK)
|
||||
.sound(SoundType.GRASS)
|
||||
.strength(0.2F));
|
||||
super(FabricBlockSettings.of(Material.LEAVES).materialColor(MaterialColor.COLOR_ORANGE).breakByTool(FabricToolTags.SHEARS).sound(SoundType.WART_BLOCK).sound(SoundType.GRASS).strength(0.2F));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,12 +1,28 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class HelixTreeSaplingBlock extends FeatureSaplingBlock {
|
||||
public class HelixTreeSaplingBlock extends PottableFeatureSapling {
|
||||
@Override
|
||||
protected Feature<?> getFeature() {
|
||||
return EndFeatures.HELIX_TREE.getFeature();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.AMBER_MOSS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,12 +33,7 @@ public class HydraluxBlock extends UnderwaterPlantBlock {
|
|||
public static final EnumProperty<HydraluxShape> SHAPE = EndBlockProperties.HYDRALUX_SHAPE;
|
||||
|
||||
public HydraluxBlock() {
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.WET_GRASS)
|
||||
.lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.WET_GRASS).lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0).noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -13,13 +13,7 @@ import ru.bclib.blocks.BaseBlock;
|
|||
|
||||
public class HydraluxPetalBlock extends BaseBlock {
|
||||
public HydraluxPetalBlock() {
|
||||
this(FabricBlockSettings.of(Material.PLANT)
|
||||
.breakByTool(FabricToolTags.AXES)
|
||||
.breakByHand(true)
|
||||
.hardness(1)
|
||||
.resistance(1)
|
||||
.materialColor(MaterialColor.PODZOL)
|
||||
.sound(SoundType.WART_BLOCK));
|
||||
this(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.AXES).breakByHand(true).hardness(1).resistance(1).materialColor(MaterialColor.PODZOL).sound(SoundType.WART_BLOCK));
|
||||
}
|
||||
|
||||
public HydraluxPetalBlock(Properties settings) {
|
||||
|
|
|
@ -40,7 +40,6 @@ import ru.bclib.blocks.BlockProperties;
|
|||
import ru.bclib.util.BlocksHelper;
|
||||
import ru.betterend.blocks.entities.BlockEntityHydrothermalVent;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndParticles;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
|
@ -51,11 +50,7 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo
|
|||
private static final VoxelShape SHAPE = Block.box(1, 1, 1, 15, 16, 15);
|
||||
|
||||
public HydrothermalVentBlock() {
|
||||
super(FabricBlockSettings.of(Material.STONE)
|
||||
.breakByTool(FabricToolTags.PICKAXES)
|
||||
.sound(SoundType.STONE)
|
||||
.noCollission()
|
||||
.requiresCorrectToolForDrops());
|
||||
super(FabricBlockSettings.of(Material.STONE).breakByTool(FabricToolTags.PICKAXES).sound(SoundType.STONE).noCollission().requiresCorrectToolForDrops());
|
||||
this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, true).setValue(ACTIVATED, false));
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ import net.minecraft.world.phys.shapes.VoxelShape;
|
|||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.betterend.blocks.basis.PedestalBlock;
|
||||
import ru.betterend.blocks.entities.InfusionPedestalEntity;
|
||||
import ru.betterend.blocks.entities.PedestalBlockEntity;
|
||||
import ru.betterend.rituals.InfusionRitual;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
|
|
|
@ -2,13 +2,15 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class LacugroveSaplingBlock extends FeatureSaplingBlock {
|
||||
public class LacugroveSaplingBlock extends PottableFeatureSapling {
|
||||
public LacugroveSaplingBlock() {
|
||||
super();
|
||||
}
|
||||
|
@ -22,4 +24,9 @@ public class LacugroveSaplingBlock extends FeatureSaplingBlock {
|
|||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.END_MOSS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,11 +28,7 @@ public class LargeAmaranitaBlock extends EndPlantBlock {
|
|||
private static final VoxelShape SHAPE_TOP = Shapes.or(Block.box(1, 3, 1, 15, 16, 15), SHAPE_BOTTOM);
|
||||
|
||||
public LargeAmaranitaBlock() {
|
||||
super(FabricBlockSettings.of(Material.PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.GRASS)
|
||||
.lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0));
|
||||
super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.GRASS).lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,13 +2,15 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class LucerniaSaplingBlock extends FeatureSaplingBlock {
|
||||
public class LucerniaSaplingBlock extends PottableFeatureSapling {
|
||||
public LucerniaSaplingBlock() {
|
||||
super();
|
||||
}
|
||||
|
@ -22,4 +24,9 @@ public class LucerniaSaplingBlock extends FeatureSaplingBlock {
|
|||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.RUTISCUS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,10 +38,7 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped {
|
|||
private static final VoxelShape SHAPE_TOP = Block.box(6, 0, 6, 10, 8, 10);
|
||||
|
||||
public LumecornBlock() {
|
||||
super(FabricBlockSettings.of(Material.WOOD)
|
||||
.breakByTool(FabricToolTags.AXES)
|
||||
.hardness(0.5F)
|
||||
.luminance(state -> state.getValue(SHAPE).getLight()));
|
||||
super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).hardness(0.5F).luminance(state -> state.getValue(SHAPE).getLight()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,14 +2,15 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock {
|
||||
|
||||
public class MossyGlowshroomSaplingBlock extends PottableFeatureSapling {
|
||||
public MossyGlowshroomSaplingBlock() {
|
||||
super(7);
|
||||
}
|
||||
|
@ -23,4 +24,9 @@ public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock {
|
|||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.END_MOSS || block == EndBlocks.END_MYCELIUM;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@ package ru.betterend.blocks;
|
|||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.BlockPos.MutableBlockPos;
|
||||
|
@ -41,6 +43,7 @@ import ru.bclib.interfaces.IRenderTyped;
|
|||
import ru.bclib.util.BlocksHelper;
|
||||
import ru.bclib.util.MHelper;
|
||||
import ru.betterend.blocks.EndBlockProperties.CactusBottom;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
|
||||
import java.util.EnumMap;
|
||||
|
@ -48,7 +51,7 @@ import java.util.List;
|
|||
import java.util.Random;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, IRenderTyped {
|
||||
public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, IRenderTyped, PottablePlant {
|
||||
public static final EnumProperty<TripleShape> SHAPE = BlockProperties.TRIPLE_SHAPE;
|
||||
public static final EnumProperty<CactusBottom> CACTUS_BOTTOM = EndBlockProperties.CACTUS_BOTTOM;
|
||||
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
|
||||
|
@ -395,4 +398,15 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate
|
|||
SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12));
|
||||
SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public String getPottedState() {
|
||||
return "bottom=moss,shape=top,facing=up";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,12 +23,7 @@ public class PondAnemoneBlock extends EndUnderwaterPlantBlock {
|
|||
private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14);
|
||||
|
||||
public PondAnemoneBlock() {
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.luminance(13)
|
||||
.sound(SoundType.CORAL_BLOCK)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.WATER_PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).luminance(13).sound(SoundType.CORAL_BLOCK).noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,13 +2,15 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class PythadendronSaplingBlock extends FeatureSaplingBlock {
|
||||
public class PythadendronSaplingBlock extends PottableFeatureSapling {
|
||||
public PythadendronSaplingBlock() {
|
||||
super();
|
||||
}
|
||||
|
@ -22,4 +24,9 @@ public class PythadendronSaplingBlock extends FeatureSaplingBlock {
|
|||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.CHORUS_NYLIUM;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,11 +21,7 @@ public class RunedFlavolite extends BaseBlock {
|
|||
public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE;
|
||||
|
||||
public RunedFlavolite(boolean unbreakable) {
|
||||
super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished)
|
||||
.strength(
|
||||
unbreakable ? -1 : 1,
|
||||
unbreakable ? Blocks.BEDROCK.getExplosionResistance() : Blocks.OBSIDIAN.getExplosionResistance()
|
||||
).luminance(state -> {
|
||||
super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished).strength(unbreakable ? -1 : 1, unbreakable ? Blocks.BEDROCK.getExplosionResistance() : Blocks.OBSIDIAN.getExplosionResistance()).luminance(state -> {
|
||||
return state.getValue(ACTIVATED) ? 8 : 0;
|
||||
}));
|
||||
this.registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false));
|
||||
|
|
|
@ -6,11 +6,11 @@ import net.minecraft.world.level.block.Block;
|
|||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import ru.bclib.blocks.BaseCropBlock;
|
||||
import ru.betterend.blocks.basis.PottableCropBlock;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndItems;
|
||||
|
||||
public class ShadowBerryBlock extends BaseCropBlock {
|
||||
public class ShadowBerryBlock extends PottableCropBlock {
|
||||
private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 8, 15);
|
||||
|
||||
public ShadowBerryBlock() {
|
||||
|
|
|
@ -60,10 +60,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock {
|
|||
}
|
||||
|
||||
private boolean checkFrame(ServerLevel world, BlockPos pos) {
|
||||
return world.getBlockState(pos).is(this) &&
|
||||
world.getBlockState(pos.south()).is(this) &&
|
||||
world.getBlockState(pos.east()).is(this) &&
|
||||
world.getBlockState(pos.south().east()).is(this);
|
||||
return world.getBlockState(pos).is(this) && world.getBlockState(pos.south()).is(this) && world.getBlockState(pos.east()).is(this) && world.getBlockState(pos.south().east()).is(this);
|
||||
}
|
||||
|
||||
private void replaceMushroom(ServerLevel world, BlockPos pos) {
|
||||
|
|
|
@ -2,6 +2,8 @@ package ru.betterend.blocks;
|
|||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags;
|
||||
import net.minecraft.core.BlockPos;
|
||||
|
@ -30,21 +32,18 @@ import ru.bclib.blocks.BaseAttachedBlock;
|
|||
import ru.bclib.client.render.BCLRenderLayer;
|
||||
import ru.bclib.interfaces.IRenderTyped;
|
||||
import ru.bclib.util.BlocksHelper;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderTyped, BonemealableBlock {
|
||||
public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderTyped, BonemealableBlock, PottablePlant {
|
||||
private static final EnumMap<Direction, VoxelShape> BOUNDING_SHAPES = Maps.newEnumMap(Direction.class);
|
||||
|
||||
public SmallJellyshroomBlock() {
|
||||
super(FabricBlockSettings.of(Material.PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.NETHER_WART)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.NETHER_WART).noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -101,4 +100,15 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
|
|||
BlocksHelper.setWithUpdate(world, pos, Blocks.AIR);
|
||||
EndFeatures.JELLYSHROOM.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public String getPottedState() {
|
||||
return "facing=up";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,12 +8,6 @@ import ru.betterend.blocks.basis.LitPillarBlock;
|
|||
|
||||
public class SmaragdantCrystalBlock extends LitPillarBlock {
|
||||
public SmaragdantCrystalBlock() {
|
||||
super(FabricBlockSettings.of(Material.GLASS)
|
||||
.breakByTool(FabricToolTags.PICKAXES)
|
||||
.luminance(15)
|
||||
.hardness(1F)
|
||||
.resistance(1F)
|
||||
.noOcclusion()
|
||||
.sound(SoundType.AMETHYST));
|
||||
super(FabricBlockSettings.of(Material.GLASS).breakByTool(FabricToolTags.PICKAXES).luminance(15).hardness(1F).resistance(1F).noOcclusion().sound(SoundType.AMETHYST));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,13 +37,7 @@ public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IR
|
|||
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
|
||||
|
||||
public SmaragdantCrystalShardBlock() {
|
||||
super(FabricBlockSettings.of(Material.STONE)
|
||||
.materialColor(MaterialColor.COLOR_GREEN)
|
||||
.breakByTool(FabricToolTags.PICKAXES)
|
||||
.luminance(15)
|
||||
.sound(SoundType.AMETHYST_CLUSTER)
|
||||
.requiresCorrectToolForDrops()
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.STONE).materialColor(MaterialColor.COLOR_GREEN).breakByTool(FabricToolTags.PICKAXES).luminance(15).sound(SoundType.AMETHYST_CLUSTER).requiresCorrectToolForDrops().noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -47,12 +47,7 @@ public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyp
|
|||
public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED;
|
||||
|
||||
public SulphurCrystalBlock() {
|
||||
super(FabricBlockSettings.of(Material.STONE)
|
||||
.materialColor(MaterialColor.COLOR_YELLOW)
|
||||
.breakByTool(FabricToolTags.PICKAXES)
|
||||
.sound(SoundType.GLASS)
|
||||
.requiresCorrectToolForDrops()
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.STONE).materialColor(MaterialColor.COLOR_YELLOW).breakByTool(FabricToolTags.PICKAXES).sound(SoundType.GLASS).requiresCorrectToolForDrops().noCollission());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -73,11 +73,6 @@ public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider
|
|||
}
|
||||
|
||||
static {
|
||||
COLORS = new Vec3i[]{
|
||||
new Vec3i(250, 111, 222),
|
||||
new Vec3i(167, 89, 255),
|
||||
new Vec3i(120, 207, 239),
|
||||
new Vec3i(255, 87, 182)
|
||||
};
|
||||
COLORS = new Vec3i[]{new Vec3i(250, 111, 222), new Vec3i(167, 89, 255), new Vec3i(120, 207, 239), new Vec3i(255, 87, 182)};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,13 +2,15 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class TenaneaSaplingBlock extends FeatureSaplingBlock {
|
||||
public class TenaneaSaplingBlock extends PottableFeatureSapling {
|
||||
public TenaneaSaplingBlock() {
|
||||
super();
|
||||
}
|
||||
|
@ -22,4 +24,9 @@ public class TenaneaSaplingBlock extends FeatureSaplingBlock {
|
|||
public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
|
||||
return world.getBlockState(pos.below()).is(EndBlocks.PINK_MOSS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.PINK_MOSS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,9 +27,7 @@ public class UmbrellaTreeClusterBlock extends BaseBlock {
|
|||
public static final BooleanProperty NATURAL = BlockProperties.NATURAL;
|
||||
|
||||
public UmbrellaTreeClusterBlock() {
|
||||
super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK)
|
||||
.materialColor(MaterialColor.COLOR_PURPLE)
|
||||
.luminance(15));
|
||||
super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.COLOR_PURPLE).luminance(15));
|
||||
registerDefaultState(stateDefinition.any().setValue(NATURAL, false));
|
||||
}
|
||||
|
||||
|
|
|
@ -19,9 +19,7 @@ public class UmbrellaTreeClusterEmptyBlock extends BaseBlock {
|
|||
public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL;
|
||||
|
||||
public UmbrellaTreeClusterEmptyBlock() {
|
||||
super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK)
|
||||
.materialColor(MaterialColor.COLOR_PURPLE)
|
||||
.randomTicks());
|
||||
super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK).materialColor(MaterialColor.COLOR_PURPLE).randomTicks());
|
||||
registerDefaultState(stateDefinition.any().setValue(NATURAL, false));
|
||||
}
|
||||
|
||||
|
|
|
@ -2,14 +2,16 @@ package ru.betterend.blocks;
|
|||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.bclib.client.render.BCLRenderLayer;
|
||||
import ru.betterend.blocks.basis.PottableFeatureSapling;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock {
|
||||
public class UmbrellaTreeSaplingBlock extends PottableFeatureSapling {
|
||||
public UmbrellaTreeSaplingBlock() {
|
||||
super();
|
||||
}
|
||||
|
@ -28,4 +30,9 @@ public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock {
|
|||
public BCLRenderLayer getRenderLayer() {
|
||||
return BCLRenderLayer.TRANSLUCENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return block == EndBlocks.JUNGLE_MOSS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,8 +130,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg
|
|||
@Environment(EnvType.CLIENT)
|
||||
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
|
||||
String floor = blockState.getValue(IS_FLOOR) ? "_floor" : "";
|
||||
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(),
|
||||
"block/" + stateId.getPath() + floor);
|
||||
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), "block/" + stateId.getPath() + floor);
|
||||
registerBlockModel(stateId, modelId, blockState, modelCache);
|
||||
return ModelsHelper.createBlockSimple(modelId);
|
||||
}
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package ru.betterend.blocks.basis;
|
||||
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import ru.bclib.api.TagAPI;
|
||||
import ru.bclib.blocks.BasePlantBlock;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
|
||||
public class EndPlantBlock extends BasePlantBlock {
|
||||
|
||||
public class EndPlantBlock extends BasePlantBlock implements PottablePlant {
|
||||
public EndPlantBlock() {
|
||||
this(false);
|
||||
}
|
||||
|
@ -30,4 +31,14 @@ public class EndPlantBlock extends BasePlantBlock {
|
|||
protected boolean isTerrain(BlockState state) {
|
||||
return state.is(TagAPI.END_GROUND);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
return isTerrain(block.defaultBlockState());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addToPot() {
|
||||
return getStateDefinition().getProperties().isEmpty();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,9 @@ package ru.betterend.blocks.basis;
|
|||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.material.MaterialColor;
|
||||
import ru.bclib.blocks.BaseTerrainBlock;
|
||||
import ru.betterend.interfaces.PottableTerrain;
|
||||
|
||||
public class EndTerrainBlock extends BaseTerrainBlock {
|
||||
public class EndTerrainBlock extends BaseTerrainBlock implements PottableTerrain {
|
||||
public EndTerrainBlock(MaterialColor color) {
|
||||
super(Blocks.END_STONE, color);
|
||||
}
|
||||
|
|
|
@ -3,9 +3,9 @@ package ru.betterend.blocks.basis;
|
|||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.material.MaterialColor;
|
||||
import ru.bclib.blocks.TripleTerrainBlock;
|
||||
import ru.betterend.interfaces.PottableTerrain;
|
||||
|
||||
public class EndTripleTerrain extends TripleTerrainBlock {
|
||||
|
||||
public class EndTripleTerrain extends TripleTerrainBlock implements PottableTerrain {
|
||||
public EndTripleTerrain(MaterialColor color) {
|
||||
super(Blocks.END_STONE, color);
|
||||
}
|
||||
|
|
|
@ -33,22 +33,13 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped {
|
|||
private final int dropChance;
|
||||
|
||||
public FurBlock(ItemLike drop, int light, int dropChance, boolean wet) {
|
||||
super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.luminance(light)
|
||||
.sound(wet ? SoundType.WET_GRASS : SoundType.GRASS)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).luminance(light).sound(wet ? SoundType.WET_GRASS : SoundType.GRASS).noCollission());
|
||||
this.drop = drop;
|
||||
this.dropChance = dropChance;
|
||||
}
|
||||
|
||||
public FurBlock(ItemLike drop, int dropChance) {
|
||||
super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT)
|
||||
.breakByTool(FabricToolTags.SHEARS)
|
||||
.breakByHand(true)
|
||||
.sound(SoundType.GRASS)
|
||||
.noCollission());
|
||||
super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT).breakByTool(FabricToolTags.SHEARS).breakByHand(true).sound(SoundType.GRASS).noCollission());
|
||||
this.drop = drop;
|
||||
this.dropChance = dropChance;
|
||||
}
|
||||
|
|
|
@ -337,8 +337,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
|||
public boolean isPlaceable(BlockState state) {
|
||||
if (!state.is(this)) return false;
|
||||
PedestalState currentState = state.getValue(STATE);
|
||||
return currentState == PedestalState.DEFAULT ||
|
||||
currentState == PedestalState.PEDESTAL_TOP;
|
||||
return currentState == PedestalState.DEFAULT || currentState == PedestalState.PEDESTAL_TOP;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -433,8 +432,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
|||
@Environment(EnvType.CLIENT)
|
||||
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
|
||||
PedestalState state = blockState.getValue(STATE);
|
||||
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(),
|
||||
"block/" + stateId.getPath() + "_" + state);
|
||||
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), "block/" + stateId.getPath() + "_" + state);
|
||||
registerBlockModel(stateId, modelId, blockState, modelCache);
|
||||
return ModelsHelper.createBlockSimple(modelId);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
package ru.betterend.blocks.basis;
|
||||
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import ru.bclib.blocks.BaseCropBlock;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
|
||||
public class PottableCropBlock extends BaseCropBlock implements PottablePlant {
|
||||
private final Block[] terrain;
|
||||
|
||||
public PottableCropBlock(Item drop, Block... terrain) {
|
||||
super(drop, terrain);
|
||||
this.terrain = terrain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
for (Block ter: terrain) {
|
||||
if (block == ter) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPottedState() {
|
||||
return "age=3";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package ru.betterend.blocks.basis;
|
||||
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import ru.bclib.blocks.FeatureSaplingBlock;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
|
||||
public abstract class PottableFeatureSapling extends FeatureSaplingBlock implements PottablePlant {
|
||||
public PottableFeatureSapling() {
|
||||
super();
|
||||
}
|
||||
|
||||
public PottableFeatureSapling(int light) {
|
||||
super(light);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package ru.betterend.blocks.basis;
|
||||
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.material.MaterialColor;
|
||||
import ru.bclib.blocks.BaseLeavesBlock;
|
||||
import ru.betterend.interfaces.PottablePlant;
|
||||
|
||||
public class PottableLeavesBlock extends BaseLeavesBlock implements PottablePlant {
|
||||
private Block sapling;
|
||||
|
||||
public PottableLeavesBlock(Block sapling, MaterialColor color) {
|
||||
super(sapling, color);
|
||||
this.sapling = sapling;
|
||||
}
|
||||
|
||||
public PottableLeavesBlock(Block sapling, MaterialColor color, int light) {
|
||||
super(sapling, color, light);
|
||||
this.sapling = sapling;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlantOn(Block block) {
|
||||
if (sapling instanceof PottablePlant) {
|
||||
return ((PottablePlant) sapling).canPlantOn(block);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -48,9 +48,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider
|
|||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
String blockName = resourceLocation.getPath();
|
||||
Optional<String> pattern = blockState.getValue(IS_FLOOR) ?
|
||||
Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, blockName, blockName) :
|
||||
Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, blockName, blockName);
|
||||
Optional<String> pattern = blockState.getValue(IS_FLOOR) ? Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, blockName, blockName) : Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, blockName, blockName);
|
||||
return ModelsHelper.fromPattern(pattern);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import ru.bclib.recipes.GridRecipe;
|
|||
import ru.bclib.util.TagHelper;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.blocks.EndPedestal;
|
||||
import ru.betterend.blocks.FlowerPotBlock;
|
||||
import ru.betterend.blocks.basis.StoneLanternBlock;
|
||||
import ru.betterend.config.Configs;
|
||||
import ru.betterend.recipe.CraftingRecipes;
|
||||
|
@ -35,15 +36,16 @@ public class StoneMaterial {
|
|||
public final Block slab;
|
||||
public final Block wall;
|
||||
public final Block button;
|
||||
public final Block pressure_plate;
|
||||
public final Block pressurePlate;
|
||||
public final Block pedestal;
|
||||
public final Block lantern;
|
||||
|
||||
public final Block bricks;
|
||||
public final Block brick_stairs;
|
||||
public final Block brick_slab;
|
||||
public final Block brick_wall;
|
||||
public final Block brickStairs;
|
||||
public final Block brickSlab;
|
||||
public final Block brickWall;
|
||||
public final Block furnace;
|
||||
public final Block flowerPot;
|
||||
|
||||
public StoneMaterial(String name, MaterialColor color) {
|
||||
FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color);
|
||||
|
@ -56,15 +58,16 @@ public class StoneMaterial {
|
|||
slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(stone));
|
||||
wall = EndBlocks.registerBlock(name + "_wall", new BaseWallBlock(stone));
|
||||
button = EndBlocks.registerBlock(name + "_button", new BaseStoneButtonBlock(stone));
|
||||
pressure_plate = EndBlocks.registerBlock(name + "_plate", new StonePressurePlateBlock(stone));
|
||||
pressurePlate = EndBlocks.registerBlock(name + "_plate", new StonePressurePlateBlock(stone));
|
||||
pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone));
|
||||
lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone));
|
||||
|
||||
bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material));
|
||||
brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks));
|
||||
brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks));
|
||||
brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks));
|
||||
brickStairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks));
|
||||
brickSlab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks));
|
||||
brickWall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks));
|
||||
furnace = EndBlocks.registerBlock(name + "_furnace", new BaseFurnaceBlock(bricks));
|
||||
flowerPot = EndBlocks.registerBlock(name + "_flower_pot", new FlowerPotBlock(bricks));
|
||||
|
||||
// Recipes //
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build();
|
||||
|
@ -74,21 +77,22 @@ public class StoneMaterial {
|
|||
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', stone).setGroup("end_stone_stairs").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', stone).setGroup("end_stone_slabs").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brick_stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brick_slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brickStairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brickSlab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build();
|
||||
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', stone).setGroup("end_wall").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brick_wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brickWall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build();
|
||||
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_button", button).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressure_plate).checkConfig(Configs.RECIPE_CONFIG).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_lantern", lantern).checkConfig(Configs.RECIPE_CONFIG).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate).checkConfig(Configs.RECIPE_CONFIG).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_lantern", lantern).checkConfig(Configs.RECIPE_CONFIG).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brickSlab).setGroup("end_stone_lanterns").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_furnace", furnace).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, name + "_flower_pot", flowerPot).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(3).setShape("# #", " # ").addMaterial('#', bricks).setGroup("end_pots").build();
|
||||
|
||||
CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar);
|
||||
|
||||
// Item Tags //
|
||||
TagHelper.addTag(ItemTags.SLABS, slab, brick_slab);
|
||||
TagHelper.addTag(ItemTags.SLABS, slab, brickSlab);
|
||||
TagHelper.addTag(ItemTags.STONE_BRICKS, bricks);
|
||||
TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone);
|
||||
TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone);
|
||||
|
@ -96,9 +100,9 @@ public class StoneMaterial {
|
|||
|
||||
// Block Tags //
|
||||
TagHelper.addTag(BlockTags.STONE_BRICKS, bricks);
|
||||
TagHelper.addTag(BlockTags.WALLS, wall, brick_wall);
|
||||
TagHelper.addTag(BlockTags.SLABS, slab, brick_slab);
|
||||
TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES);
|
||||
TagHelper.addTag(BlockTags.WALLS, wall, brickWall);
|
||||
TagHelper.addTag(BlockTags.SLABS, slab, brickSlab);
|
||||
TagHelper.addTags(pressurePlate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES);
|
||||
TagHelper.addTag(TagAPI.END_STONES, stone);
|
||||
|
||||
TagHelper.addTag(TagAPI.DRAGON_IMMUNE, stone, stairs, slab, wall);
|
||||
|
|
|
@ -3,7 +3,6 @@ package ru.betterend.blocks.entities;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.BlockPos.MutableBlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.world.entity.EquipmentSlot;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.item.ElytraItem;
|
||||
|
|
|
@ -121,8 +121,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
|
|||
return true;
|
||||
}
|
||||
itemStack = iterator.next();
|
||||
}
|
||||
while (itemStack.isEmpty());
|
||||
} while (itemStack.isEmpty());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -159,11 +158,9 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
|
|||
|
||||
protected int getSmeltTime() {
|
||||
if (level == null) return 200;
|
||||
int smeltTime = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level)
|
||||
.map(AlloyingRecipe::getSmeltTime).orElse(0);
|
||||
int smeltTime = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).map(AlloyingRecipe::getSmeltTime).orElse(0);
|
||||
if (smeltTime == 0) {
|
||||
smeltTime = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level)
|
||||
.map(BlastingRecipe::getCookingTime).orElse(200);
|
||||
smeltTime = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).map(BlastingRecipe::getCookingTime).orElse(200);
|
||||
smeltTime /= 1.5;
|
||||
}
|
||||
return smeltTime;
|
||||
|
@ -290,12 +287,10 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
|
|||
if (recipe == null) return false;
|
||||
boolean validInput;
|
||||
if (recipe instanceof AlloyingRecipe) {
|
||||
validInput = !inventory.get(0).isEmpty() &&
|
||||
!inventory.get(1).isEmpty();
|
||||
validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty();
|
||||
}
|
||||
else {
|
||||
validInput = !inventory.get(0).isEmpty() ||
|
||||
!inventory.get(1).isEmpty();
|
||||
validInput = !inventory.get(0).isEmpty() || !inventory.get(1).isEmpty();
|
||||
}
|
||||
if (validInput) {
|
||||
ItemStack result = recipe.getResultItem();
|
||||
|
|
|
@ -70,10 +70,8 @@ public class BetterEndClient implements ClientModInitializer {
|
|||
Registry.BLOCK.forEach(block -> {
|
||||
if (block instanceof IRenderTyped) {
|
||||
BCLRenderLayer layer = ((IRenderTyped) block).getRenderLayer();
|
||||
if (layer == BCLRenderLayer.CUTOUT)
|
||||
BlockRenderLayerMap.INSTANCE.putBlock(block, cutout);
|
||||
else if (layer == BCLRenderLayer.TRANSLUCENT)
|
||||
BlockRenderLayerMap.INSTANCE.putBlock(block, translucent);
|
||||
if (layer == BCLRenderLayer.CUTOUT) BlockRenderLayerMap.INSTANCE.putBlock(block, cutout);
|
||||
else if (layer == BCLRenderLayer.TRANSLUCENT) BlockRenderLayerMap.INSTANCE.putBlock(block, translucent);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -27,8 +27,7 @@ import ru.betterend.recipe.builders.AlloyingRecipe;
|
|||
|
||||
public class EndStoneSmelterScreenHandler extends RecipeBookMenu<Container> {
|
||||
|
||||
public final static MenuType<EndStoneSmelterScreenHandler> HANDLER_TYPE = ScreenHandlerRegistry.registerSimple(
|
||||
BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new);
|
||||
public final static MenuType<EndStoneSmelterScreenHandler> HANDLER_TYPE = ScreenHandlerRegistry.registerSimple(BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new);
|
||||
|
||||
private final Container inventory;
|
||||
private final ContainerData propertyDelegate;
|
||||
|
|
|
@ -74,6 +74,9 @@ public class Patterns {
|
|||
public final static ResourceLocation BLOCK_FURNACE_LIT = BetterEnd.makeID("patterns/block/furnace_glow.json");
|
||||
public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json");
|
||||
public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json");
|
||||
public final static ResourceLocation BLOCK_FLOWER_POT = BetterEnd.makeID("patterns/block/flower_pot.json");
|
||||
public final static ResourceLocation BLOCK_FLOWER_POT_SOIL = BetterEnd.makeID("patterns/block/flower_pot_soil.json");
|
||||
public final static ResourceLocation BLOCK_POTTED_LEAVES = BetterEnd.makeID("patterns/block/potted_leaves.json");
|
||||
|
||||
//Item Models
|
||||
public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json");
|
||||
|
@ -99,9 +102,7 @@ public class Patterns {
|
|||
|
||||
public static String createJson(Reader data, String parent, String block) {
|
||||
try (BufferedReader buffer = new BufferedReader(data)) {
|
||||
return buffer.lines().collect(Collectors.joining())
|
||||
.replace("%parent%", parent)
|
||||
.replace("%block%", block);
|
||||
return buffer.lines().collect(Collectors.joining()).replace("%parent%", parent).replace("%block%", block);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
return null;
|
||||
|
@ -127,8 +128,7 @@ public class Patterns {
|
|||
public static Optional<String> createJson(ResourceLocation patternId, Map<String, String> textures) {
|
||||
ResourceManager resourceManager = Minecraft.getInstance().getResourceManager();
|
||||
try (InputStream input = resourceManager.getResource(patternId).getInputStream()) {
|
||||
String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8))
|
||||
.lines().collect(Collectors.joining());
|
||||
String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines().collect(Collectors.joining());
|
||||
for (Entry<String, String> texture : textures.entrySet()) {
|
||||
json = json.replace(texture.getKey(), texture.getValue());
|
||||
}
|
||||
|
|
|
@ -49,15 +49,9 @@ public class EndCrystalRenderer {
|
|||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create()
|
||||
.texOffs(32, 0)
|
||||
.addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create().texOffs(32, 0).addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), PartPose.ZERO);
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 32);
|
||||
}
|
||||
|
|
|
@ -64,30 +64,15 @@ public class EternalCrystalRenderer {
|
|||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create().texOffs(2, 4).addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create().texOffs(2, 4).addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create().texOffs(2, 4).addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create().texOffs(2, 4).addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f),
|
||||
PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create().texOffs(0, 0).addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f), PartPose.ZERO);
|
||||
|
||||
return LayerDefinition.create(modelData, 16, 16);
|
||||
}
|
||||
|
|
|
@ -100,10 +100,7 @@ public class CubozoaEntity extends AbstractSchoolingFish {
|
|||
}
|
||||
|
||||
public static AttributeSupplier.Builder createMobAttributes() {
|
||||
return LivingEntity.createLivingAttributes()
|
||||
.add(Attributes.MAX_HEALTH, 2.0)
|
||||
.add(Attributes.FOLLOW_RANGE, 16.0)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.5);
|
||||
return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0).add(Attributes.FOLLOW_RANGE, 16.0).add(Attributes.MOVEMENT_SPEED, 0.5);
|
||||
}
|
||||
|
||||
public int getVariant() {
|
||||
|
|
|
@ -52,11 +52,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
|
||||
public static AttributeSupplier.Builder createMobAttributes() {
|
||||
return LivingEntity.createLivingAttributes()
|
||||
.add(Attributes.MAX_HEALTH, 8.0D)
|
||||
.add(Attributes.FOLLOW_RANGE, 16.0D)
|
||||
.add(Attributes.FLYING_SPEED, 1.0D)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.1D);
|
||||
return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 8.0D).add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.FLYING_SPEED, 1.0D).add(Attributes.MOVEMENT_SPEED, 0.1D);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -128,10 +128,7 @@ public class EndFishEntity extends AbstractSchoolingFish {
|
|||
}
|
||||
|
||||
public static AttributeSupplier.Builder createMobAttributes() {
|
||||
return LivingEntity.createLivingAttributes()
|
||||
.add(Attributes.MAX_HEALTH, 2.0)
|
||||
.add(Attributes.FOLLOW_RANGE, 16.0)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.75);
|
||||
return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0).add(Attributes.FOLLOW_RANGE, 16.0).add(Attributes.MOVEMENT_SPEED, 0.75);
|
||||
}
|
||||
|
||||
public int getVariant() {
|
||||
|
|
|
@ -66,11 +66,7 @@ public class EndSlimeEntity extends Slime {
|
|||
}
|
||||
|
||||
public static AttributeSupplier.Builder createMobAttributes() {
|
||||
return LivingEntity.createLivingAttributes()
|
||||
.add(Attributes.MAX_HEALTH, 1.0D)
|
||||
.add(Attributes.ATTACK_DAMAGE, 1.0D)
|
||||
.add(Attributes.FOLLOW_RANGE, 16.0D)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.15D);
|
||||
return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 1.0D).add(Attributes.ATTACK_DAMAGE, 1.0D).add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.MOVEMENT_SPEED, 0.15D);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -268,9 +264,7 @@ public class EndSlimeEntity extends Slime {
|
|||
}
|
||||
|
||||
public boolean canUse() {
|
||||
return (EndSlimeEntity.this.isInWater()
|
||||
|| EndSlimeEntity.this.isInLava())
|
||||
&& EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
|
||||
return (EndSlimeEntity.this.isInWater() || EndSlimeEntity.this.isInLava()) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
|
||||
}
|
||||
|
||||
public void tick() {
|
||||
|
@ -291,12 +285,7 @@ public class EndSlimeEntity extends Slime {
|
|||
}
|
||||
|
||||
public boolean canUse() {
|
||||
return EndSlimeEntity.this.getTarget() == null
|
||||
&& (EndSlimeEntity.this.onGround
|
||||
|| EndSlimeEntity.this.isInWater()
|
||||
|| EndSlimeEntity.this.isInLava()
|
||||
|| EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION))
|
||||
&& EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
|
||||
return EndSlimeEntity.this.getTarget() == null && (EndSlimeEntity.this.onGround || EndSlimeEntity.this.isInWater() || EndSlimeEntity.this.isInLava() || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
|
||||
}
|
||||
|
||||
public void tick() {
|
||||
|
|
|
@ -44,32 +44,15 @@ public class ShadowWalkerEntity extends Monster {
|
|||
}
|
||||
|
||||
public static AttributeSupplier.Builder createMobAttributes() {
|
||||
return Monster.createMonsterAttributes()
|
||||
.add(Attributes.FOLLOW_RANGE, 35.0)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.15)
|
||||
.add(Attributes.ATTACK_DAMAGE, 4.5)
|
||||
.add(Attributes.ARMOR, 2.0)
|
||||
.add(Attributes.SPAWN_REINFORCEMENTS_CHANCE);
|
||||
return Monster.createMonsterAttributes().add(Attributes.FOLLOW_RANGE, 35.0).add(Attributes.MOVEMENT_SPEED, 0.15).add(Attributes.ATTACK_DAMAGE, 4.5).add(Attributes.ARMOR, 2.0).add(Attributes.SPAWN_REINFORCEMENTS_CHANCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
level.addParticle(ParticleTypes.ASH,
|
||||
getX() + random.nextGaussian() * 0.2,
|
||||
getY() + random.nextGaussian() * 0.5 + 1,
|
||||
getZ() + random.nextGaussian() * 0.2,
|
||||
0, 0, 0);
|
||||
level.addParticle(ParticleTypes.SMOKE,
|
||||
getX() + random.nextGaussian() * 0.2,
|
||||
getY() + random.nextGaussian() * 0.5 + 1,
|
||||
getZ() + random.nextGaussian() * 0.2,
|
||||
0, 0, 0);
|
||||
level.addParticle(ParticleTypes.ENTITY_EFFECT,
|
||||
getX() + random.nextGaussian() * 0.2,
|
||||
getY() + random.nextGaussian() * 0.5 + 1,
|
||||
getZ() + random.nextGaussian() * 0.2,
|
||||
0, 0, 0);
|
||||
level.addParticle(ParticleTypes.ASH, getX() + random.nextGaussian() * 0.2, getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0);
|
||||
level.addParticle(ParticleTypes.SMOKE, getX() + random.nextGaussian() * 0.2, getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0);
|
||||
level.addParticle(ParticleTypes.ENTITY_EFFECT, getX() + random.nextGaussian() * 0.2, getY() + random.nextGaussian() * 0.5 + 1, getZ() + random.nextGaussian() * 0.2, 0, 0, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -70,11 +70,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
|
||||
public static AttributeSupplier.Builder createMobAttributes() {
|
||||
return LivingEntity.createLivingAttributes()
|
||||
.add(Attributes.MAX_HEALTH, 2.0D)
|
||||
.add(Attributes.FOLLOW_RANGE, 16.0D)
|
||||
.add(Attributes.FLYING_SPEED, 0.4D)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.1D);
|
||||
return LivingEntity.createLivingAttributes().add(Attributes.MAX_HEALTH, 2.0D).add(Attributes.FOLLOW_RANGE, 16.0D).add(Attributes.FLYING_SPEED, 0.4D).add(Attributes.MOVEMENT_SPEED, 0.1D);
|
||||
}
|
||||
|
||||
public void setHive(Level world, BlockPos hive) {
|
||||
|
@ -253,11 +249,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
|
|||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
return SilkMothEntity.this.hivePos != null
|
||||
&& SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level
|
||||
&& SilkMothEntity.this.navigation.isDone()
|
||||
&& SilkMothEntity.this.random.nextInt(16) == 0
|
||||
&& SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64;
|
||||
return SilkMothEntity.this.hivePos != null && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level && SilkMothEntity.this.navigation.isDone() && SilkMothEntity.this.random.nextInt(16) == 0 && SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -26,32 +26,14 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
|
|||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 17)
|
||||
.addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F),
|
||||
PartPose.offset(0.0F, 24.0F, 0.0F)
|
||||
);
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create().texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), PartPose.offset(0.0F, 24.0F, 0.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F));
|
||||
bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F));
|
||||
|
||||
for (int i = 1; i <= TENTACLE_COUNT; i++) {
|
||||
PartDefinition tentaclePart = bodyPart
|
||||
.addOrReplaceChild("tentacle_center_" + i,
|
||||
CubeListBuilder.create(),
|
||||
PartPose.offsetAndRotation(
|
||||
0.0F, 0.0F, 0.0F,
|
||||
0.0F, i * 1.5708F, 0.0F
|
||||
)
|
||||
);
|
||||
PartDefinition tentaclePart = bodyPart.addOrReplaceChild("tentacle_center_" + i, CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, i * 1.5708F, 0.0F));
|
||||
|
||||
tentaclePart.addOrReplaceChild("tentacle_" + i, CubeListBuilder.create()
|
||||
.texOffs(16, 17)
|
||||
.addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F),
|
||||
PartPose.offset(0.0F, -7.0F, 4.5F));
|
||||
tentaclePart.addOrReplaceChild("tentacle_" + i, CubeListBuilder.create().texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), PartPose.offset(0.0F, -7.0F, 4.5F));
|
||||
}
|
||||
|
||||
return LayerDefinition.create(modelData, 48, 48);
|
||||
|
|
|
@ -28,87 +28,25 @@ public class DragonflyEntityModel extends BlockBenchModel<DragonflyEntity> {
|
|||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F),
|
||||
PartPose.offset(2.0F, 21.5F, -4.0F)
|
||||
);
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F), PartPose.offset(2.0F, 21.5F, -4.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.HEAD,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(17, 0)
|
||||
.addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F),
|
||||
PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, 0.3491F, 0.0F, 0.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create().texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F), PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, 0.3491F, 0.0F, 0.0F));
|
||||
|
||||
PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(26, 0)
|
||||
.addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F),
|
||||
PartPose.offset(-2.0F, -2.0F, 9.0F)
|
||||
);
|
||||
PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL, CubeListBuilder.create().texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F), PartPose.offset(-2.0F, -2.0F, 9.0F));
|
||||
|
||||
tailPart.addOrReplaceChild(PartNames.TAIL_FIN,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(36, 0)
|
||||
.addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F),
|
||||
PartPose.offset(0.0F, 0.0F, 7.0F)
|
||||
);
|
||||
tailPart.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create().texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F), PartPose.offset(0.0F, 0.0F, 7.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_WING,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 13)
|
||||
.addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 4.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create().texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), PartPose.offset(-2.0F, -4.0F, 4.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_WING,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.mirror()
|
||||
.texOffs(0, 13)
|
||||
.addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 4.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create().mirror().texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), PartPose.offset(-2.0F, -4.0F, 4.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(4, 17)
|
||||
.addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 8.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE, CubeListBuilder.create().texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), PartPose.offset(-2.0F, -4.0F, 8.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.mirror()
|
||||
.texOffs(4, 17)
|
||||
.addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 8.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, CubeListBuilder.create().mirror().texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), PartPose.offset(-2.0F, -4.0F, 8.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_LEG,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(50, 1)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, 0.0F, 0.0F, -0.5236F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create().texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, 0.0F, 0.0F, -0.5236F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(50, 1)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.5236F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create().texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.5236F));
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 64);
|
||||
}
|
||||
|
|
|
@ -24,54 +24,17 @@ public class EndFishEntityModel extends BlockBenchModel<EndFishEntity> {
|
|||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F),
|
||||
PartPose.offset(0.0F, 20.0F, 0.0F)
|
||||
);
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create().texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F), PartPose.offset(0.0F, 20.0F, 0.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.TOP_FIN,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 6)
|
||||
.addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, -0.6981F, 0.0F, 0.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.TOP_FIN, CubeListBuilder.create().texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F), PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, -0.6981F, 0.0F, 0.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.BOTTOM_FIN,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 6)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, 0.6981F, 0.0F, 0.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.BOTTOM_FIN, CubeListBuilder.create().texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F), PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, 0.6981F, 0.0F, 0.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.TAIL_FIN,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 15)
|
||||
.addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F),
|
||||
PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, -0.7854F, 0.0F, 0.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create().texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F), PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, -0.7854F, 0.0F, 0.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_FIN,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 25)
|
||||
.addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F),
|
||||
PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, 0.7854F, 0.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_FIN, CubeListBuilder.create().texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, 0.7854F, 0.0F));
|
||||
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_FIN,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.mirror()
|
||||
.texOffs(0, 25)
|
||||
.addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F),
|
||||
PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, -0.7854F, 0.0F)
|
||||
);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_FIN, CubeListBuilder.create().mirror().texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, -0.7854F, 0.0F));
|
||||
|
||||
return LayerDefinition.create(modelData, 32, 32);
|
||||
}
|
||||
|
|
|
@ -38,46 +38,16 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
|
|||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
if (onlyShell) {
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F),
|
||||
PartPose.ZERO
|
||||
);
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F), PartPose.ZERO);
|
||||
}
|
||||
else {
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 16)
|
||||
.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F),
|
||||
PartPose.ZERO
|
||||
);
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create().texOffs(0, 16).addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(32, 0)
|
||||
.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F),
|
||||
PartPose.ZERO
|
||||
);
|
||||
modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, CubeListBuilder.create().texOffs(32, 0).addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.LEFT_EYE,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(32, 4)
|
||||
.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F),
|
||||
PartPose.ZERO
|
||||
);
|
||||
modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, CubeListBuilder.create().texOffs(32, 4).addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.MOUTH,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(32, 8)
|
||||
.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F),
|
||||
PartPose.ZERO
|
||||
);
|
||||
modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create().texOffs(32, 8).addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F), PartPose.ZERO);
|
||||
|
||||
PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO);
|
||||
PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO);
|
||||
|
@ -86,18 +56,10 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
|
|||
final PartDefinition parent = i < 4 ? flowerPart : cropPart;
|
||||
final float rot = MHelper.degreesToRadians(i < 4 ? (i * 45F) : ((i - 4) * 90F + 45F));
|
||||
|
||||
PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_" + i,
|
||||
CubeListBuilder.create(),
|
||||
PartPose.offsetAndRotation(0, 0, 0, 0, rot, 0));
|
||||
PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_" + i, CubeListBuilder.create(), PartPose.offsetAndRotation(0, 0, 0, 0, rot, 0));
|
||||
|
||||
|
||||
petalRotPart.addOrReplaceChild("petal_" + i,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(40, 0)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F),
|
||||
PartPose.offset(-4, 8, 0)
|
||||
);
|
||||
petalRotPart.addOrReplaceChild("petal_" + i, CubeListBuilder.create().texOffs(40, 0).addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F), PartPose.offset(-4, 8, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,124 +34,35 @@ public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> {
|
|||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 0),
|
||||
PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, 0.0f, 0.0f, 0.6981f)
|
||||
);
|
||||
PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create().texOffs(0, 0), PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, 0.0f, 0.0f, 0.6981f));
|
||||
|
||||
legsL.addOrReplaceChild("cube_r1",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 13)
|
||||
.addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f)
|
||||
);
|
||||
legsL.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(0, 13).addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f));
|
||||
|
||||
legsL.addOrReplaceChild("cube_r2",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 15)
|
||||
.addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f)
|
||||
);
|
||||
legsL.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(0, 15).addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f));
|
||||
|
||||
legsL.addOrReplaceChild("cube_r3",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 14)
|
||||
.addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f)
|
||||
);
|
||||
legsL.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(0, 14).addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f));
|
||||
|
||||
PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 0),
|
||||
PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, 0.0f, 3.1416f, -0.6545f)
|
||||
);
|
||||
PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create().texOffs(0, 0), PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, 0.0f, 3.1416f, -0.6545f));
|
||||
|
||||
legsR.addOrReplaceChild("cube_r4",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 10)
|
||||
.addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f)
|
||||
);
|
||||
legsR.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(0, 10).addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f));
|
||||
|
||||
legsR.addOrReplaceChild("cube_r5",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 11)
|
||||
.addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f)
|
||||
);
|
||||
legsR.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(0, 11).addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f));
|
||||
|
||||
legsR.addOrReplaceChild("cube_r6",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 12)
|
||||
.addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f)
|
||||
);
|
||||
legsR.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(0, 12).addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f));
|
||||
|
||||
PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(15, 10)
|
||||
.addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f),
|
||||
PartPose.offset(0.0f, 18.0f, -3.0f)
|
||||
);
|
||||
PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create().texOffs(15, 10).addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f), PartPose.offset(0.0f, 18.0f, -3.0f));
|
||||
|
||||
head_pivot.addOrReplaceChild("tendril_r_r1",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.mirror()
|
||||
.texOffs(23, 0)
|
||||
.addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f),
|
||||
PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, 0.0f, 0.0f, 0.3927f)
|
||||
);
|
||||
head_pivot.addOrReplaceChild("tendril_r_r1", CubeListBuilder.create().mirror().texOffs(23, 0).addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, 0.0f, 0.0f, 0.3927f));
|
||||
|
||||
head_pivot.addOrReplaceChild("tendril_r_r2",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(23, 0)
|
||||
.addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f),
|
||||
PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, 0.0f, 0.0f, -0.3927f)
|
||||
);
|
||||
head_pivot.addOrReplaceChild("tendril_r_r2", CubeListBuilder.create().texOffs(23, 0).addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, 0.0f, 0.0f, -0.3927f));
|
||||
|
||||
PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(19, 19)
|
||||
.addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f),
|
||||
PartPose.offset(0.0f, 24.0f, 0.0f)
|
||||
);
|
||||
PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create().texOffs(19, 19).addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f), PartPose.offset(0.0f, 24.0f, 0.0f));
|
||||
|
||||
bb_main.addOrReplaceChild(PartNames.RIGHT_WING,
|
||||
CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(0, 5)
|
||||
.addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f),
|
||||
PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, 0.0f, 0.0f, 0.3927f)
|
||||
);
|
||||
bb_main.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create().mirror().texOffs(0, 5).addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, 0.0f, 0.0f, 0.3927f));
|
||||
|
||||
bb_main.addOrReplaceChild(PartNames.LEFT_WING,
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 5)
|
||||
.addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f),
|
||||
PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, 0.0f, 0.0f, -0.3927f)
|
||||
);
|
||||
bb_main.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create().texOffs(0, 5).addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, 0.0f, 0.0f, -0.3927f));
|
||||
|
||||
bb_main.addOrReplaceChild("abdomen_r1",
|
||||
CubeListBuilder
|
||||
.create()
|
||||
.texOffs(0, 10)
|
||||
.addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f),
|
||||
PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, -0.3927f, 0.0f, 0.0f)
|
||||
);
|
||||
bb_main.addOrReplaceChild("abdomen_r1", CubeListBuilder.create().texOffs(0, 10).addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f), PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, -0.3927f, 0.0f, 0.0f));
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 64);
|
||||
}
|
||||
|
|
|
@ -27,12 +27,9 @@ public class RendererEntityEndFish extends MobRenderer<EndFishEntity, EndFishEnt
|
|||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndFishEntity entity,
|
||||
float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw,
|
||||
float headPitch) {
|
||||
public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndFishEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) {
|
||||
VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]);
|
||||
this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY,
|
||||
1.0F, 1.0F, 1.0F, 1.0F);
|
||||
this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -31,12 +31,9 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
|
|||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndSlimeEntity entity,
|
||||
float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw,
|
||||
float headPitch) {
|
||||
public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndSlimeEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) {
|
||||
VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]);
|
||||
this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY,
|
||||
1.0F, 1.0F, 1.0F, 1.0F);
|
||||
this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F);
|
||||
if (entity.isLake()) {
|
||||
this.getParentModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY);
|
||||
}
|
||||
|
@ -50,8 +47,7 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
|
|||
}
|
||||
|
||||
@Override
|
||||
public void render(EndSlimeEntity slimeEntity, float f, float g, PoseStack matrixStack,
|
||||
MultiBufferSource vertexConsumerProvider, int i) {
|
||||
public void render(EndSlimeEntity slimeEntity, float f, float g, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i) {
|
||||
this.shadowRadius = 0.25F * (float) slimeEntity.getSize();
|
||||
super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i);
|
||||
}
|
||||
|
@ -66,8 +62,7 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
|
|||
matrixStack.scale(j * h, 1.0F / j * h, j * h);
|
||||
}
|
||||
|
||||
private final class OverlayFeatureRenderer<T extends EndSlimeEntity>
|
||||
extends RenderLayer<T, EndSlimeEntityModel<T>> {
|
||||
private final class OverlayFeatureRenderer<T extends EndSlimeEntity> extends RenderLayer<T, EndSlimeEntityModel<T>> {
|
||||
private final EndSlimeEntityModel<T> modelOrdinal;
|
||||
private final EndSlimeEntityModel<T> modelLake;
|
||||
|
||||
|
@ -77,30 +72,23 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
|
|||
modelLake = new EndSlimeEntityModel<>(ctx.getModelSet(), true);
|
||||
}
|
||||
|
||||
public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity,
|
||||
float f, float g, float h, float j, float k, float l) {
|
||||
public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) {
|
||||
if (!livingEntity.isInvisible()) {
|
||||
if (livingEntity.isLake()) {
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider
|
||||
.getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity)));
|
||||
this.getParentModel().renderFlower(matrixStack, vertexConsumer, i,
|
||||
LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F));
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity)));
|
||||
this.getParentModel().renderFlower(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F));
|
||||
}
|
||||
else if (livingEntity.isAmber() || livingEntity.isChorus()) {
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider
|
||||
.getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity)));
|
||||
this.getParentModel().renderCrop(matrixStack, vertexConsumer, i,
|
||||
LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F));
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity)));
|
||||
this.getParentModel().renderCrop(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F));
|
||||
}
|
||||
|
||||
EndSlimeEntityModel<T> model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal;
|
||||
this.getParentModel().copyPropertiesTo(model);
|
||||
model.prepareMobModel(livingEntity, f, g, h);
|
||||
model.setupAnim(livingEntity, f, g, j, k, l);
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider
|
||||
.getBuffer(RenderType.entityTranslucent(this.getTextureLocation(livingEntity)));
|
||||
model.renderToBuffer(matrixStack, vertexConsumer, i,
|
||||
LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F);
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderType.entityTranslucent(this.getTextureLocation(livingEntity)));
|
||||
model.renderToBuffer(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,8 +8,7 @@ import net.minecraft.resources.ResourceLocation;
|
|||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.ShadowWalkerEntity;
|
||||
|
||||
public class RendererEntityShadowWalker
|
||||
extends HumanoidMobRenderer<ShadowWalkerEntity, PlayerModel<ShadowWalkerEntity>> {
|
||||
public class RendererEntityShadowWalker extends HumanoidMobRenderer<ShadowWalkerEntity, PlayerModel<ShadowWalkerEntity>> {
|
||||
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png");
|
||||
|
||||
public RendererEntityShadowWalker(EntityRendererProvider.Context ctx) {
|
||||
|
|
|
@ -32,13 +32,7 @@ public class Integrations {
|
|||
}
|
||||
});
|
||||
|
||||
GridRecipe.make(BetterEnd.MOD_ID, "guide_book", GuideBookItem.GUIDE_BOOK)
|
||||
.checkConfig(Configs.RECIPE_CONFIG)
|
||||
.setShape("D", "B", "C")
|
||||
.addMaterial('D', EndItems.ENDER_DUST)
|
||||
.addMaterial('B', Items.BOOK)
|
||||
.addMaterial('C', EndItems.CRYSTAL_SHARDS)
|
||||
.build();
|
||||
GridRecipe.make(BetterEnd.MOD_ID, "guide_book", GuideBookItem.GUIDE_BOOK).checkConfig(Configs.RECIPE_CONFIG).setShape("D", "B", "C").addMaterial('D', EndItems.ENDER_DUST).addMaterial('B', Items.BOOK).addMaterial('C', EndItems.CRYSTAL_SHARDS).build();
|
||||
}
|
||||
hasHydrogen = FabricLoader.getInstance().isModLoaded("hydrogen");
|
||||
}
|
||||
|
|
|
@ -18,38 +18,9 @@ public class NourishIntegration extends ModIntegration {
|
|||
Tag.Named<Item> protein = getItemTag("protein");
|
||||
Tag.Named<Item> sweets = getItemTag("sweets");
|
||||
|
||||
TagHelper.addTag(
|
||||
fats,
|
||||
EndItems.END_FISH_RAW,
|
||||
EndItems.END_FISH_COOKED
|
||||
);
|
||||
TagHelper.addTag(
|
||||
fruit,
|
||||
EndItems.SHADOW_BERRY_RAW,
|
||||
EndItems.SHADOW_BERRY_COOKED,
|
||||
EndItems.BLOSSOM_BERRY,
|
||||
EndItems.SHADOW_BERRY_JELLY,
|
||||
EndItems.SWEET_BERRY_JELLY,
|
||||
EndItems.BLOSSOM_BERRY_JELLY,
|
||||
EndItems.AMBER_ROOT_RAW,
|
||||
EndItems.CHORUS_MUSHROOM_RAW,
|
||||
EndItems.CHORUS_MUSHROOM_COOKED,
|
||||
EndItems.BOLUX_MUSHROOM_COOKED
|
||||
);
|
||||
TagHelper.addTag(
|
||||
protein,
|
||||
EndItems.END_FISH_RAW,
|
||||
EndItems.END_FISH_COOKED,
|
||||
EndItems.CHORUS_MUSHROOM_COOKED,
|
||||
EndItems.BOLUX_MUSHROOM_COOKED,
|
||||
EndItems.CAVE_PUMPKIN_PIE
|
||||
);
|
||||
TagHelper.addTag(
|
||||
sweets,
|
||||
EndItems.SHADOW_BERRY_JELLY,
|
||||
EndItems.SWEET_BERRY_JELLY,
|
||||
EndItems.BLOSSOM_BERRY_JELLY,
|
||||
EndItems.CAVE_PUMPKIN_PIE
|
||||
);
|
||||
TagHelper.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED);
|
||||
TagHelper.addTag(fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY, EndItems.BLOSSOM_BERRY_JELLY, EndItems.AMBER_ROOT_RAW, EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED, EndItems.BOLUX_MUSHROOM_COOKED);
|
||||
TagHelper.addTag(protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED, EndItems.CHORUS_MUSHROOM_COOKED, EndItems.BOLUX_MUSHROOM_COOKED, EndItems.CAVE_PUMPKIN_PIE);
|
||||
TagHelper.addTag(sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY, EndItems.BLOSSOM_BERRY_JELLY, EndItems.CAVE_PUMPKIN_PIE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,19 +26,7 @@ public class NightshadeRedwoods extends EndBiome {
|
|||
Biome biome = Integrations.BYG.getBiome("nightshade_forest");
|
||||
BiomeSpecialEffects effects = biome.getSpecialEffects();
|
||||
|
||||
BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("nightshade_redwoods"))
|
||||
.setFogColor(140, 108, 47)
|
||||
.setFogDensity(1.5F)
|
||||
.setWaterAndFogColor(55, 70, 186)
|
||||
.setFoliageColor(122, 17, 155)
|
||||
.setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F)
|
||||
.setSurface(biome.getGenerationSettings().getSurfaceBuilder().get())
|
||||
.setGrassColor(48, 13, 89)
|
||||
.setPlantsColor(200, 125, 9)
|
||||
.addFeature(EndFeatures.END_LAKE_RARE)
|
||||
.addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE)
|
||||
.addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD)
|
||||
.addFeature(BYGFeatures.NIGHTSHADE_MOSS);
|
||||
BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("nightshade_redwoods")).setFogColor(140, 108, 47).setFogDensity(1.5F).setWaterAndFogColor(55, 70, 186).setFoliageColor(122, 17, 155).setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F).setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()).setGrassColor(48, 13, 89).setPlantsColor(200, 125, 9).addFeature(EndFeatures.END_LAKE_RARE).addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE).addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD).addFeature(BYGFeatures.NIGHTSHADE_MOSS);
|
||||
|
||||
if (BCLib.isClient()) {
|
||||
SoundEvent loop = effects.getAmbientLoopSoundEvent().get();
|
||||
|
|
|
@ -44,15 +44,7 @@ public class OldBulbisGardens extends EndBiome {
|
|||
|
||||
Block ivis = Integrations.BYG.getBlock("ivis_phylium");
|
||||
Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock();
|
||||
BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("old_bulbis_gardens"))
|
||||
.setFogColor(215, 132, 207)
|
||||
.setFogDensity(1.8F)
|
||||
.setWaterAndFogColor(40, 0, 56)
|
||||
.setFoliageColor(122, 17, 155)
|
||||
.setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F)
|
||||
.setSurface(ivis, origin)
|
||||
.addFeature(EndFeatures.END_LAKE_RARE)
|
||||
.addFeature(BYGFeatures.OLD_BULBIS_TREE);
|
||||
BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("old_bulbis_gardens")).setFogColor(215, 132, 207).setFogDensity(1.8F).setWaterAndFogColor(40, 0, 56).setFoliageColor(122, 17, 155).setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F).setSurface(ivis, origin).addFeature(EndFeatures.END_LAKE_RARE).addFeature(BYGFeatures.OLD_BULBIS_TREE);
|
||||
|
||||
if (BCLib.isClient()) {
|
||||
SoundEvent loop = effects.getAmbientLoopSoundEvent().get();
|
||||
|
@ -90,11 +82,7 @@ public class OldBulbisGardens extends EndBiome {
|
|||
}
|
||||
}
|
||||
|
||||
def.addFeature(EndFeatures.PURPLE_POLYPORE)
|
||||
.addFeature(BYGFeatures.IVIS_MOSS_WOOD)
|
||||
.addFeature(BYGFeatures.IVIS_MOSS)
|
||||
.addFeature(BYGFeatures.IVIS_VINE)
|
||||
.addFeature(BYGFeatures.IVIS_SPROUT);
|
||||
def.addFeature(EndFeatures.PURPLE_POLYPORE).addFeature(BYGFeatures.IVIS_MOSS_WOOD).addFeature(BYGFeatures.IVIS_MOSS).addFeature(BYGFeatures.IVIS_VINE).addFeature(BYGFeatures.IVIS_SPROUT);
|
||||
|
||||
return def;
|
||||
}
|
||||
|
|
|
@ -24,8 +24,7 @@ public class BigEtherTreeFeature extends DefaultFeature {
|
|||
final Random random = featureConfig.random();
|
||||
final BlockPos pos = featureConfig.origin();
|
||||
final WorldGenLevel world = featureConfig.level();
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
|
||||
return false;
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false;
|
||||
|
||||
BlockState log = Integrations.BYG.getDefaultState("ether_log");
|
||||
BlockState wood = Integrations.BYG.getDefaultState("ether_wood");
|
||||
|
@ -33,8 +32,7 @@ public class BigEtherTreeFeature extends DefaultFeature {
|
|||
return log;
|
||||
};
|
||||
Function<BlockState, Boolean> replace = (state) -> {
|
||||
return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT)
|
||||
|| state.getMaterial().isReplaceable();
|
||||
return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable();
|
||||
};
|
||||
|
||||
int height = MHelper.randRange(40, 60, random);
|
||||
|
@ -64,8 +62,7 @@ public class BigEtherTreeFeature extends DefaultFeature {
|
|||
}
|
||||
|
||||
sdf.setReplaceFunction((state) -> {
|
||||
return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT)
|
||||
|| state.getMaterial().isReplaceable();
|
||||
return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable();
|
||||
}).addPostProcess((info) -> {
|
||||
if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) {
|
||||
return wood;
|
||||
|
|
|
@ -38,8 +38,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
|
|||
final Random random = featureConfig.random();
|
||||
final BlockPos pos = featureConfig.origin();
|
||||
final WorldGenLevel world = featureConfig.level();
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
|
||||
return false;
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false;
|
||||
|
||||
BlockState log = Integrations.BYG.getDefaultState("nightshade_log");
|
||||
BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood");
|
||||
|
@ -50,8 +49,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
|
|||
return log;
|
||||
};
|
||||
Function<BlockState, Boolean> replace = (state) -> {
|
||||
return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT)
|
||||
|| state.getMaterial().isReplaceable();
|
||||
return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial().isReplaceable();
|
||||
};
|
||||
Function<PosInfo, BlockState> post = (info) -> {
|
||||
if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) {
|
||||
|
@ -92,8 +90,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
|
|||
|
||||
SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer);
|
||||
SDF roots = new SDFSphere().setRadius(2F).setBlock(log);
|
||||
roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random))
|
||||
.setAngle(random.nextFloat() * MHelper.PI2).setSource(roots);
|
||||
roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)).setAngle(random.nextFloat() * MHelper.PI2).setSource(roots);
|
||||
sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots);
|
||||
sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos);
|
||||
Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.35F);
|
||||
|
@ -178,14 +175,12 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
|
|||
canopy = new SDFDisplacement().setFunction((vec) -> {
|
||||
return MHelper.randRange(-3F, 3F, random);
|
||||
}).setSource(canopy);
|
||||
canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world,
|
||||
pos.offset(0, height * 0.75, 0), ignore);
|
||||
canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, pos.offset(0, height * 0.75, 0), ignore);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static {
|
||||
BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0),
|
||||
new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0));
|
||||
BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0), new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,20 +39,16 @@ public class OldBulbisTreeFeature extends DefaultFeature {
|
|||
final Random random = featureConfig.random();
|
||||
final BlockPos pos = featureConfig.origin();
|
||||
final WorldGenLevel world = featureConfig.level();
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
|
||||
return false;
|
||||
if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN))
|
||||
return false;
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false;
|
||||
if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN)) return false;
|
||||
|
||||
BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem");
|
||||
BlockState wood = Integrations.BYG.getDefaultState("bulbis_wood");
|
||||
BlockState cap = Integrations.BYG
|
||||
.getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell");
|
||||
BlockState cap = Integrations.BYG.getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell");
|
||||
BlockState glow = Integrations.BYG.getDefaultState("purple_shroomlight");
|
||||
|
||||
Function<BlockState, Boolean> replacement = (state) -> {
|
||||
if (state.equals(stem) || state.equals(wood) || state.is(TagAPI.END_GROUND)
|
||||
|| state.getMaterial().equals(Material.PLANT)) {
|
||||
if (state.equals(stem) || state.equals(wood) || state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT)) {
|
||||
return true;
|
||||
}
|
||||
return state.getMaterial().isReplaceable();
|
||||
|
@ -91,8 +87,7 @@ public class OldBulbisTreeFeature extends DefaultFeature {
|
|||
}
|
||||
|
||||
sdf.setReplaceFunction(replacement).addPostProcess((info) -> {
|
||||
if (info.getState().equals(stem)
|
||||
&& (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) {
|
||||
if (info.getState().equals(stem) && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) {
|
||||
return wood;
|
||||
}
|
||||
return info.getState();
|
||||
|
@ -101,8 +96,7 @@ public class OldBulbisTreeFeature extends DefaultFeature {
|
|||
return true;
|
||||
}
|
||||
|
||||
private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow,
|
||||
BlockState wood, Function<BlockState, Boolean> replacement, Random random) {
|
||||
private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow, BlockState wood, Function<BlockState, Boolean> replacement, Random random) {
|
||||
OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong());
|
||||
SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap);
|
||||
|
||||
|
@ -149,8 +143,7 @@ public class OldBulbisTreeFeature extends DefaultFeature {
|
|||
sphere.fillArea(world, pos, new AABB(pos.above((int) offsetY)).inflate(radius * 1.3F));
|
||||
}
|
||||
|
||||
private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood,
|
||||
Function<BlockState, Boolean> replacement) {
|
||||
private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, Function<BlockState, Boolean> replacement) {
|
||||
int count = (int) (radius * 1.5F);
|
||||
for (int i = 0; i < count; i++) {
|
||||
float angle = (float) i / (float) count * MHelper.PI2;
|
||||
|
@ -167,18 +160,13 @@ public class OldBulbisTreeFeature extends DefaultFeature {
|
|||
}
|
||||
|
||||
static {
|
||||
SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F),
|
||||
new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F),
|
||||
new Vector3f(0.50F, 1.00F, 0.00F));
|
||||
SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), new Vector3f(0.50F, 1.00F, 0.00F));
|
||||
|
||||
ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0),
|
||||
new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0));
|
||||
ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0));
|
||||
SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0));
|
||||
|
||||
LEAF = Lists.newArrayList(new Vector3f(0.00F, 0.0F, 0), new Vector3f(0.10F, 0.4F, 0),
|
||||
new Vector3f(0.40F, 0.8F, 0), new Vector3f(0.75F, 0.9F, 0), new Vector3f(1.00F, 0.8F, 0));
|
||||
LEAF = Lists.newArrayList(new Vector3f(0.00F, 0.0F, 0), new Vector3f(0.10F, 0.4F, 0), new Vector3f(0.40F, 0.8F, 0), new Vector3f(0.75F, 0.9F, 0), new Vector3f(1.00F, 0.8F, 0));
|
||||
|
||||
SIDE = Lists.newArrayList(new Vector3f(0, -0.3F, -0.5F), new Vector3f(0, -0.1F, -0.3F),
|
||||
new Vector3f(0, 0.0F, 0.0F), new Vector3f(0, -0.1F, 0.3F), new Vector3f(0, -0.3F, 0.5F));
|
||||
SIDE = Lists.newArrayList(new Vector3f(0, -0.3F, -0.5F), new Vector3f(0, -0.1F, -0.3F), new Vector3f(0, 0.0F, 0.0F), new Vector3f(0, -0.1F, 0.3F), new Vector3f(0, -0.3F, 0.5F));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,8 +51,7 @@ public class REIAlloyingCategory implements TransferDisplayCategory<REIAlloyingD
|
|||
widgets.add(Widgets.createRecipeBase(bounds));
|
||||
widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9)));
|
||||
widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000));
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5),
|
||||
new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime));
|
||||
List<EntryIngredient> inputEntries = display.getInputEntries();
|
||||
widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput());
|
||||
|
@ -67,8 +66,7 @@ public class REIAlloyingCategory implements TransferDisplayCategory<REIAlloyingD
|
|||
}
|
||||
|
||||
@Override
|
||||
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, REIAlloyingDisplay display,
|
||||
IntList redSlots) {
|
||||
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, REIAlloyingDisplay display, IntList redSlots) {
|
||||
Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27);
|
||||
matrices.pushPose();
|
||||
matrices.translate(0, 0, 400);
|
||||
|
|
|
@ -34,10 +34,7 @@ public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDi
|
|||
}
|
||||
|
||||
protected REIAlloyingDisplay(Recipe<?> recipe, float xp, double smeltTime) {
|
||||
super(
|
||||
EntryIngredients.ofIngredients(recipe.getIngredients()),
|
||||
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
|
||||
);
|
||||
super(EntryIngredients.ofIngredients(recipe.getIngredients()), Collections.singletonList(EntryIngredients.of(recipe.getResultItem())));
|
||||
this.recipe = recipe;
|
||||
this.xp = xp;
|
||||
this.smeltTime = smeltTime;
|
||||
|
@ -91,9 +88,6 @@ public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDi
|
|||
// }
|
||||
|
||||
static {
|
||||
fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream()
|
||||
.map(Item::getDefaultInstance).map(EntryStacks::of)
|
||||
.map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel")
|
||||
.withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList());
|
||||
fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream().map(Item::getDefaultInstance).map(EntryStacks::of).map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel").withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,8 +52,7 @@ public class REIAlloyingFuelCategory implements DisplayCategory<REIAlloyingFuelD
|
|||
String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime());
|
||||
List<Widget> widgets = Lists.newArrayList();
|
||||
widgets.add(Widgets.createRecipeBase(bounds));
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime))
|
||||
.color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned());
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime)).color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned());
|
||||
widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime()));
|
||||
widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput());
|
||||
return widgets;
|
||||
|
@ -74,8 +73,7 @@ public class REIAlloyingFuelCategory implements DisplayCategory<REIAlloyingFuelD
|
|||
@Nullable
|
||||
@Override
|
||||
public Tooltip getTooltip(Point point) {
|
||||
if (slot.containsMouse(point))
|
||||
return slot.getCurrentTooltip(point);
|
||||
if (slot.containsMouse(point)) return slot.getCurrentTooltip(point);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -72,8 +72,7 @@ public class REIAnvilCategory implements TransferDisplayCategory<REIAnvilDisplay
|
|||
}).collect(Collectors.toList());
|
||||
//materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount()));
|
||||
widgets.add(Widgets.createArrow(new Point(x + 24, y + 4)));
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15),
|
||||
new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
|
||||
|
@ -83,8 +82,7 @@ public class REIAnvilCategory implements TransferDisplayCategory<REIAnvilDisplay
|
|||
}
|
||||
|
||||
@Override
|
||||
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, REIAnvilDisplay display,
|
||||
IntList redSlots) {
|
||||
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, REIAnvilDisplay display, IntList redSlots) {
|
||||
Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27);
|
||||
matrices.pushPose();
|
||||
matrices.translate(0, 0, 400);
|
||||
|
|
|
@ -17,10 +17,7 @@ public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDispl
|
|||
private final AnvilRecipe recipe;
|
||||
|
||||
public REIAnvilDisplay(AnvilRecipe recipe) {
|
||||
super(
|
||||
EntryIngredients.ofIngredients(recipe.getIngredients()),
|
||||
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
|
||||
);
|
||||
super(EntryIngredients.ofIngredients(recipe.getIngredients()), Collections.singletonList(EntryIngredients.of(recipe.getResultItem())));
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,15 +71,7 @@ public class REIInfusionCategory implements TransferDisplayCategory<REIInfusionD
|
|||
widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput());
|
||||
widgets.add(
|
||||
Widgets.createLabel(
|
||||
new Point(bounds.getMaxX() - 5, bounds.y + 6),
|
||||
new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())
|
||||
)
|
||||
.noShadow()
|
||||
.rightAligned()
|
||||
.color(0xFF404040, 0xFFBBBBBB)
|
||||
);
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
return widgets;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,10 +18,7 @@ public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDi
|
|||
private final int time;
|
||||
|
||||
public REIInfusionDisplay(InfusionRecipe recipe) {
|
||||
super(
|
||||
EntryIngredients.ofIngredients(recipe.getIngredients()),
|
||||
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
|
||||
);
|
||||
super(EntryIngredients.ofIngredients(recipe.getIngredients()), Collections.singletonList(EntryIngredients.of(recipe.getResultItem())));
|
||||
this.recipe = recipe;
|
||||
this.time = recipe.getInfusionTime();
|
||||
}
|
||||
|
|
|
@ -50,14 +50,11 @@ public class REIPlugin implements REIClientPlugin {
|
|||
END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER);
|
||||
INFUSION_RITUAL = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL);
|
||||
|
||||
List<EntryStack> anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream()
|
||||
.filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList())));
|
||||
List<EntryStack> anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream().filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList())));
|
||||
anvils.add(0, EntryStacks.of(Blocks.ANVIL));
|
||||
ANVILS = anvils.toArray(new EntryStack[0]);
|
||||
|
||||
FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream()
|
||||
.filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList())))
|
||||
.toArray(new EntryStack[0]);
|
||||
FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream().filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))).toArray(new EntryStack[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -79,12 +76,7 @@ public class REIPlugin implements REIClientPlugin {
|
|||
public void registerCategories(CategoryRegistry registry) {
|
||||
init();
|
||||
|
||||
registry.add(
|
||||
new REIAlloyingFuelCategory(),
|
||||
new REIAlloyingCategory(END_STONE_SMELTER),
|
||||
new REIInfusionCategory(INFUSION_RITUAL),
|
||||
new REIAnvilCategory(ANVILS)
|
||||
);
|
||||
registry.add(new REIAlloyingFuelCategory(), new REIAlloyingCategory(END_STONE_SMELTER), new REIInfusionCategory(INFUSION_RITUAL), new REIAnvilCategory(ANVILS));
|
||||
|
||||
registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER);
|
||||
registry.addWorkstations(ALLOYING, END_STONE_SMELTER);
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
public interface BetterEndRecipe {
|
||||
}
|
||||
public interface BetterEndRecipe {}
|
||||
|
|
18
src/main/java/ru/betterend/interfaces/PottablePlant.java
Normal file
18
src/main/java/ru/betterend/interfaces/PottablePlant.java
Normal file
|
@ -0,0 +1,18 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
|
||||
public interface PottablePlant {
|
||||
boolean canPlantOn(Block block);
|
||||
|
||||
default boolean addToPot() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
default String getPottedState() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
public interface PottableTerrain {}
|
|
@ -27,18 +27,14 @@ public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, Fall
|
|||
private final int defense;
|
||||
|
||||
public ArmoredElytra(String name, ArmorMaterial material, Item repairItem, int durability, double movementFactor, boolean fireproof) {
|
||||
super(material, EquipmentSlot.CHEST, fireproof ?
|
||||
EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC).fireResistant() :
|
||||
EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC));
|
||||
super(material, EquipmentSlot.CHEST, fireproof ? EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC).fireResistant() : EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC));
|
||||
this.wingTexture = BetterEnd.makeID("textures/entity/" + name + ".png");
|
||||
this.repairItem = repairItem;
|
||||
this.movementFactor = movementFactor;
|
||||
this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75);
|
||||
this.toughness = material.getToughness() / 1.75F;
|
||||
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
|
||||
"Armor modifier", defense, AttributeModifier.Operation.ADDITION));
|
||||
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
|
||||
"Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
|
||||
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], "Armor modifier", defense, AttributeModifier.Operation.ADDITION));
|
||||
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], "Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -70,7 +66,6 @@ public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, Fall
|
|||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public void registerModelPredicate() {
|
||||
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
|
||||
(itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), (itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,10 +28,8 @@ public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem,
|
|||
this.movementFactor = movementFactor;
|
||||
this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75);
|
||||
this.toughness = material.getToughness() / 1.75F;
|
||||
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
|
||||
"Armor modifier", defense, AttributeModifier.Operation.ADDITION));
|
||||
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2],
|
||||
"Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
|
||||
addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], "Armor modifier", defense, AttributeModifier.Operation.ADDITION));
|
||||
addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], "Armor toughness", toughness, AttributeModifier.Operation.ADDITION));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -62,7 +60,6 @@ public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem,
|
|||
|
||||
@Override
|
||||
public void registerModelPredicate() {
|
||||
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
|
||||
(itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), (itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,12 +14,7 @@ import java.util.UUID;
|
|||
|
||||
public class EndArmorItem extends ArmorItem implements ItemModelProvider {
|
||||
|
||||
protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[]{
|
||||
UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"),
|
||||
UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"),
|
||||
UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"),
|
||||
UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")
|
||||
};
|
||||
protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[]{UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")};
|
||||
|
||||
protected final Multimap<Attribute, AttributeModifier> defaultModifiers;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue