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/ run/
output/ output/
*.log *.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 group = project.maven_group
repositories { repositories {
maven { url "https://maven.dblsaiko.net/" } maven { url "https://maven.dblsaiko.net/" }
maven { url "https://server.bbkr.space:8081/artifactory/libs-release/" }
maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.fabricmc.net/" }
maven { url 'https://maven.blamejared.com' } maven { url 'https://maven.blamejared.com' }
maven { url "https://maven.shedaniel.me/" } maven { url "https://maven.shedaniel.me/" }
@ -33,49 +32,56 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_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}" useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}"
useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}"
useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}"
//useOptional "grondag:canvas-mc116:${project.canvas_version}" //useOptional "grondag:canvas-mc116:${project.canvas_version}"
} }
def useOptional(String dep) { def useOptional(String dep) {
dependencies.modRuntime (dep) { dependencies.modRuntime (dep) {
exclude group: "net.fabricmc.fabric-api" exclude group: 'net.fabricmc.fabric-api'
exclude group: "net.fabricmc" exclude group: 'net.fabricmc'
if (!dep.contains("me.shedaniel")) { if (!dep.contains("me.shedaniel")) {
exclude group: "me.shedaniel" exclude group: 'me.shedaniel.cloth'
exclude group: 'me.shedaniel'
} }
} }
dependencies.modCompileOnly (dep) { dependencies.modCompileOnly (dep) {
exclude group: "net.fabricmc.fabric-api" exclude group: 'net.fabricmc.fabric-api'
exclude group: "net.fabricmc" exclude group: 'net.fabricmc'
if (!dep.contains("me.shedaniel")) { if (!dep.contains("me.shedaniel")) {
exclude group: "me.shedaniel" exclude group: 'me.shedaniel.cloth'
exclude group: 'me.shedaniel'
} }
} }
} }
def useApi(String dep) { def useApi(String dep) {
dependencies.modApi (dep) { dependencies.modApi (dep) {
exclude group: "net.fabricmc.fabric-api" exclude group: 'net.fabricmc.fabric-api'
exclude group: "net.fabricmc" exclude group: 'net.fabricmc'
if (!dep.contains("me.shedaniel")) { if (!dep.contains("me.shedaniel")) {
exclude group: "me.shedaniel" exclude group: 'me.shedaniel.cloth'
exclude group: 'me.shedaniel'
} }
} }
} }
processResources { processResources {
inputs.property "version", project.version inputs.property "version", project.version
duplicatesStrategy = 'WARN' duplicatesStrategy = 'EXCLUDE'
from(sourceSets.main.resources.srcDirs) { from(sourceSets.main.resources.srcDirs) {
include "fabric.mod.json" include "fabric.mod.json"
expand "version": project.version 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 // 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 // // uncomment to publish to the local maven
// // mavenLocal() // // mavenLocal()
// } // }
//} //}

View file

@ -3,19 +3,19 @@ org.gradle.jvmargs=-Xmx2G
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/use # check these on https://fabricmc.net/use
minecraft_version= 1.17 minecraft_version= 1.17.1
yarn_mappings= 6 yarn_mappings= 6
loader_version= 0.11.6 loader_version= 0.11.6
# Mod Properties # Mod Properties
mod_version = 0.9.8-pre mod_version = 0.10.0-pre
maven_group = ru.betterend maven_group = ru.betterend
archives_base_name = better-end archives_base_name = better-end
# Dependencies # Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api # 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 patchouli_version = 55-FABRIC-SNAPSHOT
fabric_version = 0.35.2+1.17 fabric_version = 0.36.1+1.17
bclib_version = 0.2.0
rei_version = 6.0.262-alpha
canvas_version = 1.0.+ 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; package ru.betterend.blocks;
import java.util.Random;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; 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 net.minecraft.world.phys.shapes.VoxelShape;
import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock;
import java.util.Random;
public class BubbleCoralBlock extends EndUnderwaterPlantBlock { public class BubbleCoralBlock extends EndUnderwaterPlantBlock {
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); 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 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.object.builder.v1.block.FabricBlockSettings;
import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags;
import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.BlockModel;
@ -57,6 +59,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType
} }
@Override @Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Map<String, String> textures = Maps.newHashMap(); Map<String, String> textures = Maps.newHashMap();
textures.put("%glow%", getGlowTexture()); textures.put("%glow%", getGlowTexture());

View file

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

View file

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

View file

@ -94,7 +94,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
if (exitPos == null) return; if (exitPos == null) return;
if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) { if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) {
((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), ((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 { } else {
((TeleportingEntity) entity).be_setExitPos(exitPos); ((TeleportingEntity) entity).be_setExitPos(exitPos);
Optional<Entity> teleported = Optional.ofNullable(entity.changeDimension(destination)); 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) { private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) {
if (targetWorld == null) return null; 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 targetWorldId = targetWorld.dimension().location();
ResourceLocation currentWorldId = currentWorld.dimension().location(); ResourceLocation currentWorldId = currentWorld.dimension().location();
double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale();

View file

@ -1,10 +1,6 @@
package ru.betterend.blocks; package ru.betterend.blocks;
import java.util.List;
import java.util.Random;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; 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.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.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.entity.BlockEntity; 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.BlockState;
import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties; 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.LootContext;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.Nullable;
import ru.bclib.blocks.BaseBlockWithEntity; import ru.bclib.blocks.BaseBlockWithEntity;
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; 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 class EndStoneSmelter extends BaseBlockWithEntity {
public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
@ -52,7 +49,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
.resistance(100F) .resistance(100F)
.requiresCorrectToolForDrops() .requiresCorrectToolForDrops()
.sound(SoundType.STONE)); .sound(SoundType.STONE));
this.registerDefaultState(this.stateDefinition.any() registerDefaultState(this.stateDefinition.any()
.setValue(FACING, Direction.NORTH) .setValue(FACING, Direction.NORTH)
.setValue(LIT, false)); .setValue(LIT, false));
} }
@ -75,12 +72,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
@Override @Override
public BlockState getStateForPlacement(BlockPlaceContext ctx) { public BlockState getStateForPlacement(BlockPlaceContext ctx) {
return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite());
} }
@Override @Override
public BlockEntity newBlockEntity(BlockGetter world) { public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new EndStoneSmelterBlockEntity(); return new EndStoneSmelterBlockEntity(blockPos, blockState);
} }
@Override @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); 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 @Override
public BlockEntity newBlockEntity(BlockGetter world) { public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new EternalPedestalEntity(); return new EternalPedestalEntity(blockPos, blockState);
} }
@Override @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.level.storage.loot.LootContext;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import ru.bclib.interfaces.ISpetialItem;
import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.blocks.basis.EndPlantBlock;
import ru.betterend.interfaces.ISpetialItem;
public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem {
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); 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) { public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL); ItemStack tool = builder.getParameter(LootContextParams.TOOL);
if (tool != null) { 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)); return Collections.singletonList(new ItemStack(this));
} }
int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); 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.entity.Entity;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SoundType; 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.Material;
import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.material.MaterialColor;
import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseBlock;
@ -26,5 +27,5 @@ public class HydraluxPetalBlock extends BaseBlock {
} }
@Override @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 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.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.color.item.ItemColor;
@ -31,6 +33,7 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo
} }
@Override @Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
String path = "betterend:block/block_petal_colored"; String path = "betterend:block/block_petal_colored";
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); 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 @Override
public BlockEntity newBlockEntity(BlockGetter world) { public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new BlockEntityHydrothermalVent(); return new BlockEntityHydrothermalVent(pos, state);
} }
@Override @Override

View file

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

View file

@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable;
import com.google.common.collect.Lists; 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.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.color.item.ItemColor;
@ -71,11 +73,13 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo
} }
@Override @Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) { public BlockModel getItemModel(ResourceLocation resourceLocation) {
return getBlockModel(resourceLocation, defaultBlockState()); return getBlockModel(resourceLocation, defaultBlockState());
} }
@Override @Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap");
return ModelsHelper.fromPattern(pattern); 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.WorldGenLevel;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState; 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.blocks.basis.EndPlantWithAgeBlock;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
@ -14,7 +15,7 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock {
@Override @Override
public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { 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 @Override

View file

@ -61,7 +61,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped
FluidState fluidState = world.getFluidState(blockPos2); FluidState fluidState = world.getFluidState(blockPos2);
Material material = blockState.getMaterial(); Material material = blockState.getMaterial();
if (fluidState.is(FluidTags.WATER)) { 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; ++i;
if (j < 6) { if (j < 6) {
queue.add(new Tuple<>(blockPos2, j + 1)); 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)); queue.add(new Tuple<>(blockPos2, j + 1));
} }
} else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { } 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); dropResources(blockState, world, blockPos2, blockEntity);
world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3);
++i; ++i;

View file

@ -34,7 +34,7 @@ public class NeedlegrassBlock extends EndPlantBlock {
@Override @Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) { public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL); 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)); return Lists.newArrayList(new ItemStack(this));
} }
else { 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) { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
if (hand == InteractionHand.MAIN_HAND) { if (hand == InteractionHand.MAIN_HAND) {
ItemStack stack = player.getMainHandItem(); 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)); BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0));
Direction dir = state.getValue(FACING); Direction dir = state.getValue(FACING);
double px = pos.getX() + dir.getStepX() + 0.5; 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) { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
if (hand == InteractionHand.MAIN_HAND) { if (hand == InteractionHand.MAIN_HAND) {
ItemStack stack = player.getMainHandItem(); 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)); BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0));
Direction dir = state.getValue(FACING); Direction dir = state.getValue(FACING);
double px = pos.getX() + dir.getStepX() + 0.5; double px = pos.getX() + dir.getStepX() + 0.5;

View file

@ -1,7 +1,5 @@
package ru.betterend.blocks; package ru.betterend.blocks;
import java.util.Random;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.BlockGetter; 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.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; 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.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; 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.EndBlocks;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import java.util.Random;
public class SmallAmaranitaBlock extends EndPlantBlock { public class SmallAmaranitaBlock extends EndPlantBlock {
private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); 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) { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) {
BlockPos bigPos = growBig(world, pos); BlockPos bigPos = growBig(world, pos);
if (bigPos != null) { 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);
replaceMushroom(world, bigPos.south()); replaceMushroom(world, bigPos.south());
replaceMushroom(world, bigPos.east()); replaceMushroom(world, bigPos.east());
@ -37,7 +38,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock {
} }
return; return;
} }
EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
} }
@Override @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.BonemealableBlock;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState; 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.material.Material;
import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
@ -56,7 +57,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
@Override @Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) { public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL); 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)); return Lists.newArrayList(new ItemStack(this));
} }
else { else {
@ -99,6 +100,6 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
@Override @Override
public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) {
BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); 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 @Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) { public BlockModel getItemModel(ResourceLocation resourceLocation) {
return getBlockModel(resourceLocation, defaultBlockState()); return getBlockModel(resourceLocation, defaultBlockState());
} }

View file

@ -1,5 +1,6 @@
package ru.betterend.blocks; package ru.betterend.blocks;
import java.util.Optional;
import java.util.Random; import java.util.Random;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
@ -9,9 +10,12 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity; 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.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
@ -38,9 +42,9 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid
} }
@Override @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); world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11);
return Fluids.WATER; return new ItemStack(Items.WATER_BUCKET);
} }
@Override @Override
@ -120,4 +124,11 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid
public FluidState getFluidState(BlockState state) { public FluidState getFluidState(BlockState state) {
return Fluids.WATER.getSource(false); 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 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.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -125,6 +127,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg
} }
@Override @Override
@Environment(EnvType.CLIENT)
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) { public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
String floor = blockState.getValue(IS_FLOOR) ? "_floor" : ""; String floor = blockState.getValue(IS_FLOOR) ? "_floor" : "";
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(),

View file

@ -62,7 +62,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped {
@Override @Override
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) { public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
ItemStack tool = builder.getParameter(LootContextParams.TOOL); 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)); return Lists.newArrayList(new ItemStack(this));
} }
else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { 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.Map;
import java.util.Optional; 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 org.jetbrains.annotations.Nullable;
import com.google.common.collect.Lists; 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.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.UnbakedModel; 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.InfusionPedestalEntity;
import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.blocks.entities.PedestalBlockEntity;
import ru.betterend.client.models.Patterns; import ru.betterend.client.models.Patterns;
import ru.betterend.registry.EndBlockEntities;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.rituals.InfusionRitual; import ru.betterend.rituals.InfusionRitual;
@ -349,8 +354,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
} }
@Override @Override
public BlockEntity newBlockEntity(BlockGetter world) { public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new PedestalBlockEntity(); return new PedestalBlockEntity(blockPos, blockState);
} }
public boolean hasUniqueEntity() { public boolean hasUniqueEntity() {
@ -370,11 +375,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
} }
@Override @Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation blockId) { public BlockModel getItemModel(ResourceLocation blockId) {
return getBlockModel(blockId, defaultBlockState()); return getBlockModel(blockId, defaultBlockState());
} }
@Override @Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
Map<String, String> textures = createTexturesMap(); Map<String, String> textures = createTexturesMap();
PedestalState state = blockState.getValue(STATE); PedestalState state = blockState.getValue(STATE);
@ -401,6 +408,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
} }
@Override @Override
@Environment(EnvType.CLIENT)
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) { public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
PedestalState state = blockState.getValue(STATE); PedestalState state = blockState.getValue(STATE);
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), 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 { static {
VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); 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 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.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.block.BlockColor;
import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.color.item.ItemColor;
@ -44,6 +46,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider
} }
@Override @Override
@Environment(EnvType.CLIENT)
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
String blockName = resourceLocation.getPath(); String blockName = resourceLocation.getPath();
Optional<String> pattern = blockState.getValue(IS_FLOOR) ? 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.BaseBarrelBlock;
import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseBlock;
import ru.bclib.blocks.BaseBookshelfBlock; import ru.bclib.blocks.BaseBookshelfBlock;
import ru.bclib.blocks.BaseChestBlock;
import ru.bclib.blocks.BaseComposterBlock; import ru.bclib.blocks.BaseComposterBlock;
import ru.bclib.blocks.BaseCraftingTableBlock; import ru.bclib.blocks.BaseCraftingTableBlock;
import ru.bclib.blocks.BaseDoorBlock; import ru.bclib.blocks.BaseDoorBlock;
@ -90,7 +91,7 @@ public class WoodenMaterial {
ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks)); ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks));
sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(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)); barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks));
shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks));
composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(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 java.util.List;
import net.minecraft.core.BlockPos;
import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleTypes; 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.entity.LivingEntity;
import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.ElytraItem;
import net.minecraft.world.item.Item; 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.BlockEntity;
import net.minecraft.world.level.block.entity.TickableBlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
@ -20,18 +21,16 @@ import ru.betterend.registry.EndBlockEntities;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndParticles; 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); private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f);
public BlockEntityHydrothermalVent() { public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) {
super(EndBlockEntities.HYDROTHERMAL_VENT); super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState);
} }
@Override public static void tick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) {
public void tick() {
if (level != null) { if (level != null) {
BlockState state = getBlockState();
if (state.is(EndBlocks.HYDROTHERMAL_VENT)) { if (state.is(EndBlocks.HYDROTHERMAL_VENT)) {
boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED);
if (active && level.random.nextInt(20) == 0) { 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; double mult = active ? 3.0 : 5.0;
float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult); float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult);
entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() && 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)); .forEach(entity -> entity.moveRelative(force, POSITIVE_Y));
} }
mutable.move(Direction.UP); mutable.move(Direction.UP);

View file

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

View file

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

View file

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

View file

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

View file

@ -79,7 +79,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent
int slotX = this.fuelSlot.x + x; int slotX = this.fuelSlot.x + x;
int slotY = this.fuelSlot.y + y; int slotY = this.fuelSlot.y + y;
GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); 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); RenderSystem.depthFunc(516);
GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583);
RenderSystem.depthFunc(515); RenderSystem.depthFunc(515);

View file

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

View file

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

View file

@ -28,10 +28,9 @@ public class SmelterOutputSlot extends Slot {
return super.remove(amount); return super.remove(amount);
} }
public ItemStack onTake(Player player, ItemStack stack) { public void onTake(Player player, ItemStack stack) {
this.checkTakeAchievements(stack); this.checkTakeAchievements(stack);
super.onTake(player, stack); super.onTake(player, stack);
return stack;
} }
protected void onQuickCraft(ItemStack stack, int amount) { 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 com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.EntityModel;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
@ -18,12 +19,14 @@ import net.minecraft.world.entity.player.PlayerModelPart;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.interfaces.FallFlyingItem;
import ru.betterend.item.model.ArmoredElytraModel; 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> { 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) { public ArmoredElytraLayer(RenderLayerParent<T, M> renderLayerParent, EntityModelSet entityModelSet) {
super(renderLayerParent); 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) { 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 com.mojang.math.Vector3f;
import net.minecraft.client.model.geom.ModelPart; 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.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -41,14 +46,30 @@ public class EndCrystalRenderer {
CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY);
matrices.popPose(); 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 { static {
END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE);
RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE);
SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); 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); ModelPart root = getTexturedModelData().bakeRoot();
CORE = new ModelPart(64, 32, 32, 0); FRAME = root.getChild("FRAME");
CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); CORE = root.getChild("CORE");
} }
} }

View file

@ -5,6 +5,11 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Vector3f; import com.mojang.math.Vector3f;
import net.minecraft.client.model.geom.ModelPart; 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.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -56,15 +61,47 @@ public class EternalCrystalRenderer {
return ColorUtil.toFloatArray(ColorUtil.color(r, g, b)); 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 { static {
RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true);
SHARDS = new ModelPart[4]; 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); ModelPart root = getTexturedModelData().bakeRoot();
SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); SHARDS[0] = root.getChild("SHARDS_0");
SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); SHARDS[1] = root.getChild("SHARDS_1");
CORE = new ModelPart(16, 16, 0, 0); SHARDS[2] = root.getChild("SHARDS_2");
CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); 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.block.model.ItemTransforms;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; 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.client.resources.model.BakedModel;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
@ -24,10 +26,10 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndItems; import ru.betterend.registry.EndItems;
@Environment(EnvType.CLIENT) @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) { public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) {
super(dispatcher); super();
} }
@Override @Override
@ -44,7 +46,8 @@ public class PedestalItemRenderer<T extends PedestalBlockEntity> extends BlockEn
matrices.pushPose(); matrices.pushPose();
Minecraft minecraft = Minecraft.getInstance(); 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; Vector3f translate = model.getTransforms().ground.translation;
PedestalBlock pedestal = (PedestalBlock) state.getBlock(); PedestalBlock pedestal = (PedestalBlock) state.getBlock();
matrices.translate(translate.x(), translate.y(), translate.z()); matrices.translate(translate.x(), translate.y(), translate.z());

View file

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

View file

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

View file

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

View file

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

View file

@ -96,7 +96,7 @@ public class ShadowWalkerEntity extends Monster {
} }
@Override @Override
protected float getVoicePitch() { public float getVoicePitch() {
return MHelper.randRange(0.75F, 1.25F, random); 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.List;
import java.util.Random; 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 org.jetbrains.annotations.Nullable;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -16,11 +19,6 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.world.damagesource.DamageSource; 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.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.control.FlyingMoveControl; import net.minecraft.world.entity.ai.control.FlyingMoveControl;
@ -142,18 +140,18 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
} }
@Override @Override
protected boolean makeFlySound() { public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
return true;
}
@Override
public boolean causeFallDamage(float fallDistance, float damageMultiplier) {
return false; return false;
} }
@Override @Override
public boolean isMovementNoisy() { protected Entity.MovementEmission getMovementEmission() {
return false; return Entity.MovementEmission.EVENTS;
}
@Override
public boolean isFlying() {
return !this.onGround;
} }
@Override @Override
@ -162,7 +160,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
} }
@Override @Override
public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) {
return EndEntities.SILK_MOTH.create(world); return EndEntities.SILK_MOTH.create(world);
} }
@ -239,8 +237,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
@Nullable @Nullable
private Vec3 getRandomLocation() { private Vec3 getRandomLocation() {
Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F); Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F);
Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); Vec3 vec3d4 = HoverRandomPos.getPos(SilkMothEntity.this, 8, 7, vec3d3.x, vec3d3.z, 1.5707964F, 3, 1);
return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); 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)); 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.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1);
SilkMothEntity.this.remove(); SilkMothEntity.this.discard();
} }
else { else {
SilkMothEntity.this.hivePos = null; 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.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart; 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.client.renderer.RenderType;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.CubozoaEntity;
public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> { public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
private final ModelPart model; private final static int TENTACLE_COUNT = 4;
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;
public CubozoaEntityModel() { private final ModelPart model;
super(RenderType::entityTranslucent); private final ModelPart[] tentacle_center;
private final ModelPart[] tentacle;
texWidth = 48; private float scaleY;
texHeight = 48; private float scaleXZ;
model = new ModelPart(this); 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.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); main_cube_r1.setPos(0.0F, -14.0F, 0.0F);
model.addChild(main_cube_r1); model.addChild(main_cube_r1);
setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); 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); tentacle_center_1.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_1); model.addChild(tentacle_center_1);
tentacle_1 = new ModelPart(this); tentacle_1 = new ModelPart(this);
tentacle_1.setPos(0.0F, -7.0F, 4.5F); 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); tentacle_center_2.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_2); model.addChild(tentacle_center_2);
setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F);
tentacle_2 = new ModelPart(this); tentacle_2 = new ModelPart(this);
tentacle_2.setPos(0.0F, -7.0F, 4.5F); 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); tentacle_center_3.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_3); model.addChild(tentacle_center_3);
setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F);
tentacle_3 = new ModelPart(this); tentacle_3 = new ModelPart(this);
tentacle_3.setPos(0.0F, -7.0F, 4.5F); 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); tentacle_center_4.setPos(0.0F, 0.0F, 0.0F);
model.addChild(tentacle_center_4); model.addChild(tentacle_center_4);
setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F);
tentacle_4 = new ModelPart(this); tentacle_4 = new ModelPart(this);
tentacle_4.setPos(0.0F, -7.0F, 4.5F); tentacle_4.setPos(0.0F, -7.0F, 4.5F);
tentacle_center_4.addChild(tentacle_4); 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); 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;
}
@Override /* texWidth = 48;
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { texHeight = 48; */
matrices.pushPose(); return LayerDefinition.create(modelData, 48, 48);
matrices.scale(scaleXZ, scaleY, scaleXZ); }
model.render(matrices, vertices, light, overlay);
matrices.popPose(); 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 com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart; 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.client.renderer.RenderType;
import ru.betterend.entity.DragonflyEntity; import ru.betterend.entity.DragonflyEntity;
public class DragonflyEntityModel extends BlockBenchModel<DragonflyEntity> { public class DragonflyEntityModel extends BlockBenchModel<DragonflyEntity> {
private final ModelPart model; private final ModelPart model;
private final ModelPart head; private final ModelPart head;
private final ModelPart tail; private final ModelPart tail;
private final ModelPart tail_2; private final ModelPart tail_2;
private final ModelPart wing_1; private final ModelPart wing_1;
private final ModelPart wing_2; private final ModelPart wing_2;
private final ModelPart wing_3; private final ModelPart wing_3;
private final ModelPart wing_4; private final ModelPart wing_4;
private final ModelPart legs_1; private final ModelPart legs_1;
private final ModelPart legs_2; private final ModelPart legs_2;
public DragonflyEntityModel() { public static LayerDefinition getTexturedModelData() {
super(RenderType::entityCutout); MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
texWidth = 64; PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
texHeight = 64; .texOffs(0, 0)
.addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F),
model = new ModelPart(this); PartPose.offset(2.0F, 21.5F, -4.0F));
/*model = new ModelPart(this);
model.setPos(2.0F, 21.5F, -4.0F); 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); head.setPos(-2.0F, -2.0F, 0.0F);
model.addChild(head); model.addChild(head);
setRotationAngle(head, 0.3491F, 0.0F, 0.0F); 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 = new ModelPart(this);
tail.setPos(-2.0F, -2.0F, 9.0F); tail.setPos(-2.0F, -2.0F, 9.0F);
model.addChild(tail); model.addChild(tail);
tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); 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 = new ModelPart(this);
tail_2.setPos(0.0F, 0.0F, 7.0F); tail_2.setPos(0.0F, 0.0F, 7.0F);
tail.addChild(tail_2); tail.addChild(tail_2);
tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); 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); wing_1.setPos(-2.0F, -4.0F, 4.0F);
model.addChild(wing_1); 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); wing_2.setPos(-2.0F, -4.0F, 4.0F);
model.addChild(wing_2); model.addChild(wing_2);
wing_2.mirror = true; 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); wing_3.setPos(-2.0F, -4.0F, 8.0F);
model.addChild(wing_3); 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); bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, CubeListBuilder.create()
wing_4.setPos(-2.0F, -4.0F, 8.0F); .mirror()
model.addChild(wing_4); .texOffs(4, 17)
wing_4.mirror = true; .addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F),
wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.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); bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create()
legs_1.setPos(-1.0F, 0.0F, 1.0F); .texOffs(50, 1)
model.addChild(legs_1); .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F),
setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F,
legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.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); bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create()
legs_2.setPos(-3.0F, 0.0F, 1.0F); .texOffs(50, 1)
model.addChild(legs_2); .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F),
setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F,
legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.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, texWidth = 64;
float headYaw, float headPitch) { texHeight = 64;
float progress = animationProgress * 2F; */
return LayerDefinition.create(modelData, 64, 64);
}
wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; public DragonflyEntityModel(ModelPart modelPart) {
wing_2.zRot = -wing_1.zRot; super(RenderType::entityCutout);
wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; model = modelPart.getChild(PartNames.BODY);
wing_4.zRot = -wing_3.zRot; 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; wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F;
tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; wing_2.zRot = -wing_1.zRot;
tail_2.xRot = -tail.xRot * 1.5F;
}
@Override wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F;
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, wing_4.zRot = -wing_3.zRot;
float green, float blue, float alpha) {
model.render(matrices, vertices, light, overlay); 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 com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart; 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.client.renderer.RenderType;
import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.EndFishEntity;
@ -15,47 +21,91 @@ public class EndFishEntityModel extends BlockBenchModel<EndFishEntity> {
private final ModelPart fin_right; private final ModelPart fin_right;
private final ModelPart fin_left; private final ModelPart fin_left;
public EndFishEntityModel() { public static LayerDefinition getTexturedModelData() {
super(RenderType::entityCutout); MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
texWidth = 32; PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
texHeight = 32; .texOffs(0, 0)
.addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F),
model = new ModelPart(this); PartPose.offset(0.0F, 20.0F, 0.0F));
/*model = new ModelPart(this);
model.setPos(0.0F, 20.0F, 0.0F); 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); modelPartData.addOrReplaceChild(PartNames.TOP_FIN, CubeListBuilder.create()
fin_top.setPos(0.0F, -2.0F, -4.0F); .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); model.addChild(fin_top);
setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); 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); fin_bottom.setPos(0.0F, 2.0F, -4.0F);
model.addChild(fin_bottom); model.addChild(fin_bottom);
setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); 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); flipper.setPos(0.0F, 0.0F, 2.0F);
model.addChild(flipper); model.addChild(flipper);
setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); 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); fin_right.setPos(-1.0F, 0.0F, -1.0F);
model.addChild(fin_right); model.addChild(fin_right);
setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); 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); fin_left.setPos(1.0F, 0.0F, -1.0F);
model.addChild(fin_left); model.addChild(fin_left);
setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); 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 @Override
public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) { float headYaw, float headPitch) {

View file

@ -5,38 +5,94 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.ListModel; 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.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.client.renderer.RenderType;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.EndSlimeEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T> { public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T> {
private final ModelPart flower;
private final ModelPart crop;
private final ModelPart innerCube; private final ModelPart innerCube;
private final ModelPart rightEye; private final ModelPart rightEye;
private final ModelPart leftEye; private final ModelPart leftEye;
private final ModelPart mouth; private final ModelPart mouth;
private final ModelPart flower;
private final ModelPart crop;
public EndSlimeEntityModel(boolean onlyShell) { public static LayerDefinition getShellOnlyTexturedModelData() {
super(RenderType::entityCutout); return getTexturedModelData(true);
}
public static LayerDefinition getCompleteTexturedModelData() {
return getTexturedModelData(false);
}
this.innerCube = new ModelPart(this, 0, 16); private static LayerDefinition getTexturedModelData(boolean onlyShell) {
this.rightEye = new ModelPart(this, 32, 0); MeshDefinition modelData = new MeshDefinition();
this.leftEye = new ModelPart(this, 32, 4); PartDefinition modelPartData = modelData.getRoot();
this.mouth = new ModelPart(this, 32, 8);
this.flower = new ModelPart(this);
this.crop = new ModelPart(this);
//this.innerCube = new ModelPart(this, 0, 16);
if (onlyShell) { if (onlyShell) {
this.innerCube.texOffs(0, 0); modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); .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 { } else {
this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); .texOffs(0, 16)
this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); .addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F),
this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.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++) { for (int i = 0; i < 4; i++) {
ModelPart petalRot = new ModelPart(this); ModelPart petalRot = new ModelPart(this);
petalRot.yRot = MHelper.degreesToRadians(i * 45F); petalRot.yRot = MHelper.degreesToRadians(i * 45F);
@ -48,6 +104,7 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
this.flower.addChild(petalRot); this.flower.addChild(petalRot);
petalRot.addChild(petal); petalRot.addChild(petal);
} }
this.crop = new ModelPart(this);
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
ModelPart petalRot = new ModelPart(this); ModelPart petalRot = new ModelPart(this);
@ -60,6 +117,30 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
this.crop.addChild(petalRot); this.crop.addChild(petalRot);
petalRot.addChild(petal); 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); crop.render(matrices, vertices, light, overlay);
} }
private boolean isOnlyShell(){
return rightEye==null;
}
@Override @Override
public Iterable<ModelPart> parts() { 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 com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.geom.ModelPart; 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.client.renderer.RenderType;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import ru.betterend.entity.SilkMothEntity; import ru.betterend.entity.SilkMothEntity;
public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> { public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> {
private final ModelPart legsL; private final ModelPart legsL;
private final ModelPart cube_r1; private final ModelPart cube_r1;
private final ModelPart cube_r2; private final ModelPart cube_r2;
private final ModelPart cube_r3; private final ModelPart cube_r3;
private final ModelPart legsR; private final ModelPart legsR;
private final ModelPart cube_r4; private final ModelPart cube_r4;
private final ModelPart cube_r5; private final ModelPart cube_r5;
private final ModelPart cube_r6; private final ModelPart cube_r6;
private final ModelPart head_pivot; private final ModelPart head_pivot;
private final ModelPart tendril_r_r1; private final ModelPart tendril_r_r1;
private final ModelPart tendril_r_r2; private final ModelPart tendril_r_r2;
private final ModelPart bb_main; private final ModelPart bb_main;
private final ModelPart wingR_r1; private final ModelPart wingR_r1;
private final ModelPart wingL_r1; private final ModelPart wingL_r1;
private final ModelPart abdomen_r1; private final ModelPart abdomen_r1;
public SilkMothEntityModel() { public static LayerDefinition getTexturedModelData() {
super(RenderType::entityCutout); MeshDefinition modelData = new MeshDefinition();
PartDefinition modelPartData = modelData.getRoot();
texWidth = 64; PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create()
texHeight = 64; .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); legsL.setPos(1.5F, 19.9F, -0.45F);
setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); 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); abdomen_r1.setPos(1.0F, -3.9F, 0.0F);
bb_main.addChild(abdomen_r1); bb_main.addChild(abdomen_r1);
setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); 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 @Override
public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress,
float headYaw, float headPitch) { float headYaw, float headPitch) {
wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F;
wingL_r1.zRot = -wingR_r1.zRot; wingL_r1.zRot = -wingR_r1.zRot;
head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; 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_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F;
tendril_r_r2.zRot = -tendril_r_r1.zRot; tendril_r_r2.zRot = -tendril_r_r1.zRot;
abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F;
legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F;
legsL.zRot = -legsR.zRot; legsL.zRot = -legsR.zRot;
} }
@Override @Override
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
float green, float blue, float alpha) { float green, float blue, float alpha) {
bb_main.render(matrices, vertices, light, overlay); bb_main.render(matrices, vertices, light, overlay);
head_pivot.render(matrices, vertices, light, overlay); head_pivot.render(matrices, vertices, light, overlay);
legsL.render(matrices, vertices, light, overlay); legsL.render(matrices, vertices, light, overlay);
legsR.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.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; 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.MobRenderer;
import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -13,13 +13,14 @@ import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.CubozoaEntity;
import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityCubozoa extends MobRenderer<CubozoaEntity, CubozoaEntityModel> { public class RendererEntityCubozoa extends MobRenderer<CubozoaEntity, CubozoaEntityModel> {
private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; private static final ResourceLocation[] TEXTURE = new ResourceLocation[2];
private static final RenderType[] GLOW = new RenderType[2]; private static final RenderType[] GLOW = new RenderType[2];
public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { public RendererEntityCubozoa(EntityRendererProvider.Context ctx) {
super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.CUBOZOA_MODEL)), 0.5f);
this.addLayer(new EyesLayer<CubozoaEntity, CubozoaEntityModel>(this) { this.addLayer(new EyesLayer<CubozoaEntity, CubozoaEntityModel>(this) {
@Override @Override
public RenderType renderType() { 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.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher; 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.MobRenderer;
import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.entity.DragonflyEntity; import ru.betterend.entity.DragonflyEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.entity.model.DragonflyEntityModel; import ru.betterend.entity.model.DragonflyEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityDragonfly extends MobRenderer<DragonflyEntity, DragonflyEntityModel> { public class RendererEntityDragonfly extends MobRenderer<DragonflyEntity, DragonflyEntityModel> {
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); 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")); private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png"));
public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { public RendererEntityDragonfly(EntityRendererProvider.Context ctx) {
super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f);
this.addLayer(new EyesLayer<DragonflyEntity, DragonflyEntityModel>(this) { this.addLayer(new EyesLayer<DragonflyEntity, DragonflyEntityModel>(this) {
@Override @Override
public RenderType renderType() { 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.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher; 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.MobRenderer;
import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.EndFishEntity;
import ru.betterend.entity.model.DragonflyEntityModel;
import ru.betterend.entity.model.EndFishEntityModel; import ru.betterend.entity.model.EndFishEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityEndFish extends MobRenderer<EndFishEntity, EndFishEntityModel> { public class RendererEntityEndFish extends MobRenderer<EndFishEntity, EndFishEntityModel> {
private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS];
private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS]; private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS];
public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { public RendererEntityEndFish(EntityRendererProvider.Context ctx) {
super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); super(ctx, new EndFishEntityModel(ctx.bakeLayer(EndEntitiesRenders.END_FISH_MODEL)), 0.5f);
this.addLayer(new EyesLayer<EndFishEntity, EndFishEntityModel>(this) { this.addLayer(new EyesLayer<EndFishEntity, EndFishEntityModel>(this) {
@Override @Override
public RenderType renderType() { 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.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.*;
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.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.EndSlimeEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.entity.model.EndSlimeEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> { public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> {
private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final ResourceLocation TEXTURE[] = new ResourceLocation[4];
private static final RenderType GLOW[] = new RenderType[4]; private static final RenderType GLOW[] = new RenderType[4];
public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { public RendererEntityEndSlime(EntityRendererProvider.Context ctx) {
super(entityRenderDispatcher, new EndSlimeEntityModel<EndSlimeEntity>(false), 0.25F); super(ctx, new EndSlimeEntityModel<>(ctx.getModelSet(), false), 0.25f);
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this)); this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this, ctx));
this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) { this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) {
@Override @Override
public RenderType renderType() { public RenderType renderType() {
@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
private final class OverlayFeatureRenderer<T extends EndSlimeEntity> private final class OverlayFeatureRenderer<T extends EndSlimeEntity>
extends RenderLayer<T, EndSlimeEntityModel<T>> { extends RenderLayer<T, EndSlimeEntityModel<T>> {
private final EndSlimeEntityModel<T> modelOrdinal = new EndSlimeEntityModel<T>(true); private final EndSlimeEntityModel<T> modelOrdinal;
private final EndSlimeEntityModel<T> modelLake = new EndSlimeEntityModel<T>(true); private final EndSlimeEntityModel<T> modelLake;
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext) { public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext, EntityRendererProvider.Context ctx) {
super(featureRendererContext); 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, public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity,

View file

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

View file

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

View file

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

View file

@ -54,7 +54,7 @@ public class NightshadeRedwoods extends EndBiome {
}); });
for (MobCategory group: MobCategory.values()) { for (MobCategory group: MobCategory.values()) {
List<SpawnerData> list = biome.getMobSettings().getMobs(group); List<SpawnerData> list = biome.getMobSettings().getMobs(group).unwrap();
list.forEach((entry) -> { list.forEach((entry) -> {
def.addMobSpawn(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.block.Block;
import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; 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.BCLib;
import ru.bclib.world.biomes.BCLBiomeDef; import ru.bclib.world.biomes.BCLBiomeDef;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
@ -24,6 +26,14 @@ import ru.betterend.integration.byg.features.BYGFeatures;
import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndFeatures;
import ru.betterend.world.biome.EndBiome; 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 class OldBulbisGardens extends EndBiome {
public OldBulbisGardens() { public OldBulbisGardens() {
super(makeDef()); super(makeDef());
@ -54,7 +64,7 @@ public class OldBulbisGardens extends EndBiome {
} }
for (MobCategory group: MobCategory.values()) { for (MobCategory group: MobCategory.values()) {
List<SpawnerData> list = biome.getMobSettings().getMobs(group); List<SpawnerData> list = biome.getMobSettings().getMobs(group).unwrap();
list.forEach((entry) -> { list.forEach((entry) -> {
def.addMobSpawn(entry); def.addMobSpawn(entry);
}); });
@ -70,7 +80,7 @@ public class OldBulbisGardens extends EndBiome {
getter = vegetal.get(i); getter = vegetal.get(i);
ConfiguredFeature<?, ?> feature = getter.get(); ConfiguredFeature<?, ?> feature = getter.get();
ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); 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); def.addFeature(Decoration.VEGETAL_DECORATION, feature);
} }
// Grasses and other features // 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.WorldGenLevel;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator; 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.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.Material;
import ru.bclib.api.TagAPI; import ru.bclib.api.TagAPI;
@ -21,8 +22,11 @@ import ru.betterend.integration.Integrations;
public class BigEtherTreeFeature extends DefaultFeature { public class BigEtherTreeFeature extends DefaultFeature {
@Override @Override
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) 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; return false;
BlockState log = Integrations.BYG.getDefaultState("ether_log"); 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.LeavesBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator; 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.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.Material;
import ru.bclib.api.TagAPI; import ru.bclib.api.TagAPI;
@ -35,9 +36,11 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
private static final List<Vector3f> BRANCH; private static final List<Vector3f> BRANCH;
@Override @Override
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
NoneFeatureConfiguration config) { final Random random = featureConfig.random();
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) final BlockPos pos = featureConfig.origin();
final WorldGenLevel world = featureConfig.level();
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
return false; return false;
BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); 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.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator; 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.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
@ -36,11 +37,13 @@ public class OldBulbisTreeFeature extends DefaultFeature {
private static final List<Vector3f> SIDE; private static final List<Vector3f> SIDE;
@Override @Override
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
NoneFeatureConfiguration config) { final Random random = featureConfig.random();
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) final BlockPos pos = featureConfig.origin();
final WorldGenLevel world = featureConfig.level();
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
return false; 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; return false;
BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem");

View file

@ -1,44 +1,46 @@
package ru.betterend.integration.rei; 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.text.DecimalFormat;
import java.util.List; import java.util.List;
import org.jetbrains.annotations.NotNull; public class REIAlloyingCategory implements TransferDisplayCategory<REIAlloyingDisplay> {
private final EntryStack ICON;
import com.google.common.collect.Lists; REIAlloyingCategory(EntryStack icon){
import com.mojang.blaze3d.vertex.PoseStack; ICON = icon;
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;
} }
@Override @Override
public @NotNull String getCategoryName() { public @NotNull CategoryIdentifier getCategoryIdentifier() {
return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); return REIPlugin.ALLOYING;
}
@Override
public @NotNull Component getTitle() {
return new TranslatableComponent(EndBlocks.END_STONE_SMELTER.getDescriptionId());
} }
@Override @Override
public @NotNull EntryStack getLogo() { public @NotNull EntryStack getIcon() {
return REIPlugin.END_STONE_SMELTER; return ICON;
} }
@Override @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), 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)); 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)); 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()); widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput());
if (inputEntries.size() > 1) { if (inputEntries.size() > 1) {
widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput());
} else { } 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 + 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; return widgets;
} }
@ -77,11 +79,6 @@ public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDi
matrices.popPose(); matrices.popPose();
} }
@Override
public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) {
return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries());
}
@Override @Override
public int getDisplayHeight() { public int getDisplayHeight() {
return 49; return 49;

View file

@ -1,79 +1,68 @@
package ru.betterend.integration.rei; 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.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull; public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
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 {
private static List<EntryStack> fuel; private static List<EntryStack> fuel;
private Recipe<?> recipe; private Recipe<?> recipe;
private List<List<EntryStack>> input;
private List<EntryStack> output;
private float xp; private float xp;
private double smeltTime; private double smeltTime;
public REIAlloyingDisplay(AlloyingRecipe recipe) { public REIAlloyingDisplay(AlloyingRecipe recipe) {
this.recipe = recipe; this(recipe, recipe.getExperience(), recipe.getSmeltTime());
this.input = EntryStack.ofIngredients(recipe.getIngredients());
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
this.xp = recipe.getExperience();
this.smeltTime = recipe.getSmeltTime();
} }
protected REIAlloyingDisplay(Recipe<?> recipe, float xp, double smeltTime) {
public REIAlloyingDisplay(BlastingRecipe recipe) { super(
EntryIngredients.ofIngredients(recipe.getIngredients()),
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
);
this.recipe = recipe; this.recipe = recipe;
this.input = EntryStack.ofIngredients(recipe.getIngredients()); this.xp = xp;
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.smeltTime = smeltTime;
this.xp = recipe.getExperience();
this.smeltTime = recipe.getCookingTime();
} }
public static List<EntryStack> getFuel() { public static List<EntryStack> getFuel() {
return fuel; return fuel;
} }
@Override @Override
public @NotNull Optional<ResourceLocation> getRecipeLocation() { public @NotNull Optional<ResourceLocation> getDisplayLocation() {
return Optional.ofNullable(recipe).map(Recipe::getId); 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 @Override
public @NotNull ResourceLocation getRecipeCategory() { public CategoryIdentifier<?> getCategoryIdentifier() {
return AlloyingRecipe.ID; return REIPlugin.ALLOYING;
} }
@Override // @Override
public @NotNull List<List<EntryStack>> getRequiredEntries() { // public @NotNull List<List<EntryStack>> getRequiredEntries() {
return this.input; // return this.input;
} // }
public float getXp() { public float getXp() {
return this.xp; return this.xp;
@ -97,14 +86,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay {
return 1; return 1;
} }
@Override // @Override
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) { // public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
return this.input; // return this.input;
} // }
static { static {
fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() 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") .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel")
.withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList()); .withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList());
} }

View file

@ -1,40 +1,39 @@
package ru.betterend.integration.rei; 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.text.DecimalFormat;
import java.util.List; import java.util.List;
import org.jetbrains.annotations.NotNull; public class REIAlloyingFuelCategory implements DisplayCategory<REIAlloyingFuelDisplay> {
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> {
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##");
@Override @Override
public @NotNull ResourceLocation getIdentifier() { public @NotNull CategoryIdentifier getCategoryIdentifier() {
return REIPlugin.ALLOYING_FUEL; return REIPlugin.ALLOYING_FUEL;
} }
@Override @Override
public @NotNull String getCategoryName() { public @NotNull Component getTitle() {
return I18n.get("category.rei.fuel"); return new TranslatableComponent("category.rei.fuel");
} }
@Override @Override
@ -43,12 +42,12 @@ public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDi
} }
@Override @Override
public @NotNull EntryStack getLogo() { public @NotNull EntryStack getIcon() {
return EntryStack.create(Items.COAL); return EntryStacks.of(Items.COAL);
} }
@Override @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); Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17);
String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime());
List<Widget> widgets = Lists.newArrayList(); List<Widget> widgets = Lists.newArrayList();
@ -61,10 +60,10 @@ public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDi
} }
@Override @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(); Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight();
String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); 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); private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems);
@Override @Override

View file

@ -1,35 +1,31 @@
package ru.betterend.integration.rei; 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.Collections;
import java.util.List; import java.util.List;
import org.jetbrains.annotations.NotNull; public class REIAlloyingFuelDisplay extends BasicDisplay {
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;
private final int fuelTime; private final int fuelTime;
public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { public REIAlloyingFuelDisplay(List<EntryIngredient> fuel, CompoundTag tag) {
this.fuel = fuel; this(fuel, tag.getInt("fuelTime"));
}
public REIAlloyingFuelDisplay(List<EntryIngredient> fuel, int fuelTime) {
super(fuel, Collections.emptyList());
this.fuelTime = fuelTime; this.fuelTime = fuelTime;
} }
/*public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) {
this.fuel = fuel;
this.fuelTime = fuelTime;
}*/
@Override @Override
public @NotNull List<List<EntryStack>> getInputEntries() { public CategoryIdentifier<?> getCategoryIdentifier() {
return Collections.singletonList(Collections.singletonList(fuel));
}
@Override
public @NotNull List<List<EntryStack>> getResultingEntries() {
return Collections.emptyList();
}
@Override
public @NotNull ResourceLocation getRecipeCategory() {
return REIPlugin.ALLOYING_FUEL; return REIPlugin.ALLOYING_FUEL;
} }

View file

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

View file

@ -1,29 +1,27 @@
package ru.betterend.integration.rei; package ru.betterend.integration.rei;
import java.util.Collections; import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import java.util.List; import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
import java.util.Optional; import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.util.EntryIngredients;
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.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import org.jetbrains.annotations.NotNull;
import ru.betterend.recipe.builders.AnvilRecipe; 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 AnvilRecipe recipe;
private final List<List<EntryStack>> input;
private final List<EntryStack> output;
public REIAnvilDisplay(AnvilRecipe recipe) { public REIAnvilDisplay(AnvilRecipe recipe) {
super(
EntryIngredients.ofIngredients(recipe.getIngredients()),
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
);
this.recipe = recipe; this.recipe = recipe;
this.input = EntryStack.ofIngredients(recipe.getIngredients());
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
} }
public int getDamage() { public int getDamage() {
@ -37,31 +35,21 @@ public class REIAnvilDisplay implements TransferRecipeDisplay {
public int getAnvilLevel() { public int getAnvilLevel() {
return recipe.getAnvilLevel(); return recipe.getAnvilLevel();
} }
@Override @Override
public @NotNull Optional<ResourceLocation> getRecipeLocation() { public @NotNull Optional<ResourceLocation> getDisplayLocation() {
return Optional.ofNullable(recipe).map(Recipe::getId); return Optional.ofNullable(recipe).map(Recipe::getId);
} }
@Override @Override
public @NotNull List<List<EntryStack>> getInputEntries() { public CategoryIdentifier<?> getCategoryIdentifier() {
return this.input;
}
@Override
public @NotNull List<List<EntryStack>> getResultingEntries() {
return Collections.singletonList(output);
}
@Override
public @NotNull ResourceLocation getRecipeCategory() {
return REIPlugin.SMITHING; return REIPlugin.SMITHING;
} }
@Override // @Override
public @NotNull List<List<EntryStack>> getRequiredEntries() { // public @NotNull List<List<EntryStack>> getRequiredEntries() {
return input; // return input;
} // }
@Override @Override
public int getWidth() { public int getWidth() {
@ -73,9 +61,9 @@ public class REIAnvilDisplay implements TransferRecipeDisplay {
return 1; return 1;
} }
@Override // @Override
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, // public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo,
AbstractContainerMenu container) { // AbstractContainerMenu container) {
return input; // 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; 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.client.gui.EndStoneSmelterScreenHandler;
import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AlloyingRecipe;
@ -9,6 +7,6 @@ public class REIContainer implements Runnable {
@Override @Override
public void run() { 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; package ru.betterend.integration.rei;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.Point; import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle; import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.TransferRecipeCategory; import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.gui.widget.Widget; 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.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Items;
import org.jetbrains.annotations.NotNull;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.recipe.builders.InfusionRecipe;
import ru.betterend.registry.EndBlocks; 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 static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png");
private final EntryStack ICON;
@Override REIInfusionCategory(EntryStack icon){
public @NotNull ResourceLocation getIdentifier() { ICON = icon;
return InfusionRecipe.ID;
} }
@Override @Override
public @NotNull String getCategoryName() { public @NotNull CategoryIdentifier getCategoryIdentifier() {
return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); return REIPlugin.INFUSION;
}
@Override
public @NotNull Component getTitle() {
return new TranslatableComponent(EndBlocks.INFUSION_PEDESTAL.getDescriptionId());
} }
@Override @Override
public @NotNull EntryStack getLogo() { public @NotNull EntryStack getIcon() {
return REIPlugin.INFUSION_RITUAL; return ICON;
}
@Override
public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) {
return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries());
} }
@Override @Override
public @NotNull List<Widget> setupDisplay(REIInfusionDisplay display, Rectangle bounds) { public @NotNull List<Widget> setupDisplay(REIInfusionDisplay display, Rectangle bounds) {
Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2);
List<Widget> widgets = Lists.newArrayList(); List<Widget> widgets = Lists.newArrayList();
widgets.add(Widgets.createRecipeBase(bounds)); widgets.add(Widgets.createRecipeBase(bounds));
List<List<EntryStack>> inputEntries = display.getInputEntries(); List<EntryIngredient> inputEntries = display.getInputEntries();
List<List<EntryStack>> outputEntries = display.getResultingEntries(); List<EntryIngredient> outputEntries = display.getOutputEntries();
widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); 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(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput());
widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).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)); .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
return widgets; return widgets;
} }
@Override
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds,
REIInfusionDisplay display, IntList redSlots) {}
@Override @Override
public int getDisplayHeight() { public int getDisplayHeight() {
return 104; 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; package ru.betterend.integration.rei;
import java.util.Collections; import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import java.util.List; import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
import java.util.Optional; import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.util.EntryIngredients;
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 net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import ru.betterend.recipe.builders.AlloyingRecipe; import org.jetbrains.annotations.NotNull;
import ru.betterend.recipe.builders.InfusionRecipe; 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 InfusionRecipe recipe;
private final List<List<EntryStack>> input;
private final List<EntryStack> output;
private final int time; private final int time;
public REIInfusionDisplay(InfusionRecipe recipe) { public REIInfusionDisplay(InfusionRecipe recipe) {
super(
EntryIngredients.ofIngredients(recipe.getIngredients()),
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
);
this.recipe = recipe; this.recipe = recipe;
this.input = Lists.newArrayList();
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
this.time = recipe.getInfusionTime(); this.time = recipe.getInfusionTime();
recipe.getIngredients().forEach(ingredient -> {
input.add(EntryStack.ofIngredient(ingredient));
});
} }
public int getInfusionTime() { public int getInfusionTime() {
@ -40,29 +31,19 @@ public class REIInfusionDisplay implements TransferRecipeDisplay {
} }
@Override @Override
public @NotNull Optional<ResourceLocation> getRecipeLocation() { public @NotNull Optional<ResourceLocation> getDisplayLocation() {
return Optional.ofNullable(recipe).map(Recipe::getId); return Optional.ofNullable(recipe).map(Recipe::getId);
} }
@Override @Override
public @NotNull List<List<EntryStack>> getInputEntries() { public CategoryIdentifier<?> getCategoryIdentifier() {
return this.input; return REIPlugin.INFUSION;
} }
@Override // @Override
public @NotNull List<List<EntryStack>> getResultingEntries() { // public @NotNull List<List<EntryStack>> getRequiredEntries() {
return Collections.singletonList(output); // return this.input;
} // }
@Override
public @NotNull ResourceLocation getRecipeCategory() {
return AlloyingRecipe.ID;
}
@Override
public @NotNull List<List<EntryStack>> getRequiredEntries() {
return this.input;
}
@Override @Override
public int getWidth() { public int getWidth() {
@ -74,8 +55,8 @@ public class REIInfusionDisplay implements TransferRecipeDisplay {
return 0; return 0;
} }
@Override // @Override
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) { // public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
return this.input; // return this.input;
} //}
} }

View file

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

View file

@ -1,5 +1,8 @@
package ru.betterend.interfaces; package ru.betterend.interfaces;
import net.minecraft.world.entity.Entity;
public interface ISlime { public interface ISlime {
public void be_setSlimeSize(int size, boolean heal); 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) @Environment(EnvType.CLIENT)
public void registerModelPredicate() { public void registerModelPredicate() {
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), 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 @Override
public void registerModelPredicate() { public void registerModelPredicate() {
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), 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; 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.client.renderer.block.model.BlockModel;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -25,6 +27,7 @@ public class EnchantedItem extends ModelProviderItem {
} }
@Override @Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) { public BlockModel getItemModel(ResourceLocation resourceLocation) {
ResourceLocation sourceId = Registry.ITEM.getKey(source); ResourceLocation sourceId = Registry.ITEM.getKey(source);
return ModelsHelper.createItemModel(sourceId); return ModelsHelper.createItemModel(sourceId);

View file

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

View file

@ -1,13 +1,14 @@
package ru.betterend.item; package ru.betterend.item;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.entity.EntityType; 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 net.minecraft.world.level.material.Fluids;
import ru.bclib.client.models.ItemModelProvider; import ru.bclib.client.models.ItemModelProvider;
import ru.betterend.registry.EndItems; import ru.betterend.registry.EndItems;
public class EndBucketItem extends FishBucketItem implements ItemModelProvider { public class EndBucketItem extends MobBucketItem implements ItemModelProvider {
public EndBucketItem(EntityType<?> type) { 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.AgeableListModel;
import net.minecraft.client.model.geom.ModelPart; 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.client.player.AbstractClientPlayer;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.Vec3; 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 rightWing;
private final ModelPart leftWing; private final ModelPart leftWing;
public ArmoredElytraModel() { public static LayerDefinition getTexturedModelData() {
this.leftWing = new ModelPart(this, 22, 0); MeshDefinition modelData = new MeshDefinition();
this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); PartDefinition modelPartData = modelData.getRoot();
this.rightWing = new ModelPart(this, 22, 0); modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create()
this.rightWing.mirror = true; .texOffs(22, 0)
this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); .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() { protected Iterable<ModelPart> headParts() {

View file

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

View file

@ -5,23 +5,58 @@ import java.util.Collections;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import net.minecraft.client.model.HumanoidModel; 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.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class CrystaliteBootsModel extends HumanoidModel<LivingEntity> { public class CrystaliteBootsModel extends HumanoidModel<LivingEntity> {
public ModelPart leftBoot; public ModelPart leftBoot;
public ModelPart rightBoot; 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) { public CrystaliteBootsModel(ModelPart modelPart) {
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); super(modelPart, RenderType::entityTranslucent);
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); leftBoot = modelPart.getChild("leftBoot");
this.leftBoot.setPos(1.9F, 12.0F, 0.0F); rightBoot = modelPart.getChild("rightBoot");
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);
} }
@Override @Override

View file

@ -6,40 +6,95 @@ import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.HumanoidModel; 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.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.client.renderer.RenderType;
import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> { public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
public ModelPart leftShoulder; public ModelPart leftShoulder;
public ModelPart rightShoulder; public ModelPart rightShoulder;
private final boolean thinArms; private final boolean thinArms;
public CrystaliteChestplateModel(float scale, boolean thinArms) { public static LayerDefinition getRegularTexturedModelData(){
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); return getTexturedModelData(1.0f, false);
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); public static LayerDefinition getThinTexturedModelData(){
this.body.setPos(0.0F, 0.0F, 0.0F); 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) { if (thinArms) {
this.leftShoulder = new ModelPart(this, 41, 32); deformation = new CubeDeformation(scale + 0.45F);
this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create()
this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); .mirror()
this.leftShoulder.mirror = true; .texOffs(40, 32)
this.rightShoulder = new ModelPart(this, 41, 16); .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); PartPose.offset(5.0f, 2.0f, 0.0f));
this.rightShoulder.setPos(-5.0F, 2.5F, 10.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 { } else {
this.leftShoulder = new ModelPart(this, 40, 32); deformation = new CubeDeformation(scale + 0.45F);
this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create()
this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); .mirror()
this.leftShoulder.mirror = true; .texOffs(40, 32)
this.rightShoulder = new ModelPart(this, 40, 16); .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); PartPose.offset(5.0f, 2.0f, 0.0f));
this.rightShoulder.setPos(-5.0F, 2.0F, 10.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 @Override
@ -56,7 +111,7 @@ public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
@Override @Override
protected Iterable<ModelPart> bodyParts() { protected Iterable<ModelPart> bodyParts() {
return Lists.newArrayList(body, leftShoulder, rightShoulder); return Lists.newArrayList(localBody, leftShoulder, rightShoulder);
} }
@Override @Override

View file

@ -7,18 +7,53 @@ import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.model.HumanoidModel; 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.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.client.renderer.RenderType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
import shadow.fabric.impl.client.rendering.ArmorProviderExtensions;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class CrystaliteHelmetModel extends HumanoidModel<LivingEntity> { 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) { // TODO: see if we need to subclass HumanoidModel
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); // Humanoid model tries to retrieve all parts in it's constructor,
this.hat = new ModelPart(this, 0, 0); // so we need to add empty Nodes
this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
this.hat.setPos(0.0F, 0.0F, 0.0F); //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 @Override
@ -28,6 +63,6 @@ public class CrystaliteHelmetModel extends HumanoidModel<LivingEntity> {
@Override @Override
protected Iterable<ModelPart> bodyParts() { 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 com.google.common.collect.Lists;
import net.minecraft.client.model.HumanoidModel; 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.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.client.renderer.RenderType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import ru.betterend.registry.EndEntitiesRenders;
public class CrystaliteLeggingsModel extends HumanoidModel<LivingEntity> { 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) { // TODO: see if we need to subclass HumanoidModel
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); // Humanoid model tries to retrieve all parts in it's constructor,
this.body = new ModelPart(this, 16, 16); // so we need to add empty Nodes
this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
this.body.setPos(0.0F, 0.0F, 0.0F); modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
this.leftLeg = new ModelPart(this, 0, 32); // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
this.leftLeg.setPos(1.9F, 12.0F, 0.0F); modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
this.rightLeg = new ModelPart(this, 0, 16); // modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); // modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
this.rightLeg.setPos(-1.9F, 12.0F, 0.0F);
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 @Override
@ -31,6 +73,6 @@ public class CrystaliteLeggingsModel extends HumanoidModel<LivingEntity> {
@Override @Override
protected Iterable<ModelPart> bodyParts() { 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 com.google.common.collect.Sets;
import io.netty.util.internal.ThreadLocalRandom; 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.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool;
import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.Tag; import net.minecraft.tags.Tag;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlot;
@ -38,7 +41,8 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I
private final Multimap<Attribute, AttributeModifier> attributeModifiers; private final Multimap<Attribute, AttributeModifier> attributeModifiers;
public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { 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<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); 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 @Override
@Environment(EnvType.CLIENT)
public BlockModel getItemModel(ResourceLocation resourceLocation) { public BlockModel getItemModel(ResourceLocation resourceLocation) {
return ModelsHelper.createHandheldItem(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; 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.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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; import ru.betterend.client.render.ArmoredElytraLayer;
@Mixin(ArmorStandRenderer.class) @Mixin(ArmorStandRenderer.class)
public abstract class ArmorStandRendererMixin extends LivingEntityRenderer<ArmorStand, ArmorStandArmorModel> { public abstract class ArmorStandRendererMixin extends LivingEntityRenderer<ArmorStand, ArmorStandArmorModel> {
public ArmorStandRendererMixin(EntityRenderDispatcher entityRenderDispatcher, ArmorStandArmorModel entityModel, float f) { public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) {
super(entityRenderDispatcher, entityModel, f); super(context, entityModel, f);
} }
@Inject(method = "<init>*", at = @At("TAIL")) @Inject(method = "<init>*", at = @At("TAIL"))
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, CallbackInfo info) { public void be_addCustomLayer(EntityRendererProvider.Context context, CallbackInfo ci) {
addLayer(new ArmoredElytraLayer<>(this)); addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
} }
} }

View file

@ -1,5 +1,6 @@
package ru.betterend.mixin.client; package ru.betterend.mixin.client;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -18,6 +19,7 @@ import ru.bclib.client.gui.BlockSignEditScreen;
@Mixin(ClientPacketListener.class) @Mixin(ClientPacketListener.class)
public class ClientPlayNetworkHandlerMixin public class ClientPlayNetworkHandlerMixin
{ {
@Final
@Shadow @Shadow
private Minecraft minecraft; 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; 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.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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; import ru.betterend.client.render.ArmoredElytraLayer;
@Mixin(HumanoidMobRenderer.class) @Mixin(HumanoidMobRenderer.class)
public abstract class HumanoidMobRendererMixin<T extends Mob, M extends HumanoidModel<T>> extends MobRenderer<T, M> { public abstract class HumanoidMobRendererMixin<T extends Mob, M extends HumanoidModel<T>> extends MobRenderer<T, M> {
public HumanoidMobRendererMixin(EntityRenderDispatcher entityRenderDispatcher, M entityModel, float f) { public HumanoidMobRendererMixin(EntityRendererProvider.Context context, M entityModel, float f) {
super(entityRenderDispatcher, entityModel, f); super(context, entityModel, f);
} }
@Inject(method = "<init>*", at = @At("TAIL")) @Inject(method = "<init>(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Lnet/minecraft/client/model/HumanoidModel;FFFF)V", at = @At("TAIL"))
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, M humanoidModel, float f, float g, float h, float i, CallbackInfo info) { public void be_addCustomLayer(EntityRendererProvider.Context context, M humanoidModel, float f, float g, float h, float i, CallbackInfo ci) {
addLayer(new ArmoredElytraLayer<>(this)); addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
} }
} }

View file

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

View file

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