Merge pull request #213 from quiqueck/1.17

1.17/1.17.1 Conversion
This commit is contained in:
paulevsGitch 2021-07-07 21:22:29 +03:00 committed by GitHub
commit 62ba56eee6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
212 changed files with 4343 additions and 1778 deletions

2
.gitignore vendored
View file

@ -29,3 +29,5 @@ bin/
run/
output/
*.log
Convert.class
ModelPart.class

180
Convert.java Normal file
View file

@ -0,0 +1,180 @@
class ModelPart {
static java.util.ArrayList<ModelPart> parts = new java.util.ArrayList<>(20);
final String name;
ModelPart parent = null;
boolean mirror = false;
float x=0, y=0, z=0, rx=0, ry=0, rz=0;
int u=0, v=0;
float bx=0,by=0,bz=0,ba=0,bb=0,bc=0;
float scale = 1;
static int wd = 64;
static int hg = 32;
boolean hadBox = false;
ModelPart(Convert c, String name){
this(c, 0, 0, name);
}
ModelPart(Convert c, int u, int v, String name){
this.name = name;
this.u = u;
this.v = v;
parts.add(this);
}
ModelPart(int wd, int hg, int u, int v, String name){
this.name = name;
this.u = u;
this.v = v;
ModelPart.wd = wd;
ModelPart.hg = hg;
parts.add(this);
}
ModelPart setPos(float x, float y, float z){
this.x=x;
this.y=y;
this.z=z;
return this;
}
ModelPart setRotationAngle(float x, float y, float z){
this.rx=x;
this.ry=y;
this.rz=z;
return this;
}
ModelPart addChild(ModelPart p){
p.parent = this;
return this;
}
ModelPart texOffs(int u, int v){
this.u=u;
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);
}
ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d){
bx=x;
by=y;
bz=z;
ba=a;
bb=b;
bc=c;
scale = _d;
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;
by=y;
bz=z;
ba=a;
bb=b;
bc=c;
hadBox = true;
return this;
}
public String toString(){
String s = "";
String pName = parent==null?"modelPartData":parent.name;
if (scale!=1){
s += "CubeDeformation deformation_"+name+" = new CubeDeformation("+scale+"f);\n";
}
s += "PartDefinition " + name + " = ";
s += pName+".addOrReplaceChild(\""+name+"\", CubeListBuilder.create()\n";
if (this.mirror) s+= ".mirror()\n";
s+= ".texOffs("+u+", "+v+")";
if (this.hadBox) {
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 {
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){
s+= "PartPose.offset("+x+"f, "+y+"f, "+z+"f)";
} else {
s+= "PartPose.offsetAndRotation("+x+"f, "+y+"f, "+z+"f, \n"+rx+"f, "+ry+"f, "+rz+"f)";
}
s +=");";
return s;
}
public static void print(){
System.out.println("public static LayerDefinition getTexturedModelData() {");
System.out.println(" MeshDefinition modelData = new MeshDefinition();");
System.out.println(" PartDefinition modelPartData = modelData.getRoot();");
for(ModelPart p : parts){
System.out.println(p);
System.out.println();
}
System.out.println("return LayerDefinition.create(modelData, "+wd+", "+hg+");");
System.out.println("}");
System.out.println();
System.out.println();
for(ModelPart p : parts){
String pName = p.parent==null?"modelPart":p.parent.name;
System.out.println(p.name +" = "+pName+".getChild(\""+p.name+"\");");
}
}
}
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");
partC.addBox(1.0F, 0.0F, 1.0F, 14.0F, 9.0F, 14.0F, 0.0F);
ModelPart partA = new ModelPart(64, 64, 0, 0,"partA");
partA.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F);
partA.y = 9.0F;
partA.z = 1.0F;
ModelPart partB = new ModelPart(64, 64, 0, 0, "partB");
partB.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F);
partB.y = 8.0F;
ModelPart partRightC = new ModelPart(64, 64, 0, 19, "partRightC");
partRightC.addBox(1.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F);
ModelPart partRightA = new ModelPart(64, 64, 0, 0, "partRightA");
partRightA.addBox(1.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F);
partRightA.y = 9.0F;
partRightA.z = 1.0F;
ModelPart partRightB = new ModelPart(64, 64, 0, 0, "partRightB");
partRightB.addBox(15.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F);
partRightB.y = 8.0F;
ModelPart partLeftC = new ModelPart(64, 64, 0, 19, "partLeftC");
partLeftC.addBox(0.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F);
ModelPart partLeftA = new ModelPart(64, 64, 0, 0, "partLeftA");
partLeftA.addBox(0.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F);
partLeftA.y = 9.0F;
partLeftA.z = 1.0F;
ModelPart partLeftB = new ModelPart(64, 64, 0, 0, "partLeftB");
partLeftB.addBox(0.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F);
partLeftB.y = 8.0F;
}
}

View file

@ -19,8 +19,7 @@ version = project.mod_version
group = project.maven_group
repositories {
maven { url "https://maven.dblsaiko.net/" }
maven { url "https://server.bbkr.space:8081/artifactory/libs-release/" }
maven { url "https://maven.dblsaiko.net/" }
maven { url "https://maven.fabricmc.net/" }
maven { url 'https://maven.blamejared.com' }
maven { url "https://maven.shedaniel.me/" }
@ -33,49 +32,56 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}"
useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}"
useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}"
useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}"
useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}"
useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}"
useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}"
//useOptional "grondag:canvas-mc116:${project.canvas_version}"
}
def useOptional(String dep) {
dependencies.modRuntime (dep) {
exclude group: "net.fabricmc.fabric-api"
exclude group: "net.fabricmc"
exclude group: 'net.fabricmc.fabric-api'
exclude group: 'net.fabricmc'
if (!dep.contains("me.shedaniel")) {
exclude group: "me.shedaniel"
exclude group: 'me.shedaniel.cloth'
exclude group: 'me.shedaniel'
}
}
dependencies.modCompileOnly (dep) {
exclude group: "net.fabricmc.fabric-api"
exclude group: "net.fabricmc"
exclude group: 'net.fabricmc.fabric-api'
exclude group: 'net.fabricmc'
if (!dep.contains("me.shedaniel")) {
exclude group: "me.shedaniel"
exclude group: 'me.shedaniel.cloth'
exclude group: 'me.shedaniel'
}
}
}
def useApi(String dep) {
dependencies.modApi (dep) {
exclude group: "net.fabricmc.fabric-api"
exclude group: "net.fabricmc"
exclude group: 'net.fabricmc.fabric-api'
exclude group: 'net.fabricmc'
if (!dep.contains("me.shedaniel")) {
exclude group: "me.shedaniel"
exclude group: 'me.shedaniel.cloth'
exclude group: 'me.shedaniel'
}
}
}
processResources {
inputs.property "version", project.version
duplicatesStrategy = 'WARN'
duplicatesStrategy = 'EXCLUDE'
from(sourceSets.main.resources.srcDirs) {
include "fabric.mod.json"
expand "version": project.version
}
from(sourceSets.main.resources.srcDirs) {
exclude "fabric.mod.json"
}
}
// ensure that the encoding is set to UTF-8, no matter what the system default is
@ -155,4 +161,4 @@ task release(dependsOn: [remapJar, sourcesJar, javadocJar]) {
// // uncomment to publish to the local maven
// // mavenLocal()
// }
//}
//}

View file

@ -3,19 +3,19 @@ org.gradle.jvmargs=-Xmx2G
# Fabric Properties
# check these on https://fabricmc.net/use
minecraft_version= 1.17
minecraft_version= 1.17.1
yarn_mappings= 6
loader_version= 0.11.6
# Mod Properties
mod_version = 0.9.8-pre
mod_version = 0.10.0-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 = 50-FABRIC
fabric_version = 0.35.2+1.17
patchouli_version = 55-FABRIC-SNAPSHOT
fabric_version = 0.36.1+1.17
bclib_version = 0.2.0
rei_version = 6.0.262-alpha
canvas_version = 1.0.+
bclib_version = 0.1.38
rei_version = 6.0.251-alpha

View file

@ -1,7 +1,5 @@
package ru.betterend.blocks;
import java.util.Random;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
@ -19,6 +17,8 @@ import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import ru.betterend.blocks.basis.EndUnderwaterPlantBlock;
import java.util.Random;
public class BubbleCoralBlock extends EndUnderwaterPlantBlock {
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16);

View file

@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable;
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.client.renderer.block.model.BlockModel;
@ -57,6 +59,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType
}
@Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Map<String, String> textures = Maps.newHashMap();
textures.put("%glow%", getGlowTexture());

View file

@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable;
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.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.BlockModelRotation;
@ -46,11 +48,13 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped,
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation blockId) {
return ModelsHelper.createItemModel(blockId);
}
@Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Optional<String> pattern;
switch (blockState.getValue(FACING)) {
@ -67,6 +71,7 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped,
}
@Override
@Environment(EnvType.CLIENT)
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
String state = "_wall";
BlockModelRotation rotation = BlockModelRotation.X0_Y0;

View file

@ -6,6 +6,8 @@ import java.util.Random;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.core.BlockPos;
@ -85,6 +87,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) {
return getBlockModel(resourceLocation, defaultBlockState());
}

View file

@ -94,7 +94,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
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.yRot, entity.xRot);
exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot());
} else {
((TeleportingEntity) entity).be_setExitPos(exitPos);
Optional<Entity> teleported = Optional.ofNullable(entity.changeDimension(destination));
@ -114,7 +114,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) {
if (targetWorld == null) return null;
Registry<DimensionType> registry = targetWorld.registryAccess().dimensionTypes();
Registry<DimensionType> registry = targetWorld.registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY);
ResourceLocation targetWorldId = targetWorld.dimension().location();
ResourceLocation currentWorldId = currentWorld.dimension().location();
double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale();

View file

@ -1,10 +1,6 @@
package ru.betterend.blocks;
import java.util.List;
import java.util.Random;
import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
@ -19,15 +15,11 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
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.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
@ -38,8 +30,13 @@ import net.minecraft.world.level.material.MaterialColor;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.Nullable;
import ru.bclib.blocks.BaseBlockWithEntity;
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
import ru.betterend.registry.EndBlockEntities;
import java.util.List;
import java.util.Random;
public class EndStoneSmelter extends BaseBlockWithEntity {
public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
@ -52,7 +49,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
.resistance(100F)
.requiresCorrectToolForDrops()
.sound(SoundType.STONE));
this.registerDefaultState(this.stateDefinition.any()
registerDefaultState(this.stateDefinition.any()
.setValue(FACING, Direction.NORTH)
.setValue(LIT, false));
}
@ -75,12 +72,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
@Override
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite());
return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite());
}
@Override
public BlockEntity newBlockEntity(BlockGetter world) {
return new EndStoneSmelterBlockEntity();
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new EndStoneSmelterBlockEntity(blockPos, blockState);
}
@Override
@ -149,4 +146,11 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D);
}
}
@Override
@Nullable
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> blockEntityType) {
return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.END_STONE_SMELTER, EndStoneSmelterBlockEntity::tick);
}
}

View file

@ -126,8 +126,8 @@ public class EternalPedestal extends PedestalBlock {
}
@Override
public BlockEntity newBlockEntity(BlockGetter world) {
return new EternalPedestalEntity();
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new EternalPedestalEntity(blockPos, blockState);
}
@Override

View file

@ -18,8 +18,8 @@ import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import ru.bclib.interfaces.ISpetialItem;
import ru.betterend.blocks.basis.EndPlantBlock;
import ru.betterend.interfaces.ISpetialItem;
public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem {
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16);

View file

@ -79,7 +79,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider {
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null) {
if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
if (tool.is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Collections.singletonList(new ItemStack(this));
}
int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool);

View file

@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.MaterialColor;
import ru.bclib.blocks.BaseBlock;
@ -26,5 +27,5 @@ public class HydraluxPetalBlock extends BaseBlock {
}
@Override
public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {}
public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) {}
}

View file

@ -4,6 +4,8 @@ import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor;
@ -31,6 +33,7 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo
}
@Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
String path = "betterend:block/block_petal_colored";
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path);

View file

@ -108,8 +108,8 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo
}
@Override
public BlockEntity newBlockEntity(BlockGetter world) {
return new BlockEntityHydrothermalVent();
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new BlockEntityHydrothermalVent(pos, state);
}
@Override

View file

@ -44,8 +44,8 @@ public class InfusionPedestal extends PedestalBlock {
}
@Override
public BlockEntity newBlockEntity(BlockGetter world) {
return new InfusionPedestalEntity();
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new InfusionPedestalEntity(blockPos, blockState);
}
@Override

View file

@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable;
import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor;
@ -71,11 +73,13 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) {
return getBlockModel(resourceLocation, defaultBlockState());
}
@Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap");
return ModelsHelper.fromPattern(pattern);

View file

@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import ru.betterend.blocks.basis.EndPlantWithAgeBlock;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures;
@ -14,7 +15,7 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock {
@Override
public void growAdult(WorldGenLevel world, Random random, BlockPos pos) {
EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null);
EndFeatures.LUMECORN.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
}
@Override

View file

@ -61,7 +61,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped
FluidState fluidState = world.getFluidState(blockPos2);
Material material = blockState.getMaterial();
if (fluidState.is(FluidTags.WATER)) {
if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) {
if (blockState.getBlock() instanceof BucketPickup && !((BucketPickup) blockState.getBlock()).pickupBlock(world, blockPos2, blockState).isEmpty()) {
++i;
if (j < 6) {
queue.add(new Tuple<>(blockPos2, j + 1));
@ -73,7 +73,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped
queue.add(new Tuple<>(blockPos2, j + 1));
}
} else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null;
BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null;
dropResources(blockState, world, blockPos2, blockEntity);
world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3);
++i;

View file

@ -34,7 +34,7 @@ public class NeedlegrassBlock extends EndPlantBlock {
@Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Lists.newArrayList(new ItemStack(this));
}
else {

View file

@ -89,7 +89,7 @@ public class SilkMothHiveBlock extends BaseBlock {
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
if (hand == InteractionHand.MAIN_HAND) {
ItemStack stack = player.getMainHandItem();
if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) {
if (stack.is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) {
BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0));
Direction dir = state.getValue(FACING);
double px = pos.getX() + dir.getStepX() + 0.5;

View file

@ -150,7 +150,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped {
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
if (hand == InteractionHand.MAIN_HAND) {
ItemStack stack = player.getMainHandItem();
if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) {
if (stack.is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) {
BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0));
Direction dir = state.getValue(FACING);
double px = pos.getX() + dir.getStepX() + 0.5;

View file

@ -1,7 +1,5 @@
package ru.betterend.blocks;
import java.util.Random;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.BlockGetter;
@ -9,6 +7,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
@ -17,6 +16,8 @@ import ru.betterend.blocks.basis.EndPlantBlock;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures;
import java.util.Random;
public class SmallAmaranitaBlock extends EndPlantBlock {
private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12);
@ -29,7 +30,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock {
public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) {
BlockPos bigPos = growBig(world, pos);
if (bigPos != null) {
if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) {
if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, bigPos, null))) {
replaceMushroom(world, bigPos);
replaceMushroom(world, bigPos.south());
replaceMushroom(world, bigPos.east());
@ -37,7 +38,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock {
}
return;
}
EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null);
EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
}
@Override

View file

@ -23,6 +23,7 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.BonemealableBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
@ -56,7 +57,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
@Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Lists.newArrayList(new ItemStack(this));
}
else {
@ -99,6 +100,6 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
@Override
public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) {
BlocksHelper.setWithUpdate(world, pos, Blocks.AIR);
EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null);
EndFeatures.JELLYSHROOM.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
}
}

View file

@ -81,6 +81,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) {
return getBlockModel(resourceLocation, defaultBlockState());
}

View file

@ -1,5 +1,6 @@
package ru.betterend.blocks;
import java.util.Optional;
import java.util.Random;
import net.fabricmc.api.EnvType;
@ -9,9 +10,12 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
@ -38,9 +42,9 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid
}
@Override
public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) {
public ItemStack pickupBlock(LevelAccessor world, BlockPos pos, BlockState state) {
world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11);
return Fluids.WATER;
return new ItemStack(Items.WATER_BUCKET);
}
@Override
@ -120,4 +124,11 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid
public FluidState getFluidState(BlockState state) {
return Fluids.WATER.getSource(false);
}
@Override
public Optional<SoundEvent> getPickupSound() {
return Fluids.WATER.getPickupSound();
}
}

View file

@ -2,6 +2,8 @@ package ru.betterend.blocks.basis;
import java.util.Map;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.core.BlockPos;
@ -125,6 +127,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg
}
@Override
@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(),

View file

@ -62,7 +62,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped {
@Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
return Lists.newArrayList(new ItemStack(this));
}
else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) {

View file

@ -6,10 +6,14 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import org.jetbrains.annotations.Nullable;
import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.UnbakedModel;
@ -49,6 +53,7 @@ import ru.betterend.blocks.InfusionPedestal;
import ru.betterend.blocks.entities.InfusionPedestalEntity;
import ru.betterend.blocks.entities.PedestalBlockEntity;
import ru.betterend.client.models.Patterns;
import ru.betterend.registry.EndBlockEntities;
import ru.betterend.registry.EndBlocks;
import ru.betterend.rituals.InfusionRitual;
@ -349,8 +354,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
}
@Override
public BlockEntity newBlockEntity(BlockGetter world) {
return new PedestalBlockEntity();
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new PedestalBlockEntity(blockPos, blockState);
}
public boolean hasUniqueEntity() {
@ -370,11 +375,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation blockId) {
return getBlockModel(blockId, defaultBlockState());
}
@Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Map<String, String> textures = createTexturesMap();
PedestalState state = blockState.getValue(STATE);
@ -401,6 +408,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
}
@Override
@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(),
@ -423,6 +431,22 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
}
};
}
@Override
@Nullable
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> blockEntityType) {
if (level.isClientSide) return null;
BlockEntityTicker<T> ticker = createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick);
if (ticker!=null) return ticker;
return createTickerHelper(blockEntityType, EndBlockEntities.INFUSION_PEDESTAL, InfusionPedestalEntity::tick);
}
@Nullable
protected static <E extends BlockEntity, A extends BlockEntity> BlockEntityTicker<A> createTickerHelper(BlockEntityType<A> blockEntityType, BlockEntityType<E> blockEntityType2, BlockEntityTicker<? super E> blockEntityTicker) {
return blockEntityType2 == blockEntityType ? (BlockEntityTicker<A>) blockEntityTicker : null;
}
static {
VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14);

View file

@ -4,6 +4,8 @@ import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor;
@ -44,6 +46,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider
}
@Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
String blockName = resourceLocation.getPath();
Optional<String> pattern = blockState.getValue(IS_FLOOR) ?

View file

@ -16,6 +16,7 @@ import ru.bclib.blocks.BaseBarkBlock;
import ru.bclib.blocks.BaseBarrelBlock;
import ru.bclib.blocks.BaseBlock;
import ru.bclib.blocks.BaseBookshelfBlock;
import ru.bclib.blocks.BaseChestBlock;
import ru.bclib.blocks.BaseComposterBlock;
import ru.bclib.blocks.BaseCraftingTableBlock;
import ru.bclib.blocks.BaseDoorBlock;
@ -90,7 +91,7 @@ public class WoodenMaterial {
ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks));
sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks));
chest = EndBlocks.registerBlock(name + "_chest", new BaseFenceBlock(planks));
chest = EndBlocks.registerBlock(name + "_chest", new BaseChestBlock(planks));
barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks));
shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks));
composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks));

View file

@ -2,6 +2,7 @@ package ru.betterend.blocks.entities;
import java.util.List;
import net.minecraft.core.BlockPos;
import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleTypes;
@ -9,8 +10,8 @@ import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.TickableBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
@ -20,18 +21,16 @@ import ru.betterend.registry.EndBlockEntities;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndParticles;
public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity {
public class BlockEntityHydrothermalVent extends BlockEntity {
private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f);
public BlockEntityHydrothermalVent() {
super(EndBlockEntities.HYDROTHERMAL_VENT);
public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) {
super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState);
}
@Override
public void tick() {
public static void tick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) {
if (level != null) {
BlockState state = getBlockState();
if (state.is(EndBlocks.HYDROTHERMAL_VENT)) {
boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED);
if (active && level.random.nextInt(20) == 0) {
@ -56,7 +55,7 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable
double mult = active ? 3.0 : 5.0;
float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult);
entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() &&
hasElytra(entity) && entity.isFallFlying())
blockEntity.hasElytra(entity) && entity.isFallFlying())
.forEach(entity -> entity.moveRelative(force, POSITIVE_Y));
}
mutable.move(Direction.UP);

View file

@ -1,15 +1,11 @@
package ru.betterend.blocks.entities;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import net.fabricmc.fabric.api.registry.FuelRegistry;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
@ -37,7 +33,6 @@ import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity;
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
import net.minecraft.world.level.block.entity.TickableBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import ru.betterend.BetterEnd;
@ -46,7 +41,11 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler;
import ru.betterend.recipe.builders.AlloyingRecipe;
import ru.betterend.registry.EndBlockEntities;
public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity {
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible {
private static final int[] TOP_SLOTS = new int[] { 0, 1 };
private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 };
@ -62,8 +61,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
private int burnTime;
private int fuelTime;
public EndStoneSmelterBlockEntity() {
super(EndBlockEntities.END_STONE_SMELTER);
public EndStoneSmelterBlockEntity(BlockPos blockPos, BlockState blockState) {
super(EndBlockEntities.END_STONE_SMELTER, blockPos, blockState);
this.inventory = NonNullList.withSize(4, ItemStack.EMPTY);
this.recipesUsed = new Object2IntOpenHashMap<>();
this.propertyDelegate = new ContainerData() {
@ -225,61 +224,60 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate);
}
@Override
public void tick() {
if (level == null) return;
public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, EndStoneSmelterBlockEntity blockEntity) {
if (tickLevel == null) return;
boolean initialBurning = isBurning();
boolean initialBurning = blockEntity.isBurning();
if (initialBurning) {
burnTime--;
blockEntity.burnTime--;
}
boolean burning = initialBurning;
if (!level.isClientSide) {
ItemStack fuel = inventory.get(2);
if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) {
if (smeltTime > 0) {
smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal);
if (!tickLevel.isClientSide) {
ItemStack fuel = blockEntity.inventory.get(2);
if (!burning && (fuel.isEmpty() || blockEntity.inventory.get(0).isEmpty() && blockEntity.inventory.get(1).isEmpty())) {
if (blockEntity.smeltTime > 0) {
blockEntity.smeltTime = Mth.clamp(blockEntity.smeltTime - 2, 0, blockEntity.smeltTimeTotal);
}
} else {
Recipe<?> recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null);
Recipe<?> recipe = tickLevel.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, blockEntity, tickLevel).orElse(null);
if (recipe == null) {
recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null);
recipe = tickLevel.getRecipeManager().getRecipeFor(RecipeType.BLASTING, blockEntity, tickLevel).orElse(null);
}
boolean accepted = this.canAcceptRecipeOutput(recipe);
boolean accepted = blockEntity.canAcceptRecipeOutput(recipe);
if (!burning && accepted) {
burnTime = getFuelTime(fuel);
fuelTime = burnTime;
burning = isBurning();
blockEntity.burnTime = blockEntity.getFuelTime(fuel);
blockEntity.fuelTime = blockEntity.burnTime;
burning = blockEntity.isBurning();
if (burning) {
if (!fuel.isEmpty()) {
Item item = fuel.getItem();
fuel.shrink(1);
if (fuel.isEmpty()) {
Item remainFuel = item.getCraftingRemainingItem();
inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel));
blockEntity.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel));
}
}
setChanged();
blockEntity.setChanged();
}
}
if (burning && accepted) {
this.smeltTime++;
if (smeltTime == smeltTimeTotal) {
smeltTime = 0;
smeltTimeTotal = getSmeltTime();
craftRecipe(recipe);
setChanged();
blockEntity.smeltTime++;
if (blockEntity.smeltTime == blockEntity.smeltTimeTotal) {
blockEntity.smeltTime = 0;
blockEntity.smeltTimeTotal = blockEntity.getSmeltTime();
blockEntity.craftRecipe(recipe);
blockEntity.setChanged();
}
} else {
smeltTime = 0;
blockEntity.smeltTime = 0;
}
}
burning = blockEntity.isBurning();
if (initialBurning != burning) {
level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3);
setChanged();
tickLevel.setBlock(tickPos, tickState.setValue(EndStoneSmelter.LIT, burning), 3);
blockEntity.setChanged();
}
}
}
@ -395,8 +393,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
}
@Override
public void load(BlockState state, CompoundTag tag) {
super.load(state, tag);
public void load(CompoundTag tag) {
super.load(tag);
inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY);
ContainerHelper.loadAllItems(tag, inventory);
burnTime = tag.getShort("BurnTime");

View file

@ -3,14 +3,15 @@ package ru.betterend.blocks.entities;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import ru.betterend.registry.EndBlockEntities;
import ru.betterend.rituals.EternalRitual;
public class EternalPedestalEntity extends PedestalBlockEntity {
private EternalRitual linkedRitual;
public EternalPedestalEntity() {
super(EndBlockEntities.ETERNAL_PEDESTAL);
public EternalPedestalEntity(BlockPos blockPos, BlockState blockState) {
super(EndBlockEntities.ETERNAL_PEDESTAL, blockPos, blockState);
}
public boolean hasRitual() {
@ -26,8 +27,13 @@ public class EternalPedestalEntity extends PedestalBlockEntity {
}
@Override
public void setLevel(Level world) {
if (hasRitual()) {
linkedRitual.setWorld(world);
}
}
public void setLevelAndPosition(Level world, BlockPos pos) {
super.setLevelAndPosition(world, pos);
if (hasRitual()) {
linkedRitual.setWorld(world);
}

View file

@ -3,6 +3,7 @@ package ru.betterend.blocks.entities;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import ru.betterend.registry.EndBlockEntities;
import ru.betterend.rituals.InfusionRitual;
@ -10,13 +11,21 @@ public class InfusionPedestalEntity extends PedestalBlockEntity {
private InfusionRitual linkedRitual;
public InfusionPedestalEntity() {
super(EndBlockEntities.INFUSION_PEDESTAL);
public InfusionPedestalEntity(BlockPos blockPos, BlockState blockState) {
super(EndBlockEntities.INFUSION_PEDESTAL, blockPos, blockState);
}
@Override
public void setLevel(Level world){
super.setLevel(world);
if (hasRitual()) {
linkedRitual.setLocation(world, this.getBlockPos());
} else {
linkRitual(new InfusionRitual(this, world, this.getBlockPos()));
}
}
@Override
public void setLevelAndPosition(Level world, BlockPos pos) {
super.setLevelAndPosition(world, pos);
if (hasRitual()) {
linkedRitual.setLocation(world, pos);
} else {
@ -35,13 +44,12 @@ public class InfusionPedestalEntity extends PedestalBlockEntity {
public boolean hasRitual() {
return linkedRitual != null;
}
@Override
public void tick() {
if (hasRitual()) {
linkedRitual.tick();
public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, InfusionPedestalEntity blockEntity) {
if (blockEntity.hasRitual()) {
blockEntity.linkedRitual.tick();
}
super.tick();
PedestalBlockEntity.tick(tickLevel, tickPos, tickState, blockEntity);
}
@Override

View file

@ -1,30 +1,31 @@
package ru.betterend.blocks.entities;
import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.entity.TickableBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import ru.betterend.blocks.basis.PedestalBlock;
import ru.betterend.registry.EndBlockEntities;
import ru.betterend.registry.EndItems;
public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable {
public class PedestalBlockEntity extends BlockEntity implements Container, BlockEntityClientSerializable {
private ItemStack activeItem = ItemStack.EMPTY;
private final int maxAge = 314;
private int age;
public PedestalBlockEntity() {
super(EndBlockEntities.PEDESTAL);
public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) {
this(EndBlockEntities.PEDESTAL, blockPos, blockState);
}
public PedestalBlockEntity(BlockEntityType<?> type) {
super(type);
public PedestalBlockEntity(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
super(blockEntityType, blockPos, blockState);
}
public int getAge() {
@ -103,8 +104,8 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka
}
@Override
public void load(BlockState state, CompoundTag tag) {
super.load(state, tag);
public void load(CompoundTag tag) {
super.load(tag);
fromTag(tag);
}
@ -131,12 +132,11 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka
}
}
@Override
public void tick() {
if (!isEmpty()) {
age++;
if (age > maxAge) {
age = 0;
public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) {
if (!blockEntity.isEmpty()) {
blockEntity.age++;
if (blockEntity.age > blockEntity.maxAge) {
blockEntity.age = 0;
}
}
}

View file

@ -79,7 +79,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent
int slotX = this.fuelSlot.x + x;
int slotY = this.fuelSlot.y + y;
GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048);
this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY);
//TODO: test k=0
this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY,0);
RenderSystem.depthFunc(516);
GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583);
RenderSystem.depthFunc(515);

View file

@ -32,21 +32,22 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen<EndStoneSmelt
public void init() {
super.init();
//TODO: test in 1.17
narrow = width < 379;
recipeBook.init(width, height, minecraft, narrow, menu);
leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth);
addButton(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> {
recipeBook.initVisuals(narrow);
leftPos = recipeBook.updateScreenPosition(width, imageWidth);
addRenderableWidget(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> {
recipeBook.initVisuals();
recipeBook.toggleVisibility();
leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth);
leftPos = recipeBook.updateScreenPosition( width, imageWidth);
((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49);
}));
titleLabelX = (imageWidth - font.width(title)) / 2;
}
@Override
public void tick() {
super.tick();
public void containerTick() {
super.containerTick();
recipeBook.tick();
}
@ -109,8 +110,10 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen<EndStoneSmelt
@Override
protected void renderBg(PoseStack matrices, float delta, int mouseX, int mouseY) {
if (minecraft == null) return;
RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
minecraft.getTextureManager().bind(BACKGROUND_TEXTURE);
//TODO: verify
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE);
//minecraft.getTextureManager().bind(BACKGROUND_TEXTURE);
blit(matrices, leftPos, topPos, 0, 0, imageWidth, imageHeight);
int progress;
if (menu.isBurning()) {

View file

@ -107,6 +107,11 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu<Container> {
return RecipeBookType.BLAST_FURNACE;
}
@Override
public boolean shouldMoveToInventory(int i) {
return i != this.getResultSlotIndex();
}
@Override
public boolean stillValid(Player player) {
return inventory.stillValid(player);

View file

@ -28,10 +28,9 @@ public class SmelterOutputSlot extends Slot {
return super.remove(amount);
}
public ItemStack onTake(Player player, ItemStack stack) {
public void onTake(Player player, ItemStack stack) {
this.checkTakeAchievements(stack);
super.onTake(player, stack);
return stack;
}
protected void onQuickCraft(ItemStack stack, int amount) {

View file

@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
@ -18,12 +19,14 @@ import net.minecraft.world.entity.player.PlayerModelPart;
import net.minecraft.world.item.ItemStack;
import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.model.ArmoredElytraModel;
import ru.betterend.registry.EndEntitiesRenders;
public class ArmoredElytraLayer<T extends LivingEntity, M extends EntityModel<T>> extends ElytraLayer<T, M> {
private final ArmoredElytraModel<T> elytraModel = new ArmoredElytraModel<>();
private final ArmoredElytraModel<T> elytraModel;
public ArmoredElytraLayer(RenderLayerParent<T, M> renderLayerParent) {
super(renderLayerParent);
public ArmoredElytraLayer(RenderLayerParent<T, M> renderLayerParent, EntityModelSet entityModelSet) {
super(renderLayerParent, entityModelSet);
elytraModel = new ArmoredElytraModel<>(entityModelSet.bakeLayer(EndEntitiesRenders.ARMORED_ELYTRA));
}
public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) {

View file

@ -6,6 +6,11 @@ import com.mojang.math.Quaternion;
import com.mojang.math.Vector3f;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture;
@ -41,14 +46,30 @@ public class EndCrystalRenderer {
CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY);
matrices.popPose();
}
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("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);
}
static {
END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE);
RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE);
SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D);
FRAME = new ModelPart(64, 32, 0, 0);
FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F);
CORE = new ModelPart(64, 32, 32, 0);
CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F);
ModelPart root = getTexturedModelData().bakeRoot();
FRAME = root.getChild("FRAME");
CORE = root.getChild("CORE");
}
}

View file

@ -5,6 +5,11 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Vector3f;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture;
@ -56,15 +61,47 @@ public class EternalCrystalRenderer {
return ColorUtil.toFloatArray(ColorUtil.color(r, g, b));
}
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_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_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);
return LayerDefinition.create(modelData, 16, 16);
}
static {
RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true);
SHARDS = new ModelPart[4];
SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F);
SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F);
SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F);
SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F);
CORE = new ModelPart(16, 16, 0, 0);
CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F);
ModelPart root = getTexturedModelData().bakeRoot();
SHARDS[0] = root.getChild("SHARDS_0");
SHARDS[1] = root.getChild("SHARDS_1");
SHARDS[2] = root.getChild("SHARDS_2");
SHARDS[3] = root.getChild("SHARDS_3");
CORE = root.getChild("CORE");
}
}

View file

@ -10,6 +10,8 @@ import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.util.Mth;
import net.minecraft.world.item.BlockItem;
@ -24,10 +26,10 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndItems;
@Environment(EnvType.CLIENT)
public class PedestalItemRenderer<T extends PedestalBlockEntity> extends BlockEntityRenderer<T> {
public class PedestalItemRenderer<T extends PedestalBlockEntity> implements BlockEntityRenderer<T> {
public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) {
super(dispatcher);
public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) {
super();
}
@Override
@ -44,7 +46,8 @@ public class PedestalItemRenderer<T extends PedestalBlockEntity> extends BlockEn
matrices.pushPose();
Minecraft minecraft = Minecraft.getInstance();
BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null);
//TODO: check i=0
BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null, 0);
Vector3f translate = model.getTransforms().ground.translation;
PedestalBlock pedestal = (PedestalBlock) state.getBlock();
matrices.translate(translate.x(), translate.y(), translate.z());

View file

@ -91,7 +91,7 @@ public class CubozoaEntity extends AbstractSchoolingFish {
}
@Override
protected ItemStack getBucketItemStack() {
public ItemStack getBucketItemStack() {
ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance();
CompoundTag tag = bucket.getOrCreateTag();
tag.putByte("Variant", entityData.get(VARIANT));

View file

@ -6,11 +6,8 @@ import java.util.Random;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.entity.AgableMob;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.control.FlyingMoveControl;
@ -21,7 +18,8 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal;
import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation;
import net.minecraft.world.entity.ai.navigation.PathNavigation;
import net.minecraft.world.entity.ai.util.RandomPos;
import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos;
import net.minecraft.world.entity.ai.util.HoverRandomPos;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.entity.animal.FlyingAnimal;
import net.minecraft.world.entity.player.Player;
@ -98,18 +96,18 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
}
@Override
protected boolean makeFlySound() {
return true;
}
@Override
public boolean causeFallDamage(float fallDistance, float damageMultiplier) {
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
return false;
}
@Override
public boolean isMovementNoisy() {
return false;
protected Entity.MovementEmission getMovementEmission() {
return Entity.MovementEmission.EVENTS;
}
@Override
public boolean isFlying() {
return !this.onGround;
}
@Override
@ -168,11 +166,11 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
private Vec3 getRandomLocation() {
int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16);
Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F);
Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1);
Vec3 airPos = HoverRandomPos.getPos(DragonflyEntity.this, 8, 7, rotation.x, rotation.z, 1.5707964F, 3, 1);
if (airPos != null) {
if (isInVoid(airPos)) {
for (int i = 0; i < 8; i++) {
airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1);
airPos = HoverRandomPos.getPos(DragonflyEntity.this, 16, 7, rotation.x, rotation.z, MHelper.PI2, 3, 1);
if (airPos != null && !isInVoid(airPos)) {
return airPos;
}
@ -184,7 +182,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
}
return airPos;
}
return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D);
return AirAndWaterRandomPos.getPos(DragonflyEntity.this, 8, 4, -2, rotation.x, rotation.z, 1.5707963705062866D);
}
private boolean isInVoid(Vec3 pos) {
@ -194,7 +192,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
}
@Override
public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) {
public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) {
return EndEntities.DRAGONFLY.create(world);
}

View file

@ -88,7 +88,7 @@ public class EndFishEntity extends AbstractSchoolingFish {
}
@Override
protected ItemStack getBucketItemStack() {
public ItemStack getBucketItemStack() {
ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance();
CompoundTag tag = bucket.getOrCreateTag();
tag.putByte("variant", entityData.get(VARIANT));

View file

@ -116,7 +116,7 @@ public class EndSlimeEntity extends Slime {
}
@Override
public void remove() {
public void remove(RemovalReason reason) {
int i = this.getSize();
if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) {
Component text = this.getCustomName();
@ -144,7 +144,8 @@ public class EndSlimeEntity extends Slime {
this.level.addFreshEntity(slimeEntity);
}
}
this.removed = true;
((ISlime)this).entityRemove(reason);
}
@Override
@ -322,7 +323,7 @@ public class EndSlimeEntity extends Slime {
return false;
}
else {
return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
return livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
}
}
@ -339,7 +340,7 @@ public class EndSlimeEntity extends Slime {
else if (!livingEntity.isAlive()) {
return false;
}
else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) {
else if (livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable) {
return false;
}
else {
@ -349,7 +350,7 @@ public class EndSlimeEntity extends Slime {
public void tick() {
EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F);
((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage());
((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.getYRot(), EndSlimeEntity.this.isDealsDamage());
}
}
@ -360,7 +361,7 @@ public class EndSlimeEntity extends Slime {
public EndSlimeMoveControl(EndSlimeEntity slime) {
super(slime);
this.targetYaw = 180.0F * slime.yRot / 3.1415927F;
this.targetYaw = 180.0F * slime.getYRot() / 3.1415927F;
}
public void look(float targetYaw, boolean jumpOften) {
@ -374,9 +375,9 @@ public class EndSlimeEntity extends Slime {
}
public void tick() {
this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F);
this.mob.yHeadRot = this.mob.yRot;
this.mob.yBodyRot = this.mob.yRot;
this.mob.setYRot(this.rotlerp(this.mob.getYRot(), this.targetYaw, 90.0F));
this.mob.yHeadRot = this.mob.getYRot();
this.mob.yBodyRot = this.mob.getYRot();
if (this.operation != MoveControl.Operation.MOVE_TO) {
this.mob.setZza(0.0F);
}

View file

@ -96,7 +96,7 @@ public class ShadowWalkerEntity extends Monster {
}
@Override
protected float getVoicePitch() {
public float getVoicePitch() {
return MHelper.randRange(0.75F, 1.25F, random);
}

View file

@ -4,6 +4,9 @@ import java.util.EnumSet;
import java.util.List;
import java.util.Random;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos;
import net.minecraft.world.entity.ai.util.HoverRandomPos;
import org.jetbrains.annotations.Nullable;
import net.minecraft.core.BlockPos;
@ -16,11 +19,6 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.AgableMob;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.control.FlyingMoveControl;
@ -142,18 +140,18 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
}
@Override
protected boolean makeFlySound() {
return true;
}
@Override
public boolean causeFallDamage(float fallDistance, float damageMultiplier) {
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
return false;
}
@Override
public boolean isMovementNoisy() {
return false;
protected Entity.MovementEmission getMovementEmission() {
return Entity.MovementEmission.EVENTS;
}
@Override
public boolean isFlying() {
return !this.onGround;
}
@Override
@ -162,7 +160,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
}
@Override
public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) {
public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) {
return EndEntities.SILK_MOTH.create(world);
}
@ -239,8 +237,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
@Nullable
private Vec3 getRandomLocation() {
Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F);
Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1);
return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D);
Vec3 vec3d4 = HoverRandomPos.getPos(SilkMothEntity.this, 8, 7, vec3d3.x, vec3d3.z, 1.5707964F, 3, 1);
return vec3d4 != null ? vec3d4 : AirAndWaterRandomPos.getPos(SilkMothEntity.this, 8, 4, -2, vec3d3.x, vec3d3.z, 1.5707963705062866D);
}
}
@ -299,7 +297,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(EndBlockProperties.FULLNESS, fullness));
}
SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1);
SilkMothEntity.this.remove();
SilkMothEntity.this.discard();
}
else {
SilkMothEntity.this.hivePos = null;

View file

@ -2,46 +2,66 @@ package ru.betterend.entity.model;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.Mth;
import ru.betterend.entity.CubozoaEntity;
public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
private final ModelPart model;
private final ModelPart main_cube_r1;
private final ModelPart tentacle_center_1;
private final ModelPart tentacle_1;
private final ModelPart tentacle_center_2;
private final ModelPart tentacle_2;
private final ModelPart tentacle_center_3;
private final ModelPart tentacle_3;
private final ModelPart tentacle_center_4;
private final ModelPart tentacle_4;
private float scaleY;
private float scaleXZ;
private final static int TENTACLE_COUNT = 4;
public CubozoaEntityModel() {
super(RenderType::entityTranslucent);
texWidth = 48;
texHeight = 48;
model = new ModelPart(this);
private final ModelPart model;
private final ModelPart[] tentacle_center;
private final ModelPart[] tentacle;
private float scaleY;
private float scaleXZ;
public static LayerDefinition getTexturedModelData() {
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));
/*model = new ModelPart(this);
model.setPos(0.0F, 24.0F, 0.0F);
model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);
model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);*/
main_cube_r1 = new ModelPart(this);
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));
/*main_cube_r1 = new ModelPart(this);
main_cube_r1.setPos(0.0F, -14.0F, 0.0F);
model.addChild(main_cube_r1);
setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F);
main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);
main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);*/
float[] angles = {0, (float)Math.PI/-2, (float)Math.PI, (float)Math.PI/2};
tentacle_center_1 = new ModelPart(this);
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, -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));
}
/*tentacle_center_1 = new ModelPart(this);
tentacle_center_1.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_1);
tentacle_1 = new ModelPart(this);
tentacle_1.setPos(0.0F, -7.0F, 4.5F);
@ -52,7 +72,6 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
tentacle_center_2.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_2);
setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F);
tentacle_2 = new ModelPart(this);
tentacle_2.setPos(0.0F, -7.0F, 4.5F);
@ -63,7 +82,6 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
tentacle_center_3.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_3);
setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F);
tentacle_3 = new ModelPart(this);
tentacle_3.setPos(0.0F, -7.0F, 4.5F);
@ -74,31 +92,46 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
tentacle_center_4.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_4);
setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F);
tentacle_4 = new ModelPart(this);
tentacle_4.setPos(0.0F, -7.0F, 4.5F);
tentacle_center_4.addChild(tentacle_4);
tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);
}
@Override
public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {
float sin = Mth.sin(animationProgress * 0.13F);
scaleY = sin * 0.1F + 0.9F;
scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F;
tentacle_1.xRot = sin * 0.15F;
tentacle_2.xRot = sin * 0.15F;
tentacle_3.xRot = sin * 0.15F;
tentacle_4.xRot = sin * 0.15F;
}
tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);*/
@Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
matrices.pushPose();
matrices.scale(scaleXZ, scaleY, scaleXZ);
model.render(matrices, vertices, light, overlay);
matrices.popPose();
}
/* texWidth = 48;
texHeight = 48; */
return LayerDefinition.create(modelData, 48, 48);
}
public CubozoaEntityModel(ModelPart modelPart) {
super(RenderType::entityTranslucent);
tentacle = new ModelPart[TENTACLE_COUNT];
tentacle_center = new ModelPart[TENTACLE_COUNT];
model = modelPart.getChild(PartNames.BODY);
for (int i=1; i<=TENTACLE_COUNT; i++){
tentacle_center[i-1] = model.getChild("tentacle_center_"+i);
tentacle[i-1] = tentacle_center[i-1].getChild("tentacle_"+i);
}
}
@Override
public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {
float sin = Mth.sin(animationProgress * 0.13F);
scaleY = sin * 0.1F + 0.9F;
scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F;
for (int i=0; i<TENTACLE_COUNT; i++){
tentacle[i].xRot = sin * 0.15f;
}
}
@Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
matrices.pushPose();
matrices.scale(scaleXZ, scaleY, scaleXZ);
model.render(matrices, vertices, light, overlay);
matrices.popPose();
}
}

View file

@ -4,103 +4,179 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.RenderType;
import ru.betterend.entity.DragonflyEntity;
public class DragonflyEntityModel extends BlockBenchModel<DragonflyEntity> {
private final ModelPart model;
private final ModelPart head;
private final ModelPart tail;
private final ModelPart tail_2;
private final ModelPart wing_1;
private final ModelPart wing_2;
private final ModelPart wing_3;
private final ModelPart wing_4;
private final ModelPart legs_1;
private final ModelPart legs_2;
private final ModelPart model;
private final ModelPart head;
private final ModelPart tail;
private final ModelPart tail_2;
private final ModelPart wing_1;
private final ModelPart wing_2;
private final ModelPart wing_3;
private final ModelPart wing_4;
private final ModelPart legs_1;
private final ModelPart legs_2;
public DragonflyEntityModel() {
super(RenderType::entityCutout);
public static LayerDefinition getTexturedModelData() {
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
texWidth = 64;
texHeight = 64;
model = new ModelPart(this);
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));
/*model = new ModelPart(this);
model.setPos(2.0F, 21.5F, -4.0F);
model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);
model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);*/
head = new ModelPart(this);
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));
/*head = new ModelPart(this);
head.setPos(-2.0F, -2.0F, 0.0F);
model.addChild(head);
setRotationAngle(head, 0.3491F, 0.0F, 0.0F);
head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F);
head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.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));
/*
tail = new ModelPart(this);
tail.setPos(-2.0F, -2.0F, 9.0F);
model.addChild(tail);
tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.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));
/*
tail_2 = new ModelPart(this);
tail_2.setPos(0.0F, 0.0F, 7.0F);
tail.addChild(tail_2);
tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F);
*/
wing_1 = new ModelPart(this);
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));
/*wing_1 = new ModelPart(this);
wing_1.setPos(-2.0F, -4.0F, 4.0F);
model.addChild(wing_1);
wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);
wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/
wing_2 = new ModelPart(this);
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));
/*wing_2 = new ModelPart(this);
wing_2.setPos(-2.0F, -4.0F, 4.0F);
model.addChild(wing_2);
wing_2.mirror = true;
wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);
wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/
wing_3 = new ModelPart(this);
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));
/*wing_3 = new ModelPart(this);
wing_3.setPos(-2.0F, -4.0F, 8.0F);
model.addChild(wing_3);
wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);
wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/
wing_4 = new ModelPart(this);
wing_4.setPos(-2.0F, -4.0F, 8.0F);
model.addChild(wing_4);
wing_4.mirror = true;
wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.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));
/*wing_4 = new ModelPart(this);
wing_4.setPos(-2.0F, -4.0F, 8.0F);
model.addChild(wing_4);
wing_4.mirror = true;
wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/
legs_1 = new ModelPart(this);
legs_1.setPos(-1.0F, 0.0F, 1.0F);
model.addChild(legs_1);
setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F);
legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.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));
/*legs_1 = new ModelPart(this);
legs_1.setPos(-1.0F, 0.0F, 1.0F);
model.addChild(legs_1);
setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F);
legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/
legs_2 = new ModelPart(this);
legs_2.setPos(-3.0F, 0.0F, 1.0F);
model.addChild(legs_2);
setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F);
legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);
}
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));
/*legs_2 = new ModelPart(this);
legs_2.setPos(-3.0F, 0.0F, 1.0F);
model.addChild(legs_2);
setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F);
legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/
@Override
public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) {
float progress = animationProgress * 2F;
/*
texWidth = 64;
texHeight = 64;
*/
return LayerDefinition.create(modelData, 64, 64);
}
wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F;
wing_2.zRot = -wing_1.zRot;
public DragonflyEntityModel(ModelPart modelPart) {
super(RenderType::entityCutout);
wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F;
wing_4.zRot = -wing_3.zRot;
model = modelPart.getChild(PartNames.BODY);
head = model.getChild(PartNames.HEAD);
tail = model.getChild(PartNames.TAIL);
tail_2 = tail.getChild(PartNames.TAIL_FIN);
wing_1 = model.getChild(PartNames.LEFT_WING);
wing_2 = model.getChild(PartNames.RIGHT_WING);
wing_3 = model.getChild(PartNames.LEFT_WING_BASE);
wing_4 = model.getChild(PartNames.RIGHT_WING_BASE);
legs_1 = model.getChild(PartNames.LEFT_LEG);
legs_2 = model.getChild(PartNames.RIGHT_LEG);
}
progress = animationProgress * 0.05F;
@Override
public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) {
float progress = animationProgress * 2F;
head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F;
tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F;
tail_2.xRot = -tail.xRot * 1.5F;
}
wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F;
wing_2.zRot = -wing_1.zRot;
@Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
float green, float blue, float alpha) {
model.render(matrices, vertices, light, overlay);
}
wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F;
wing_4.zRot = -wing_3.zRot;
progress = animationProgress * 0.05F;
head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F;
tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F;
tail_2.xRot = -tail.xRot * 1.5F;
}
@Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
float green, float blue, float alpha) {
model.render(matrices, vertices, light, overlay);
}
}

View file

@ -4,6 +4,12 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.RenderType;
import ru.betterend.entity.EndFishEntity;
@ -15,47 +21,91 @@ public class EndFishEntityModel extends BlockBenchModel<EndFishEntity> {
private final ModelPart fin_right;
private final ModelPart fin_left;
public EndFishEntityModel() {
super(RenderType::entityCutout);
public static LayerDefinition getTexturedModelData() {
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
texWidth = 32;
texHeight = 32;
model = new ModelPart(this);
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));
/*model = new ModelPart(this);
model.setPos(0.0F, 20.0F, 0.0F);
model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);
model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);*/
fin_top = new ModelPart(this);
fin_top.setPos(0.0F, -2.0F, -4.0F);
modelPartData.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));
/*fin_top.setPos(0.0F, -2.0F, -4.0F);
model.addChild(fin_top);
setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F);
fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);
fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*
*/
fin_bottom = new ModelPart(this);
modelPartData.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));
/*fin_bottom = new ModelPart(this);
fin_bottom.setPos(0.0F, 2.0F, -4.0F);
model.addChild(fin_bottom);
setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F);
fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);
fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*/
flipper = new ModelPart(this);
modelPartData.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));
/*flipper = new ModelPart(this);
flipper.setPos(0.0F, 0.0F, 2.0F);
model.addChild(flipper);
setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F);
flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);
flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);*/
fin_right = new ModelPart(this);
modelPartData.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));
/*fin_right = new ModelPart(this);
fin_right.setPos(-1.0F, 0.0F, -1.0F);
model.addChild(fin_right);
setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F);
fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);
fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);*/
fin_left = new ModelPart(this);
modelPartData.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));
/*fin_left = new ModelPart(this);
fin_left.setPos(1.0F, 0.0F, -1.0F);
model.addChild(fin_left);
setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F);
fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);
fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);*/
/*
texWidth = 32;
texHeight = 32;
*/
return LayerDefinition.create(modelData, 32, 32);
}
public EndFishEntityModel(ModelPart modelPart) {
super(RenderType::entityCutout);
model = modelPart.getChild(PartNames.BODY);
fin_top = modelPart.getChild(PartNames.TOP_FIN);
fin_bottom = modelPart.getChild(PartNames.BOTTOM_FIN);
flipper = modelPart.getChild(PartNames.TAIL_FIN);
fin_right = modelPart.getChild(PartNames.RIGHT_FIN);
fin_left = modelPart.getChild(PartNames.LEFT_FIN);}
@Override
public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) {

View file

@ -5,38 +5,94 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.ListModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.RenderType;
import ru.bclib.util.MHelper;
import ru.betterend.entity.EndSlimeEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T> {
private final ModelPart flower;
private final ModelPart crop;
private final ModelPart innerCube;
private final ModelPart rightEye;
private final ModelPart leftEye;
private final ModelPart mouth;
private final ModelPart flower;
private final ModelPart crop;
public EndSlimeEntityModel(boolean onlyShell) {
super(RenderType::entityCutout);
public static LayerDefinition getShellOnlyTexturedModelData() {
return getTexturedModelData(true);
}
public static LayerDefinition getCompleteTexturedModelData() {
return getTexturedModelData(false);
}
this.innerCube = new ModelPart(this, 0, 16);
this.rightEye = new ModelPart(this, 32, 0);
this.leftEye = new ModelPart(this, 32, 4);
this.mouth = new ModelPart(this, 32, 8);
this.flower = new ModelPart(this);
this.crop = new ModelPart(this);
private static LayerDefinition getTexturedModelData(boolean onlyShell) {
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
//this.innerCube = new ModelPart(this, 0, 16);
if (onlyShell) {
this.innerCube.texOffs(0, 0);
this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
.texOffs(0, 0)
.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F),
PartPose.ZERO);
/* this.innerCube.texOffs(0, 0);
this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);*/
} else {
this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F);
this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F);
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
.texOffs(0, 16)
.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F),
PartPose.ZERO);
//this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F);
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);
//this.rightEye = new ModelPart(this, 32, 0);
//this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
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);
//this.leftEye = new ModelPart(this, 32, 4);
//this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create()
.texOffs(32, 8)
.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F),
PartPose.ZERO);
//this.mouth = new ModelPart(this, 32, 8);
//this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F);
PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO);
PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO);
for (int i = 0; i < 6; i++) {
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));
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));
}
/* this.flower = new ModelPart(this);
for (int i = 0; i < 4; i++) {
ModelPart petalRot = new ModelPart(this);
petalRot.yRot = MHelper.degreesToRadians(i * 45F);
@ -48,6 +104,7 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
this.flower.addChild(petalRot);
petalRot.addChild(petal);
}
this.crop = new ModelPart(this);
for (int i = 0; i < 2; i++) {
ModelPart petalRot = new ModelPart(this);
@ -60,6 +117,30 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
this.crop.addChild(petalRot);
petalRot.addChild(petal);
}
*/
}
return LayerDefinition.create(modelData, 64, 32);
}
public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell){
super(RenderType::entityCutout);
ModelPart modelPart = modelSet.bakeLayer(onlyShell ? EndEntitiesRenders.END_SLIME_SHELL_MODEL : EndEntitiesRenders.END_SLIME_MODEL);
innerCube = modelPart.getChild(PartNames.BODY);
if (!onlyShell) {
rightEye = modelPart.getChild(PartNames.RIGHT_EYE);
leftEye = modelPart.getChild(PartNames.LEFT_EYE);
mouth = modelPart.getChild(PartNames.MOUTH);
flower = modelPart.getChild("flower");
crop = modelPart.getChild("crop");
} else {
rightEye = null;
leftEye = null;
mouth = null;
flower = null;
crop = null;
}
}
@ -76,8 +157,16 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
crop.render(matrices, vertices, light, overlay);
}
private boolean isOnlyShell(){
return rightEye==null;
}
@Override
public Iterable<ModelPart> parts() {
return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth);
if (isOnlyShell()) {
return ImmutableList.of(this.innerCube);
} else {
return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth);
}
}
}

View file

@ -4,34 +4,150 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.Mth;
import ru.betterend.entity.SilkMothEntity;
public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> {
private final ModelPart legsL;
private final ModelPart cube_r1;
private final ModelPart cube_r2;
private final ModelPart cube_r3;
private final ModelPart legsR;
private final ModelPart cube_r4;
private final ModelPart cube_r5;
private final ModelPart cube_r6;
private final ModelPart head_pivot;
private final ModelPart tendril_r_r1;
private final ModelPart tendril_r_r2;
private final ModelPart bb_main;
private final ModelPart wingR_r1;
private final ModelPart wingL_r1;
private final ModelPart abdomen_r1;
private final ModelPart legsL;
private final ModelPart cube_r1;
private final ModelPart cube_r2;
private final ModelPart cube_r3;
private final ModelPart legsR;
private final ModelPart cube_r4;
private final ModelPart cube_r5;
private final ModelPart cube_r6;
private final ModelPart head_pivot;
private final ModelPart tendril_r_r1;
private final ModelPart tendril_r_r2;
private final ModelPart bb_main;
private final ModelPart wingR_r1;
private final ModelPart wingL_r1;
private final ModelPart abdomen_r1;
public SilkMothEntityModel() {
super(RenderType::entityCutout);
public static LayerDefinition getTexturedModelData() {
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
texWidth = 64;
texHeight = 64;
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 = new ModelPart(this);
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_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));
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_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));
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));
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.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));
/*texWidth = 64;
texHeight = 64;*/
return LayerDefinition.create(modelData, 64, 64);
}
public SilkMothEntityModel(ModelPart modelPart) {
super(RenderType::entityCutout);
legsL = modelPart.getChild(PartNames.LEFT_LEG);
cube_r1 = legsL.getChild("cube_r1");
cube_r2 = legsL.getChild("cube_r2");
cube_r3 = legsL.getChild("cube_r3");
legsR = modelPart.getChild(PartNames.RIGHT_LEG);
cube_r4 = legsR.getChild("cube_r4");
cube_r5 = legsR.getChild("cube_r5");
cube_r6 = legsR.getChild("cube_r6");
head_pivot = modelPart.getChild(PartNames.HEAD);
tendril_r_r1 = head_pivot.getChild("tendril_r_r1");
tendril_r_r2 = head_pivot.getChild("tendril_r_r2");
bb_main = modelPart.getChild(PartNames.BODY);
wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING);
wingL_r1 = bb_main.getChild(PartNames.LEFT_WING);
abdomen_r1 = bb_main.getChild("abdomen_r1");
/*legsL = new ModelPart(this);
legsL.setPos(1.5F, 19.9F, -0.45F);
setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F);
@ -111,28 +227,28 @@ public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> {
abdomen_r1.setPos(1.0F, -3.9F, 0.0F);
bb_main.addChild(abdomen_r1);
setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F);
abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);
}
abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);*/
}
@Override
public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) {
wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F;
wingL_r1.zRot = -wingR_r1.zRot;
head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F;
tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F;
tendril_r_r2.zRot = -tendril_r_r1.zRot;
abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F;
legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F;
legsL.zRot = -legsR.zRot;
}
@Override
public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) {
wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F;
wingL_r1.zRot = -wingR_r1.zRot;
head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F;
tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F;
tendril_r_r2.zRot = -tendril_r_r1.zRot;
abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F;
legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F;
legsL.zRot = -legsR.zRot;
}
@Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
float green, float blue, float alpha) {
bb_main.render(matrices, vertices, light, overlay);
head_pivot.render(matrices, vertices, light, overlay);
legsL.render(matrices, vertices, light, overlay);
legsR.render(matrices, vertices, light, overlay);
}
@Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
float green, float blue, float alpha) {
bb_main.render(matrices, vertices, light, overlay);
head_pivot.render(matrices, vertices, light, overlay);
legsL.render(matrices, vertices, light, overlay);
legsR.render(matrices, vertices, light, overlay);
}
}

View file

@ -5,7 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.texture.OverlayTexture;
@ -13,13 +13,14 @@ import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd;
import ru.betterend.entity.CubozoaEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityCubozoa extends MobRenderer<CubozoaEntity, CubozoaEntityModel> {
private static final ResourceLocation[] TEXTURE = new ResourceLocation[2];
private static final RenderType[] GLOW = new RenderType[2];
public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f);
public RendererEntityCubozoa(EntityRendererProvider.Context ctx) {
super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.CUBOZOA_MODEL)), 0.5f);
this.addLayer(new EyesLayer<CubozoaEntity, CubozoaEntityModel>(this) {
@Override
public RenderType renderType() {

View file

@ -2,19 +2,22 @@ package ru.betterend.entity.render;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd;
import ru.betterend.entity.DragonflyEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.entity.model.DragonflyEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityDragonfly extends MobRenderer<DragonflyEntity, DragonflyEntityModel> {
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png");
private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png"));
public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f);
public RendererEntityDragonfly(EntityRendererProvider.Context ctx) {
super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f);
this.addLayer(new EyesLayer<DragonflyEntity, DragonflyEntityModel>(this) {
@Override
public RenderType renderType() {

View file

@ -6,20 +6,23 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd;
import ru.betterend.entity.EndFishEntity;
import ru.betterend.entity.model.DragonflyEntityModel;
import ru.betterend.entity.model.EndFishEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityEndFish extends MobRenderer<EndFishEntity, EndFishEntityModel> {
private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS];
private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS];
public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f);
public RendererEntityEndFish(EntityRendererProvider.Context ctx) {
super(ctx, new EndFishEntityModel(ctx.bakeLayer(EndEntitiesRenders.END_FISH_MODEL)), 0.5f);
this.addLayer(new EyesLayer<EndFishEntity, EndFishEntityModel>(this) {
@Override
public RenderType renderType() {

View file

@ -5,10 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.entity.*;
import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.client.renderer.texture.OverlayTexture;
@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import ru.betterend.BetterEnd;
import ru.betterend.entity.EndSlimeEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.entity.model.EndSlimeEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> {
private static final ResourceLocation TEXTURE[] = new ResourceLocation[4];
private static final RenderType GLOW[] = new RenderType[4];
public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher, new EndSlimeEntityModel<EndSlimeEntity>(false), 0.25F);
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this));
public RendererEntityEndSlime(EntityRendererProvider.Context ctx) {
super(ctx, new EndSlimeEntityModel<>(ctx.getModelSet(), false), 0.25f);
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this, ctx));
this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) {
@Override
public RenderType renderType() {
@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
private final class OverlayFeatureRenderer<T extends EndSlimeEntity>
extends RenderLayer<T, EndSlimeEntityModel<T>> {
private final EndSlimeEntityModel<T> modelOrdinal = new EndSlimeEntityModel<T>(true);
private final EndSlimeEntityModel<T> modelLake = new EndSlimeEntityModel<T>(true);
private final EndSlimeEntityModel<T> modelOrdinal;
private final EndSlimeEntityModel<T> modelLake;
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext) {
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext, EntityRendererProvider.Context ctx) {
super(featureRendererContext);
modelOrdinal = new EndSlimeEntityModel<>(ctx.getModelSet(), true);
modelLake = new EndSlimeEntityModel<>(ctx.getModelSet(), true);
}
public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity,

View file

@ -1,7 +1,9 @@
package ru.betterend.entity.render;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd;
@ -11,8 +13,9 @@ public class RendererEntityShadowWalker
extends HumanoidMobRenderer<ShadowWalkerEntity, PlayerModel<ShadowWalkerEntity>> {
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png");
public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher, new PlayerModel<ShadowWalkerEntity>(0.0F, false), 0.5F);
public RendererEntityShadowWalker(EntityRendererProvider.Context ctx) {
super(ctx, new PlayerModel<ShadowWalkerEntity>(ctx.bakeLayer(ModelLayers.PLAYER), false), 0.5F);
//super(entityRenderDispatcher, new PlayerModel<ShadowWalkerEntity>(0.0F, false), 0.5F);
}
@Override

View file

@ -1,17 +1,20 @@
package ru.betterend.entity.render;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd;
import ru.betterend.entity.SilkMothEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.entity.model.SilkMothEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class SilkMothEntityRenderer extends MobRenderer<SilkMothEntity, SilkMothEntityModel> {
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png");
public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f);
public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) {
super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f);
}
@Override

View file

@ -5,7 +5,7 @@ import java.util.stream.Collectors;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.ai.behavior.WeightedList;
import net.minecraft.world.entity.ai.behavior.ShufflingList;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import ru.bclib.api.BiomeAPI;
@ -62,7 +62,7 @@ public class BYGIntegration extends ModIntegration implements EndBiomeIntegratio
EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID);
EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome);
}
WeightedList<ResourceLocation> subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills");
ShufflingList<ResourceLocation> subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills");
if (subBiomes != null) {
subBiomes.stream().collect(Collectors.toList()).forEach((id) -> {
BCLBiome subBiome = BiomeAPI.getBiome(id);

View file

@ -54,7 +54,7 @@ public class NightshadeRedwoods extends EndBiome {
});
for (MobCategory group: MobCategory.values()) {
List<SpawnerData> list = biome.getMobSettings().getMobs(group);
List<SpawnerData> list = biome.getMobSettings().getMobs(group).unwrap();
list.forEach((entry) -> {
def.addMobSpawn(entry);
});

View file

@ -16,6 +16,8 @@ import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator;
import ru.bclib.BCLib;
import ru.bclib.world.biomes.BCLBiomeDef;
import ru.betterend.BetterEnd;
@ -24,6 +26,14 @@ import ru.betterend.integration.byg.features.BYGFeatures;
import ru.betterend.registry.EndFeatures;
import ru.betterend.world.biome.EndBiome;
class FeaturesAccesor extends Features{
static ConfiguredDecorator<?> shadowHEIGHTMAP_SQUARE;
static {
shadowHEIGHTMAP_SQUARE = Decorators.HEIGHTMAP_SQUARE;
}
}
public class OldBulbisGardens extends EndBiome {
public OldBulbisGardens() {
super(makeDef());
@ -54,7 +64,7 @@ public class OldBulbisGardens extends EndBiome {
}
for (MobCategory group: MobCategory.values()) {
List<SpawnerData> list = biome.getMobSettings().getMobs(group);
List<SpawnerData> list = biome.getMobSettings().getMobs(group).unwrap();
list.forEach((entry) -> {
def.addMobSpawn(entry);
});
@ -70,7 +80,7 @@ public class OldBulbisGardens extends EndBiome {
getter = vegetal.get(i);
ConfiguredFeature<?, ?> feature = getter.get();
ResourceLocation id = BetterEnd.makeID("obg_feature_" + i);
feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1));
feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1));
def.addFeature(Decoration.VEGETAL_DECORATION, feature);
}
// Grasses and other features

View file

@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.material.Material;
import ru.bclib.api.TagAPI;
@ -21,8 +22,11 @@ import ru.betterend.integration.Integrations;
public class BigEtherTreeFeature extends DefaultFeature {
@Override
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) {
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND))
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
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;
BlockState log = Integrations.BYG.getDefaultState("ether_log");

View file

@ -15,6 +15,7 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.material.Material;
import ru.bclib.api.TagAPI;
@ -35,9 +36,11 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
private static final List<Vector3f> BRANCH;
@Override
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos,
NoneFeatureConfiguration config) {
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND))
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
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;
BlockState log = Integrations.BYG.getDefaultState("nightshade_log");

View file

@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.AABB;
@ -36,11 +37,13 @@ public class OldBulbisTreeFeature extends DefaultFeature {
private static final List<Vector3f> SIDE;
@Override
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos,
NoneFeatureConfiguration config) {
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND))
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
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)).getBlock().is(TagAPI.GEN_TERRAIN))
if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN))
return false;
BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem");

View file

@ -1,44 +1,46 @@
package ru.betterend.integration.rei;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.item.Items;
import org.jetbrains.annotations.NotNull;
import ru.betterend.registry.EndBlocks;
import java.text.DecimalFormat;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeCategory;
import me.shedaniel.rei.api.widgets.Widgets;
import me.shedaniel.rei.gui.entries.RecipeEntry;
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
import me.shedaniel.rei.gui.widget.Widget;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import ru.betterend.recipe.builders.AlloyingRecipe;
import ru.betterend.registry.EndBlocks;
import ru.betterend.util.LangUtil;
public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDisplay> {
@Override
public @NotNull ResourceLocation getIdentifier() {
return AlloyingRecipe.ID;
public class REIAlloyingCategory implements TransferDisplayCategory<REIAlloyingDisplay> {
private final EntryStack ICON;
REIAlloyingCategory(EntryStack icon){
ICON = icon;
}
@Override
public @NotNull String getCategoryName() {
return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId());
public @NotNull CategoryIdentifier getCategoryIdentifier() {
return REIPlugin.ALLOYING;
}
@Override
public @NotNull Component getTitle() {
return new TranslatableComponent(EndBlocks.END_STONE_SMELTER.getDescriptionId());
}
@Override
public @NotNull EntryStack getLogo() {
return REIPlugin.END_STONE_SMELTER;
public @NotNull EntryStack getIcon() {
return ICON;
}
@Override
@ -53,14 +55,14 @@ public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDi
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<List<EntryStack>> inputEntries = display.getInputEntries();
List<EntryIngredient> inputEntries = display.getInputEntries();
widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput());
if (inputEntries.size() > 1) {
widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput());
} else {
widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput());
}
widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput());
widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
return widgets;
}
@ -77,11 +79,6 @@ public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDi
matrices.popPose();
}
@Override
public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) {
return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries());
}
@Override
public int getDisplayHeight() {
return 49;

View file

@ -1,79 +1,68 @@
package ru.betterend.integration.rei;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.crafting.BlastingRecipe;
import net.minecraft.world.item.crafting.Recipe;
import org.jetbrains.annotations.NotNull;
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
import ru.betterend.recipe.builders.AlloyingRecipe;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeDisplay;
import me.shedaniel.rei.server.ContainerInfo;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.crafting.BlastingRecipe;
import net.minecraft.world.item.crafting.Recipe;
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
import ru.betterend.recipe.builders.AlloyingRecipe;
public class REIAlloyingDisplay implements TransferRecipeDisplay {
public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
private static List<EntryStack> fuel;
private Recipe<?> recipe;
private List<List<EntryStack>> input;
private List<EntryStack> output;
private float xp;
private double smeltTime;
public REIAlloyingDisplay(AlloyingRecipe recipe) {
this.recipe = recipe;
this.input = EntryStack.ofIngredients(recipe.getIngredients());
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
this.xp = recipe.getExperience();
this.smeltTime = recipe.getSmeltTime();
this(recipe, recipe.getExperience(), recipe.getSmeltTime());
}
public REIAlloyingDisplay(BlastingRecipe recipe) {
protected REIAlloyingDisplay(Recipe<?> recipe, float xp, double smeltTime) {
super(
EntryIngredients.ofIngredients(recipe.getIngredients()),
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
);
this.recipe = recipe;
this.input = EntryStack.ofIngredients(recipe.getIngredients());
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
this.xp = recipe.getExperience();
this.smeltTime = recipe.getCookingTime();
this.xp = xp;
this.smeltTime = smeltTime;
}
public static List<EntryStack> getFuel() {
return fuel;
}
@Override
public @NotNull Optional<ResourceLocation> getRecipeLocation() {
public @NotNull Optional<ResourceLocation> getDisplayLocation() {
return Optional.ofNullable(recipe).map(Recipe::getId);
}
@Override
public @NotNull List<List<EntryStack>> getInputEntries() {
return this.input;
}
@Override
public @NotNull List<List<EntryStack>> getResultingEntries() {
return Collections.singletonList(output);
}
@Override
public @NotNull ResourceLocation getRecipeCategory() {
return AlloyingRecipe.ID;
public CategoryIdentifier<?> getCategoryIdentifier() {
return REIPlugin.ALLOYING;
}
@Override
public @NotNull List<List<EntryStack>> getRequiredEntries() {
return this.input;
}
// @Override
// public @NotNull List<List<EntryStack>> getRequiredEntries() {
// return this.input;
// }
public float getXp() {
return this.xp;
@ -97,14 +86,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay {
return 1;
}
@Override
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
return this.input;
}
// @Override
// public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
// return this.input;
// }
static {
fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream()
.map(Item::getDefaultInstance).map(EntryStack::create)
.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());
}

View file

@ -1,40 +1,39 @@
package ru.betterend.integration.rei;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.DisplayRenderer;
import me.shedaniel.rei.api.client.gui.widgets.Slot;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.item.Items;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.DecimalFormat;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.RecipeCategory;
import me.shedaniel.rei.api.widgets.Slot;
import me.shedaniel.rei.api.widgets.Tooltip;
import me.shedaniel.rei.api.widgets.Widgets;
import me.shedaniel.rei.gui.entries.RecipeEntry;
import me.shedaniel.rei.gui.widget.Widget;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Items;
public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDisplay> {
public class REIAlloyingFuelCategory implements DisplayCategory<REIAlloyingFuelDisplay> {
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##");
@Override
public @NotNull ResourceLocation getIdentifier() {
public @NotNull CategoryIdentifier getCategoryIdentifier() {
return REIPlugin.ALLOYING_FUEL;
}
@Override
public @NotNull String getCategoryName() {
return I18n.get("category.rei.fuel");
public @NotNull Component getTitle() {
return new TranslatableComponent("category.rei.fuel");
}
@Override
@ -43,12 +42,12 @@ public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDi
}
@Override
public @NotNull EntryStack getLogo() {
return EntryStack.create(Items.COAL);
public @NotNull EntryStack getIcon() {
return EntryStacks.of(Items.COAL);
}
@Override
public @NotNull List<Widget> setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) {
public List<Widget> setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) {
Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17);
String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime());
List<Widget> widgets = Lists.newArrayList();
@ -61,10 +60,10 @@ public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDi
}
@Override
public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) {
public DisplayRenderer getDisplayRenderer(REIAlloyingFuelDisplay recipe) {
Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight();
String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d);
return new RecipeEntry() {
return new DisplayRenderer() {
private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems);
@Override

View file

@ -1,35 +1,31 @@
package ru.betterend.integration.rei;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import net.minecraft.nbt.CompoundTag;
import java.util.Collections;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.RecipeDisplay;
import net.minecraft.resources.ResourceLocation;
public class REIAlloyingFuelDisplay implements RecipeDisplay {
private final EntryStack fuel;
public class REIAlloyingFuelDisplay extends BasicDisplay {
private final int fuelTime;
public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) {
this.fuel = fuel;
public REIAlloyingFuelDisplay(List<EntryIngredient> fuel, CompoundTag tag) {
this(fuel, tag.getInt("fuelTime"));
}
public REIAlloyingFuelDisplay(List<EntryIngredient> fuel, int fuelTime) {
super(fuel, Collections.emptyList());
this.fuelTime = fuelTime;
}
/*public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) {
this.fuel = fuel;
this.fuelTime = fuelTime;
}*/
@Override
public @NotNull List<List<EntryStack>> getInputEntries() {
return Collections.singletonList(Collections.singletonList(fuel));
}
@Override
public @NotNull List<List<EntryStack>> getResultingEntries() {
return Collections.emptyList();
}
@Override
public @NotNull ResourceLocation getRecipeCategory() {
public CategoryIdentifier<?> getCategoryIdentifier() {
return REIPlugin.ALLOYING_FUEL;
}

View file

@ -1,49 +1,54 @@
package ru.betterend.integration.rei;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeCategory;
import me.shedaniel.rei.api.widgets.Widgets;
import me.shedaniel.rei.gui.entries.RecipeEntry;
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
import me.shedaniel.rei.gui.widget.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import org.jetbrains.annotations.NotNull;
import ru.betterend.blocks.basis.EndAnvilBlock;
import ru.betterend.util.LangUtil;
public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay> {
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class REIAnvilCategory implements TransferDisplayCategory<REIAnvilDisplay> {
private final EntryStack[] ANVILS;
REIAnvilCategory(EntryStack[] anvils){
ANVILS = anvils;
}
@Override
public @NotNull ResourceLocation getIdentifier() {
public @NotNull CategoryIdentifier getCategoryIdentifier() {
return REIPlugin.SMITHING;
}
@Override
public @NotNull String getCategoryName() {
return LangUtil.translate(Blocks.ANVIL.getDescriptionId());
public @NotNull Component getTitle() {
return new TranslatableComponent(Blocks.ANVIL.getDescriptionId());
}
@Override
public @NotNull EntryStack getLogo() {
return REIPlugin.ANVILS[0];
public @NotNull EntryStack getIcon() {
return ANVILS[0];
}
@Override
public @NotNull List<Widget> setupDisplay(REIAnvilDisplay display, Rectangle bounds) {
@ -53,23 +58,27 @@ public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay>
int x = startPoint.x + 10;
int y = startPoint.y;
widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5)));
List<List<EntryStack>> inputEntries = display.getInputEntries();
List<EntryStack> materials = inputEntries.get(1);
List<EntryIngredient> inputEntries = display.getInputEntries();
EntryIngredient materials = inputEntries.get(1);
int anvilLevel = display.getAnvilLevel();
List<EntryStack> anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> {
Block block = ((BlockItem) anvil.getItem()).getBlock();
List anvils = Arrays.stream(ANVILS).filter(anvil -> {
Object value = anvil.getValue();
if (value instanceof ItemStack){
value = ((ItemStack) value).getItem();
}
Block block = ((BlockItem) value).getBlock();
if (block instanceof EndAnvilBlock) {
return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel;
}
return anvilLevel == 1;
}).collect(Collectors.toList());
materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount()));
//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.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.getResultingEntries().get(0)).disableBackground().markOutput());
widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils));
return widgets;
@ -88,11 +97,6 @@ public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay>
matrices.popPose();
}
@Override
public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) {
return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries());
}
@Override
public int getDisplayHeight() {
return 60;

View file

@ -1,29 +1,27 @@
package ru.betterend.integration.rei;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.jetbrains.annotations.NotNull;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeDisplay;
import me.shedaniel.rei.server.ContainerInfo;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.crafting.Recipe;
import org.jetbrains.annotations.NotNull;
import ru.betterend.recipe.builders.AnvilRecipe;
public class REIAnvilDisplay implements TransferRecipeDisplay {
import java.util.Collections;
import java.util.Optional;
public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
private final AnvilRecipe recipe;
private final List<List<EntryStack>> input;
private final List<EntryStack> output;
public REIAnvilDisplay(AnvilRecipe recipe) {
super(
EntryIngredients.ofIngredients(recipe.getIngredients()),
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
);
this.recipe = recipe;
this.input = EntryStack.ofIngredients(recipe.getIngredients());
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
}
public int getDamage() {
@ -37,31 +35,21 @@ public class REIAnvilDisplay implements TransferRecipeDisplay {
public int getAnvilLevel() {
return recipe.getAnvilLevel();
}
@Override
public @NotNull Optional<ResourceLocation> getRecipeLocation() {
public @NotNull Optional<ResourceLocation> getDisplayLocation() {
return Optional.ofNullable(recipe).map(Recipe::getId);
}
@Override
public @NotNull List<List<EntryStack>> getInputEntries() {
return this.input;
}
@Override
public @NotNull List<List<EntryStack>> getResultingEntries() {
return Collections.singletonList(output);
}
@Override
public @NotNull ResourceLocation getRecipeCategory() {
public CategoryIdentifier<?> getCategoryIdentifier() {
return REIPlugin.SMITHING;
}
@Override
public @NotNull List<List<EntryStack>> getRequiredEntries() {
return input;
}
// @Override
// public @NotNull List<List<EntryStack>> getRequiredEntries() {
// return input;
// }
@Override
public int getWidth() {
@ -73,9 +61,9 @@ public class REIAnvilDisplay implements TransferRecipeDisplay {
return 1;
}
@Override
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo,
AbstractContainerMenu container) {
return input;
}
// @Override
// public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo,
// AbstractContainerMenu container) {
// return input;
// }
}

View file

@ -0,0 +1,10 @@
package ru.betterend.integration.rei;
import net.minecraft.world.item.crafting.BlastingRecipe;
import ru.betterend.recipe.builders.AlloyingRecipe;
public class REIBlastingDisplay extends REIAlloyingDisplay{
public REIBlastingDisplay(BlastingRecipe recipe) {
super(recipe, recipe.getExperience(), recipe.getCookingTime());
}
}

View file

@ -1,7 +1,5 @@
package ru.betterend.integration.rei;
import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper;
import me.shedaniel.rei.server.ContainerInfoHandler;
import ru.betterend.client.gui.EndStoneSmelterScreenHandler;
import ru.betterend.recipe.builders.AlloyingRecipe;
@ -9,6 +7,6 @@ public class REIContainer implements Runnable {
@Override
public void run() {
ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class));
//ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class));
}
}

View file

@ -1,59 +1,59 @@
package ru.betterend.integration.rei;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeCategory;
import me.shedaniel.rei.api.widgets.Widgets;
import me.shedaniel.rei.gui.entries.RecipeEntry;
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
import me.shedaniel.rei.gui.widget.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Items;
import org.jetbrains.annotations.NotNull;
import ru.betterend.BetterEnd;
import ru.betterend.recipe.builders.InfusionRecipe;
import ru.betterend.registry.EndBlocks;
import ru.betterend.util.LangUtil;
public class REIInfusionCategory implements TransferRecipeCategory<REIInfusionDisplay> {
import java.util.List;
public class REIInfusionCategory implements TransferDisplayCategory<REIInfusionDisplay> {
private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png");
private final EntryStack ICON;
@Override
public @NotNull ResourceLocation getIdentifier() {
return InfusionRecipe.ID;
REIInfusionCategory(EntryStack icon){
ICON = icon;
}
@Override
public @NotNull String getCategoryName() {
return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId());
public @NotNull CategoryIdentifier getCategoryIdentifier() {
return REIPlugin.INFUSION;
}
@Override
public @NotNull Component getTitle() {
return new TranslatableComponent(EndBlocks.INFUSION_PEDESTAL.getDescriptionId());
}
@Override
public @NotNull EntryStack getLogo() {
return REIPlugin.INFUSION_RITUAL;
}
@Override
public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) {
return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries());
public @NotNull EntryStack getIcon() {
return ICON;
}
@Override
public @NotNull List<Widget> setupDisplay(REIInfusionDisplay display, Rectangle bounds) {
Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2);
List<Widget> widgets = Lists.newArrayList();
widgets.add(Widgets.createRecipeBase(bounds));
List<List<EntryStack>> inputEntries = display.getInputEntries();
List<List<EntryStack>> outputEntries = display.getResultingEntries();
List<EntryIngredient> inputEntries = display.getInputEntries();
List<EntryIngredient> outputEntries = display.getOutputEntries();
widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104));
widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput());
widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput());
@ -69,13 +69,14 @@ public class REIInfusionCategory implements TransferRecipeCategory<REIInfusionDi
.noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
return widgets;
}
@Override
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds,
REIInfusionDisplay display, IntList redSlots) {}
@Override
public int getDisplayHeight() {
return 104;
}
@Override
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) {
}
}

View file

@ -1,38 +1,29 @@
package ru.betterend.integration.rei;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.jetbrains.annotations.NotNull;
import com.google.common.collect.Lists;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.TransferRecipeDisplay;
import me.shedaniel.rei.server.ContainerInfo;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.crafting.Recipe;
import ru.betterend.recipe.builders.AlloyingRecipe;
import org.jetbrains.annotations.NotNull;
import ru.betterend.recipe.builders.InfusionRecipe;
public class REIInfusionDisplay implements TransferRecipeDisplay {
import java.util.Collections;
import java.util.Optional;
public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
private final InfusionRecipe recipe;
private final List<List<EntryStack>> input;
private final List<EntryStack> output;
private final int time;
public REIInfusionDisplay(InfusionRecipe recipe) {
super(
EntryIngredients.ofIngredients(recipe.getIngredients()),
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
);
this.recipe = recipe;
this.input = Lists.newArrayList();
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
this.time = recipe.getInfusionTime();
recipe.getIngredients().forEach(ingredient -> {
input.add(EntryStack.ofIngredient(ingredient));
});
}
public int getInfusionTime() {
@ -40,29 +31,19 @@ public class REIInfusionDisplay implements TransferRecipeDisplay {
}
@Override
public @NotNull Optional<ResourceLocation> getRecipeLocation() {
public @NotNull Optional<ResourceLocation> getDisplayLocation() {
return Optional.ofNullable(recipe).map(Recipe::getId);
}
@Override
public @NotNull List<List<EntryStack>> getInputEntries() {
return this.input;
public CategoryIdentifier<?> getCategoryIdentifier() {
return REIPlugin.INFUSION;
}
@Override
public @NotNull List<List<EntryStack>> getResultingEntries() {
return Collections.singletonList(output);
}
@Override
public @NotNull ResourceLocation getRecipeCategory() {
return AlloyingRecipe.ID;
}
@Override
public @NotNull List<List<EntryStack>> getRequiredEntries() {
return this.input;
}
// @Override
// public @NotNull List<List<EntryStack>> getRequiredEntries() {
// return this.input;
// }
@Override
public int getWidth() {
@ -74,8 +55,8 @@ public class REIInfusionDisplay implements TransferRecipeDisplay {
return 0;
}
@Override
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
return this.input;
}
// @Override
// public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
// return this.input;
//}
}

View file

@ -1,20 +1,28 @@
package ru.betterend.integration.rei;
import java.util.List;
import java.util.stream.Collectors;
import com.google.common.collect.Lists;
import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.api.RecipeHelper;
import me.shedaniel.rei.api.plugins.REIPluginV0;
import me.shedaniel.rei.plugin.DefaultPlugin;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.entry.type.EntryType;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.impl.ClientInternals;
import me.shedaniel.rei.impl.Internals;
import me.shedaniel.rei.plugin.common.DefaultPlugin;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.BlastingRecipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.block.Blocks;
import org.jetbrains.annotations.ApiStatus;
import ru.bclib.blocks.BaseFurnaceBlock;
import ru.betterend.BetterEnd;
import ru.betterend.blocks.basis.EndAnvilBlock;
@ -22,68 +30,81 @@ import ru.betterend.recipe.builders.AlloyingRecipe;
import ru.betterend.recipe.builders.AnvilRecipe;
import ru.betterend.recipe.builders.InfusionRecipe;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndItems;
import ru.betterend.registry.EndPortals;
@Environment(EnvType.CLIENT)
public class REIPlugin implements REIPluginV0 {
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
//https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java
public class REIPlugin implements REIClientPlugin {
public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin");
public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel");
public final static ResourceLocation ALLOYING = AlloyingRecipe.ID;
public final static ResourceLocation SMITHING = AnvilRecipe.ID;
public final static ResourceLocation INFUSION = InfusionRecipe.ID;
public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel");
public final static CategoryIdentifier ALLOYING = AlloyingRecipe.ID;
public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath());
public final static CategoryIdentifier INFUSION = InfusionRecipe.ID;
public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER);
public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL);
public final static EntryStack[] FURNACES;
public final static EntryStack[] ANVILS;
private EntryStack END_STONE_SMELTER;
private EntryStack INFUSION_RITUAL;
private EntryStack[] ANVILS;
private EntryStack[] FURNACES;
@Override
public ResourceLocation getPluginIdentifier() {
return PLUGIN_ID;
void init(){
//we need to initialize those variables after the static initialization
//otherwise the registry does not know the BlockItems
if (END_STONE_SMELTER!=null) {
return;
}
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())));
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]);
}
@Override
public void registerRecipeDisplays(RecipeHelper recipeHelper) {
recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new);
recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new);
recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new);
recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new);
FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> {
public void registerDisplays(DisplayRegistry registry) {
registry.registerRecipeFiller(AlloyingRecipe.class, AlloyingRecipe.TYPE, REIAlloyingDisplay::new);
registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new);
registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new);
registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new);
FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> {
if (time >= 2000) {
recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time));
final List<EntryIngredient> list = Arrays.asList(EntryIngredients.of(item));
registry.add(new REIAlloyingFuelDisplay(list, time));
}
});
}
@Override
public void registerOthers(RecipeHelper recipeHelper) {
recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER);
recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER);
recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL);
recipeHelper.registerWorkingStations(SMITHING, ANVILS);
recipeHelper.removeAutoCraftButton(ALLOYING_FUEL);
recipeHelper.removeAutoCraftButton(SMITHING);
recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES);
recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES);
}
@Override
public void registerPluginCategories(RecipeHelper recipeHelper) {
recipeHelper.registerCategories(
public void registerCategories(CategoryRegistry registry) {
init();
registry.add(
new REIAlloyingFuelCategory(),
new REIAlloyingCategory(),
new REIInfusionCategory(),
new REIAnvilCategory());
}
new REIAlloyingCategory(END_STONE_SMELTER),
new REIInfusionCategory(INFUSION_RITUAL),
new REIAnvilCategory(ANVILS)
);
static {
List<EntryStack> anvils = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream()
.filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList())));
anvils.add(0, EntryStack.create(Blocks.ANVIL));
ANVILS = anvils.toArray(new EntryStack[0]);
FURNACES = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream()
.filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList())))
.toArray(new EntryStack[0]);
registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER);
registry.addWorkstations(ALLOYING, END_STONE_SMELTER);
registry.addWorkstations(INFUSION, INFUSION_RITUAL);
registry.addWorkstations(SMITHING, ANVILS);
registry.removePlusButton(ALLOYING_FUEL);
registry.removePlusButton(SMITHING);
registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES);
registry.addWorkstations(DefaultPlugin.FUEL, FURNACES);
}
}

View file

@ -1,5 +1,8 @@
package ru.betterend.interfaces;
import net.minecraft.world.entity.Entity;
public interface ISlime {
public void be_setSlimeSize(int size, boolean heal);
void entityRemove(Entity.RemovalReason removalReason);
}

View file

@ -1,7 +0,0 @@
package ru.betterend.interfaces;
public interface ISpetialItem {
public int getStackSize();
public boolean canPlaceOnWater();
}

View file

@ -71,6 +71,6 @@ public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, Fall
@Environment(EnvType.CLIENT)
public void registerModelPredicate() {
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
(itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
(itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
}
}

View file

@ -63,6 +63,6 @@ public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem,
@Override
public void registerModelPredicate() {
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
(itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
(itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
}
}

View file

@ -1,5 +1,7 @@
package ru.betterend.item;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
@ -25,6 +27,7 @@ public class EnchantedItem extends ModelProviderItem {
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) {
ResourceLocation sourceId = Registry.ITEM.getKey(source);
return ModelsHelper.createItemModel(sourceId);

View file

@ -1,5 +1,7 @@
package ru.betterend.item;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
@ -25,11 +27,14 @@ public class EndAnvilItem extends BaseAnvilItem {
BlockState blockState = super.getPlacementState(blockPlaceContext);
ItemStack stack = blockPlaceContext.getItemInHand();
int durability = stack.getOrCreateTag().getInt(DURABILITY);
blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability);
if (blockState!=null) {
blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability);
}
return blockState;
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) {
Block block = getBlock();
ResourceLocation blockId = Registry.BLOCK.getKey(block);

View file

@ -1,13 +1,14 @@
package ru.betterend.item;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.FishBucketItem;
import net.minecraft.world.item.MobBucketItem;
import net.minecraft.world.level.material.Fluids;
import ru.bclib.client.models.ItemModelProvider;
import ru.betterend.registry.EndItems;
public class EndBucketItem extends FishBucketItem implements ItemModelProvider {
public class EndBucketItem extends MobBucketItem implements ItemModelProvider {
public EndBucketItem(EntityType<?> type) {
super(type, Fluids.WATER, EndItems.makeEndItemSettings().stacksTo(1));
super(type, Fluids.WATER, SoundEvents.BUCKET_EMPTY, EndItems.makeEndItemSettings().stacksTo(1));
}
}

View file

@ -4,6 +4,12 @@ import com.google.common.collect.ImmutableList;
import net.minecraft.client.model.AgeableListModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.Vec3;
@ -12,12 +18,25 @@ public class ArmoredElytraModel<T extends LivingEntity> extends AgeableListModel
private final ModelPart rightWing;
private final ModelPart leftWing;
public ArmoredElytraModel() {
this.leftWing = new ModelPart(this, 22, 0);
this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F);
this.rightWing = new ModelPart(this, 22, 0);
this.rightWing.mirror = true;
this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F);
public static LayerDefinition getTexturedModelData() {
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create()
.texOffs(22, 0)
.addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f),
PartPose.ZERO);
modelPartData.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create()
.mirror()
.texOffs(22, 0)
.addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f),
PartPose.ZERO);
return LayerDefinition.create(modelData, 48, 48);
}
public ArmoredElytraModel(ModelPart modelPart) {
leftWing = modelPart.getChild(PartNames.LEFT_WING);
rightWing = modelPart.getChild(PartNames.RIGHT_WING);
}
protected Iterable<ModelPart> headParts() {

View file

@ -1,5 +1,7 @@
package ru.betterend.item.model;
import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer;
import net.minecraft.world.item.ArmorMaterial;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -7,8 +9,6 @@ import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider;
import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.resources.ResourceLocation;
@ -18,18 +18,20 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import ru.betterend.item.CrystaliteArmor;
import ru.betterend.registry.EndItems;
import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry;
@Environment(EnvType.CLIENT)
public class CrystaliteArmorProvider implements ModelProvider, TextureProvider {
public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProvider, ArmorRenderingRegistry.TextureProvider {
//TODO: find new registry
private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png");
private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png");
private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F);
private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false);
private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true);
private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F);
private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F);
@Override
private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null);
private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null);
private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null);
private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null);
private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null);
//@Override
public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot,
boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) {
if (!isStackValid(stack)) return defaultTexture;
@ -37,7 +39,7 @@ public class CrystaliteArmorProvider implements ModelProvider, TextureProvider {
return FIRST_LAYER;
}
@Override
//@Override
public @NotNull HumanoidModel<LivingEntity> getArmorModel(LivingEntity entity, ItemStack stack,
EquipmentSlot slot, HumanoidModel<LivingEntity> defaultModel) {
if (!isStackValid(stack)) return defaultModel;

View file

@ -5,23 +5,58 @@ import java.util.Collections;
import com.google.common.collect.Lists;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class CrystaliteBootsModel extends HumanoidModel<LivingEntity> {
public ModelPart leftBoot;
public ModelPart rightBoot;
public static LayerDefinition getTexturedModelData() {
final float scale = 1.0f;
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
// TODO: see if we need to subclass HumanoidModel
// Humanoid model tries to retrieve all parts in it's constructor,
// so we need to add empty Nodes
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
CubeDeformation deformation = new CubeDeformation(scale + 0.25f);
modelPartData.addOrReplaceChild("leftBoot", CubeListBuilder.create()
.texOffs(0, 32)
.addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(1.9f, 12.0f, 0.0f));
modelPartData.addOrReplaceChild("rightBoot", CubeListBuilder.create()
.texOffs(0, 16)
.addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(-1.9f, 12.0f, 0.0f));
return LayerDefinition.create(modelData, 64, 48);
}
public static CrystaliteBootsModel createModel(EntityModelSet entityModelSet){
return new CrystaliteBootsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_BOOTS));
}
public CrystaliteBootsModel(float scale) {
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
this.leftBoot = new ModelPart(this, 0, 32);
this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F);
this.leftBoot.setPos(1.9F, 12.0F, 0.0F);
this.rightBoot = new ModelPart(this, 0, 16);
this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F);
this.rightBoot.setPos(-1.9F, 12.0F, 0.0F);
public CrystaliteBootsModel(ModelPart modelPart) {
super(modelPart, RenderType::entityTranslucent);
leftBoot = modelPart.getChild("leftBoot");
rightBoot = modelPart.getChild("rightBoot");
}
@Override

View file

@ -6,40 +6,95 @@ import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
public ModelPart leftShoulder;
public ModelPart rightShoulder;
private final boolean thinArms;
public CrystaliteChestplateModel(float scale, boolean thinArms) {
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
this.thinArms = thinArms;
this.body = new ModelPart(this, 16, 16);
this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F);
this.body.setPos(0.0F, 0.0F, 0.0F);
public static LayerDefinition getRegularTexturedModelData(){
return getTexturedModelData(1.0f, false);
}
public static LayerDefinition getThinTexturedModelData(){
return getTexturedModelData(1.0f, true);
}
private static LayerDefinition getTexturedModelData(float scale, boolean thinArms) {
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
// TODO: see if we need to subclass HumanoidModel
// Humanoid model tries to retrieve all parts in it's constructor,
// so we need to add empty Nodes
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
// modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
CubeDeformation deformation = new CubeDeformation(scale + 0.25F);
PartDefinition body = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
.texOffs(16, 16)
.addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation),
PartPose.ZERO);
if (thinArms) {
this.leftShoulder = new ModelPart(this, 41, 32);
this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F);
this.leftShoulder.setPos(5.0F, 2.5F, 0.0F);
this.leftShoulder.mirror = true;
this.rightShoulder = new ModelPart(this, 41, 16);
this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F);
this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F);
deformation = new CubeDeformation(scale + 0.45F);
PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create()
.mirror()
.texOffs(40, 32)
.addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(5.0f, 2.0f, 0.0f));
PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create()
.texOffs(40, 16)
.addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(-5.0f, 2.0f, 10.0f));
} else {
this.leftShoulder = new ModelPart(this, 40, 32);
this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F);
this.leftShoulder.setPos(5.0F, 2.0F, 0.0F);
this.leftShoulder.mirror = true;
this.rightShoulder = new ModelPart(this, 40, 16);
this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F);
this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F);
deformation = new CubeDeformation(scale + 0.45F);
PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create()
.mirror()
.texOffs(40, 32)
.addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(5.0f, 2.0f, 0.0f));
PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create()
.texOffs(40, 16)
.addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(-5.0f, 2.0f, 10.0f));
}
return LayerDefinition.create(modelData, 64, 48);
}
final ModelPart localBody;
public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet){
return new CrystaliteChestplateModel(entityModelSet==null?getRegularTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false);
}
public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet){
return new CrystaliteChestplateModel(entityModelSet==null?getThinTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true);
}
protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) {
super(modelPart, RenderType::entityTranslucent);
this.thinArms = thinArms;
localBody = modelPart.getChild(PartNames.BODY);
leftShoulder = modelPart.getChild("leftShoulder");
rightShoulder = modelPart.getChild("rightShoulder");
}
@Override
@ -56,7 +111,7 @@ public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
@Override
protected Iterable<ModelPart> bodyParts() {
return Lists.newArrayList(body, leftShoulder, rightShoulder);
return Lists.newArrayList(localBody, leftShoulder, rightShoulder);
}
@Override

View file

@ -7,18 +7,53 @@ import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
import shadow.fabric.impl.client.rendering.ArmorProviderExtensions;
@Environment(EnvType.CLIENT)
public class CrystaliteHelmetModel extends HumanoidModel<LivingEntity> {
final ModelPart myHat;
public static LayerDefinition getTexturedModelData() {
final float scale = 1.0f;
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
public CrystaliteHelmetModel(float scale) {
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
this.hat = new ModelPart(this, 0, 0);
this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F);
this.hat.setPos(0.0F, 0.0F, 0.0F);
// TODO: see if we need to subclass HumanoidModel
// Humanoid model tries to retrieve all parts in it's constructor,
// so we need to add empty Nodes
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
//modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f);
PartDefinition hat = modelPartData.addOrReplaceChild(PartNames.HAT, CubeListBuilder.create()
.texOffs(0, 0)
.addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat),
PartPose.ZERO);
return LayerDefinition.create(modelData, 64, 48);
}
public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet){
return new CrystaliteHelmetModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_HELMET));
}
public CrystaliteHelmetModel(ModelPart modelPart) {
super(modelPart, RenderType::entityTranslucent);
myHat = modelPart.getChild(PartNames.HAT);
}
@Override
@ -28,6 +63,6 @@ public class CrystaliteHelmetModel extends HumanoidModel<LivingEntity> {
@Override
protected Iterable<ModelPart> bodyParts() {
return Lists.newArrayList(hat);
return Lists.newArrayList(myHat);
}
}

View file

@ -5,23 +5,65 @@ import java.util.Collections;
import com.google.common.collect.Lists;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartNames;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class CrystaliteLeggingsModel extends HumanoidModel<LivingEntity> {
public static LayerDefinition getTexturedModelData() {
float scale = 1.0f;
MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
public CrystaliteLeggingsModel(float scale) {
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
this.body = new ModelPart(this, 16, 16);
this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale);
this.body.setPos(0.0F, 0.0F, 0.0F);
this.leftLeg = new ModelPart(this, 0, 32);
this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale);
this.leftLeg.setPos(1.9F, 12.0F, 0.0F);
this.rightLeg = new ModelPart(this, 0, 16);
this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale);
this.rightLeg.setPos(-1.9F, 12.0F, 0.0F);
// TODO: see if we need to subclass HumanoidModel
// Humanoid model tries to retrieve all parts in it's constructor,
// so we need to add empty Nodes
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
// modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
// modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
// modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
CubeDeformation deformation = new CubeDeformation(scale);
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
.texOffs(16, 16)
.addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation),
PartPose.ZERO);
modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create()
.texOffs(0, 32)
.addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(1.9f, 12.0f, 0.0f));
modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create()
.texOffs(0, 16)
.addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
PartPose.offset(-1.9f, 12.0f, 0.0f));
return LayerDefinition.create(modelData, 64, 48);
}
final ModelPart myBody;
final ModelPart myLeftLeg;
final ModelPart myRightLeg;
public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet){
return new CrystaliteLeggingsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_LEGGINGS));
}
public CrystaliteLeggingsModel(ModelPart modelPart) {
super(modelPart, RenderType::entityTranslucent);
myBody = modelPart.getChild(PartNames.BODY);
myLeftLeg = modelPart.getChild(PartNames.LEFT_LEG);
myRightLeg = modelPart.getChild(PartNames.RIGHT_LEG);
}
@Override
@ -31,6 +73,6 @@ public class CrystaliteLeggingsModel extends HumanoidModel<LivingEntity> {
@Override
protected Iterable<ModelPart> bodyParts() {
return Lists.newArrayList(body, rightLeg, leftLeg);
return Lists.newArrayList(myBody, myRightLeg, myLeftLeg);
}
}

View file

@ -8,10 +8,13 @@ import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import io.netty.util.internal.ThreadLocalRandom;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.Tag;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.EquipmentSlot;
@ -38,7 +41,8 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I
private final Multimap<Attribute, AttributeModifier> attributeModifiers;
public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) {
super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings);
//we override all methods that access BlockTags.MINEABLE_WITH_PICKAXE in the superclass, so this should not matter
super(attackDamage, attackSpeed, material, BlockTags.MINEABLE_WITH_PICKAXE, settings);
Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION));
@ -133,6 +137,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I
}
@Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) {
return ModelsHelper.createHandheldItem(resourceLocation);
}

View file

@ -0,0 +1,593 @@
SHOVELS:
"betterend:endstone_dust",
HOES:
"betterend:amber_root_seed",
"betterend:blossom_berry_seed",
"betterend:chorus_mushroom_seed",
"betterend:dragon_tree_leaves",
"betterend:lacugrove_leaves",
"betterend:lucernia_leaves",
"betterend:pythadendron_leaves",
"betterend:shadow_berry",
"betterend:tenanea_leaves",
SWORDS:
AXES:
"betterend:amaranita_cap",
"betterend:amaranita_hymenophore",
"betterend:amaranita_lantern",
"betterend:aurant_polypore",
"betterend:blue_vine_lantern",
"betterend:filalux_lantern",
"betterend:hydralux_petal_block",
"betterend:hydralux_petal_block_black",
"betterend:hydralux_petal_block_blue",
"betterend:hydralux_petal_block_brown",
"betterend:hydralux_petal_block_cyan",
"betterend:hydralux_petal_block_gray",
"betterend:hydralux_petal_block_green",
"betterend:hydralux_petal_block_light_blue",
"betterend:hydralux_petal_block_light_gray",
"betterend:hydralux_petal_block_lime",
"betterend:hydralux_petal_block_magenta",
"betterend:hydralux_petal_block_orange",
"betterend:hydralux_petal_block_pink",
"betterend:hydralux_petal_block_purple",
"betterend:hydralux_petal_block_red",
"betterend:hydralux_petal_block_white",
"betterend:hydralux_petal_block_yellow",
"betterend:mossy_glowshroom_cap",
"betterend:mossy_glowshroom_hymenophore",
"betterend:purple_polypore",
SHEARS:
"betterend:aeridium",
"betterend:amaranita_fur",
"betterend:amber_grass",
"betterend:blooming_cooksonia",
"betterend:blue_vine_fur",
"betterend:blue_vine_seed",
"betterend:bolux_mushroom",
"betterend:bubble_coral",
"betterend:bulb_moss",
"betterend:bulb_vine",
"betterend:bulb_vine_seed",
"betterend:bushy_grass",
"betterend:cave_grass",
"betterend:cave_pumpkin_seed",
"betterend:charnia_cyan",
"betterend:charnia_green",
"betterend:charnia_light_blue",
"betterend:charnia_orange",
"betterend:charnia_purple",
"betterend:charnia_red",
"betterend:chorus_grass",
"betterend:clawfern",
"betterend:creeping_moss",
"betterend:crystal_grass",
"betterend:cyan_moss",
"betterend:dense_vine",
"betterend:dragon_tree_leaves",
"betterend:end_lily_seed",
"betterend:end_lotus_seed",
"betterend:filalux",
"betterend:filalux_wings",
"betterend:flamaea",
"betterend:fracturn",
"betterend:globulagus",
"betterend:glowing_pillar_leaves",
"betterend:glowing_pillar_luminophor",
"betterend:glowing_pillar_seed",
"betterend:helix_tree_leaves",
"betterend:hydralux_sapling",
"betterend:jungle_fern",
"betterend:jungle_grass",
"betterend:jungle_vine",
"betterend:lacugrove_leaves",
"betterend:lamellarium",
"betterend:lanceleaf_seed",
"betterend:lucernia_leaves",
"betterend:lucernia_outer_leaves",
"betterend:lumecorn_seed",
"betterend:lutebus",
"betterend:magnula",
"betterend:mossy_glowshroom_fur",
"betterend:murkweed",
"betterend:needlegrass",
"betterend:orango",
"betterend:pond_anemone",
"betterend:pythadendron_leaves",
"betterend:rubinea",
"betterend:ruscus",
"betterend:salteago",
"betterend:shadow_plant",
"betterend:small_amaranita_mushroom",
"betterend:small_jellyshroom",
"betterend:tail_moss",
"betterend:tenanea_flowers",
"betterend:tenanea_leaves",
"betterend:tenanea_outer_leaves",
"betterend:tube_worm",
"betterend:twisted_moss",
"betterend:twisted_umbrella_moss",
"betterend:twisted_umbrella_moss_tall",
"betterend:twisted_vine",
"betterend:umbrella_moss",
"betterend:umbrella_moss_tall",
"betterend:vaiolush_fern",
UNKNOWN:
"betterend:aurora_crystal",
MISSING:
"betterend:amber_ore",
"betterend:end_stone_stalactite",
"betterend:end_stone_stalactite_cavemoss",
"betterend:ender_ore",
NONE:
"betterend:amaranita_hyphae",
"betterend:amaranita_stem",
"betterend:ancient_emerald_ice",
"betterend:cave_bush",
"betterend:cave_pumpkin",
"betterend:dense_emerald_ice",
"betterend:dense_snow",
"betterend:dragon_tree_bark",
"betterend:dragon_tree_barrel",
"betterend:dragon_tree_bookshelf",
"betterend:dragon_tree_button",
"betterend:dragon_tree_chest",
"betterend:dragon_tree_composter",
"betterend:dragon_tree_crafting_table",
"betterend:dragon_tree_door",
"betterend:dragon_tree_fence",
"betterend:dragon_tree_gate",
"betterend:dragon_tree_ladder",
"betterend:dragon_tree_log",
"betterend:dragon_tree_planks",
"betterend:dragon_tree_plate",
"betterend:dragon_tree_sign",
"betterend:dragon_tree_slab",
"betterend:dragon_tree_stairs",
"betterend:dragon_tree_stripped_bark",
"betterend:dragon_tree_stripped_log",
"betterend:dragon_tree_trapdoor",
"betterend:emerald_ice",
"betterend:end_lotus_bark",
"betterend:end_lotus_barrel",
"betterend:end_lotus_bookshelf",
"betterend:end_lotus_button",
"betterend:end_lotus_chest",
"betterend:end_lotus_composter",
"betterend:end_lotus_crafting_table",
"betterend:end_lotus_door",
"betterend:end_lotus_fence",
"betterend:end_lotus_gate",
"betterend:end_lotus_ladder",
"betterend:end_lotus_log",
"betterend:end_lotus_planks",
"betterend:end_lotus_plate",
"betterend:end_lotus_sign",
"betterend:end_lotus_slab",
"betterend:end_lotus_stairs",
"betterend:end_lotus_stem",
"betterend:end_lotus_stripped_bark",
"betterend:end_lotus_stripped_log",
"betterend:end_lotus_trapdoor",
"betterend:helix_tree_bark",
"betterend:helix_tree_barrel",
"betterend:helix_tree_bookshelf",
"betterend:helix_tree_button",
"betterend:helix_tree_chest",
"betterend:helix_tree_composter",
"betterend:helix_tree_crafting_table",
"betterend:helix_tree_door",
"betterend:helix_tree_fence",
"betterend:helix_tree_gate",
"betterend:helix_tree_ladder",
"betterend:helix_tree_log",
"betterend:helix_tree_planks",
"betterend:helix_tree_plate",
"betterend:helix_tree_sign",
"betterend:helix_tree_slab",
"betterend:helix_tree_stairs",
"betterend:helix_tree_stripped_bark",
"betterend:helix_tree_stripped_log",
"betterend:helix_tree_trapdoor",
"betterend:jellyshroom_bark",
"betterend:jellyshroom_barrel",
"betterend:jellyshroom_bookshelf",
"betterend:jellyshroom_button",
"betterend:jellyshroom_cap_purple",
"betterend:jellyshroom_chest",
"betterend:jellyshroom_composter",
"betterend:jellyshroom_crafting_table",
"betterend:jellyshroom_door",
"betterend:jellyshroom_fence",
"betterend:jellyshroom_gate",
"betterend:jellyshroom_ladder",
"betterend:jellyshroom_log",
"betterend:jellyshroom_planks",
"betterend:jellyshroom_plate",
"betterend:jellyshroom_sign",
"betterend:jellyshroom_slab",
"betterend:jellyshroom_stairs",
"betterend:jellyshroom_stripped_bark",
"betterend:jellyshroom_stripped_log",
"betterend:jellyshroom_trapdoor",
"betterend:lacugrove_bark",
"betterend:lacugrove_barrel",
"betterend:lacugrove_bookshelf",
"betterend:lacugrove_button",
"betterend:lacugrove_chest",
"betterend:lacugrove_composter",
"betterend:lacugrove_crafting_table",
"betterend:lacugrove_door",
"betterend:lacugrove_fence",
"betterend:lacugrove_gate",
"betterend:lacugrove_ladder",
"betterend:lacugrove_log",
"betterend:lacugrove_planks",
"betterend:lacugrove_plate",
"betterend:lacugrove_sign",
"betterend:lacugrove_slab",
"betterend:lacugrove_stairs",
"betterend:lacugrove_stripped_bark",
"betterend:lacugrove_stripped_log",
"betterend:lacugrove_trapdoor",
"betterend:lucernia_bark",
"betterend:lucernia_barrel",
"betterend:lucernia_bookshelf",
"betterend:lucernia_button",
"betterend:lucernia_chest",
"betterend:lucernia_composter",
"betterend:lucernia_crafting_table",
"betterend:lucernia_door",
"betterend:lucernia_fence",
"betterend:lucernia_gate",
"betterend:lucernia_ladder",
"betterend:lucernia_log",
"betterend:lucernia_planks",
"betterend:lucernia_plate",
"betterend:lucernia_sign",
"betterend:lucernia_slab",
"betterend:lucernia_stairs",
"betterend:lucernia_stripped_bark",
"betterend:lucernia_stripped_log",
"betterend:lucernia_trapdoor",
"betterend:menger_sponge",
"betterend:menger_sponge_wet",
"betterend:mossy_glowshroom_bark",
"betterend:mossy_glowshroom_barrel",
"betterend:mossy_glowshroom_bookshelf",
"betterend:mossy_glowshroom_button",
"betterend:mossy_glowshroom_chest",
"betterend:mossy_glowshroom_composter",
"betterend:mossy_glowshroom_crafting_table",
"betterend:mossy_glowshroom_door",
"betterend:mossy_glowshroom_fence",
"betterend:mossy_glowshroom_gate",
"betterend:mossy_glowshroom_ladder",
"betterend:mossy_glowshroom_log",
"betterend:mossy_glowshroom_planks",
"betterend:mossy_glowshroom_plate",
"betterend:mossy_glowshroom_sign",
"betterend:mossy_glowshroom_slab",
"betterend:mossy_glowshroom_stairs",
"betterend:mossy_glowshroom_stripped_bark",
"betterend:mossy_glowshroom_stripped_log",
"betterend:mossy_glowshroom_trapdoor",
"betterend:neon_cactus",
"betterend:neon_cactus_block",
"betterend:neon_cactus_slab",
"betterend:neon_cactus_stairs",
"betterend:pythadendron_bark",
"betterend:pythadendron_barrel",
"betterend:pythadendron_bookshelf",
"betterend:pythadendron_button",
"betterend:pythadendron_chest",
"betterend:pythadendron_composter",
"betterend:pythadendron_crafting_table",
"betterend:pythadendron_door",
"betterend:pythadendron_fence",
"betterend:pythadendron_gate",
"betterend:pythadendron_ladder",
"betterend:pythadendron_log",
"betterend:pythadendron_planks",
"betterend:pythadendron_plate",
"betterend:pythadendron_sign",
"betterend:pythadendron_slab",
"betterend:pythadendron_stairs",
"betterend:pythadendron_stripped_bark",
"betterend:pythadendron_stripped_log",
"betterend:pythadendron_trapdoor",
"betterend:silk_moth_nest",
"betterend:tenanea_bark",
"betterend:tenanea_barrel",
"betterend:tenanea_bookshelf",
"betterend:tenanea_button",
"betterend:tenanea_chest",
"betterend:tenanea_composter",
"betterend:tenanea_crafting_table",
"betterend:tenanea_door",
"betterend:tenanea_fence",
"betterend:tenanea_gate",
"betterend:tenanea_ladder",
"betterend:tenanea_log",
"betterend:tenanea_planks",
"betterend:tenanea_plate",
"betterend:tenanea_sign",
"betterend:tenanea_slab",
"betterend:tenanea_stairs",
"betterend:tenanea_stripped_bark",
"betterend:tenanea_stripped_log",
"betterend:tenanea_trapdoor",
"betterend:umbrella_tree_bark",
"betterend:umbrella_tree_barrel",
"betterend:umbrella_tree_bookshelf",
"betterend:umbrella_tree_button",
"betterend:umbrella_tree_chest",
"betterend:umbrella_tree_cluster",
"betterend:umbrella_tree_cluster_empty",
"betterend:umbrella_tree_composter",
"betterend:umbrella_tree_crafting_table",
"betterend:umbrella_tree_door",
"betterend:umbrella_tree_fence",
"betterend:umbrella_tree_gate",
"betterend:umbrella_tree_ladder",
"betterend:umbrella_tree_log",
"betterend:umbrella_tree_membrane",
"betterend:umbrella_tree_planks",
"betterend:umbrella_tree_plate",
"betterend:umbrella_tree_sign",
"betterend:umbrella_tree_slab",
"betterend:umbrella_tree_stairs",
"betterend:umbrella_tree_stripped_bark",
"betterend:umbrella_tree_stripped_log",
"betterend:umbrella_tree_trapdoor",
PICKAXES:
"betterend:aeternium_anvil",
"betterend:aeternium_block",
"betterend:amber_block",
"betterend:amber_moss",
"betterend:amber_moss_path",
"betterend:andesite_lantern",
"betterend:andesite_pedestal",
"betterend:aurora_crystal",
"betterend:azure_jadestone",
"betterend:azure_jadestone_bricks",
"betterend:azure_jadestone_bricks_slab",
"betterend:azure_jadestone_bricks_stairs",
"betterend:azure_jadestone_bricks_wall",
"betterend:azure_jadestone_button",
"betterend:azure_jadestone_furnace",
"betterend:azure_jadestone_lantern",
"betterend:azure_jadestone_pedestal",
"betterend:azure_jadestone_pillar",
"betterend:azure_jadestone_plate",
"betterend:azure_jadestone_polished",
"betterend:azure_jadestone_slab",
"betterend:azure_jadestone_stairs",
"betterend:azure_jadestone_tiles",
"betterend:azure_jadestone_wall",
"betterend:blackstone_lantern",
"betterend:brimstone",
"betterend:cave_moss",
"betterend:cave_moss_path",
"betterend:charcoal_block",
"betterend:chorus_nylium",
"betterend:chorus_nylium_path",
"betterend:crystal_moss",
"betterend:crystal_moss_path",
"betterend:diorite_lantern",
"betterend:diorite_pedestal",
"betterend:dragon_bone_block",
"betterend:dragon_bone_slab",
"betterend:dragon_bone_stairs",
"betterend:end_moss",
"betterend:end_moss_path",
"betterend:end_mycelium",
"betterend:end_mycelium_path",
"betterend:end_stone_furnace",
"betterend:end_stone_lantern",
"betterend:end_stone_smelter",
"betterend:ender_block",
"betterend:eternal_pedestal",
"betterend:flavolite",
"betterend:flavolite_bricks",
"betterend:flavolite_bricks_slab",
"betterend:flavolite_bricks_stairs",
"betterend:flavolite_bricks_wall",
"betterend:flavolite_button",
"betterend:flavolite_furnace",
"betterend:flavolite_lantern",
"betterend:flavolite_pedestal",
"betterend:flavolite_pillar",
"betterend:flavolite_plate",
"betterend:flavolite_polished",
"betterend:flavolite_runed",
"betterend:flavolite_runed_eternal",
"betterend:flavolite_slab",
"betterend:flavolite_stairs",
"betterend:flavolite_tiles",
"betterend:flavolite_wall",
"betterend:gold_chandelier",
"betterend:granite_lantern",
"betterend:granite_pedestal",
"betterend:hydrothermal_vent",
"betterend:infusion_pedestal",
"betterend:iron_bulb_lantern",
"betterend:iron_bulb_lantern_black",
"betterend:iron_bulb_lantern_blue",
"betterend:iron_bulb_lantern_brown",
"betterend:iron_bulb_lantern_cyan",
"betterend:iron_bulb_lantern_gray",
"betterend:iron_bulb_lantern_green",
"betterend:iron_bulb_lantern_light_blue",
"betterend:iron_bulb_lantern_light_gray",
"betterend:iron_bulb_lantern_lime",
"betterend:iron_bulb_lantern_magenta",
"betterend:iron_bulb_lantern_orange",
"betterend:iron_bulb_lantern_pink",
"betterend:iron_bulb_lantern_purple",
"betterend:iron_bulb_lantern_red",
"betterend:iron_bulb_lantern_white",
"betterend:iron_bulb_lantern_yellow",
"betterend:iron_chandelier",
"betterend:jungle_moss",
"betterend:jungle_moss_path",
"betterend:missing_tile",
"betterend:mossy_dragon_bone",
"betterend:mossy_obsidian",
"betterend:pink_moss",
"betterend:pink_moss_path",
"betterend:purpur_lantern",
"betterend:purpur_pedestal",
"betterend:quartz_lantern",
"betterend:quartz_pedestal",
"betterend:respawn_obelisk",
"betterend:rutiscus",
"betterend:rutiscus_path",
"betterend:sandy_jadestone",
"betterend:sandy_jadestone_bricks",
"betterend:sandy_jadestone_bricks_slab",
"betterend:sandy_jadestone_bricks_stairs",
"betterend:sandy_jadestone_bricks_wall",
"betterend:sandy_jadestone_button",
"betterend:sandy_jadestone_furnace",
"betterend:sandy_jadestone_lantern",
"betterend:sandy_jadestone_pedestal",
"betterend:sandy_jadestone_pillar",
"betterend:sandy_jadestone_plate",
"betterend:sandy_jadestone_polished",
"betterend:sandy_jadestone_slab",
"betterend:sandy_jadestone_stairs",
"betterend:sandy_jadestone_tiles",
"betterend:sandy_jadestone_wall",
"betterend:sangnum",
"betterend:sangnum_path",
"betterend:shadow_grass",
"betterend:shadow_grass_path",
"betterend:smaragdant_crystal",
"betterend:smaragdant_crystal_bricks",
"betterend:smaragdant_crystal_bricks_slab",
"betterend:smaragdant_crystal_bricks_stairs",
"betterend:smaragdant_crystal_bricks_wall",
"betterend:smaragdant_crystal_pedestal",
"betterend:smaragdant_crystal_pillar",
"betterend:smaragdant_crystal_polished",
"betterend:smaragdant_crystal_shard",
"betterend:smaragdant_crystal_slab",
"betterend:smaragdant_crystal_stairs",
"betterend:smaragdant_crystal_tiles",
"betterend:smaragdant_crystal_wall",
"betterend:sulphur_crystal",
"betterend:sulphuric_rock",
"betterend:sulphuric_rock_bricks",
"betterend:sulphuric_rock_bricks_slab",
"betterend:sulphuric_rock_bricks_stairs",
"betterend:sulphuric_rock_bricks_wall",
"betterend:sulphuric_rock_button",
"betterend:sulphuric_rock_furnace",
"betterend:sulphuric_rock_lantern",
"betterend:sulphuric_rock_pedestal",
"betterend:sulphuric_rock_pillar",
"betterend:sulphuric_rock_plate",
"betterend:sulphuric_rock_polished",
"betterend:sulphuric_rock_slab",
"betterend:sulphuric_rock_stairs",
"betterend:sulphuric_rock_tiles",
"betterend:sulphuric_rock_wall",
"betterend:terminite_anvil",
"betterend:terminite_bars",
"betterend:terminite_block",
"betterend:terminite_bulb_lantern",
"betterend:terminite_bulb_lantern_black",
"betterend:terminite_bulb_lantern_blue",
"betterend:terminite_bulb_lantern_brown",
"betterend:terminite_bulb_lantern_cyan",
"betterend:terminite_bulb_lantern_gray",
"betterend:terminite_bulb_lantern_green",
"betterend:terminite_bulb_lantern_light_blue",
"betterend:terminite_bulb_lantern_light_gray",
"betterend:terminite_bulb_lantern_lime",
"betterend:terminite_bulb_lantern_magenta",
"betterend:terminite_bulb_lantern_orange",
"betterend:terminite_bulb_lantern_pink",
"betterend:terminite_bulb_lantern_purple",
"betterend:terminite_bulb_lantern_red",
"betterend:terminite_bulb_lantern_white",
"betterend:terminite_bulb_lantern_yellow",
"betterend:terminite_chain",
"betterend:terminite_chandelier",
"betterend:terminite_door",
"betterend:terminite_plate",
"betterend:terminite_slab",
"betterend:terminite_stairs",
"betterend:terminite_tile",
"betterend:terminite_trapdoor",
"betterend:thallasium_anvil",
"betterend:thallasium_bars",
"betterend:thallasium_block",
"betterend:thallasium_bulb_lantern",
"betterend:thallasium_bulb_lantern_black",
"betterend:thallasium_bulb_lantern_blue",
"betterend:thallasium_bulb_lantern_brown",
"betterend:thallasium_bulb_lantern_cyan",
"betterend:thallasium_bulb_lantern_gray",
"betterend:thallasium_bulb_lantern_green",
"betterend:thallasium_bulb_lantern_light_blue",
"betterend:thallasium_bulb_lantern_light_gray",
"betterend:thallasium_bulb_lantern_lime",
"betterend:thallasium_bulb_lantern_magenta",
"betterend:thallasium_bulb_lantern_orange",
"betterend:thallasium_bulb_lantern_pink",
"betterend:thallasium_bulb_lantern_purple",
"betterend:thallasium_bulb_lantern_red",
"betterend:thallasium_bulb_lantern_white",
"betterend:thallasium_bulb_lantern_yellow",
"betterend:thallasium_chain",
"betterend:thallasium_chandelier",
"betterend:thallasium_door",
"betterend:thallasium_ore",
"betterend:thallasium_plate",
"betterend:thallasium_slab",
"betterend:thallasium_stairs",
"betterend:thallasium_tile",
"betterend:thallasium_trapdoor",
"betterend:violecite",
"betterend:violecite_bricks",
"betterend:violecite_bricks_slab",
"betterend:violecite_bricks_stairs",
"betterend:violecite_bricks_wall",
"betterend:violecite_button",
"betterend:violecite_furnace",
"betterend:violecite_lantern",
"betterend:violecite_pedestal",
"betterend:violecite_pillar",
"betterend:violecite_plate",
"betterend:violecite_polished",
"betterend:violecite_slab",
"betterend:violecite_stairs",
"betterend:violecite_tiles",
"betterend:violecite_wall",
"betterend:virid_jadestone",
"betterend:virid_jadestone_bricks",
"betterend:virid_jadestone_bricks_slab",
"betterend:virid_jadestone_bricks_stairs",
"betterend:virid_jadestone_bricks_wall",
"betterend:virid_jadestone_button",
"betterend:virid_jadestone_furnace",
"betterend:virid_jadestone_lantern",
"betterend:virid_jadestone_pedestal",
"betterend:virid_jadestone_pillar",
"betterend:virid_jadestone_plate",
"betterend:virid_jadestone_polished",
"betterend:virid_jadestone_slab",
"betterend:virid_jadestone_stairs",
"betterend:virid_jadestone_tiles",
"betterend:virid_jadestone_wall",

View file

@ -1,26 +1,25 @@
package ru.betterend.mixin.client;
import net.minecraft.client.model.ArmorStandArmorModel;
import net.minecraft.client.renderer.entity.ArmorStandRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.world.entity.decoration.ArmorStand;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.model.ArmorStandArmorModel;
import net.minecraft.client.renderer.entity.ArmorStandRenderer;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.world.entity.decoration.ArmorStand;
import ru.betterend.client.render.ArmoredElytraLayer;
@Mixin(ArmorStandRenderer.class)
public abstract class ArmorStandRendererMixin extends LivingEntityRenderer<ArmorStand, ArmorStandArmorModel> {
public ArmorStandRendererMixin(EntityRenderDispatcher entityRenderDispatcher, ArmorStandArmorModel entityModel, float f) {
super(entityRenderDispatcher, entityModel, f);
public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) {
super(context, entityModel, f);
}
@Inject(method = "<init>*", at = @At("TAIL"))
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, CallbackInfo info) {
addLayer(new ArmoredElytraLayer<>(this));
public void be_addCustomLayer(EntityRendererProvider.Context context, CallbackInfo ci) {
addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
}
}

View file

@ -1,5 +1,6 @@
package ru.betterend.mixin.client;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -18,6 +19,7 @@ import ru.bclib.client.gui.BlockSignEditScreen;
@Mixin(ClientPacketListener.class)
public class ClientPlayNetworkHandlerMixin
{
@Final
@Shadow
private Minecraft minecraft;

View file

@ -1,14 +0,0 @@
package ru.betterend.mixin.client;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import com.google.gson.Gson;
import net.minecraft.client.renderer.block.model.BlockModelDefinition;
@Mixin(BlockModelDefinition.Context.class)
public interface ContextGsonAccessor {
@Accessor
Gson getGson();
}

View file

@ -1,26 +1,25 @@
package ru.betterend.mixin.client;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.world.entity.Mob;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.world.entity.Mob;
import ru.betterend.client.render.ArmoredElytraLayer;
@Mixin(HumanoidMobRenderer.class)
public abstract class HumanoidMobRendererMixin<T extends Mob, M extends HumanoidModel<T>> extends MobRenderer<T, M> {
public HumanoidMobRendererMixin(EntityRenderDispatcher entityRenderDispatcher, M entityModel, float f) {
super(entityRenderDispatcher, entityModel, f);
public HumanoidMobRendererMixin(EntityRendererProvider.Context context, M entityModel, float f) {
super(context, entityModel, f);
}
@Inject(method = "<init>*", at = @At("TAIL"))
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, M humanoidModel, float f, float g, float h, float i, CallbackInfo info) {
addLayer(new ArmoredElytraLayer<>(this));
@Inject(method = "<init>(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Lnet/minecraft/client/model/HumanoidModel;FFFF)V", at = @At("TAIL"))
public void be_addCustomLayer(EntityRendererProvider.Context context, M humanoidModel, float f, float g, float h, float i, CallbackInfo ci) {
addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
}
}

View file

@ -1,26 +1,25 @@
package ru.betterend.mixin.client;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import ru.betterend.client.render.ArmoredElytraLayer;
@Mixin(PlayerRenderer.class)
public abstract class PlayerRendererMixin extends LivingEntityRenderer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> {
public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel<AbstractClientPlayer> entityModel, float f) {
super(entityRenderDispatcher, entityModel, f);
public PlayerRendererMixin(EntityRendererProvider.Context context, PlayerModel<AbstractClientPlayer> entityModel, float f) {
super(context, entityModel, f);
}
@Inject(method = "<init>(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL"))
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) {
addLayer(new ArmoredElytraLayer<>(this));
@Inject(method = "<init>*", at = @At("TAIL"))
public void be_addCustomLayer(EntityRendererProvider.Context context, boolean bl, CallbackInfo ci) {
addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
}
}

View file

@ -2,6 +2,9 @@ package ru.betterend.mixin.client;
import java.util.Random;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.math.Matrix4f;
import net.minecraft.client.renderer.GameRenderer;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@ -92,7 +95,7 @@ public class WorldRendererMixin {
}
@Inject(method = "renderSky", at = @At("HEAD"), cancellable = true)
private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) {
private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) {
if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) {
time = (ticks % 360000) * 0.000017453292F;
time2 = time * 2;
@ -108,9 +111,11 @@ public class WorldRendererMixin {
RenderSystem.depthMask(false);
}
else {
RenderSystem.enableAlphaTest();
RenderSystem.alphaFunc(516, 0.0F);
//TODO: Removed in 1.17
//RenderSystem.enableAlphaTest();
//RenderSystem.alphaFunc(516, 0.0F);
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
}
float blindA = 1F - BackgroundInfo.blindness;
@ -120,40 +125,40 @@ public class WorldRendererMixin {
if (blindA > 0) {
matrices.pushPose();
matrices.mulPose(new Quaternion(0, time, 0, false));
textureManager.bind(HORIZON);
be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA);
RenderSystem.setShaderTexture(0, HORIZON);
be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA);
matrices.popPose();
matrices.pushPose();
matrices.mulPose(new Quaternion(0, -time, 0, false));
textureManager.bind(NEBULA_1);
be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
RenderSystem.setShaderTexture(0, NEBULA_1);
be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
matrices.popPose();
matrices.pushPose();
matrices.mulPose(new Quaternion(0, time2, 0, false));
textureManager.bind(NEBULA_2);
be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
RenderSystem.setShaderTexture(0, NEBULA_2);
be_renderBuffer(matrices, matrix4f, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
matrices.popPose();
textureManager.bind(STARS);
RenderSystem.setShaderTexture(0, STARS);
matrices.pushPose();
matrices.mulPose(axis3.rotation(time));
be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06);
be_renderBuffer(matrices, matrix4f ,stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06);
matrices.popPose();
matrices.pushPose();
matrices.mulPose(axis4.rotation(time2));
be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06);
be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06);
matrices.popPose();
}
float a = (BackgroundInfo.fogDensity - 1F);
if (a > 0) {
if (a > 1) a = 1;
textureManager.bind(FOG);
be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a);
RenderSystem.setShaderTexture(0, FOG);
be_renderBuffer(matrices, matrix4f, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a);
}
RenderSystem.disableTexture();
@ -161,27 +166,30 @@ public class WorldRendererMixin {
if (blindA > 0) {
matrices.pushPose();
matrices.mulPose(axis1.rotation(time3));
be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06);
be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06);
matrices.popPose();
matrices.pushPose();
matrices.mulPose(axis2.rotation(time2));
be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06);
be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06);
matrices.popPose();
}
RenderSystem.enableTexture();
RenderSystem.depthMask(true);
RenderSystem.defaultBlendFunc();
RenderSystem.disableBlend();
info.cancel();
}
}
private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) {
RenderSystem.color4f(r, g, b, a);
private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) {
RenderSystem.setShaderColor(r, g, b, a);
buffer.bind();
format.setupBufferState(0L);
buffer.draw(matrices.last().pose(), 7);
format.setupBufferState();
buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader());
VertexBuffer.unbind();
format.clearBufferState();
}
@ -203,7 +211,10 @@ public class WorldRendererMixin {
buffer.close();
}
buffer = new VertexBuffer(DefaultVertexFormat.POSITION);
//TODO: Test if this is working correct
//Format is set in the DrawState
//buffer = new VertexBuffer(DefaultVertexFormat.POSITION);
buffer = new VertexBuffer();
be_makeStars(bufferBuilder, minSize, maxSize, count, seed);
bufferBuilder.end();
buffer.upload(bufferBuilder);
@ -216,7 +227,8 @@ public class WorldRendererMixin {
buffer.close();
}
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
buffer = new VertexBuffer();
be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed);
bufferBuilder.end();
buffer.upload(bufferBuilder);
@ -229,7 +241,8 @@ public class WorldRendererMixin {
buffer.close();
}
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
buffer = new VertexBuffer();
be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed);
bufferBuilder.end();
buffer.upload(bufferBuilder);
@ -242,7 +255,8 @@ public class WorldRendererMixin {
buffer.close();
}
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
buffer = new VertexBuffer();
be_makeCylinder(bufferBuilder, 16, 50, 100);
bufferBuilder.end();
buffer.upload(bufferBuilder);
@ -255,7 +269,8 @@ public class WorldRendererMixin {
buffer.close();
}
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
buffer = new VertexBuffer();
be_makeCylinder(bufferBuilder, 16, 50, 70);
bufferBuilder.end();
buffer.upload(bufferBuilder);
@ -265,7 +280,7 @@ public class WorldRendererMixin {
private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
Random random = new Random(seed);
buffer.begin(7, DefaultVertexFormat.POSITION);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION);
for (int i = 0; i < count; ++i) {
double posX = random.nextDouble() * 2.0 - 1.0;
@ -308,7 +323,7 @@ public class WorldRendererMixin {
private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
Random random = new Random(seed);
buffer.begin(7, DefaultVertexFormat.POSITION_TEX);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
for (int i = 0; i < count; ++i) {
double posX = random.nextDouble() * 2.0 - 1.0;
@ -356,7 +371,7 @@ public class WorldRendererMixin {
private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
Random random = new Random(seed);
buffer.begin(7, DefaultVertexFormat.POSITION_TEX);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
for (int i = 0; i < count; ++i) {
double posX = random.nextDouble() * 2.0 - 1.0;
@ -406,7 +421,7 @@ public class WorldRendererMixin {
}
private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) {
buffer.begin(7, DefaultVertexFormat.POSITION_TEX);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
for (int i = 0; i < segments; i ++) {
double a1 = (double) i * Math.PI * 2.0 / (double) segments;
double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments;

Some files were not shown because too many files have changed in this diff Show more