commit
62ba56eee6
212 changed files with 4343 additions and 1778 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -29,3 +29,5 @@ bin/
|
|||
run/
|
||||
output/
|
||||
*.log
|
||||
Convert.class
|
||||
ModelPart.class
|
||||
|
|
180
Convert.java
Normal file
180
Convert.java
Normal 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;
|
||||
}
|
||||
}
|
34
build.gradle
34
build.gradle
|
@ -20,7 +20,6 @@ group = project.maven_group
|
|||
|
||||
repositories {
|
||||
maven { url "https://maven.dblsaiko.net/" }
|
||||
maven { url "https://server.bbkr.space:8081/artifactory/libs-release/" }
|
||||
maven { url "https://maven.fabricmc.net/" }
|
||||
maven { url 'https://maven.blamejared.com' }
|
||||
maven { url "https://maven.shedaniel.me/" }
|
||||
|
@ -33,49 +32,56 @@ dependencies {
|
|||
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||
|
||||
useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}"
|
||||
useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}"
|
||||
useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}"
|
||||
|
||||
useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}"
|
||||
useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}"
|
||||
useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}"
|
||||
useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}"
|
||||
//useOptional "grondag:canvas-mc116:${project.canvas_version}"
|
||||
}
|
||||
|
||||
def useOptional(String dep) {
|
||||
dependencies.modRuntime (dep) {
|
||||
exclude group: "net.fabricmc.fabric-api"
|
||||
exclude group: "net.fabricmc"
|
||||
exclude group: 'net.fabricmc.fabric-api'
|
||||
exclude group: 'net.fabricmc'
|
||||
if (!dep.contains("me.shedaniel")) {
|
||||
exclude group: "me.shedaniel"
|
||||
exclude group: 'me.shedaniel.cloth'
|
||||
exclude group: 'me.shedaniel'
|
||||
}
|
||||
}
|
||||
dependencies.modCompileOnly (dep) {
|
||||
exclude group: "net.fabricmc.fabric-api"
|
||||
exclude group: "net.fabricmc"
|
||||
exclude group: 'net.fabricmc.fabric-api'
|
||||
exclude group: 'net.fabricmc'
|
||||
if (!dep.contains("me.shedaniel")) {
|
||||
exclude group: "me.shedaniel"
|
||||
exclude group: 'me.shedaniel.cloth'
|
||||
exclude group: 'me.shedaniel'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def useApi(String dep) {
|
||||
dependencies.modApi (dep) {
|
||||
exclude group: "net.fabricmc.fabric-api"
|
||||
exclude group: "net.fabricmc"
|
||||
exclude group: 'net.fabricmc.fabric-api'
|
||||
exclude group: 'net.fabricmc'
|
||||
if (!dep.contains("me.shedaniel")) {
|
||||
exclude group: "me.shedaniel"
|
||||
exclude group: 'me.shedaniel.cloth'
|
||||
exclude group: 'me.shedaniel'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
processResources {
|
||||
inputs.property "version", project.version
|
||||
duplicatesStrategy = 'WARN'
|
||||
duplicatesStrategy = 'EXCLUDE'
|
||||
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
include "fabric.mod.json"
|
||||
expand "version": project.version
|
||||
}
|
||||
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
exclude "fabric.mod.json"
|
||||
}
|
||||
}
|
||||
|
||||
// ensure that the encoding is set to UTF-8, no matter what the system default is
|
||||
|
|
|
@ -3,19 +3,19 @@ org.gradle.jvmargs=-Xmx2G
|
|||
|
||||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/use
|
||||
minecraft_version= 1.17
|
||||
minecraft_version= 1.17.1
|
||||
yarn_mappings= 6
|
||||
loader_version= 0.11.6
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 0.9.8-pre
|
||||
mod_version = 0.10.0-pre
|
||||
maven_group = ru.betterend
|
||||
archives_base_name = better-end
|
||||
|
||||
# Dependencies
|
||||
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
|
||||
patchouli_version = 50-FABRIC
|
||||
fabric_version = 0.35.2+1.17
|
||||
patchouli_version = 55-FABRIC-SNAPSHOT
|
||||
fabric_version = 0.36.1+1.17
|
||||
bclib_version = 0.2.0
|
||||
rei_version = 6.0.262-alpha
|
||||
canvas_version = 1.0.+
|
||||
bclib_version = 0.1.38
|
||||
rei_version = 6.0.251-alpha
|
|
@ -1,7 +1,5 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
|
@ -19,6 +17,8 @@ import net.minecraft.world.phys.shapes.CollisionContext;
|
|||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import ru.betterend.blocks.basis.EndUnderwaterPlantBlock;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class BubbleCoralBlock extends EndUnderwaterPlantBlock {
|
||||
|
||||
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16);
|
||||
|
|
|
@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable;
|
|||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
|
@ -57,6 +59,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
Map<String, String> textures = Maps.newHashMap();
|
||||
textures.put("%glow%", getGlowTexture());
|
||||
|
|
|
@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable;
|
|||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.client.resources.model.BlockModelRotation;
|
||||
|
@ -46,11 +48,13 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped,
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation blockId) {
|
||||
return ModelsHelper.createItemModel(blockId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
Optional<String> pattern;
|
||||
switch (blockState.getValue(FACING)) {
|
||||
|
@ -67,6 +71,7 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped,
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
|
||||
String state = "_wall";
|
||||
BlockModelRotation rotation = BlockModelRotation.X0_Y0;
|
||||
|
|
|
@ -6,6 +6,8 @@ import java.util.Random;
|
|||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.core.BlockPos;
|
||||
|
@ -85,6 +87,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation resourceLocation) {
|
||||
return getBlockModel(resourceLocation, defaultBlockState());
|
||||
}
|
||||
|
|
|
@ -94,7 +94,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
|
|||
if (exitPos == null) return;
|
||||
if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) {
|
||||
((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(),
|
||||
exitPos.getZ() + 0.5, entity.yRot, entity.xRot);
|
||||
exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot());
|
||||
} else {
|
||||
((TeleportingEntity) entity).be_setExitPos(exitPos);
|
||||
Optional<Entity> teleported = Optional.ofNullable(entity.changeDimension(destination));
|
||||
|
@ -114,7 +114,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I
|
|||
|
||||
private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) {
|
||||
if (targetWorld == null) return null;
|
||||
Registry<DimensionType> registry = targetWorld.registryAccess().dimensionTypes();
|
||||
Registry<DimensionType> registry = targetWorld.registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY);
|
||||
ResourceLocation targetWorldId = targetWorld.dimension().location();
|
||||
ResourceLocation currentWorldId = currentWorld.dimension().location();
|
||||
double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale();
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
|
@ -19,15 +15,11 @@ import net.minecraft.world.entity.player.Player;
|
|||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
|
||||
import net.minecraft.world.level.block.Mirror;
|
||||
import net.minecraft.world.level.block.RenderShape;
|
||||
import net.minecraft.world.level.block.Rotation;
|
||||
import net.minecraft.world.level.block.SoundType;
|
||||
import net.minecraft.world.level.block.*;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||
|
@ -38,8 +30,13 @@ import net.minecraft.world.level.material.MaterialColor;
|
|||
import net.minecraft.world.level.storage.loot.LootContext;
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.bclib.blocks.BaseBlockWithEntity;
|
||||
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
|
||||
import ru.betterend.registry.EndBlockEntities;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
public class EndStoneSmelter extends BaseBlockWithEntity {
|
||||
public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
|
||||
|
@ -52,7 +49,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
|
|||
.resistance(100F)
|
||||
.requiresCorrectToolForDrops()
|
||||
.sound(SoundType.STONE));
|
||||
this.registerDefaultState(this.stateDefinition.any()
|
||||
registerDefaultState(this.stateDefinition.any()
|
||||
.setValue(FACING, Direction.NORTH)
|
||||
.setValue(LIT, false));
|
||||
}
|
||||
|
@ -75,12 +72,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
|
|||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
|
||||
return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite());
|
||||
return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite());
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockGetter world) {
|
||||
return new EndStoneSmelterBlockEntity();
|
||||
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
return new EndStoneSmelterBlockEntity(blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -149,4 +146,11 @@ public class EndStoneSmelter extends BaseBlockWithEntity {
|
|||
world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> blockEntityType) {
|
||||
return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.END_STONE_SMELTER, EndStoneSmelterBlockEntity::tick);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -126,8 +126,8 @@ public class EternalPedestal extends PedestalBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockGetter world) {
|
||||
return new EternalPedestalEntity();
|
||||
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
return new EternalPedestalEntity(blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -18,8 +18,8 @@ import net.minecraft.world.level.material.Material;
|
|||
import net.minecraft.world.level.storage.loot.LootContext;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import ru.bclib.interfaces.ISpetialItem;
|
||||
import ru.betterend.blocks.basis.EndPlantBlock;
|
||||
import ru.betterend.interfaces.ISpetialItem;
|
||||
|
||||
public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem {
|
||||
private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16);
|
||||
|
|
|
@ -79,7 +79,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider {
|
|||
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
|
||||
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
|
||||
if (tool != null) {
|
||||
if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
if (tool.is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
return Collections.singletonList(new ItemStack(this));
|
||||
}
|
||||
int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool);
|
||||
|
|
|
@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos;
|
|||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.SoundType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.material.Material;
|
||||
import net.minecraft.world.level.material.MaterialColor;
|
||||
import ru.bclib.blocks.BaseBlock;
|
||||
|
@ -26,5 +27,5 @@ public class HydraluxPetalBlock extends BaseBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {}
|
||||
public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) {}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@ import java.util.Optional;
|
|||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.color.block.BlockColor;
|
||||
import net.minecraft.client.color.item.ItemColor;
|
||||
|
@ -31,6 +33,7 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
String path = "betterend:block/block_petal_colored";
|
||||
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path);
|
||||
|
|
|
@ -108,8 +108,8 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockGetter world) {
|
||||
return new BlockEntityHydrothermalVent();
|
||||
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
|
||||
return new BlockEntityHydrothermalVent(pos, state);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -44,8 +44,8 @@ public class InfusionPedestal extends PedestalBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockGetter world) {
|
||||
return new InfusionPedestalEntity();
|
||||
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
return new InfusionPedestalEntity(blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable;
|
|||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.color.block.BlockColor;
|
||||
import net.minecraft.client.color.item.ItemColor;
|
||||
|
@ -71,11 +73,13 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation resourceLocation) {
|
||||
return getBlockModel(resourceLocation, defaultBlockState());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
Optional<String> pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap");
|
||||
return ModelsHelper.fromPattern(pattern);
|
||||
|
|
|
@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos;
|
|||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import ru.betterend.blocks.basis.EndPlantWithAgeBlock;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
@ -14,7 +15,7 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock {
|
|||
|
||||
@Override
|
||||
public void growAdult(WorldGenLevel world, Random random, BlockPos pos) {
|
||||
EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null);
|
||||
EndFeatures.LUMECORN.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -61,7 +61,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped
|
|||
FluidState fluidState = world.getFluidState(blockPos2);
|
||||
Material material = blockState.getMaterial();
|
||||
if (fluidState.is(FluidTags.WATER)) {
|
||||
if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) {
|
||||
if (blockState.getBlock() instanceof BucketPickup && !((BucketPickup) blockState.getBlock()).pickupBlock(world, blockPos2, blockState).isEmpty()) {
|
||||
++i;
|
||||
if (j < 6) {
|
||||
queue.add(new Tuple<>(blockPos2, j + 1));
|
||||
|
@ -73,7 +73,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped
|
|||
queue.add(new Tuple<>(blockPos2, j + 1));
|
||||
}
|
||||
} else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
|
||||
BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null;
|
||||
BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null;
|
||||
dropResources(blockState, world, blockPos2, blockEntity);
|
||||
world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3);
|
||||
++i;
|
||||
|
|
|
@ -34,7 +34,7 @@ public class NeedlegrassBlock extends EndPlantBlock {
|
|||
@Override
|
||||
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
|
||||
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
|
||||
if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
return Lists.newArrayList(new ItemStack(this));
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -89,7 +89,7 @@ public class SilkMothHiveBlock extends BaseBlock {
|
|||
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
|
||||
if (hand == InteractionHand.MAIN_HAND) {
|
||||
ItemStack stack = player.getMainHandItem();
|
||||
if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) {
|
||||
if (stack.is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) {
|
||||
BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0));
|
||||
Direction dir = state.getValue(FACING);
|
||||
double px = pos.getX() + dir.getStepX() + 0.5;
|
||||
|
|
|
@ -150,7 +150,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped {
|
|||
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
|
||||
if (hand == InteractionHand.MAIN_HAND) {
|
||||
ItemStack stack = player.getMainHandItem();
|
||||
if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) {
|
||||
if (stack.is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) {
|
||||
BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0));
|
||||
Direction dir = state.getValue(FACING);
|
||||
double px = pos.getX() + dir.getStepX() + 0.5;
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
|
@ -9,6 +7,7 @@ import net.minecraft.world.level.Level;
|
|||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
@ -17,6 +16,8 @@ import ru.betterend.blocks.basis.EndPlantBlock;
|
|||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndFeatures;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class SmallAmaranitaBlock extends EndPlantBlock {
|
||||
private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12);
|
||||
|
||||
|
@ -29,7 +30,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock {
|
|||
public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) {
|
||||
BlockPos bigPos = growBig(world, pos);
|
||||
if (bigPos != null) {
|
||||
if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) {
|
||||
if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, bigPos, null))) {
|
||||
replaceMushroom(world, bigPos);
|
||||
replaceMushroom(world, bigPos.south());
|
||||
replaceMushroom(world, bigPos.east());
|
||||
|
@ -37,7 +38,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock {
|
|||
}
|
||||
return;
|
||||
}
|
||||
EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null);
|
||||
EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -23,6 +23,7 @@ import net.minecraft.world.level.block.Blocks;
|
|||
import net.minecraft.world.level.block.BonemealableBlock;
|
||||
import net.minecraft.world.level.block.SoundType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.material.Material;
|
||||
import net.minecraft.world.level.storage.loot.LootContext;
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
|
||||
|
@ -56,7 +57,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
|
|||
@Override
|
||||
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
|
||||
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
|
||||
if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
return Lists.newArrayList(new ItemStack(this));
|
||||
}
|
||||
else {
|
||||
|
@ -99,6 +100,6 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT
|
|||
@Override
|
||||
public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) {
|
||||
BlocksHelper.setWithUpdate(world, pos, Blocks.AIR);
|
||||
EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null);
|
||||
EndFeatures.JELLYSHROOM.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,6 +81,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation resourceLocation) {
|
||||
return getBlockModel(resourceLocation, defaultBlockState());
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
|
@ -9,9 +10,12 @@ import net.minecraft.core.BlockPos;
|
|||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
|
@ -38,9 +42,9 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid
|
|||
}
|
||||
|
||||
@Override
|
||||
public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) {
|
||||
public ItemStack pickupBlock(LevelAccessor world, BlockPos pos, BlockState state) {
|
||||
world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11);
|
||||
return Fluids.WATER;
|
||||
return new ItemStack(Items.WATER_BUCKET);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -120,4 +124,11 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid
|
|||
public FluidState getFluidState(BlockState state) {
|
||||
return Fluids.WATER.getSource(false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Optional<SoundEvent> getPickupSound() {
|
||||
return Fluids.WATER.getPickupSound();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@ package ru.betterend.blocks.basis;
|
|||
|
||||
import java.util.Map;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.resources.model.UnbakedModel;
|
||||
import net.minecraft.core.BlockPos;
|
||||
|
@ -125,6 +127,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
|
||||
String floor = blockState.getValue(IS_FLOOR) ? "_floor" : "";
|
||||
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(),
|
||||
|
|
|
@ -62,7 +62,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped {
|
|||
@Override
|
||||
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
|
||||
ItemStack tool = builder.getParameter(LootContextParams.TOOL);
|
||||
if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) {
|
||||
return Lists.newArrayList(new ItemStack(this));
|
||||
}
|
||||
else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) {
|
||||
|
|
|
@ -6,10 +6,14 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import net.minecraft.world.level.block.entity.BlockEntityTicker;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.client.resources.model.UnbakedModel;
|
||||
|
@ -49,6 +53,7 @@ import ru.betterend.blocks.InfusionPedestal;
|
|||
import ru.betterend.blocks.entities.InfusionPedestalEntity;
|
||||
import ru.betterend.blocks.entities.PedestalBlockEntity;
|
||||
import ru.betterend.client.models.Patterns;
|
||||
import ru.betterend.registry.EndBlockEntities;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.rituals.InfusionRitual;
|
||||
|
||||
|
@ -349,8 +354,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockGetter world) {
|
||||
return new PedestalBlockEntity();
|
||||
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
return new PedestalBlockEntity(blockPos, blockState);
|
||||
}
|
||||
|
||||
public boolean hasUniqueEntity() {
|
||||
|
@ -370,11 +375,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation blockId) {
|
||||
return getBlockModel(blockId, defaultBlockState());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
Map<String, String> textures = createTexturesMap();
|
||||
PedestalState state = blockState.getValue(STATE);
|
||||
|
@ -401,6 +408,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map<ResourceLocation, UnbakedModel> modelCache) {
|
||||
PedestalState state = blockState.getValue(STATE);
|
||||
ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(),
|
||||
|
@ -424,6 +432,22 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
|||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> blockEntityType) {
|
||||
if (level.isClientSide) return null;
|
||||
|
||||
BlockEntityTicker<T> ticker = createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick);
|
||||
if (ticker!=null) return ticker;
|
||||
|
||||
return createTickerHelper(blockEntityType, EndBlockEntities.INFUSION_PEDESTAL, InfusionPedestalEntity::tick);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected static <E extends BlockEntity, A extends BlockEntity> BlockEntityTicker<A> createTickerHelper(BlockEntityType<A> blockEntityType, BlockEntityType<E> blockEntityType2, BlockEntityTicker<? super E> blockEntityTicker) {
|
||||
return blockEntityType2 == blockEntityType ? (BlockEntityTicker<A>) blockEntityTicker : null;
|
||||
}
|
||||
|
||||
static {
|
||||
VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14);
|
||||
VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16);
|
||||
|
|
|
@ -4,6 +4,8 @@ import java.util.Optional;
|
|||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
import net.minecraft.client.color.block.BlockColor;
|
||||
import net.minecraft.client.color.item.ItemColor;
|
||||
|
@ -44,6 +46,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) {
|
||||
String blockName = resourceLocation.getPath();
|
||||
Optional<String> pattern = blockState.getValue(IS_FLOOR) ?
|
||||
|
|
|
@ -16,6 +16,7 @@ import ru.bclib.blocks.BaseBarkBlock;
|
|||
import ru.bclib.blocks.BaseBarrelBlock;
|
||||
import ru.bclib.blocks.BaseBlock;
|
||||
import ru.bclib.blocks.BaseBookshelfBlock;
|
||||
import ru.bclib.blocks.BaseChestBlock;
|
||||
import ru.bclib.blocks.BaseComposterBlock;
|
||||
import ru.bclib.blocks.BaseCraftingTableBlock;
|
||||
import ru.bclib.blocks.BaseDoorBlock;
|
||||
|
@ -90,7 +91,7 @@ public class WoodenMaterial {
|
|||
ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks));
|
||||
sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks));
|
||||
|
||||
chest = EndBlocks.registerBlock(name + "_chest", new BaseFenceBlock(planks));
|
||||
chest = EndBlocks.registerBlock(name + "_chest", new BaseChestBlock(planks));
|
||||
barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks));
|
||||
shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks));
|
||||
composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks));
|
||||
|
|
|
@ -2,6 +2,7 @@ package ru.betterend.blocks.entities;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.BlockPos.MutableBlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
|
@ -9,8 +10,8 @@ import net.minecraft.world.entity.EquipmentSlot;
|
|||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.item.ElytraItem;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.TickableBlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
@ -20,18 +21,16 @@ import ru.betterend.registry.EndBlockEntities;
|
|||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndParticles;
|
||||
|
||||
public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity {
|
||||
public class BlockEntityHydrothermalVent extends BlockEntity {
|
||||
|
||||
private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f);
|
||||
|
||||
public BlockEntityHydrothermalVent() {
|
||||
super(EndBlockEntities.HYDROTHERMAL_VENT);
|
||||
public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) {
|
||||
super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public static void tick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) {
|
||||
if (level != null) {
|
||||
BlockState state = getBlockState();
|
||||
if (state.is(EndBlocks.HYDROTHERMAL_VENT)) {
|
||||
boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED);
|
||||
if (active && level.random.nextInt(20) == 0) {
|
||||
|
@ -56,7 +55,7 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable
|
|||
double mult = active ? 3.0 : 5.0;
|
||||
float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult);
|
||||
entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() &&
|
||||
hasElytra(entity) && entity.isFallFlying())
|
||||
blockEntity.hasElytra(entity) && entity.isFallFlying())
|
||||
.forEach(entity -> entity.moveRelative(force, POSITIVE_Y));
|
||||
}
|
||||
mutable.move(Direction.UP);
|
||||
|
|
|
@ -1,15 +1,11 @@
|
|||
package ru.betterend.blocks.entities;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry;
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||
import net.fabricmc.fabric.api.registry.FuelRegistry;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.NonNullList;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
|
@ -37,7 +33,6 @@ import net.minecraft.world.level.ItemLike;
|
|||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
|
||||
import net.minecraft.world.level.block.entity.TickableBlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
@ -46,7 +41,11 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler;
|
|||
import ru.betterend.recipe.builders.AlloyingRecipe;
|
||||
import ru.betterend.registry.EndBlockEntities;
|
||||
|
||||
public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity {
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible {
|
||||
|
||||
private static final int[] TOP_SLOTS = new int[] { 0, 1 };
|
||||
private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 };
|
||||
|
@ -62,8 +61,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
|
|||
private int burnTime;
|
||||
private int fuelTime;
|
||||
|
||||
public EndStoneSmelterBlockEntity() {
|
||||
super(EndBlockEntities.END_STONE_SMELTER);
|
||||
public EndStoneSmelterBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
super(EndBlockEntities.END_STONE_SMELTER, blockPos, blockState);
|
||||
this.inventory = NonNullList.withSize(4, ItemStack.EMPTY);
|
||||
this.recipesUsed = new Object2IntOpenHashMap<>();
|
||||
this.propertyDelegate = new ContainerData() {
|
||||
|
@ -225,61 +224,60 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
|
|||
return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (level == null) return;
|
||||
public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, EndStoneSmelterBlockEntity blockEntity) {
|
||||
if (tickLevel == null) return;
|
||||
|
||||
boolean initialBurning = isBurning();
|
||||
boolean initialBurning = blockEntity.isBurning();
|
||||
if (initialBurning) {
|
||||
burnTime--;
|
||||
blockEntity.burnTime--;
|
||||
}
|
||||
|
||||
boolean burning = initialBurning;
|
||||
if (!level.isClientSide) {
|
||||
ItemStack fuel = inventory.get(2);
|
||||
if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) {
|
||||
if (smeltTime > 0) {
|
||||
smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal);
|
||||
if (!tickLevel.isClientSide) {
|
||||
ItemStack fuel = blockEntity.inventory.get(2);
|
||||
if (!burning && (fuel.isEmpty() || blockEntity.inventory.get(0).isEmpty() && blockEntity.inventory.get(1).isEmpty())) {
|
||||
if (blockEntity.smeltTime > 0) {
|
||||
blockEntity.smeltTime = Mth.clamp(blockEntity.smeltTime - 2, 0, blockEntity.smeltTimeTotal);
|
||||
}
|
||||
} else {
|
||||
Recipe<?> recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null);
|
||||
Recipe<?> recipe = tickLevel.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, blockEntity, tickLevel).orElse(null);
|
||||
if (recipe == null) {
|
||||
recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null);
|
||||
recipe = tickLevel.getRecipeManager().getRecipeFor(RecipeType.BLASTING, blockEntity, tickLevel).orElse(null);
|
||||
}
|
||||
boolean accepted = this.canAcceptRecipeOutput(recipe);
|
||||
boolean accepted = blockEntity.canAcceptRecipeOutput(recipe);
|
||||
if (!burning && accepted) {
|
||||
burnTime = getFuelTime(fuel);
|
||||
fuelTime = burnTime;
|
||||
burning = isBurning();
|
||||
blockEntity.burnTime = blockEntity.getFuelTime(fuel);
|
||||
blockEntity.fuelTime = blockEntity.burnTime;
|
||||
burning = blockEntity.isBurning();
|
||||
if (burning) {
|
||||
if (!fuel.isEmpty()) {
|
||||
Item item = fuel.getItem();
|
||||
fuel.shrink(1);
|
||||
if (fuel.isEmpty()) {
|
||||
Item remainFuel = item.getCraftingRemainingItem();
|
||||
inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel));
|
||||
blockEntity.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel));
|
||||
}
|
||||
}
|
||||
setChanged();
|
||||
blockEntity.setChanged();
|
||||
}
|
||||
}
|
||||
|
||||
if (burning && accepted) {
|
||||
this.smeltTime++;
|
||||
if (smeltTime == smeltTimeTotal) {
|
||||
smeltTime = 0;
|
||||
smeltTimeTotal = getSmeltTime();
|
||||
craftRecipe(recipe);
|
||||
setChanged();
|
||||
blockEntity.smeltTime++;
|
||||
if (blockEntity.smeltTime == blockEntity.smeltTimeTotal) {
|
||||
blockEntity.smeltTime = 0;
|
||||
blockEntity.smeltTimeTotal = blockEntity.getSmeltTime();
|
||||
blockEntity.craftRecipe(recipe);
|
||||
blockEntity.setChanged();
|
||||
}
|
||||
} else {
|
||||
smeltTime = 0;
|
||||
blockEntity.smeltTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
burning = blockEntity.isBurning();
|
||||
if (initialBurning != burning) {
|
||||
level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3);
|
||||
setChanged();
|
||||
tickLevel.setBlock(tickPos, tickState.setValue(EndStoneSmelter.LIT, burning), 3);
|
||||
blockEntity.setChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -395,8 +393,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme
|
|||
}
|
||||
|
||||
@Override
|
||||
public void load(BlockState state, CompoundTag tag) {
|
||||
super.load(state, tag);
|
||||
public void load(CompoundTag tag) {
|
||||
super.load(tag);
|
||||
inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY);
|
||||
ContainerHelper.loadAllItems(tag, inventory);
|
||||
burnTime = tag.getShort("BurnTime");
|
||||
|
|
|
@ -3,14 +3,15 @@ package ru.betterend.blocks.entities;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import ru.betterend.registry.EndBlockEntities;
|
||||
import ru.betterend.rituals.EternalRitual;
|
||||
|
||||
public class EternalPedestalEntity extends PedestalBlockEntity {
|
||||
private EternalRitual linkedRitual;
|
||||
|
||||
public EternalPedestalEntity() {
|
||||
super(EndBlockEntities.ETERNAL_PEDESTAL);
|
||||
public EternalPedestalEntity(BlockPos blockPos, BlockState blockState) {
|
||||
super(EndBlockEntities.ETERNAL_PEDESTAL, blockPos, blockState);
|
||||
}
|
||||
|
||||
public boolean hasRitual() {
|
||||
|
@ -26,8 +27,13 @@ public class EternalPedestalEntity extends PedestalBlockEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setLevel(Level world) {
|
||||
if (hasRitual()) {
|
||||
linkedRitual.setWorld(world);
|
||||
}
|
||||
}
|
||||
|
||||
public void setLevelAndPosition(Level world, BlockPos pos) {
|
||||
super.setLevelAndPosition(world, pos);
|
||||
if (hasRitual()) {
|
||||
linkedRitual.setWorld(world);
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package ru.betterend.blocks.entities;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import ru.betterend.registry.EndBlockEntities;
|
||||
import ru.betterend.rituals.InfusionRitual;
|
||||
|
||||
|
@ -10,13 +11,21 @@ public class InfusionPedestalEntity extends PedestalBlockEntity {
|
|||
|
||||
private InfusionRitual linkedRitual;
|
||||
|
||||
public InfusionPedestalEntity() {
|
||||
super(EndBlockEntities.INFUSION_PEDESTAL);
|
||||
public InfusionPedestalEntity(BlockPos blockPos, BlockState blockState) {
|
||||
super(EndBlockEntities.INFUSION_PEDESTAL, blockPos, blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLevel(Level world){
|
||||
super.setLevel(world);
|
||||
if (hasRitual()) {
|
||||
linkedRitual.setLocation(world, this.getBlockPos());
|
||||
} else {
|
||||
linkRitual(new InfusionRitual(this, world, this.getBlockPos()));
|
||||
}
|
||||
}
|
||||
|
||||
public void setLevelAndPosition(Level world, BlockPos pos) {
|
||||
super.setLevelAndPosition(world, pos);
|
||||
if (hasRitual()) {
|
||||
linkedRitual.setLocation(world, pos);
|
||||
} else {
|
||||
|
@ -36,12 +45,11 @@ public class InfusionPedestalEntity extends PedestalBlockEntity {
|
|||
return linkedRitual != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (hasRitual()) {
|
||||
linkedRitual.tick();
|
||||
public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, InfusionPedestalEntity blockEntity) {
|
||||
if (blockEntity.hasRitual()) {
|
||||
blockEntity.linkedRitual.tick();
|
||||
}
|
||||
super.tick();
|
||||
PedestalBlockEntity.tick(tickLevel, tickPos, tickState, blockEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,30 +1,31 @@
|
|||
package ru.betterend.blocks.entities;
|
||||
|
||||
import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.Container;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.entity.TickableBlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import ru.betterend.blocks.basis.PedestalBlock;
|
||||
import ru.betterend.registry.EndBlockEntities;
|
||||
import ru.betterend.registry.EndItems;
|
||||
|
||||
public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable {
|
||||
public class PedestalBlockEntity extends BlockEntity implements Container, BlockEntityClientSerializable {
|
||||
private ItemStack activeItem = ItemStack.EMPTY;
|
||||
|
||||
private final int maxAge = 314;
|
||||
private int age;
|
||||
|
||||
public PedestalBlockEntity() {
|
||||
super(EndBlockEntities.PEDESTAL);
|
||||
public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) {
|
||||
this(EndBlockEntities.PEDESTAL, blockPos, blockState);
|
||||
}
|
||||
|
||||
public PedestalBlockEntity(BlockEntityType<?> type) {
|
||||
super(type);
|
||||
public PedestalBlockEntity(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
|
||||
super(blockEntityType, blockPos, blockState);
|
||||
}
|
||||
|
||||
public int getAge() {
|
||||
|
@ -103,8 +104,8 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka
|
|||
}
|
||||
|
||||
@Override
|
||||
public void load(BlockState state, CompoundTag tag) {
|
||||
super.load(state, tag);
|
||||
public void load(CompoundTag tag) {
|
||||
super.load(tag);
|
||||
fromTag(tag);
|
||||
}
|
||||
|
||||
|
@ -131,12 +132,11 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!isEmpty()) {
|
||||
age++;
|
||||
if (age > maxAge) {
|
||||
age = 0;
|
||||
public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) {
|
||||
if (!blockEntity.isEmpty()) {
|
||||
blockEntity.age++;
|
||||
if (blockEntity.age > blockEntity.maxAge) {
|
||||
blockEntity.age = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,7 +79,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent
|
|||
int slotX = this.fuelSlot.x + x;
|
||||
int slotY = this.fuelSlot.y + y;
|
||||
GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048);
|
||||
this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY);
|
||||
//TODO: test k=0
|
||||
this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY,0);
|
||||
RenderSystem.depthFunc(516);
|
||||
GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583);
|
||||
RenderSystem.depthFunc(515);
|
||||
|
|
|
@ -32,21 +32,22 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen<EndStoneSmelt
|
|||
|
||||
public void init() {
|
||||
super.init();
|
||||
//TODO: test in 1.17
|
||||
narrow = width < 379;
|
||||
recipeBook.init(width, height, minecraft, narrow, menu);
|
||||
leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth);
|
||||
addButton(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> {
|
||||
recipeBook.initVisuals(narrow);
|
||||
leftPos = recipeBook.updateScreenPosition(width, imageWidth);
|
||||
addRenderableWidget(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> {
|
||||
recipeBook.initVisuals();
|
||||
recipeBook.toggleVisibility();
|
||||
leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth);
|
||||
leftPos = recipeBook.updateScreenPosition( width, imageWidth);
|
||||
((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49);
|
||||
}));
|
||||
titleLabelX = (imageWidth - font.width(title)) / 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
public void containerTick() {
|
||||
super.containerTick();
|
||||
recipeBook.tick();
|
||||
}
|
||||
|
||||
|
@ -109,8 +110,10 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen<EndStoneSmelt
|
|||
@Override
|
||||
protected void renderBg(PoseStack matrices, float delta, int mouseX, int mouseY) {
|
||||
if (minecraft == null) return;
|
||||
RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
minecraft.getTextureManager().bind(BACKGROUND_TEXTURE);
|
||||
//TODO: verify
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE);
|
||||
//minecraft.getTextureManager().bind(BACKGROUND_TEXTURE);
|
||||
blit(matrices, leftPos, topPos, 0, 0, imageWidth, imageHeight);
|
||||
int progress;
|
||||
if (menu.isBurning()) {
|
||||
|
|
|
@ -107,6 +107,11 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu<Container> {
|
|||
return RecipeBookType.BLAST_FURNACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldMoveToInventory(int i) {
|
||||
return i != this.getResultSlotIndex();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean stillValid(Player player) {
|
||||
return inventory.stillValid(player);
|
||||
|
|
|
@ -28,10 +28,9 @@ public class SmelterOutputSlot extends Slot {
|
|||
return super.remove(amount);
|
||||
}
|
||||
|
||||
public ItemStack onTake(Player player, ItemStack stack) {
|
||||
public void onTake(Player player, ItemStack stack) {
|
||||
this.checkTakeAchievements(stack);
|
||||
super.onTake(player, stack);
|
||||
return stack;
|
||||
}
|
||||
|
||||
protected void onQuickCraft(ItemStack stack, int amount) {
|
||||
|
|
|
@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
|
|||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.model.EntityModel;
|
||||
import net.minecraft.client.model.geom.EntityModelSet;
|
||||
import net.minecraft.client.player.AbstractClientPlayer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
|
@ -18,12 +19,14 @@ import net.minecraft.world.entity.player.PlayerModelPart;
|
|||
import net.minecraft.world.item.ItemStack;
|
||||
import ru.betterend.interfaces.FallFlyingItem;
|
||||
import ru.betterend.item.model.ArmoredElytraModel;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class ArmoredElytraLayer<T extends LivingEntity, M extends EntityModel<T>> extends ElytraLayer<T, M> {
|
||||
private final ArmoredElytraModel<T> elytraModel = new ArmoredElytraModel<>();
|
||||
private final ArmoredElytraModel<T> elytraModel;
|
||||
|
||||
public ArmoredElytraLayer(RenderLayerParent<T, M> renderLayerParent) {
|
||||
super(renderLayerParent);
|
||||
public ArmoredElytraLayer(RenderLayerParent<T, M> renderLayerParent, EntityModelSet entityModelSet) {
|
||||
super(renderLayerParent, entityModelSet);
|
||||
elytraModel = new ArmoredElytraModel<>(entityModelSet.bakeLayer(EndEntitiesRenders.ARMORED_ELYTRA));
|
||||
}
|
||||
|
||||
public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) {
|
||||
|
|
|
@ -6,6 +6,11 @@ import com.mojang.math.Quaternion;
|
|||
import com.mojang.math.Vector3f;
|
||||
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
|
@ -42,13 +47,29 @@ public class EndCrystalRenderer {
|
|||
matrices.popPose();
|
||||
}
|
||||
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create()
|
||||
.texOffs(32, 0)
|
||||
.addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 32);
|
||||
}
|
||||
|
||||
static {
|
||||
END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE);
|
||||
RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE);
|
||||
SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D);
|
||||
FRAME = new ModelPart(64, 32, 0, 0);
|
||||
FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F);
|
||||
CORE = new ModelPart(64, 32, 32, 0);
|
||||
CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F);
|
||||
|
||||
ModelPart root = getTexturedModelData().bakeRoot();
|
||||
FRAME = root.getChild("FRAME");
|
||||
CORE = root.getChild("CORE");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,11 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
|
|||
import com.mojang.math.Vector3f;
|
||||
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
|
@ -57,14 +62,46 @@ public class EternalCrystalRenderer {
|
|||
return ColorUtil.toFloatArray(ColorUtil.color(r, g, b));
|
||||
}
|
||||
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create()
|
||||
.texOffs(2, 4)
|
||||
.addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
return LayerDefinition.create(modelData, 16, 16);
|
||||
}
|
||||
|
||||
static {
|
||||
RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true);
|
||||
SHARDS = new ModelPart[4];
|
||||
SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F);
|
||||
SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F);
|
||||
SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F);
|
||||
SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F);
|
||||
CORE = new ModelPart(16, 16, 0, 0);
|
||||
CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F);
|
||||
|
||||
ModelPart root = getTexturedModelData().bakeRoot();
|
||||
SHARDS[0] = root.getChild("SHARDS_0");
|
||||
SHARDS[1] = root.getChild("SHARDS_1");
|
||||
SHARDS[2] = root.getChild("SHARDS_2");
|
||||
SHARDS[3] = root.getChild("SHARDS_3");
|
||||
CORE = root.getChild("CORE");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ import net.minecraft.client.renderer.MultiBufferSource;
|
|||
import net.minecraft.client.renderer.block.model.ItemTransforms;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.resources.model.BakedModel;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.item.BlockItem;
|
||||
|
@ -24,10 +26,10 @@ import ru.betterend.registry.EndBlocks;
|
|||
import ru.betterend.registry.EndItems;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class PedestalItemRenderer<T extends PedestalBlockEntity> extends BlockEntityRenderer<T> {
|
||||
public class PedestalItemRenderer<T extends PedestalBlockEntity> implements BlockEntityRenderer<T> {
|
||||
|
||||
public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) {
|
||||
super(dispatcher);
|
||||
public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -44,7 +46,8 @@ public class PedestalItemRenderer<T extends PedestalBlockEntity> extends BlockEn
|
|||
|
||||
matrices.pushPose();
|
||||
Minecraft minecraft = Minecraft.getInstance();
|
||||
BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null);
|
||||
//TODO: check i=0
|
||||
BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null, 0);
|
||||
Vector3f translate = model.getTransforms().ground.translation;
|
||||
PedestalBlock pedestal = (PedestalBlock) state.getBlock();
|
||||
matrices.translate(translate.x(), translate.y(), translate.z());
|
||||
|
|
|
@ -91,7 +91,7 @@ public class CubozoaEntity extends AbstractSchoolingFish {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected ItemStack getBucketItemStack() {
|
||||
public ItemStack getBucketItemStack() {
|
||||
ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance();
|
||||
CompoundTag tag = bucket.getOrCreateTag();
|
||||
tag.putByte("Variant", entityData.get(VARIANT));
|
||||
|
|
|
@ -6,11 +6,8 @@ import java.util.Random;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.world.entity.AgableMob;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.entity.MobSpawnType;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.entity.*;
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||
import net.minecraft.world.entity.ai.control.FlyingMoveControl;
|
||||
|
@ -21,7 +18,8 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal;
|
|||
import net.minecraft.world.entity.ai.goal.Goal;
|
||||
import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation;
|
||||
import net.minecraft.world.entity.ai.navigation.PathNavigation;
|
||||
import net.minecraft.world.entity.ai.util.RandomPos;
|
||||
import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos;
|
||||
import net.minecraft.world.entity.ai.util.HoverRandomPos;
|
||||
import net.minecraft.world.entity.animal.Animal;
|
||||
import net.minecraft.world.entity.animal.FlyingAnimal;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
|
@ -98,18 +96,18 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean makeFlySound() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean causeFallDamage(float fallDistance, float damageMultiplier) {
|
||||
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMovementNoisy() {
|
||||
return false;
|
||||
protected Entity.MovementEmission getMovementEmission() {
|
||||
return Entity.MovementEmission.EVENTS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlying() {
|
||||
return !this.onGround;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -168,11 +166,11 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
|
|||
private Vec3 getRandomLocation() {
|
||||
int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16);
|
||||
Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F);
|
||||
Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1);
|
||||
Vec3 airPos = HoverRandomPos.getPos(DragonflyEntity.this, 8, 7, rotation.x, rotation.z, 1.5707964F, 3, 1);
|
||||
if (airPos != null) {
|
||||
if (isInVoid(airPos)) {
|
||||
for (int i = 0; i < 8; i++) {
|
||||
airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1);
|
||||
airPos = HoverRandomPos.getPos(DragonflyEntity.this, 16, 7, rotation.x, rotation.z, MHelper.PI2, 3, 1);
|
||||
if (airPos != null && !isInVoid(airPos)) {
|
||||
return airPos;
|
||||
}
|
||||
|
@ -184,7 +182,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
return airPos;
|
||||
}
|
||||
return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D);
|
||||
return AirAndWaterRandomPos.getPos(DragonflyEntity.this, 8, 4, -2, rotation.x, rotation.z, 1.5707963705062866D);
|
||||
}
|
||||
|
||||
private boolean isInVoid(Vec3 pos) {
|
||||
|
@ -194,7 +192,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
|
||||
@Override
|
||||
public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) {
|
||||
public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) {
|
||||
return EndEntities.DRAGONFLY.create(world);
|
||||
}
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ public class EndFishEntity extends AbstractSchoolingFish {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected ItemStack getBucketItemStack() {
|
||||
public ItemStack getBucketItemStack() {
|
||||
ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance();
|
||||
CompoundTag tag = bucket.getOrCreateTag();
|
||||
tag.putByte("variant", entityData.get(VARIANT));
|
||||
|
|
|
@ -116,7 +116,7 @@ public class EndSlimeEntity extends Slime {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
public void remove(RemovalReason reason) {
|
||||
int i = this.getSize();
|
||||
if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) {
|
||||
Component text = this.getCustomName();
|
||||
|
@ -144,7 +144,8 @@ public class EndSlimeEntity extends Slime {
|
|||
this.level.addFreshEntity(slimeEntity);
|
||||
}
|
||||
}
|
||||
this.removed = true;
|
||||
|
||||
((ISlime)this).entityRemove(reason);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -322,7 +323,7 @@ public class EndSlimeEntity extends Slime {
|
|||
return false;
|
||||
}
|
||||
else {
|
||||
return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
|
||||
return livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -339,7 +340,7 @@ public class EndSlimeEntity extends Slime {
|
|||
else if (!livingEntity.isAlive()) {
|
||||
return false;
|
||||
}
|
||||
else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) {
|
||||
else if (livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
|
@ -349,7 +350,7 @@ public class EndSlimeEntity extends Slime {
|
|||
|
||||
public void tick() {
|
||||
EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F);
|
||||
((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage());
|
||||
((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.getYRot(), EndSlimeEntity.this.isDealsDamage());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -360,7 +361,7 @@ public class EndSlimeEntity extends Slime {
|
|||
|
||||
public EndSlimeMoveControl(EndSlimeEntity slime) {
|
||||
super(slime);
|
||||
this.targetYaw = 180.0F * slime.yRot / 3.1415927F;
|
||||
this.targetYaw = 180.0F * slime.getYRot() / 3.1415927F;
|
||||
}
|
||||
|
||||
public void look(float targetYaw, boolean jumpOften) {
|
||||
|
@ -374,9 +375,9 @@ public class EndSlimeEntity extends Slime {
|
|||
}
|
||||
|
||||
public void tick() {
|
||||
this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F);
|
||||
this.mob.yHeadRot = this.mob.yRot;
|
||||
this.mob.yBodyRot = this.mob.yRot;
|
||||
this.mob.setYRot(this.rotlerp(this.mob.getYRot(), this.targetYaw, 90.0F));
|
||||
this.mob.yHeadRot = this.mob.getYRot();
|
||||
this.mob.yBodyRot = this.mob.getYRot();
|
||||
if (this.operation != MoveControl.Operation.MOVE_TO) {
|
||||
this.mob.setZza(0.0F);
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ public class ShadowWalkerEntity extends Monster {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected float getVoicePitch() {
|
||||
public float getVoicePitch() {
|
||||
return MHelper.randRange(0.75F, 1.25F, random);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,9 @@ import java.util.EnumSet;
|
|||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.world.entity.*;
|
||||
import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos;
|
||||
import net.minecraft.world.entity.ai.util.HoverRandomPos;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
|
@ -16,11 +19,6 @@ import net.minecraft.server.level.ServerLevel;
|
|||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.entity.AgableMob;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.entity.MobSpawnType;
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||
import net.minecraft.world.entity.ai.control.FlyingMoveControl;
|
||||
|
@ -142,18 +140,18 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean makeFlySound() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean causeFallDamage(float fallDistance, float damageMultiplier) {
|
||||
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMovementNoisy() {
|
||||
return false;
|
||||
protected Entity.MovementEmission getMovementEmission() {
|
||||
return Entity.MovementEmission.EVENTS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlying() {
|
||||
return !this.onGround;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -162,7 +160,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
|
|||
}
|
||||
|
||||
@Override
|
||||
public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) {
|
||||
public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) {
|
||||
return EndEntities.SILK_MOTH.create(world);
|
||||
}
|
||||
|
||||
|
@ -239,8 +237,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
|
|||
@Nullable
|
||||
private Vec3 getRandomLocation() {
|
||||
Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F);
|
||||
Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1);
|
||||
return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D);
|
||||
Vec3 vec3d4 = HoverRandomPos.getPos(SilkMothEntity.this, 8, 7, vec3d3.x, vec3d3.z, 1.5707964F, 3, 1);
|
||||
return vec3d4 != null ? vec3d4 : AirAndWaterRandomPos.getPos(SilkMothEntity.this, 8, 4, -2, vec3d3.x, vec3d3.z, 1.5707963705062866D);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -299,7 +297,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal {
|
|||
BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(EndBlockProperties.FULLNESS, fullness));
|
||||
}
|
||||
SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1);
|
||||
SilkMothEntity.this.remove();
|
||||
SilkMothEntity.this.discard();
|
||||
}
|
||||
else {
|
||||
SilkMothEntity.this.hivePos = null;
|
||||
|
|
|
@ -2,47 +2,67 @@ package ru.betterend.entity.model;
|
|||
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.util.Mth;
|
||||
import ru.betterend.entity.CubozoaEntity;
|
||||
|
||||
public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
|
||||
private final ModelPart model;
|
||||
private final ModelPart main_cube_r1;
|
||||
private final ModelPart tentacle_center_1;
|
||||
private final ModelPart tentacle_1;
|
||||
private final ModelPart tentacle_center_2;
|
||||
private final ModelPart tentacle_2;
|
||||
private final ModelPart tentacle_center_3;
|
||||
private final ModelPart tentacle_3;
|
||||
private final ModelPart tentacle_center_4;
|
||||
private final ModelPart tentacle_4;
|
||||
private float scaleY;
|
||||
private float scaleXZ;
|
||||
private final static int TENTACLE_COUNT = 4;
|
||||
|
||||
public CubozoaEntityModel() {
|
||||
super(RenderType::entityTranslucent);
|
||||
private final ModelPart model;
|
||||
private final ModelPart[] tentacle_center;
|
||||
private final ModelPart[] tentacle;
|
||||
private float scaleY;
|
||||
private float scaleXZ;
|
||||
|
||||
texWidth = 48;
|
||||
texHeight = 48;
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
model = new ModelPart(this);
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(0, 17)
|
||||
.addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), PartPose.offset(0.0F, 24.0F, 0.0F));
|
||||
/*model = new ModelPart(this);
|
||||
model.setPos(0.0F, 24.0F, 0.0F);
|
||||
model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);
|
||||
model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);*/
|
||||
|
||||
main_cube_r1 = new ModelPart(this);
|
||||
bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F));
|
||||
|
||||
/*main_cube_r1 = new ModelPart(this);
|
||||
main_cube_r1.setPos(0.0F, -14.0F, 0.0F);
|
||||
model.addChild(main_cube_r1);
|
||||
setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F);
|
||||
main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);
|
||||
main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);*/
|
||||
float[] angles = {0, (float)Math.PI/-2, (float)Math.PI, (float)Math.PI/2};
|
||||
|
||||
tentacle_center_1 = new ModelPart(this);
|
||||
for (int i=1; i<=TENTACLE_COUNT; i++){
|
||||
PartDefinition tentaclePart = bodyPart
|
||||
.addOrReplaceChild("tentacle_center_"+i,
|
||||
CubeListBuilder.create(),
|
||||
PartPose.offsetAndRotation(
|
||||
0.0F, 0.0F, 0.0F,
|
||||
0.0F, -1.5708F, 0.0F
|
||||
)
|
||||
);
|
||||
|
||||
tentaclePart.addOrReplaceChild("tentacle_"+i, CubeListBuilder.create()
|
||||
.texOffs(16, 17)
|
||||
.addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F),
|
||||
PartPose.offset(0.0F, -7.0F, 4.5F));
|
||||
}
|
||||
/*tentacle_center_1 = new ModelPart(this);
|
||||
tentacle_center_1.setPos(0.0F, 0.0F, 0.0F);
|
||||
model.addChild(tentacle_center_1);
|
||||
|
||||
|
||||
tentacle_1 = new ModelPart(this);
|
||||
tentacle_1.setPos(0.0F, -7.0F, 4.5F);
|
||||
tentacle_center_1.addChild(tentacle_1);
|
||||
|
@ -53,7 +73,6 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
|
|||
model.addChild(tentacle_center_2);
|
||||
setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F);
|
||||
|
||||
|
||||
tentacle_2 = new ModelPart(this);
|
||||
tentacle_2.setPos(0.0F, -7.0F, 4.5F);
|
||||
tentacle_center_2.addChild(tentacle_2);
|
||||
|
@ -64,7 +83,6 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
|
|||
model.addChild(tentacle_center_3);
|
||||
setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F);
|
||||
|
||||
|
||||
tentacle_3 = new ModelPart(this);
|
||||
tentacle_3.setPos(0.0F, -7.0F, 4.5F);
|
||||
tentacle_center_3.addChild(tentacle_3);
|
||||
|
@ -79,26 +97,41 @@ public class CubozoaEntityModel extends BlockBenchModel<CubozoaEntity> {
|
|||
tentacle_4 = new ModelPart(this);
|
||||
tentacle_4.setPos(0.0F, -7.0F, 4.5F);
|
||||
tentacle_center_4.addChild(tentacle_4);
|
||||
tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);
|
||||
}
|
||||
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;
|
||||
/* texWidth = 48;
|
||||
texHeight = 48; */
|
||||
return LayerDefinition.create(modelData, 48, 48);
|
||||
}
|
||||
|
||||
tentacle_1.xRot = sin * 0.15F;
|
||||
tentacle_2.xRot = sin * 0.15F;
|
||||
tentacle_3.xRot = sin * 0.15F;
|
||||
tentacle_4.xRot = sin * 0.15F;
|
||||
}
|
||||
public CubozoaEntityModel(ModelPart modelPart) {
|
||||
super(RenderType::entityTranslucent);
|
||||
tentacle = new ModelPart[TENTACLE_COUNT];
|
||||
tentacle_center = new ModelPart[TENTACLE_COUNT];
|
||||
|
||||
@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();
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,103 +4,179 @@ import com.mojang.blaze3d.vertex.PoseStack;
|
|||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import ru.betterend.entity.DragonflyEntity;
|
||||
|
||||
public class DragonflyEntityModel extends BlockBenchModel<DragonflyEntity> {
|
||||
private final ModelPart model;
|
||||
private final ModelPart head;
|
||||
private final ModelPart tail;
|
||||
private final ModelPart tail_2;
|
||||
private final ModelPart wing_1;
|
||||
private final ModelPart wing_2;
|
||||
private final ModelPart wing_3;
|
||||
private final ModelPart wing_4;
|
||||
private final ModelPart legs_1;
|
||||
private final ModelPart legs_2;
|
||||
private final ModelPart model;
|
||||
private final ModelPart head;
|
||||
private final ModelPart tail;
|
||||
private final ModelPart tail_2;
|
||||
private final ModelPart wing_1;
|
||||
private final ModelPart wing_2;
|
||||
private final ModelPart wing_3;
|
||||
private final ModelPart wing_4;
|
||||
private final ModelPart legs_1;
|
||||
private final ModelPart legs_2;
|
||||
|
||||
public DragonflyEntityModel() {
|
||||
super(RenderType::entityCutout);
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
texWidth = 64;
|
||||
texHeight = 64;
|
||||
|
||||
model = new ModelPart(this);
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F),
|
||||
PartPose.offset(2.0F, 21.5F, -4.0F));
|
||||
/*model = new ModelPart(this);
|
||||
model.setPos(2.0F, 21.5F, -4.0F);
|
||||
model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);
|
||||
model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);*/
|
||||
|
||||
head = new ModelPart(this);
|
||||
bodyPart.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create()
|
||||
.texOffs(17, 0)
|
||||
.addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F),
|
||||
PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F,
|
||||
0.3491F, 0.0F, 0.0F));
|
||||
/*head = new ModelPart(this);
|
||||
head.setPos(-2.0F, -2.0F, 0.0F);
|
||||
model.addChild(head);
|
||||
setRotationAngle(head, 0.3491F, 0.0F, 0.0F);
|
||||
head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F);
|
||||
head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F);*/
|
||||
|
||||
PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL, CubeListBuilder.create()
|
||||
.texOffs(26, 0)
|
||||
.addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F),
|
||||
PartPose.offset(-2.0F, -2.0F, 9.0F));
|
||||
/*
|
||||
tail = new ModelPart(this);
|
||||
tail.setPos(-2.0F, -2.0F, 9.0F);
|
||||
model.addChild(tail);
|
||||
tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F);
|
||||
*/
|
||||
|
||||
tailPart.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create()
|
||||
.texOffs(36, 0)
|
||||
.addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F),
|
||||
PartPose.offset(0.0F, 0.0F, 7.0F));
|
||||
|
||||
/*
|
||||
tail_2 = new ModelPart(this);
|
||||
tail_2.setPos(0.0F, 0.0F, 7.0F);
|
||||
tail.addChild(tail_2);
|
||||
tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F);
|
||||
*/
|
||||
|
||||
wing_1 = new ModelPart(this);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create()
|
||||
.texOffs(0, 13)
|
||||
.addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 4.0F));
|
||||
|
||||
/*wing_1 = new ModelPart(this);
|
||||
wing_1.setPos(-2.0F, -4.0F, 4.0F);
|
||||
model.addChild(wing_1);
|
||||
wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);
|
||||
wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/
|
||||
|
||||
wing_2 = new ModelPart(this);
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(0, 13)
|
||||
.addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 4.0F));
|
||||
/*wing_2 = new ModelPart(this);
|
||||
wing_2.setPos(-2.0F, -4.0F, 4.0F);
|
||||
model.addChild(wing_2);
|
||||
wing_2.mirror = true;
|
||||
wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);
|
||||
wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/
|
||||
|
||||
wing_3 = new ModelPart(this);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE, CubeListBuilder.create()
|
||||
.texOffs(4, 17)
|
||||
.addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 8.0F));
|
||||
/*wing_3 = new ModelPart(this);
|
||||
wing_3.setPos(-2.0F, -4.0F, 8.0F);
|
||||
model.addChild(wing_3);
|
||||
wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);
|
||||
wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/
|
||||
|
||||
wing_4 = new ModelPart(this);
|
||||
wing_4.setPos(-2.0F, -4.0F, 8.0F);
|
||||
model.addChild(wing_4);
|
||||
wing_4.mirror = true;
|
||||
wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(4, 17)
|
||||
.addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F),
|
||||
PartPose.offset(-2.0F, -4.0F, 8.0F));
|
||||
/*wing_4 = new ModelPart(this);
|
||||
wing_4.setPos(-2.0F, -4.0F, 8.0F);
|
||||
model.addChild(wing_4);
|
||||
wing_4.mirror = true;
|
||||
wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/
|
||||
|
||||
legs_1 = new ModelPart(this);
|
||||
legs_1.setPos(-1.0F, 0.0F, 1.0F);
|
||||
model.addChild(legs_1);
|
||||
setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F);
|
||||
legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);
|
||||
bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create()
|
||||
.texOffs(50, 1)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F,
|
||||
0.0F, 0.0F, -0.5236F));
|
||||
/*legs_1 = new ModelPart(this);
|
||||
legs_1.setPos(-1.0F, 0.0F, 1.0F);
|
||||
model.addChild(legs_1);
|
||||
setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F);
|
||||
legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/
|
||||
|
||||
legs_2 = new ModelPart(this);
|
||||
legs_2.setPos(-3.0F, 0.0F, 1.0F);
|
||||
model.addChild(legs_2);
|
||||
setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F);
|
||||
legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);
|
||||
}
|
||||
bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create()
|
||||
.texOffs(50, 1)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F,
|
||||
0.0F, 0.0F, 0.5236F));
|
||||
/*legs_2 = new ModelPart(this);
|
||||
legs_2.setPos(-3.0F, 0.0F, 1.0F);
|
||||
model.addChild(legs_2);
|
||||
setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F);
|
||||
legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/
|
||||
|
||||
@Override
|
||||
public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress,
|
||||
float headYaw, float headPitch) {
|
||||
float progress = animationProgress * 2F;
|
||||
/*
|
||||
texWidth = 64;
|
||||
texHeight = 64;
|
||||
*/
|
||||
return LayerDefinition.create(modelData, 64, 64);
|
||||
}
|
||||
|
||||
wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F;
|
||||
wing_2.zRot = -wing_1.zRot;
|
||||
public DragonflyEntityModel(ModelPart modelPart) {
|
||||
super(RenderType::entityCutout);
|
||||
|
||||
wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F;
|
||||
wing_4.zRot = -wing_3.zRot;
|
||||
model = modelPart.getChild(PartNames.BODY);
|
||||
head = model.getChild(PartNames.HEAD);
|
||||
tail = model.getChild(PartNames.TAIL);
|
||||
tail_2 = tail.getChild(PartNames.TAIL_FIN);
|
||||
wing_1 = model.getChild(PartNames.LEFT_WING);
|
||||
wing_2 = model.getChild(PartNames.RIGHT_WING);
|
||||
wing_3 = model.getChild(PartNames.LEFT_WING_BASE);
|
||||
wing_4 = model.getChild(PartNames.RIGHT_WING_BASE);
|
||||
legs_1 = model.getChild(PartNames.LEFT_LEG);
|
||||
legs_2 = model.getChild(PartNames.RIGHT_LEG);
|
||||
}
|
||||
|
||||
progress = animationProgress * 0.05F;
|
||||
@Override
|
||||
public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress,
|
||||
float headYaw, float headPitch) {
|
||||
float progress = animationProgress * 2F;
|
||||
|
||||
head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F;
|
||||
tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F;
|
||||
tail_2.xRot = -tail.xRot * 1.5F;
|
||||
}
|
||||
wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F;
|
||||
wing_2.zRot = -wing_1.zRot;
|
||||
|
||||
@Override
|
||||
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
|
||||
float green, float blue, float alpha) {
|
||||
model.render(matrices, vertices, light, overlay);
|
||||
}
|
||||
wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F;
|
||||
wing_4.zRot = -wing_3.zRot;
|
||||
|
||||
progress = animationProgress * 0.05F;
|
||||
|
||||
head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F;
|
||||
tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F;
|
||||
tail_2.xRot = -tail.xRot * 1.5F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
|
||||
float green, float blue, float alpha) {
|
||||
model.render(matrices, vertices, light, overlay);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,12 @@ import com.mojang.blaze3d.vertex.PoseStack;
|
|||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import ru.betterend.entity.EndFishEntity;
|
||||
|
||||
|
@ -15,47 +21,91 @@ public class EndFishEntityModel extends BlockBenchModel<EndFishEntity> {
|
|||
private final ModelPart fin_right;
|
||||
private final ModelPart fin_left;
|
||||
|
||||
public EndFishEntityModel() {
|
||||
super(RenderType::entityCutout);
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
texWidth = 32;
|
||||
texHeight = 32;
|
||||
|
||||
model = new ModelPart(this);
|
||||
PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F),
|
||||
PartPose.offset(0.0F, 20.0F, 0.0F));
|
||||
/*model = new ModelPart(this);
|
||||
model.setPos(0.0F, 20.0F, 0.0F);
|
||||
model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);
|
||||
model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);*/
|
||||
|
||||
fin_top = new ModelPart(this);
|
||||
fin_top.setPos(0.0F, -2.0F, -4.0F);
|
||||
modelPartData.addOrReplaceChild(PartNames.TOP_FIN, CubeListBuilder.create()
|
||||
.texOffs(0, 6)
|
||||
.addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F,
|
||||
-0.6981F, 0.0F, 0.0F));
|
||||
/*fin_top.setPos(0.0F, -2.0F, -4.0F);
|
||||
model.addChild(fin_top);
|
||||
setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F);
|
||||
fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);
|
||||
fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*
|
||||
*/
|
||||
|
||||
fin_bottom = new ModelPart(this);
|
||||
modelPartData.addOrReplaceChild(PartNames.BOTTOM_FIN, CubeListBuilder.create()
|
||||
.texOffs(0, 6)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F),
|
||||
PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F,
|
||||
0.6981F, 0.0F, 0.0F));
|
||||
/*fin_bottom = new ModelPart(this);
|
||||
fin_bottom.setPos(0.0F, 2.0F, -4.0F);
|
||||
model.addChild(fin_bottom);
|
||||
setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F);
|
||||
fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);
|
||||
fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*/
|
||||
|
||||
flipper = new ModelPart(this);
|
||||
modelPartData.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create()
|
||||
.texOffs(0, 15)
|
||||
.addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F),
|
||||
PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F,
|
||||
-0.7854F, 0.0F, 0.0F));
|
||||
/*flipper = new ModelPart(this);
|
||||
flipper.setPos(0.0F, 0.0F, 2.0F);
|
||||
model.addChild(flipper);
|
||||
setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F);
|
||||
flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);
|
||||
flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);*/
|
||||
|
||||
fin_right = new ModelPart(this);
|
||||
modelPartData.addOrReplaceChild(PartNames.RIGHT_FIN, CubeListBuilder.create()
|
||||
.texOffs(0, 25)
|
||||
.addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F),
|
||||
PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F,
|
||||
1.5708F, 0.7854F, 0.0F));
|
||||
/*fin_right = new ModelPart(this);
|
||||
fin_right.setPos(-1.0F, 0.0F, -1.0F);
|
||||
model.addChild(fin_right);
|
||||
setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F);
|
||||
fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);
|
||||
fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);*/
|
||||
|
||||
fin_left = new ModelPart(this);
|
||||
modelPartData.addOrReplaceChild(PartNames.LEFT_FIN, CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(0, 25)
|
||||
.addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F),
|
||||
PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F,
|
||||
1.5708F, -0.7854F, 0.0F));
|
||||
/*fin_left = new ModelPart(this);
|
||||
fin_left.setPos(1.0F, 0.0F, -1.0F);
|
||||
model.addChild(fin_left);
|
||||
setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F);
|
||||
fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);
|
||||
fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);*/
|
||||
|
||||
/*
|
||||
texWidth = 32;
|
||||
texHeight = 32;
|
||||
*/
|
||||
return LayerDefinition.create(modelData, 32, 32);
|
||||
}
|
||||
|
||||
public EndFishEntityModel(ModelPart modelPart) {
|
||||
super(RenderType::entityCutout);
|
||||
|
||||
model = modelPart.getChild(PartNames.BODY);
|
||||
fin_top = modelPart.getChild(PartNames.TOP_FIN);
|
||||
fin_bottom = modelPart.getChild(PartNames.BOTTOM_FIN);
|
||||
flipper = modelPart.getChild(PartNames.TAIL_FIN);
|
||||
fin_right = modelPart.getChild(PartNames.RIGHT_FIN);
|
||||
fin_left = modelPart.getChild(PartNames.LEFT_FIN);}
|
||||
|
||||
@Override
|
||||
public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress,
|
||||
float headYaw, float headPitch) {
|
||||
|
|
|
@ -5,38 +5,94 @@ import com.mojang.blaze3d.vertex.PoseStack;
|
|||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.model.ListModel;
|
||||
import net.minecraft.client.model.geom.EntityModelSet;
|
||||
import net.minecraft.client.model.geom.ModelLayers;
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import ru.bclib.util.MHelper;
|
||||
import ru.betterend.entity.EndSlimeEntity;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T> {
|
||||
private final ModelPart flower;
|
||||
private final ModelPart crop;
|
||||
private final ModelPart innerCube;
|
||||
private final ModelPart rightEye;
|
||||
private final ModelPart leftEye;
|
||||
private final ModelPart mouth;
|
||||
private final ModelPart flower;
|
||||
private final ModelPart crop;
|
||||
|
||||
public EndSlimeEntityModel(boolean onlyShell) {
|
||||
super(RenderType::entityCutout);
|
||||
public static LayerDefinition getShellOnlyTexturedModelData() {
|
||||
return getTexturedModelData(true);
|
||||
}
|
||||
public static LayerDefinition getCompleteTexturedModelData() {
|
||||
return getTexturedModelData(false);
|
||||
}
|
||||
|
||||
this.innerCube = new ModelPart(this, 0, 16);
|
||||
this.rightEye = new ModelPart(this, 32, 0);
|
||||
this.leftEye = new ModelPart(this, 32, 4);
|
||||
this.mouth = new ModelPart(this, 32, 8);
|
||||
this.flower = new ModelPart(this);
|
||||
this.crop = new ModelPart(this);
|
||||
private static LayerDefinition getTexturedModelData(boolean onlyShell) {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
//this.innerCube = new ModelPart(this, 0, 16);
|
||||
if (onlyShell) {
|
||||
this.innerCube.texOffs(0, 0);
|
||||
this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F),
|
||||
PartPose.ZERO);
|
||||
/* this.innerCube.texOffs(0, 0);
|
||||
this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);*/
|
||||
} else {
|
||||
this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F);
|
||||
this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
|
||||
this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
|
||||
this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F);
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(0, 16)
|
||||
.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F),
|
||||
PartPose.ZERO);
|
||||
//this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, CubeListBuilder.create()
|
||||
.texOffs(32, 0)
|
||||
.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F),
|
||||
PartPose.ZERO);
|
||||
//this.rightEye = new ModelPart(this, 32, 0);
|
||||
//this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, CubeListBuilder.create()
|
||||
.texOffs(32, 4)
|
||||
.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F),
|
||||
PartPose.ZERO);
|
||||
//this.leftEye = new ModelPart(this, 32, 4);
|
||||
//this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create()
|
||||
.texOffs(32, 8)
|
||||
.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F),
|
||||
PartPose.ZERO);
|
||||
//this.mouth = new ModelPart(this, 32, 8);
|
||||
//this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO);
|
||||
PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO);
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
final PartDefinition parent = i<4?flowerPart:cropPart;
|
||||
final float rot = MHelper.degreesToRadians( i<4 ? (i * 45F) : ((i-4) * 90F + 45F) );
|
||||
|
||||
PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_"+i,
|
||||
CubeListBuilder.create(),
|
||||
PartPose.offsetAndRotation(0,0,0,0,rot, 0));
|
||||
|
||||
|
||||
petalRotPart.addOrReplaceChild("petal_"+i,
|
||||
CubeListBuilder.create()
|
||||
.texOffs(40, 0)
|
||||
.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F),
|
||||
PartPose.offset(-4, 8, 0));
|
||||
}
|
||||
/* this.flower = new ModelPart(this);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
ModelPart petalRot = new ModelPart(this);
|
||||
petalRot.yRot = MHelper.degreesToRadians(i * 45F);
|
||||
|
@ -48,6 +104,7 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
|
|||
this.flower.addChild(petalRot);
|
||||
petalRot.addChild(petal);
|
||||
}
|
||||
this.crop = new ModelPart(this);
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
ModelPart petalRot = new ModelPart(this);
|
||||
|
@ -60,6 +117,30 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
|
|||
this.crop.addChild(petalRot);
|
||||
petalRot.addChild(petal);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 32);
|
||||
}
|
||||
|
||||
public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell){
|
||||
super(RenderType::entityCutout);
|
||||
|
||||
ModelPart modelPart = modelSet.bakeLayer(onlyShell ? EndEntitiesRenders.END_SLIME_SHELL_MODEL : EndEntitiesRenders.END_SLIME_MODEL);
|
||||
|
||||
innerCube = modelPart.getChild(PartNames.BODY);
|
||||
if (!onlyShell) {
|
||||
rightEye = modelPart.getChild(PartNames.RIGHT_EYE);
|
||||
leftEye = modelPart.getChild(PartNames.LEFT_EYE);
|
||||
mouth = modelPart.getChild(PartNames.MOUTH);
|
||||
flower = modelPart.getChild("flower");
|
||||
crop = modelPart.getChild("crop");
|
||||
} else {
|
||||
rightEye = null;
|
||||
leftEye = null;
|
||||
mouth = null;
|
||||
flower = null;
|
||||
crop = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,8 +157,16 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
|
|||
crop.render(matrices, vertices, light, overlay);
|
||||
}
|
||||
|
||||
private boolean isOnlyShell(){
|
||||
return rightEye==null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<ModelPart> parts() {
|
||||
return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth);
|
||||
if (isOnlyShell()) {
|
||||
return ImmutableList.of(this.innerCube);
|
||||
} else {
|
||||
return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,34 +4,150 @@ import com.mojang.blaze3d.vertex.PoseStack;
|
|||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.util.Mth;
|
||||
import ru.betterend.entity.SilkMothEntity;
|
||||
|
||||
public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> {
|
||||
private final ModelPart legsL;
|
||||
private final ModelPart cube_r1;
|
||||
private final ModelPart cube_r2;
|
||||
private final ModelPart cube_r3;
|
||||
private final ModelPart legsR;
|
||||
private final ModelPart cube_r4;
|
||||
private final ModelPart cube_r5;
|
||||
private final ModelPart cube_r6;
|
||||
private final ModelPart head_pivot;
|
||||
private final ModelPart tendril_r_r1;
|
||||
private final ModelPart tendril_r_r2;
|
||||
private final ModelPart bb_main;
|
||||
private final ModelPart wingR_r1;
|
||||
private final ModelPart wingL_r1;
|
||||
private final ModelPart abdomen_r1;
|
||||
private final ModelPart legsL;
|
||||
private final ModelPart cube_r1;
|
||||
private final ModelPart cube_r2;
|
||||
private final ModelPart cube_r3;
|
||||
private final ModelPart legsR;
|
||||
private final ModelPart cube_r4;
|
||||
private final ModelPart cube_r5;
|
||||
private final ModelPart cube_r6;
|
||||
private final ModelPart head_pivot;
|
||||
private final ModelPart tendril_r_r1;
|
||||
private final ModelPart tendril_r_r2;
|
||||
private final ModelPart bb_main;
|
||||
private final ModelPart wingR_r1;
|
||||
private final ModelPart wingL_r1;
|
||||
private final ModelPart abdomen_r1;
|
||||
|
||||
public SilkMothEntityModel() {
|
||||
super(RenderType::entityCutout);
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
texWidth = 64;
|
||||
texHeight = 64;
|
||||
PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create()
|
||||
.texOffs(0, 0),
|
||||
PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f,
|
||||
0.0f, 0.0f, 0.6981f));
|
||||
|
||||
legsL = new ModelPart(this);
|
||||
legsL.addOrReplaceChild("cube_r1", CubeListBuilder.create()
|
||||
.texOffs(0, 13)
|
||||
.addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f,
|
||||
0.0f, 0.2182f, 0.3927f));
|
||||
|
||||
legsL.addOrReplaceChild("cube_r2", CubeListBuilder.create()
|
||||
.texOffs(0, 15)
|
||||
.addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f,
|
||||
0.0f, 0.0f, 0.3927f));
|
||||
|
||||
legsL.addOrReplaceChild("cube_r3", CubeListBuilder.create()
|
||||
.texOffs(0, 14)
|
||||
.addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f,
|
||||
0.0f, -0.2182f, 0.3927f));
|
||||
|
||||
PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create()
|
||||
.texOffs(0, 0),
|
||||
PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f,
|
||||
0.0f, 3.1416f, -0.6545f));
|
||||
|
||||
legsR.addOrReplaceChild("cube_r4", CubeListBuilder.create()
|
||||
.texOffs(0, 10)
|
||||
.addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f,
|
||||
0.0f, 0.2182f, 0.3927f));
|
||||
|
||||
legsR.addOrReplaceChild("cube_r5", CubeListBuilder.create()
|
||||
.texOffs(0, 11)
|
||||
.addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f,
|
||||
0.0f, 0.0f, 0.3927f));
|
||||
|
||||
legsR.addOrReplaceChild("cube_r6", CubeListBuilder.create()
|
||||
.texOffs(0, 12)
|
||||
.addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f),
|
||||
PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f,
|
||||
0.0f, -0.2182f, 0.3927f));
|
||||
|
||||
PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create()
|
||||
.texOffs(15, 10)
|
||||
.addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f),
|
||||
PartPose.offset(0.0f, 18.0f, -3.0f));
|
||||
|
||||
head_pivot.addOrReplaceChild("tendril_r_r1", CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(23, 0)
|
||||
.addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f),
|
||||
PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f,
|
||||
0.0f, 0.0f, 0.3927f));
|
||||
|
||||
head_pivot.addOrReplaceChild("tendril_r_r2", CubeListBuilder.create()
|
||||
.texOffs(23, 0)
|
||||
.addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f),
|
||||
PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f,
|
||||
0.0f, 0.0f, -0.3927f));
|
||||
|
||||
PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(19, 19)
|
||||
.addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f),
|
||||
PartPose.offset(0.0f, 24.0f, 0.0f));
|
||||
|
||||
bb_main.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(0, 5)
|
||||
.addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f),
|
||||
PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f,
|
||||
0.0f, 0.0f, 0.3927f));
|
||||
|
||||
bb_main.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create()
|
||||
.texOffs(0, 5)
|
||||
.addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f),
|
||||
PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f,
|
||||
0.0f, 0.0f, -0.3927f));
|
||||
|
||||
bb_main.addOrReplaceChild("abdomen_r1", CubeListBuilder.create()
|
||||
.texOffs(0, 10)
|
||||
.addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f),
|
||||
PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f,
|
||||
-0.3927f, 0.0f, 0.0f));
|
||||
|
||||
/*texWidth = 64;
|
||||
texHeight = 64;*/
|
||||
return LayerDefinition.create(modelData, 64, 64);
|
||||
}
|
||||
|
||||
public SilkMothEntityModel(ModelPart modelPart) {
|
||||
super(RenderType::entityCutout);
|
||||
|
||||
legsL = modelPart.getChild(PartNames.LEFT_LEG);
|
||||
cube_r1 = legsL.getChild("cube_r1");
|
||||
cube_r2 = legsL.getChild("cube_r2");
|
||||
cube_r3 = legsL.getChild("cube_r3");
|
||||
legsR = modelPart.getChild(PartNames.RIGHT_LEG);
|
||||
cube_r4 = legsR.getChild("cube_r4");
|
||||
cube_r5 = legsR.getChild("cube_r5");
|
||||
cube_r6 = legsR.getChild("cube_r6");
|
||||
head_pivot = modelPart.getChild(PartNames.HEAD);
|
||||
tendril_r_r1 = head_pivot.getChild("tendril_r_r1");
|
||||
tendril_r_r2 = head_pivot.getChild("tendril_r_r2");
|
||||
bb_main = modelPart.getChild(PartNames.BODY);
|
||||
wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING);
|
||||
wingL_r1 = bb_main.getChild(PartNames.LEFT_WING);
|
||||
abdomen_r1 = bb_main.getChild("abdomen_r1");
|
||||
|
||||
/*legsL = new ModelPart(this);
|
||||
legsL.setPos(1.5F, 19.9F, -0.45F);
|
||||
setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F);
|
||||
|
||||
|
@ -111,28 +227,28 @@ public class SilkMothEntityModel extends BlockBenchModel<SilkMothEntity> {
|
|||
abdomen_r1.setPos(1.0F, -3.9F, 0.0F);
|
||||
bb_main.addChild(abdomen_r1);
|
||||
setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F);
|
||||
abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);
|
||||
}
|
||||
abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress,
|
||||
float headYaw, float headPitch) {
|
||||
wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F;
|
||||
wingL_r1.zRot = -wingR_r1.zRot;
|
||||
head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F;
|
||||
tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F;
|
||||
tendril_r_r2.zRot = -tendril_r_r1.zRot;
|
||||
abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F;
|
||||
legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F;
|
||||
legsL.zRot = -legsR.zRot;
|
||||
}
|
||||
@Override
|
||||
public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress,
|
||||
float headYaw, float headPitch) {
|
||||
wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F;
|
||||
wingL_r1.zRot = -wingR_r1.zRot;
|
||||
head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F;
|
||||
tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F;
|
||||
tendril_r_r2.zRot = -tendril_r_r1.zRot;
|
||||
abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F;
|
||||
legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F;
|
||||
legsL.zRot = -legsR.zRot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
|
||||
float green, float blue, float alpha) {
|
||||
bb_main.render(matrices, vertices, light, overlay);
|
||||
head_pivot.render(matrices, vertices, light, overlay);
|
||||
legsL.render(matrices, vertices, light, overlay);
|
||||
legsR.render(matrices, vertices, light, overlay);
|
||||
}
|
||||
@Override
|
||||
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red,
|
||||
float green, float blue, float alpha) {
|
||||
bb_main.render(matrices, vertices, light, overlay);
|
||||
head_pivot.render(matrices, vertices, light, overlay);
|
||||
legsL.render(matrices, vertices, light, overlay);
|
||||
legsR.render(matrices, vertices, light, overlay);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
|
|||
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.client.renderer.entity.layers.EyesLayer;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
|
@ -13,13 +13,14 @@ import net.minecraft.resources.ResourceLocation;
|
|||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.CubozoaEntity;
|
||||
import ru.betterend.entity.model.CubozoaEntityModel;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class RendererEntityCubozoa extends MobRenderer<CubozoaEntity, CubozoaEntityModel> {
|
||||
private static final ResourceLocation[] TEXTURE = new ResourceLocation[2];
|
||||
private static final RenderType[] GLOW = new RenderType[2];
|
||||
|
||||
public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f);
|
||||
public RendererEntityCubozoa(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.CUBOZOA_MODEL)), 0.5f);
|
||||
this.addLayer(new EyesLayer<CubozoaEntity, CubozoaEntityModel>(this) {
|
||||
@Override
|
||||
public RenderType renderType() {
|
||||
|
|
|
@ -2,19 +2,22 @@ package ru.betterend.entity.render;
|
|||
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.client.renderer.entity.layers.EyesLayer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.DragonflyEntity;
|
||||
import ru.betterend.entity.model.CubozoaEntityModel;
|
||||
import ru.betterend.entity.model.DragonflyEntityModel;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class RendererEntityDragonfly extends MobRenderer<DragonflyEntity, DragonflyEntityModel> {
|
||||
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png");
|
||||
private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png"));
|
||||
|
||||
public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f);
|
||||
public RendererEntityDragonfly(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f);
|
||||
this.addLayer(new EyesLayer<DragonflyEntity, DragonflyEntityModel>(this) {
|
||||
@Override
|
||||
public RenderType renderType() {
|
||||
|
|
|
@ -6,20 +6,23 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
|
|||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.client.renderer.entity.layers.EyesLayer;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.EndFishEntity;
|
||||
import ru.betterend.entity.model.DragonflyEntityModel;
|
||||
import ru.betterend.entity.model.EndFishEntityModel;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class RendererEntityEndFish extends MobRenderer<EndFishEntity, EndFishEntityModel> {
|
||||
private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS];
|
||||
private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS];
|
||||
|
||||
public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f);
|
||||
public RendererEntityEndFish(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new EndFishEntityModel(ctx.bakeLayer(EndEntitiesRenders.END_FISH_MODEL)), 0.5f);
|
||||
this.addLayer(new EyesLayer<EndFishEntity, EndFishEntityModel>(this) {
|
||||
@Override
|
||||
public RenderType renderType() {
|
||||
|
|
|
@ -5,10 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
|
|||
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.client.renderer.entity.RenderLayerParent;
|
||||
import net.minecraft.client.renderer.entity.*;
|
||||
import net.minecraft.client.renderer.entity.layers.EyesLayer;
|
||||
import net.minecraft.client.renderer.entity.layers.RenderLayer;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
|
@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation;
|
|||
import net.minecraft.util.Mth;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.EndSlimeEntity;
|
||||
import ru.betterend.entity.model.CubozoaEntityModel;
|
||||
import ru.betterend.entity.model.EndSlimeEntityModel;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> {
|
||||
private static final ResourceLocation TEXTURE[] = new ResourceLocation[4];
|
||||
private static final RenderType GLOW[] = new RenderType[4];
|
||||
|
||||
public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new EndSlimeEntityModel<EndSlimeEntity>(false), 0.25F);
|
||||
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this));
|
||||
public RendererEntityEndSlime(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new EndSlimeEntityModel<>(ctx.getModelSet(), false), 0.25f);
|
||||
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this, ctx));
|
||||
this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) {
|
||||
@Override
|
||||
public RenderType renderType() {
|
||||
|
@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
|
|||
|
||||
private final class OverlayFeatureRenderer<T extends EndSlimeEntity>
|
||||
extends RenderLayer<T, EndSlimeEntityModel<T>> {
|
||||
private final EndSlimeEntityModel<T> modelOrdinal = new EndSlimeEntityModel<T>(true);
|
||||
private final EndSlimeEntityModel<T> modelLake = new EndSlimeEntityModel<T>(true);
|
||||
private final EndSlimeEntityModel<T> modelOrdinal;
|
||||
private final EndSlimeEntityModel<T> modelLake;
|
||||
|
||||
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext) {
|
||||
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext, EntityRendererProvider.Context ctx) {
|
||||
super(featureRendererContext);
|
||||
modelOrdinal = new EndSlimeEntityModel<>(ctx.getModelSet(), true);
|
||||
modelLake = new EndSlimeEntityModel<>(ctx.getModelSet(), true);
|
||||
}
|
||||
|
||||
public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity,
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package ru.betterend.entity.render;
|
||||
|
||||
import net.minecraft.client.model.PlayerModel;
|
||||
import net.minecraft.client.model.geom.ModelLayers;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
@ -11,8 +13,9 @@ public class RendererEntityShadowWalker
|
|||
extends HumanoidMobRenderer<ShadowWalkerEntity, PlayerModel<ShadowWalkerEntity>> {
|
||||
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png");
|
||||
|
||||
public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new PlayerModel<ShadowWalkerEntity>(0.0F, false), 0.5F);
|
||||
public RendererEntityShadowWalker(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new PlayerModel<ShadowWalkerEntity>(ctx.bakeLayer(ModelLayers.PLAYER), false), 0.5F);
|
||||
//super(entityRenderDispatcher, new PlayerModel<ShadowWalkerEntity>(0.0F, false), 0.5F);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,17 +1,20 @@
|
|||
package ru.betterend.entity.render;
|
||||
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.SilkMothEntity;
|
||||
import ru.betterend.entity.model.CubozoaEntityModel;
|
||||
import ru.betterend.entity.model.SilkMothEntityModel;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class SilkMothEntityRenderer extends MobRenderer<SilkMothEntity, SilkMothEntityModel> {
|
||||
private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png");
|
||||
|
||||
public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f);
|
||||
public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -5,7 +5,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import net.minecraft.data.BuiltinRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.ai.behavior.WeightedList;
|
||||
import net.minecraft.world.entity.ai.behavior.ShufflingList;
|
||||
import net.minecraft.world.level.biome.Biome;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import ru.bclib.api.BiomeAPI;
|
||||
|
@ -62,7 +62,7 @@ public class BYGIntegration extends ModIntegration implements EndBiomeIntegratio
|
|||
EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID);
|
||||
EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome);
|
||||
}
|
||||
WeightedList<ResourceLocation> subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills");
|
||||
ShufflingList<ResourceLocation> subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills");
|
||||
if (subBiomes != null) {
|
||||
subBiomes.stream().collect(Collectors.toList()).forEach((id) -> {
|
||||
BCLBiome subBiome = BiomeAPI.getBiome(id);
|
||||
|
|
|
@ -54,7 +54,7 @@ public class NightshadeRedwoods extends EndBiome {
|
|||
});
|
||||
|
||||
for (MobCategory group: MobCategory.values()) {
|
||||
List<SpawnerData> list = biome.getMobSettings().getMobs(group);
|
||||
List<SpawnerData> list = biome.getMobSettings().getMobs(group).unwrap();
|
||||
list.forEach((entry) -> {
|
||||
def.addMobSpawn(entry);
|
||||
});
|
||||
|
|
|
@ -16,6 +16,8 @@ import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
|
|||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
|
||||
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator;
|
||||
import ru.bclib.BCLib;
|
||||
import ru.bclib.world.biomes.BCLBiomeDef;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
@ -24,6 +26,14 @@ import ru.betterend.integration.byg.features.BYGFeatures;
|
|||
import ru.betterend.registry.EndFeatures;
|
||||
import ru.betterend.world.biome.EndBiome;
|
||||
|
||||
class FeaturesAccesor extends Features{
|
||||
static ConfiguredDecorator<?> shadowHEIGHTMAP_SQUARE;
|
||||
|
||||
static {
|
||||
shadowHEIGHTMAP_SQUARE = Decorators.HEIGHTMAP_SQUARE;
|
||||
}
|
||||
}
|
||||
|
||||
public class OldBulbisGardens extends EndBiome {
|
||||
public OldBulbisGardens() {
|
||||
super(makeDef());
|
||||
|
@ -54,7 +64,7 @@ public class OldBulbisGardens extends EndBiome {
|
|||
}
|
||||
|
||||
for (MobCategory group: MobCategory.values()) {
|
||||
List<SpawnerData> list = biome.getMobSettings().getMobs(group);
|
||||
List<SpawnerData> list = biome.getMobSettings().getMobs(group).unwrap();
|
||||
list.forEach((entry) -> {
|
||||
def.addMobSpawn(entry);
|
||||
});
|
||||
|
@ -70,7 +80,7 @@ public class OldBulbisGardens extends EndBiome {
|
|||
getter = vegetal.get(i);
|
||||
ConfiguredFeature<?, ?> feature = getter.get();
|
||||
ResourceLocation id = BetterEnd.makeID("obg_feature_" + i);
|
||||
feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1));
|
||||
feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1));
|
||||
def.addFeature(Decoration.VEGETAL_DECORATION, feature);
|
||||
}
|
||||
// Grasses and other features
|
||||
|
|
|
@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos;
|
|||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
import net.minecraft.world.level.material.Material;
|
||||
import ru.bclib.api.TagAPI;
|
||||
|
@ -21,8 +22,11 @@ import ru.betterend.integration.Integrations;
|
|||
|
||||
public class BigEtherTreeFeature extends DefaultFeature {
|
||||
@Override
|
||||
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) {
|
||||
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND))
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
|
||||
final Random random = featureConfig.random();
|
||||
final BlockPos pos = featureConfig.origin();
|
||||
final WorldGenLevel world = featureConfig.level();
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
|
||||
return false;
|
||||
|
||||
BlockState log = Integrations.BYG.getDefaultState("ether_log");
|
||||
|
|
|
@ -15,6 +15,7 @@ import net.minecraft.world.level.block.Blocks;
|
|||
import net.minecraft.world.level.block.LeavesBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
import net.minecraft.world.level.material.Material;
|
||||
import ru.bclib.api.TagAPI;
|
||||
|
@ -35,9 +36,11 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature {
|
|||
private static final List<Vector3f> BRANCH;
|
||||
|
||||
@Override
|
||||
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos,
|
||||
NoneFeatureConfiguration config) {
|
||||
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND))
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
|
||||
final Random random = featureConfig.random();
|
||||
final BlockPos pos = featureConfig.origin();
|
||||
final WorldGenLevel world = featureConfig.level();
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
|
||||
return false;
|
||||
|
||||
BlockState log = Integrations.BYG.getDefaultState("nightshade_log");
|
||||
|
|
|
@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel;
|
|||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
import net.minecraft.world.level.material.Material;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
|
@ -36,11 +37,13 @@ public class OldBulbisTreeFeature extends DefaultFeature {
|
|||
private static final List<Vector3f> SIDE;
|
||||
|
||||
@Override
|
||||
public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos,
|
||||
NoneFeatureConfiguration config) {
|
||||
if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND))
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featureConfig) {
|
||||
final Random random = featureConfig.random();
|
||||
final BlockPos pos = featureConfig.origin();
|
||||
final WorldGenLevel world = featureConfig.level();
|
||||
if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND))
|
||||
return false;
|
||||
if (!world.getBlockState(pos.below(4)).getBlock().is(TagAPI.GEN_TERRAIN))
|
||||
if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN))
|
||||
return false;
|
||||
|
||||
BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem");
|
||||
|
|
|
@ -1,44 +1,46 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import it.unimi.dsi.fastutil.ints.IntList;
|
||||
import me.shedaniel.math.Point;
|
||||
import me.shedaniel.math.Rectangle;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widget;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
|
||||
import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.entry.EntryIngredient;
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack;
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks;
|
||||
import net.minecraft.client.gui.GuiComponent;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.item.Items;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.IntList;
|
||||
import me.shedaniel.math.Point;
|
||||
import me.shedaniel.math.Rectangle;
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.TransferRecipeCategory;
|
||||
import me.shedaniel.rei.api.widgets.Widgets;
|
||||
import me.shedaniel.rei.gui.entries.RecipeEntry;
|
||||
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
|
||||
import me.shedaniel.rei.gui.widget.Widget;
|
||||
import net.minecraft.client.gui.GuiComponent;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import ru.betterend.recipe.builders.AlloyingRecipe;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.util.LangUtil;
|
||||
|
||||
public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDisplay> {
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getIdentifier() {
|
||||
return AlloyingRecipe.ID;
|
||||
public class REIAlloyingCategory implements TransferDisplayCategory<REIAlloyingDisplay> {
|
||||
private final EntryStack ICON;
|
||||
REIAlloyingCategory(EntryStack icon){
|
||||
ICON = icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getCategoryName() {
|
||||
return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId());
|
||||
public @NotNull CategoryIdentifier getCategoryIdentifier() {
|
||||
return REIPlugin.ALLOYING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull EntryStack getLogo() {
|
||||
return REIPlugin.END_STONE_SMELTER;
|
||||
public @NotNull Component getTitle() {
|
||||
return new TranslatableComponent(EndBlocks.END_STONE_SMELTER.getDescriptionId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull EntryStack getIcon() {
|
||||
return ICON;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -53,14 +55,14 @@ public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDi
|
|||
widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5),
|
||||
new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime));
|
||||
List<List<EntryStack>> inputEntries = display.getInputEntries();
|
||||
List<EntryIngredient> inputEntries = display.getInputEntries();
|
||||
widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput());
|
||||
if (inputEntries.size() > 1) {
|
||||
widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput());
|
||||
} else {
|
||||
widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput());
|
||||
}
|
||||
widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput());
|
||||
widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
|
||||
return widgets;
|
||||
}
|
||||
|
||||
|
@ -77,11 +79,6 @@ public class REIAlloyingCategory implements TransferRecipeCategory<REIAlloyingDi
|
|||
matrices.popPose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) {
|
||||
return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDisplayHeight() {
|
||||
return 49;
|
||||
|
|
|
@ -1,79 +1,68 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
|
||||
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack;
|
||||
import me.shedaniel.rei.api.common.util.EntryIngredients;
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.crafting.BlastingRecipe;
|
||||
import net.minecraft.world.item.crafting.Recipe;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
|
||||
import ru.betterend.recipe.builders.AlloyingRecipe;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.TransferRecipeDisplay;
|
||||
import me.shedaniel.rei.server.ContainerInfo;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.crafting.BlastingRecipe;
|
||||
import net.minecraft.world.item.crafting.Recipe;
|
||||
import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity;
|
||||
import ru.betterend.recipe.builders.AlloyingRecipe;
|
||||
|
||||
public class REIAlloyingDisplay implements TransferRecipeDisplay {
|
||||
public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
|
||||
|
||||
private static List<EntryStack> fuel;
|
||||
|
||||
private Recipe<?> recipe;
|
||||
private List<List<EntryStack>> input;
|
||||
private List<EntryStack> output;
|
||||
private float xp;
|
||||
private double smeltTime;
|
||||
|
||||
|
||||
|
||||
public REIAlloyingDisplay(AlloyingRecipe recipe) {
|
||||
this(recipe, recipe.getExperience(), recipe.getSmeltTime());
|
||||
}
|
||||
protected REIAlloyingDisplay(Recipe<?> recipe, float xp, double smeltTime) {
|
||||
super(
|
||||
EntryIngredients.ofIngredients(recipe.getIngredients()),
|
||||
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
|
||||
);
|
||||
this.recipe = recipe;
|
||||
this.input = EntryStack.ofIngredients(recipe.getIngredients());
|
||||
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
|
||||
this.xp = recipe.getExperience();
|
||||
this.smeltTime = recipe.getSmeltTime();
|
||||
this.xp = xp;
|
||||
this.smeltTime = smeltTime;
|
||||
}
|
||||
|
||||
public REIAlloyingDisplay(BlastingRecipe recipe) {
|
||||
this.recipe = recipe;
|
||||
this.input = EntryStack.ofIngredients(recipe.getIngredients());
|
||||
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
|
||||
this.xp = recipe.getExperience();
|
||||
this.smeltTime = recipe.getCookingTime();
|
||||
}
|
||||
|
||||
public static List<EntryStack> getFuel() {
|
||||
return fuel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Optional<ResourceLocation> getRecipeLocation() {
|
||||
public @NotNull Optional<ResourceLocation> getDisplayLocation() {
|
||||
return Optional.ofNullable(recipe).map(Recipe::getId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getInputEntries() {
|
||||
return this.input;
|
||||
public CategoryIdentifier<?> getCategoryIdentifier() {
|
||||
return REIPlugin.ALLOYING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getResultingEntries() {
|
||||
return Collections.singletonList(output);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getRecipeCategory() {
|
||||
return AlloyingRecipe.ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getRequiredEntries() {
|
||||
return this.input;
|
||||
}
|
||||
// @Override
|
||||
// public @NotNull List<List<EntryStack>> getRequiredEntries() {
|
||||
// return this.input;
|
||||
// }
|
||||
|
||||
public float getXp() {
|
||||
return this.xp;
|
||||
|
@ -97,14 +86,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay {
|
|||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
|
||||
return this.input;
|
||||
}
|
||||
// @Override
|
||||
// public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
|
||||
// return this.input;
|
||||
// }
|
||||
|
||||
static {
|
||||
fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream()
|
||||
.map(Item::getDefaultInstance).map(EntryStack::create)
|
||||
.map(Item::getDefaultInstance).map(EntryStacks::of)
|
||||
.map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel")
|
||||
.withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList());
|
||||
}
|
||||
|
|
|
@ -1,40 +1,39 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import me.shedaniel.math.Point;
|
||||
import me.shedaniel.math.Rectangle;
|
||||
import me.shedaniel.rei.api.client.gui.DisplayRenderer;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Slot;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widget;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
|
||||
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack;
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.world.item.Items;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
|
||||
import me.shedaniel.math.Point;
|
||||
import me.shedaniel.math.Rectangle;
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.RecipeCategory;
|
||||
import me.shedaniel.rei.api.widgets.Slot;
|
||||
import me.shedaniel.rei.api.widgets.Tooltip;
|
||||
import me.shedaniel.rei.api.widgets.Widgets;
|
||||
import me.shedaniel.rei.gui.entries.RecipeEntry;
|
||||
import me.shedaniel.rei.gui.widget.Widget;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.resources.language.I18n;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.Items;
|
||||
|
||||
public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDisplay> {
|
||||
public class REIAlloyingFuelCategory implements DisplayCategory<REIAlloyingFuelDisplay> {
|
||||
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##");
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getIdentifier() {
|
||||
public @NotNull CategoryIdentifier getCategoryIdentifier() {
|
||||
return REIPlugin.ALLOYING_FUEL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getCategoryName() {
|
||||
return I18n.get("category.rei.fuel");
|
||||
public @NotNull Component getTitle() {
|
||||
return new TranslatableComponent("category.rei.fuel");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -43,12 +42,12 @@ public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDi
|
|||
}
|
||||
|
||||
@Override
|
||||
public @NotNull EntryStack getLogo() {
|
||||
return EntryStack.create(Items.COAL);
|
||||
public @NotNull EntryStack getIcon() {
|
||||
return EntryStacks.of(Items.COAL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<Widget> setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) {
|
||||
public List<Widget> setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) {
|
||||
Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17);
|
||||
String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime());
|
||||
List<Widget> widgets = Lists.newArrayList();
|
||||
|
@ -61,10 +60,10 @@ public class REIAlloyingFuelCategory implements RecipeCategory<REIAlloyingFuelDi
|
|||
}
|
||||
|
||||
@Override
|
||||
public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) {
|
||||
public DisplayRenderer getDisplayRenderer(REIAlloyingFuelDisplay recipe) {
|
||||
Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight();
|
||||
String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d);
|
||||
return new RecipeEntry() {
|
||||
return new DisplayRenderer() {
|
||||
private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems);
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,35 +1,31 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
|
||||
import me.shedaniel.rei.api.common.entry.EntryIngredient;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.RecipeDisplay;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public class REIAlloyingFuelDisplay implements RecipeDisplay {
|
||||
private final EntryStack fuel;
|
||||
public class REIAlloyingFuelDisplay extends BasicDisplay {
|
||||
private final int fuelTime;
|
||||
|
||||
public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) {
|
||||
this.fuel = fuel;
|
||||
public REIAlloyingFuelDisplay(List<EntryIngredient> fuel, CompoundTag tag) {
|
||||
this(fuel, tag.getInt("fuelTime"));
|
||||
}
|
||||
|
||||
public REIAlloyingFuelDisplay(List<EntryIngredient> fuel, int fuelTime) {
|
||||
super(fuel, Collections.emptyList());
|
||||
this.fuelTime = fuelTime;
|
||||
}
|
||||
/*public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) {
|
||||
this.fuel = fuel;
|
||||
this.fuelTime = fuelTime;
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getInputEntries() {
|
||||
return Collections.singletonList(Collections.singletonList(fuel));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getResultingEntries() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getRecipeCategory() {
|
||||
public CategoryIdentifier<?> getCategoryIdentifier() {
|
||||
return REIPlugin.ALLOYING_FUEL;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,50 +1,55 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.IntList;
|
||||
import me.shedaniel.math.Point;
|
||||
import me.shedaniel.math.Rectangle;
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.TransferRecipeCategory;
|
||||
import me.shedaniel.rei.api.widgets.Widgets;
|
||||
import me.shedaniel.rei.gui.entries.RecipeEntry;
|
||||
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
|
||||
import me.shedaniel.rei.gui.widget.Widget;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widget;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
|
||||
import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.entry.EntryIngredient;
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack;
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks;
|
||||
import net.minecraft.client.gui.GuiComponent;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.BlockItem;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.betterend.blocks.basis.EndAnvilBlock;
|
||||
import ru.betterend.util.LangUtil;
|
||||
|
||||
public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay> {
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class REIAnvilCategory implements TransferDisplayCategory<REIAnvilDisplay> {
|
||||
private final EntryStack[] ANVILS;
|
||||
|
||||
REIAnvilCategory(EntryStack[] anvils){
|
||||
ANVILS = anvils;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getIdentifier() {
|
||||
public @NotNull CategoryIdentifier getCategoryIdentifier() {
|
||||
return REIPlugin.SMITHING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getCategoryName() {
|
||||
return LangUtil.translate(Blocks.ANVIL.getDescriptionId());
|
||||
public @NotNull Component getTitle() {
|
||||
return new TranslatableComponent(Blocks.ANVIL.getDescriptionId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull EntryStack getLogo() {
|
||||
return REIPlugin.ANVILS[0];
|
||||
public @NotNull EntryStack getIcon() {
|
||||
return ANVILS[0];
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public @NotNull List<Widget> setupDisplay(REIAnvilDisplay display, Rectangle bounds) {
|
||||
Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10);
|
||||
|
@ -53,23 +58,27 @@ public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay>
|
|||
int x = startPoint.x + 10;
|
||||
int y = startPoint.y;
|
||||
widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5)));
|
||||
List<List<EntryStack>> inputEntries = display.getInputEntries();
|
||||
List<EntryStack> materials = inputEntries.get(1);
|
||||
List<EntryIngredient> inputEntries = display.getInputEntries();
|
||||
EntryIngredient materials = inputEntries.get(1);
|
||||
int anvilLevel = display.getAnvilLevel();
|
||||
List<EntryStack> anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> {
|
||||
Block block = ((BlockItem) anvil.getItem()).getBlock();
|
||||
List anvils = Arrays.stream(ANVILS).filter(anvil -> {
|
||||
Object value = anvil.getValue();
|
||||
if (value instanceof ItemStack){
|
||||
value = ((ItemStack) value).getItem();
|
||||
}
|
||||
Block block = ((BlockItem) value).getBlock();
|
||||
if (block instanceof EndAnvilBlock) {
|
||||
return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel;
|
||||
}
|
||||
return anvilLevel == 1;
|
||||
}).collect(Collectors.toList());
|
||||
materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount()));
|
||||
//materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount()));
|
||||
widgets.add(Widgets.createArrow(new Point(x + 24, y + 4)));
|
||||
widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15),
|
||||
new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB));
|
||||
widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput());
|
||||
widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
|
||||
widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils));
|
||||
|
||||
return widgets;
|
||||
|
@ -88,11 +97,6 @@ public class REIAnvilCategory implements TransferRecipeCategory<REIAnvilDisplay>
|
|||
matrices.popPose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) {
|
||||
return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDisplayHeight() {
|
||||
return 60;
|
||||
|
|
|
@ -1,29 +1,27 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.TransferRecipeDisplay;
|
||||
import me.shedaniel.rei.server.ContainerInfo;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
|
||||
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
|
||||
import me.shedaniel.rei.api.common.util.EntryIngredients;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.crafting.Recipe;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.betterend.recipe.builders.AnvilRecipe;
|
||||
|
||||
public class REIAnvilDisplay implements TransferRecipeDisplay {
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
|
||||
|
||||
private final AnvilRecipe recipe;
|
||||
private final List<List<EntryStack>> input;
|
||||
private final List<EntryStack> output;
|
||||
|
||||
public REIAnvilDisplay(AnvilRecipe recipe) {
|
||||
super(
|
||||
EntryIngredients.ofIngredients(recipe.getIngredients()),
|
||||
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
|
||||
);
|
||||
this.recipe = recipe;
|
||||
this.input = EntryStack.ofIngredients(recipe.getIngredients());
|
||||
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
|
||||
}
|
||||
|
||||
public int getDamage() {
|
||||
|
@ -39,29 +37,19 @@ public class REIAnvilDisplay implements TransferRecipeDisplay {
|
|||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Optional<ResourceLocation> getRecipeLocation() {
|
||||
public @NotNull Optional<ResourceLocation> getDisplayLocation() {
|
||||
return Optional.ofNullable(recipe).map(Recipe::getId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getInputEntries() {
|
||||
return this.input;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getResultingEntries() {
|
||||
return Collections.singletonList(output);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getRecipeCategory() {
|
||||
public CategoryIdentifier<?> getCategoryIdentifier() {
|
||||
return REIPlugin.SMITHING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getRequiredEntries() {
|
||||
return input;
|
||||
}
|
||||
// @Override
|
||||
// public @NotNull List<List<EntryStack>> getRequiredEntries() {
|
||||
// return input;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
|
@ -73,9 +61,9 @@ public class REIAnvilDisplay implements TransferRecipeDisplay {
|
|||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo,
|
||||
AbstractContainerMenu container) {
|
||||
return input;
|
||||
}
|
||||
// @Override
|
||||
// public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo,
|
||||
// AbstractContainerMenu container) {
|
||||
// return input;
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -1,7 +1,5 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper;
|
||||
import me.shedaniel.rei.server.ContainerInfoHandler;
|
||||
import ru.betterend.client.gui.EndStoneSmelterScreenHandler;
|
||||
import ru.betterend.recipe.builders.AlloyingRecipe;
|
||||
|
||||
|
@ -9,6 +7,6 @@ public class REIContainer implements Runnable {
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class));
|
||||
//ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,59 +1,59 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.IntList;
|
||||
import me.shedaniel.math.Point;
|
||||
import me.shedaniel.math.Rectangle;
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.TransferRecipeCategory;
|
||||
import me.shedaniel.rei.api.widgets.Widgets;
|
||||
import me.shedaniel.rei.gui.entries.RecipeEntry;
|
||||
import me.shedaniel.rei.gui.entries.SimpleRecipeEntry;
|
||||
import me.shedaniel.rei.gui.widget.Widget;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widget;
|
||||
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
|
||||
import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.entry.EntryIngredient;
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack;
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.Items;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.recipe.builders.InfusionRecipe;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.util.LangUtil;
|
||||
|
||||
public class REIInfusionCategory implements TransferRecipeCategory<REIInfusionDisplay> {
|
||||
import java.util.List;
|
||||
|
||||
public class REIInfusionCategory implements TransferDisplayCategory<REIInfusionDisplay> {
|
||||
|
||||
private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png");
|
||||
private final EntryStack ICON;
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getIdentifier() {
|
||||
return InfusionRecipe.ID;
|
||||
REIInfusionCategory(EntryStack icon){
|
||||
ICON = icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getCategoryName() {
|
||||
return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId());
|
||||
public @NotNull CategoryIdentifier getCategoryIdentifier() {
|
||||
return REIPlugin.INFUSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull EntryStack getLogo() {
|
||||
return REIPlugin.INFUSION_RITUAL;
|
||||
public @NotNull Component getTitle() {
|
||||
return new TranslatableComponent(EndBlocks.INFUSION_PEDESTAL.getDescriptionId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) {
|
||||
return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries());
|
||||
public @NotNull EntryStack getIcon() {
|
||||
return ICON;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public @NotNull List<Widget> setupDisplay(REIInfusionDisplay display, Rectangle bounds) {
|
||||
Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2);
|
||||
List<Widget> widgets = Lists.newArrayList();
|
||||
widgets.add(Widgets.createRecipeBase(bounds));
|
||||
List<List<EntryStack>> inputEntries = display.getInputEntries();
|
||||
List<List<EntryStack>> outputEntries = display.getResultingEntries();
|
||||
List<EntryIngredient> inputEntries = display.getInputEntries();
|
||||
List<EntryIngredient> outputEntries = display.getOutputEntries();
|
||||
widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104));
|
||||
widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput());
|
||||
widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput());
|
||||
|
@ -70,12 +70,13 @@ public class REIInfusionCategory implements TransferRecipeCategory<REIInfusionDi
|
|||
return widgets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds,
|
||||
REIInfusionDisplay display, IntList redSlots) {}
|
||||
|
||||
@Override
|
||||
public int getDisplayHeight() {
|
||||
return 104;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderRedSlots(PoseStack matrices, List<Widget> widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,38 +1,29 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.TransferRecipeDisplay;
|
||||
import me.shedaniel.rei.server.ContainerInfo;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay;
|
||||
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
|
||||
import me.shedaniel.rei.api.common.util.EntryIngredients;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.crafting.Recipe;
|
||||
import ru.betterend.recipe.builders.AlloyingRecipe;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import ru.betterend.recipe.builders.InfusionRecipe;
|
||||
|
||||
public class REIInfusionDisplay implements TransferRecipeDisplay {
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDisplay {
|
||||
|
||||
private final InfusionRecipe recipe;
|
||||
private final List<List<EntryStack>> input;
|
||||
private final List<EntryStack> output;
|
||||
private final int time;
|
||||
|
||||
public REIInfusionDisplay(InfusionRecipe recipe) {
|
||||
super(
|
||||
EntryIngredients.ofIngredients(recipe.getIngredients()),
|
||||
Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))
|
||||
);
|
||||
this.recipe = recipe;
|
||||
this.input = Lists.newArrayList();
|
||||
this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem()));
|
||||
this.time = recipe.getInfusionTime();
|
||||
|
||||
recipe.getIngredients().forEach(ingredient -> {
|
||||
input.add(EntryStack.ofIngredient(ingredient));
|
||||
});
|
||||
}
|
||||
|
||||
public int getInfusionTime() {
|
||||
|
@ -40,29 +31,19 @@ public class REIInfusionDisplay implements TransferRecipeDisplay {
|
|||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Optional<ResourceLocation> getRecipeLocation() {
|
||||
public @NotNull Optional<ResourceLocation> getDisplayLocation() {
|
||||
return Optional.ofNullable(recipe).map(Recipe::getId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getInputEntries() {
|
||||
return this.input;
|
||||
public CategoryIdentifier<?> getCategoryIdentifier() {
|
||||
return REIPlugin.INFUSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getResultingEntries() {
|
||||
return Collections.singletonList(output);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ResourceLocation getRecipeCategory() {
|
||||
return AlloyingRecipe.ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<EntryStack>> getRequiredEntries() {
|
||||
return this.input;
|
||||
}
|
||||
// @Override
|
||||
// public @NotNull List<List<EntryStack>> getRequiredEntries() {
|
||||
// return this.input;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
|
@ -74,8 +55,8 @@ public class REIInfusionDisplay implements TransferRecipeDisplay {
|
|||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
|
||||
return this.input;
|
||||
}
|
||||
// @Override
|
||||
// public List<List<EntryStack>> getOrganisedInputEntries(ContainerInfo<AbstractContainerMenu> containerInfo, AbstractContainerMenu container) {
|
||||
// return this.input;
|
||||
//}
|
||||
}
|
||||
|
|
|
@ -1,20 +1,28 @@
|
|||
package ru.betterend.integration.rei;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import me.shedaniel.rei.api.EntryStack;
|
||||
import me.shedaniel.rei.api.RecipeHelper;
|
||||
import me.shedaniel.rei.api.plugins.REIPluginV0;
|
||||
import me.shedaniel.rei.plugin.DefaultPlugin;
|
||||
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
|
||||
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
|
||||
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry;
|
||||
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
|
||||
import me.shedaniel.rei.api.common.entry.EntryIngredient;
|
||||
import me.shedaniel.rei.api.common.entry.EntryStack;
|
||||
import me.shedaniel.rei.api.common.entry.type.EntryType;
|
||||
import me.shedaniel.rei.api.common.util.EntryIngredients;
|
||||
import me.shedaniel.rei.api.common.util.EntryStacks;
|
||||
import me.shedaniel.rei.impl.ClientInternals;
|
||||
import me.shedaniel.rei.impl.Internals;
|
||||
import me.shedaniel.rei.plugin.common.DefaultPlugin;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.item.crafting.BlastingRecipe;
|
||||
import net.minecraft.world.item.crafting.RecipeType;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import ru.bclib.blocks.BaseFurnaceBlock;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.blocks.basis.EndAnvilBlock;
|
||||
|
@ -22,68 +30,81 @@ import ru.betterend.recipe.builders.AlloyingRecipe;
|
|||
import ru.betterend.recipe.builders.AnvilRecipe;
|
||||
import ru.betterend.recipe.builders.InfusionRecipe;
|
||||
import ru.betterend.registry.EndBlocks;
|
||||
import ru.betterend.registry.EndItems;
|
||||
import ru.betterend.registry.EndPortals;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class REIPlugin implements REIPluginV0 {
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
//https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java
|
||||
public class REIPlugin implements REIClientPlugin {
|
||||
public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin");
|
||||
public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel");
|
||||
public final static ResourceLocation ALLOYING = AlloyingRecipe.ID;
|
||||
public final static ResourceLocation SMITHING = AnvilRecipe.ID;
|
||||
public final static ResourceLocation INFUSION = InfusionRecipe.ID;
|
||||
public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel");
|
||||
public final static CategoryIdentifier ALLOYING = AlloyingRecipe.ID;
|
||||
public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath());
|
||||
public final static CategoryIdentifier INFUSION = InfusionRecipe.ID;
|
||||
|
||||
public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER);
|
||||
public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL);
|
||||
public final static EntryStack[] FURNACES;
|
||||
public final static EntryStack[] ANVILS;
|
||||
private EntryStack END_STONE_SMELTER;
|
||||
private EntryStack INFUSION_RITUAL;
|
||||
private EntryStack[] ANVILS;
|
||||
private EntryStack[] FURNACES;
|
||||
|
||||
@Override
|
||||
public ResourceLocation getPluginIdentifier() {
|
||||
return PLUGIN_ID;
|
||||
void init(){
|
||||
//we need to initialize those variables after the static initialization
|
||||
//otherwise the registry does not know the BlockItems
|
||||
if (END_STONE_SMELTER!=null) {
|
||||
return;
|
||||
}
|
||||
|
||||
END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER);
|
||||
INFUSION_RITUAL = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL);
|
||||
|
||||
List<EntryStack> anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream()
|
||||
.filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList())));
|
||||
anvils.add(0, EntryStacks.of(Blocks.ANVIL));
|
||||
ANVILS = anvils.toArray(new EntryStack[0]);
|
||||
|
||||
FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream()
|
||||
.filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList())))
|
||||
.toArray(new EntryStack[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRecipeDisplays(RecipeHelper recipeHelper) {
|
||||
recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new);
|
||||
recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new);
|
||||
recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new);
|
||||
recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new);
|
||||
FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> {
|
||||
public void registerDisplays(DisplayRegistry registry) {
|
||||
registry.registerRecipeFiller(AlloyingRecipe.class, AlloyingRecipe.TYPE, REIAlloyingDisplay::new);
|
||||
registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new);
|
||||
registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new);
|
||||
registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new);
|
||||
|
||||
FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> {
|
||||
if (time >= 2000) {
|
||||
recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time));
|
||||
final List<EntryIngredient> list = Arrays.asList(EntryIngredients.of(item));
|
||||
registry.add(new REIAlloyingFuelDisplay(list, time));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerOthers(RecipeHelper recipeHelper) {
|
||||
recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER);
|
||||
recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER);
|
||||
recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL);
|
||||
recipeHelper.registerWorkingStations(SMITHING, ANVILS);
|
||||
recipeHelper.removeAutoCraftButton(ALLOYING_FUEL);
|
||||
recipeHelper.removeAutoCraftButton(SMITHING);
|
||||
public void registerCategories(CategoryRegistry registry) {
|
||||
init();
|
||||
|
||||
recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES);
|
||||
recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerPluginCategories(RecipeHelper recipeHelper) {
|
||||
recipeHelper.registerCategories(
|
||||
registry.add(
|
||||
new REIAlloyingFuelCategory(),
|
||||
new REIAlloyingCategory(),
|
||||
new REIInfusionCategory(),
|
||||
new REIAnvilCategory());
|
||||
}
|
||||
new REIAlloyingCategory(END_STONE_SMELTER),
|
||||
new REIInfusionCategory(INFUSION_RITUAL),
|
||||
new REIAnvilCategory(ANVILS)
|
||||
);
|
||||
|
||||
static {
|
||||
List<EntryStack> anvils = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream()
|
||||
.filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList())));
|
||||
anvils.add(0, EntryStack.create(Blocks.ANVIL));
|
||||
ANVILS = anvils.toArray(new EntryStack[0]);
|
||||
FURNACES = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream()
|
||||
.filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList())))
|
||||
.toArray(new EntryStack[0]);
|
||||
registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER);
|
||||
registry.addWorkstations(ALLOYING, END_STONE_SMELTER);
|
||||
registry.addWorkstations(INFUSION, INFUSION_RITUAL);
|
||||
registry.addWorkstations(SMITHING, ANVILS);
|
||||
registry.removePlusButton(ALLOYING_FUEL);
|
||||
registry.removePlusButton(SMITHING);
|
||||
|
||||
registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES);
|
||||
registry.addWorkstations(DefaultPlugin.FUEL, FURNACES);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
import net.minecraft.world.entity.Entity;
|
||||
|
||||
public interface ISlime {
|
||||
public void be_setSlimeSize(int size, boolean heal);
|
||||
void entityRemove(Entity.RemovalReason removalReason);
|
||||
}
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
package ru.betterend.interfaces;
|
||||
|
||||
public interface ISpetialItem {
|
||||
public int getStackSize();
|
||||
|
||||
public boolean canPlaceOnWater();
|
||||
}
|
|
@ -71,6 +71,6 @@ public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, Fall
|
|||
@Environment(EnvType.CLIENT)
|
||||
public void registerModelPredicate() {
|
||||
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
|
||||
(itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
(itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,6 +63,6 @@ public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem,
|
|||
@Override
|
||||
public void registerModelPredicate() {
|
||||
FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"),
|
||||
(itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
(itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package ru.betterend.item;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
@ -25,6 +27,7 @@ public class EnchantedItem extends ModelProviderItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation resourceLocation) {
|
||||
ResourceLocation sourceId = Registry.ITEM.getKey(source);
|
||||
return ModelsHelper.createItemModel(sourceId);
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package ru.betterend.item;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
@ -25,11 +27,14 @@ public class EndAnvilItem extends BaseAnvilItem {
|
|||
BlockState blockState = super.getPlacementState(blockPlaceContext);
|
||||
ItemStack stack = blockPlaceContext.getItemInHand();
|
||||
int durability = stack.getOrCreateTag().getInt(DURABILITY);
|
||||
blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability);
|
||||
if (blockState!=null) {
|
||||
blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability);
|
||||
}
|
||||
return blockState;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation resourceLocation) {
|
||||
Block block = getBlock();
|
||||
ResourceLocation blockId = Registry.BLOCK.getKey(block);
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package ru.betterend.item;
|
||||
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.item.FishBucketItem;
|
||||
import net.minecraft.world.item.MobBucketItem;
|
||||
import net.minecraft.world.level.material.Fluids;
|
||||
import ru.bclib.client.models.ItemModelProvider;
|
||||
import ru.betterend.registry.EndItems;
|
||||
|
||||
public class EndBucketItem extends FishBucketItem implements ItemModelProvider {
|
||||
public class EndBucketItem extends MobBucketItem implements ItemModelProvider {
|
||||
public EndBucketItem(EntityType<?> type) {
|
||||
super(type, Fluids.WATER, EndItems.makeEndItemSettings().stacksTo(1));
|
||||
super(type, Fluids.WATER, SoundEvents.BUCKET_EMPTY, EndItems.makeEndItemSettings().stacksTo(1));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,12 @@ import com.google.common.collect.ImmutableList;
|
|||
|
||||
import net.minecraft.client.model.AgeableListModel;
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.CubeListBuilder;
|
||||
import net.minecraft.client.model.geom.builders.LayerDefinition;
|
||||
import net.minecraft.client.model.geom.builders.MeshDefinition;
|
||||
import net.minecraft.client.model.geom.builders.PartDefinition;
|
||||
import net.minecraft.client.player.AbstractClientPlayer;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
@ -12,12 +18,25 @@ public class ArmoredElytraModel<T extends LivingEntity> extends AgeableListModel
|
|||
private final ModelPart rightWing;
|
||||
private final ModelPart leftWing;
|
||||
|
||||
public ArmoredElytraModel() {
|
||||
this.leftWing = new ModelPart(this, 22, 0);
|
||||
this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F);
|
||||
this.rightWing = new ModelPart(this, 22, 0);
|
||||
this.rightWing.mirror = true;
|
||||
this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F);
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create()
|
||||
.texOffs(22, 0)
|
||||
.addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(22, 0)
|
||||
.addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f),
|
||||
PartPose.ZERO);
|
||||
|
||||
return LayerDefinition.create(modelData, 48, 48);
|
||||
}
|
||||
public ArmoredElytraModel(ModelPart modelPart) {
|
||||
leftWing = modelPart.getChild(PartNames.LEFT_WING);
|
||||
rightWing = modelPart.getChild(PartNames.RIGHT_WING);
|
||||
}
|
||||
|
||||
protected Iterable<ModelPart> headParts() {
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package ru.betterend.item.model;
|
||||
|
||||
import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer;
|
||||
import net.minecraft.world.item.ArmorMaterial;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
@ -7,8 +9,6 @@ import com.google.common.collect.Lists;
|
|||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider;
|
||||
import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider;
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.player.AbstractClientPlayer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
@ -18,18 +18,20 @@ import net.minecraft.world.item.Item;
|
|||
import net.minecraft.world.item.ItemStack;
|
||||
import ru.betterend.item.CrystaliteArmor;
|
||||
import ru.betterend.registry.EndItems;
|
||||
import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class CrystaliteArmorProvider implements ModelProvider, TextureProvider {
|
||||
public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProvider, ArmorRenderingRegistry.TextureProvider {
|
||||
//TODO: find new registry
|
||||
private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png");
|
||||
private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png");
|
||||
private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F);
|
||||
private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false);
|
||||
private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true);
|
||||
private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F);
|
||||
private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F);
|
||||
private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null);
|
||||
private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null);
|
||||
private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null);
|
||||
private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null);
|
||||
private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null);
|
||||
|
||||
@Override
|
||||
//@Override
|
||||
public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot,
|
||||
boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) {
|
||||
if (!isStackValid(stack)) return defaultTexture;
|
||||
|
@ -37,7 +39,7 @@ public class CrystaliteArmorProvider implements ModelProvider, TextureProvider {
|
|||
return FIRST_LAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
//@Override
|
||||
public @NotNull HumanoidModel<LivingEntity> getArmorModel(LivingEntity entity, ItemStack stack,
|
||||
EquipmentSlot slot, HumanoidModel<LivingEntity> defaultModel) {
|
||||
if (!isStackValid(stack)) return defaultModel;
|
||||
|
|
|
@ -5,23 +5,58 @@ import java.util.Collections;
|
|||
import com.google.common.collect.Lists;
|
||||
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.model.geom.EntityModelSet;
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.*;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class CrystaliteBootsModel extends HumanoidModel<LivingEntity> {
|
||||
|
||||
public ModelPart leftBoot;
|
||||
public ModelPart rightBoot;
|
||||
|
||||
public CrystaliteBootsModel(float scale) {
|
||||
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
|
||||
this.leftBoot = new ModelPart(this, 0, 32);
|
||||
this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F);
|
||||
this.leftBoot.setPos(1.9F, 12.0F, 0.0F);
|
||||
this.rightBoot = new ModelPart(this, 0, 16);
|
||||
this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F);
|
||||
this.rightBoot.setPos(-1.9F, 12.0F, 0.0F);
|
||||
public 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(ModelPart modelPart) {
|
||||
super(modelPart, RenderType::entityTranslucent);
|
||||
|
||||
leftBoot = modelPart.getChild("leftBoot");
|
||||
rightBoot = modelPart.getChild("rightBoot");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -6,10 +6,15 @@ import com.google.common.collect.Lists;
|
|||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.model.geom.EntityModelSet;
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.*;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.world.entity.HumanoidArm;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
|
||||
|
||||
|
@ -17,29 +22,79 @@ public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
|
|||
public ModelPart rightShoulder;
|
||||
private final boolean thinArms;
|
||||
|
||||
public CrystaliteChestplateModel(float scale, boolean thinArms) {
|
||||
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
|
||||
this.thinArms = thinArms;
|
||||
this.body = new ModelPart(this, 16, 16);
|
||||
this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F);
|
||||
this.body.setPos(0.0F, 0.0F, 0.0F);
|
||||
public static LayerDefinition getRegularTexturedModelData(){
|
||||
return getTexturedModelData(1.0f, false);
|
||||
}
|
||||
|
||||
public static LayerDefinition getThinTexturedModelData(){
|
||||
return getTexturedModelData(1.0f, true);
|
||||
}
|
||||
|
||||
private static LayerDefinition getTexturedModelData(float scale, boolean thinArms) {
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
// TODO: see if we need to subclass HumanoidModel
|
||||
// Humanoid model tries to retrieve all parts in it's constructor,
|
||||
// so we need to add empty Nodes
|
||||
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
|
||||
// modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
|
||||
|
||||
CubeDeformation deformation = new CubeDeformation(scale + 0.25F);
|
||||
PartDefinition body = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(16, 16)
|
||||
.addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.ZERO);
|
||||
|
||||
if (thinArms) {
|
||||
this.leftShoulder = new ModelPart(this, 41, 32);
|
||||
this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F);
|
||||
this.leftShoulder.setPos(5.0F, 2.5F, 0.0F);
|
||||
this.leftShoulder.mirror = true;
|
||||
this.rightShoulder = new ModelPart(this, 41, 16);
|
||||
this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F);
|
||||
this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F);
|
||||
deformation = new CubeDeformation(scale + 0.45F);
|
||||
PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(40, 32)
|
||||
.addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.offset(5.0f, 2.0f, 0.0f));
|
||||
|
||||
PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create()
|
||||
.texOffs(40, 16)
|
||||
.addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.offset(-5.0f, 2.0f, 10.0f));
|
||||
} else {
|
||||
this.leftShoulder = new ModelPart(this, 40, 32);
|
||||
this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F);
|
||||
this.leftShoulder.setPos(5.0F, 2.0F, 0.0F);
|
||||
this.leftShoulder.mirror = true;
|
||||
this.rightShoulder = new ModelPart(this, 40, 16);
|
||||
this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F);
|
||||
this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F);
|
||||
deformation = new CubeDeformation(scale + 0.45F);
|
||||
PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create()
|
||||
.mirror()
|
||||
.texOffs(40, 32)
|
||||
.addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.offset(5.0f, 2.0f, 0.0f));
|
||||
|
||||
PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create()
|
||||
.texOffs(40, 16)
|
||||
.addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.offset(-5.0f, 2.0f, 10.0f));
|
||||
}
|
||||
return LayerDefinition.create(modelData, 64, 48);
|
||||
}
|
||||
|
||||
final ModelPart localBody;
|
||||
|
||||
public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet){
|
||||
return new CrystaliteChestplateModel(entityModelSet==null?getRegularTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false);
|
||||
}
|
||||
|
||||
public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet){
|
||||
return new CrystaliteChestplateModel(entityModelSet==null?getThinTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true);
|
||||
}
|
||||
|
||||
protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) {
|
||||
super(modelPart, RenderType::entityTranslucent);
|
||||
this.thinArms = thinArms;
|
||||
localBody = modelPart.getChild(PartNames.BODY);
|
||||
leftShoulder = modelPart.getChild("leftShoulder");
|
||||
rightShoulder = modelPart.getChild("rightShoulder");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -56,7 +111,7 @@ public class CrystaliteChestplateModel extends HumanoidModel<LivingEntity> {
|
|||
|
||||
@Override
|
||||
protected Iterable<ModelPart> bodyParts() {
|
||||
return Lists.newArrayList(body, leftShoulder, rightShoulder);
|
||||
return Lists.newArrayList(localBody, leftShoulder, rightShoulder);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -7,18 +7,53 @@ import com.google.common.collect.Lists;
|
|||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.model.geom.EntityModelSet;
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.*;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
import shadow.fabric.impl.client.rendering.ArmorProviderExtensions;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class CrystaliteHelmetModel extends HumanoidModel<LivingEntity> {
|
||||
final ModelPart myHat;
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
final float scale = 1.0f;
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
public CrystaliteHelmetModel(float scale) {
|
||||
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
|
||||
this.hat = new ModelPart(this, 0, 0);
|
||||
this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F);
|
||||
this.hat.setPos(0.0F, 0.0F, 0.0F);
|
||||
// TODO: see if we need to subclass HumanoidModel
|
||||
// Humanoid model tries to retrieve all parts in it's constructor,
|
||||
// so we need to add empty Nodes
|
||||
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
|
||||
//modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
|
||||
|
||||
CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f);
|
||||
PartDefinition hat = modelPartData.addOrReplaceChild(PartNames.HAT, CubeListBuilder.create()
|
||||
.texOffs(0, 0)
|
||||
.addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat),
|
||||
PartPose.ZERO);
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 48);
|
||||
}
|
||||
|
||||
public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet){
|
||||
return new CrystaliteHelmetModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_HELMET));
|
||||
}
|
||||
|
||||
|
||||
public CrystaliteHelmetModel(ModelPart modelPart) {
|
||||
super(modelPart, RenderType::entityTranslucent);
|
||||
|
||||
myHat = modelPart.getChild(PartNames.HAT);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -28,6 +63,6 @@ public class CrystaliteHelmetModel extends HumanoidModel<LivingEntity> {
|
|||
|
||||
@Override
|
||||
protected Iterable<ModelPart> bodyParts() {
|
||||
return Lists.newArrayList(hat);
|
||||
return Lists.newArrayList(myHat);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,23 +5,65 @@ import java.util.Collections;
|
|||
import com.google.common.collect.Lists;
|
||||
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.model.geom.EntityModelSet;
|
||||
import net.minecraft.client.model.geom.ModelPart;
|
||||
import net.minecraft.client.model.geom.PartNames;
|
||||
import net.minecraft.client.model.geom.PartPose;
|
||||
import net.minecraft.client.model.geom.builders.*;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import ru.betterend.registry.EndEntitiesRenders;
|
||||
|
||||
public class CrystaliteLeggingsModel extends HumanoidModel<LivingEntity> {
|
||||
public static LayerDefinition getTexturedModelData() {
|
||||
float scale = 1.0f;
|
||||
MeshDefinition modelData = new MeshDefinition();
|
||||
PartDefinition modelPartData = modelData.getRoot();
|
||||
|
||||
public CrystaliteLeggingsModel(float scale) {
|
||||
super(RenderType::entityTranslucent, scale, 0.0F, 64, 48);
|
||||
this.body = new ModelPart(this, 16, 16);
|
||||
this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale);
|
||||
this.body.setPos(0.0F, 0.0F, 0.0F);
|
||||
this.leftLeg = new ModelPart(this, 0, 32);
|
||||
this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale);
|
||||
this.leftLeg.setPos(1.9F, 12.0F, 0.0F);
|
||||
this.rightLeg = new ModelPart(this, 0, 16);
|
||||
this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale);
|
||||
this.rightLeg.setPos(-1.9F, 12.0F, 0.0F);
|
||||
// TODO: see if we need to subclass HumanoidModel
|
||||
// Humanoid model tries to retrieve all parts in it's constructor,
|
||||
// so we need to add empty Nodes
|
||||
modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO);
|
||||
// modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO);
|
||||
modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO);
|
||||
// modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO);
|
||||
// modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO);
|
||||
|
||||
CubeDeformation deformation = new CubeDeformation(scale);
|
||||
modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
|
||||
.texOffs(16, 16)
|
||||
.addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.ZERO);
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create()
|
||||
.texOffs(0, 32)
|
||||
.addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.offset(1.9f, 12.0f, 0.0f));
|
||||
|
||||
modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create()
|
||||
.texOffs(0, 16)
|
||||
.addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation),
|
||||
PartPose.offset(-1.9f, 12.0f, 0.0f));
|
||||
|
||||
return LayerDefinition.create(modelData, 64, 48);
|
||||
}
|
||||
|
||||
final ModelPart myBody;
|
||||
final ModelPart myLeftLeg;
|
||||
final ModelPart myRightLeg;
|
||||
|
||||
public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet){
|
||||
return new CrystaliteLeggingsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_LEGGINGS));
|
||||
}
|
||||
|
||||
public CrystaliteLeggingsModel(ModelPart modelPart) {
|
||||
super(modelPart, RenderType::entityTranslucent);
|
||||
|
||||
myBody = modelPart.getChild(PartNames.BODY);
|
||||
myLeftLeg = modelPart.getChild(PartNames.LEFT_LEG);
|
||||
myRightLeg = modelPart.getChild(PartNames.RIGHT_LEG);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -31,6 +73,6 @@ public class CrystaliteLeggingsModel extends HumanoidModel<LivingEntity> {
|
|||
|
||||
@Override
|
||||
protected Iterable<ModelPart> bodyParts() {
|
||||
return Lists.newArrayList(body, rightLeg, leftLeg);
|
||||
return Lists.newArrayList(myBody, myRightLeg, myLeftLeg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,10 +8,13 @@ import com.google.common.collect.Multimap;
|
|||
import com.google.common.collect.Sets;
|
||||
|
||||
import io.netty.util.internal.ThreadLocalRandom;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.tags.Tag;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.EquipmentSlot;
|
||||
|
@ -38,7 +41,8 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I
|
|||
private final Multimap<Attribute, AttributeModifier> attributeModifiers;
|
||||
|
||||
public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) {
|
||||
super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings);
|
||||
//we override all methods that access BlockTags.MINEABLE_WITH_PICKAXE in the superclass, so this should not matter
|
||||
super(attackDamage, attackSpeed, material, BlockTags.MINEABLE_WITH_PICKAXE, settings);
|
||||
|
||||
Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
|
||||
builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION));
|
||||
|
@ -133,6 +137,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I
|
|||
}
|
||||
|
||||
@Override
|
||||
@Environment(EnvType.CLIENT)
|
||||
public BlockModel getItemModel(ResourceLocation resourceLocation) {
|
||||
return ModelsHelper.createHandheldItem(resourceLocation);
|
||||
}
|
||||
|
|
593
src/main/java/ru/betterend/minigTools.txt
Normal file
593
src/main/java/ru/betterend/minigTools.txt
Normal 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",
|
|
@ -1,26 +1,25 @@
|
|||
package ru.betterend.mixin.client;
|
||||
|
||||
import net.minecraft.client.model.ArmorStandArmorModel;
|
||||
import net.minecraft.client.renderer.entity.ArmorStandRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||
import net.minecraft.world.entity.decoration.ArmorStand;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.client.model.ArmorStandArmorModel;
|
||||
import net.minecraft.client.renderer.entity.ArmorStandRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||
import net.minecraft.world.entity.decoration.ArmorStand;
|
||||
import ru.betterend.client.render.ArmoredElytraLayer;
|
||||
|
||||
@Mixin(ArmorStandRenderer.class)
|
||||
public abstract class ArmorStandRendererMixin extends LivingEntityRenderer<ArmorStand, ArmorStandArmorModel> {
|
||||
|
||||
public ArmorStandRendererMixin(EntityRenderDispatcher entityRenderDispatcher, ArmorStandArmorModel entityModel, float f) {
|
||||
super(entityRenderDispatcher, entityModel, f);
|
||||
public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) {
|
||||
super(context, entityModel, f);
|
||||
}
|
||||
|
||||
@Inject(method = "<init>*", at = @At("TAIL"))
|
||||
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, CallbackInfo info) {
|
||||
addLayer(new ArmoredElytraLayer<>(this));
|
||||
public void be_addCustomLayer(EntityRendererProvider.Context context, CallbackInfo ci) {
|
||||
addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package ru.betterend.mixin.client;
|
||||
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
@ -18,6 +19,7 @@ import ru.bclib.client.gui.BlockSignEditScreen;
|
|||
@Mixin(ClientPacketListener.class)
|
||||
public class ClientPlayNetworkHandlerMixin
|
||||
{
|
||||
@Final
|
||||
@Shadow
|
||||
private Minecraft minecraft;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -1,26 +1,25 @@
|
|||
package ru.betterend.mixin.client;
|
||||
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.client.model.HumanoidModel;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
|
||||
import net.minecraft.client.renderer.entity.MobRenderer;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import ru.betterend.client.render.ArmoredElytraLayer;
|
||||
|
||||
@Mixin(HumanoidMobRenderer.class)
|
||||
public abstract class HumanoidMobRendererMixin<T extends Mob, M extends HumanoidModel<T>> extends MobRenderer<T, M> {
|
||||
|
||||
public HumanoidMobRendererMixin(EntityRenderDispatcher entityRenderDispatcher, M entityModel, float f) {
|
||||
super(entityRenderDispatcher, entityModel, f);
|
||||
public HumanoidMobRendererMixin(EntityRendererProvider.Context context, M entityModel, float f) {
|
||||
super(context, entityModel, f);
|
||||
}
|
||||
|
||||
@Inject(method = "<init>*", at = @At("TAIL"))
|
||||
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, M humanoidModel, float f, float g, float h, float i, CallbackInfo info) {
|
||||
addLayer(new ArmoredElytraLayer<>(this));
|
||||
@Inject(method = "<init>(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Lnet/minecraft/client/model/HumanoidModel;FFFF)V", at = @At("TAIL"))
|
||||
public void be_addCustomLayer(EntityRendererProvider.Context context, M humanoidModel, float f, float g, float h, float i, CallbackInfo ci) {
|
||||
addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,26 +1,25 @@
|
|||
package ru.betterend.mixin.client;
|
||||
|
||||
import net.minecraft.client.model.PlayerModel;
|
||||
import net.minecraft.client.player.AbstractClientPlayer;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.client.model.PlayerModel;
|
||||
import net.minecraft.client.player.AbstractClientPlayer;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
||||
import ru.betterend.client.render.ArmoredElytraLayer;
|
||||
|
||||
@Mixin(PlayerRenderer.class)
|
||||
public abstract class PlayerRendererMixin extends LivingEntityRenderer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> {
|
||||
|
||||
public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel<AbstractClientPlayer> entityModel, float f) {
|
||||
super(entityRenderDispatcher, entityModel, f);
|
||||
public PlayerRendererMixin(EntityRendererProvider.Context context, PlayerModel<AbstractClientPlayer> entityModel, float f) {
|
||||
super(context, entityModel, f);
|
||||
}
|
||||
|
||||
@Inject(method = "<init>(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL"))
|
||||
public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) {
|
||||
addLayer(new ArmoredElytraLayer<>(this));
|
||||
@Inject(method = "<init>*", at = @At("TAIL"))
|
||||
public void be_addCustomLayer(EntityRendererProvider.Context context, boolean bl, CallbackInfo ci) {
|
||||
addLayer(new ArmoredElytraLayer<>(this, context.getModelSet()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,9 @@ package ru.betterend.mixin.client;
|
|||
|
||||
import java.util.Random;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.math.Matrix4f;
|
||||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
@ -92,7 +95,7 @@ public class WorldRendererMixin {
|
|||
}
|
||||
|
||||
@Inject(method = "renderSky", at = @At("HEAD"), cancellable = true)
|
||||
private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) {
|
||||
private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) {
|
||||
if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) {
|
||||
time = (ticks % 360000) * 0.000017453292F;
|
||||
time2 = time * 2;
|
||||
|
@ -108,9 +111,11 @@ public class WorldRendererMixin {
|
|||
RenderSystem.depthMask(false);
|
||||
}
|
||||
else {
|
||||
RenderSystem.enableAlphaTest();
|
||||
RenderSystem.alphaFunc(516, 0.0F);
|
||||
//TODO: Removed in 1.17
|
||||
//RenderSystem.enableAlphaTest();
|
||||
//RenderSystem.alphaFunc(516, 0.0F);
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
|
||||
}
|
||||
|
||||
float blindA = 1F - BackgroundInfo.blindness;
|
||||
|
@ -120,40 +125,40 @@ public class WorldRendererMixin {
|
|||
if (blindA > 0) {
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(new Quaternion(0, time, 0, false));
|
||||
textureManager.bind(HORIZON);
|
||||
be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA);
|
||||
RenderSystem.setShaderTexture(0, HORIZON);
|
||||
be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA);
|
||||
matrices.popPose();
|
||||
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(new Quaternion(0, -time, 0, false));
|
||||
textureManager.bind(NEBULA_1);
|
||||
be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
|
||||
RenderSystem.setShaderTexture(0, NEBULA_1);
|
||||
be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
|
||||
matrices.popPose();
|
||||
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(new Quaternion(0, time2, 0, false));
|
||||
textureManager.bind(NEBULA_2);
|
||||
be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
|
||||
RenderSystem.setShaderTexture(0, NEBULA_2);
|
||||
be_renderBuffer(matrices, matrix4f, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02);
|
||||
matrices.popPose();
|
||||
|
||||
textureManager.bind(STARS);
|
||||
RenderSystem.setShaderTexture(0, STARS);
|
||||
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(axis3.rotation(time));
|
||||
be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06);
|
||||
be_renderBuffer(matrices, matrix4f ,stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06);
|
||||
matrices.popPose();
|
||||
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(axis4.rotation(time2));
|
||||
be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06);
|
||||
be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06);
|
||||
matrices.popPose();
|
||||
}
|
||||
|
||||
float a = (BackgroundInfo.fogDensity - 1F);
|
||||
if (a > 0) {
|
||||
if (a > 1) a = 1;
|
||||
textureManager.bind(FOG);
|
||||
be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a);
|
||||
RenderSystem.setShaderTexture(0, FOG);
|
||||
be_renderBuffer(matrices, matrix4f, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a);
|
||||
}
|
||||
|
||||
RenderSystem.disableTexture();
|
||||
|
@ -161,27 +166,30 @@ public class WorldRendererMixin {
|
|||
if (blindA > 0) {
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(axis1.rotation(time3));
|
||||
be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06);
|
||||
be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06);
|
||||
matrices.popPose();
|
||||
|
||||
matrices.pushPose();
|
||||
matrices.mulPose(axis2.rotation(time2));
|
||||
be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06);
|
||||
be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06);
|
||||
matrices.popPose();
|
||||
}
|
||||
|
||||
RenderSystem.enableTexture();
|
||||
RenderSystem.depthMask(true);
|
||||
RenderSystem.defaultBlendFunc();
|
||||
RenderSystem.disableBlend();
|
||||
|
||||
info.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) {
|
||||
RenderSystem.color4f(r, g, b, a);
|
||||
private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) {
|
||||
RenderSystem.setShaderColor(r, g, b, a);
|
||||
buffer.bind();
|
||||
format.setupBufferState(0L);
|
||||
buffer.draw(matrices.last().pose(), 7);
|
||||
format.setupBufferState();
|
||||
buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader());
|
||||
|
||||
VertexBuffer.unbind();
|
||||
format.clearBufferState();
|
||||
}
|
||||
|
@ -203,7 +211,10 @@ public class WorldRendererMixin {
|
|||
buffer.close();
|
||||
}
|
||||
|
||||
buffer = new VertexBuffer(DefaultVertexFormat.POSITION);
|
||||
//TODO: Test if this is working correct
|
||||
//Format is set in the DrawState
|
||||
//buffer = new VertexBuffer(DefaultVertexFormat.POSITION);
|
||||
buffer = new VertexBuffer();
|
||||
be_makeStars(bufferBuilder, minSize, maxSize, count, seed);
|
||||
bufferBuilder.end();
|
||||
buffer.upload(bufferBuilder);
|
||||
|
@ -216,7 +227,8 @@ public class WorldRendererMixin {
|
|||
buffer.close();
|
||||
}
|
||||
|
||||
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
buffer = new VertexBuffer();
|
||||
be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed);
|
||||
bufferBuilder.end();
|
||||
buffer.upload(bufferBuilder);
|
||||
|
@ -229,7 +241,8 @@ public class WorldRendererMixin {
|
|||
buffer.close();
|
||||
}
|
||||
|
||||
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
buffer = new VertexBuffer();
|
||||
be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed);
|
||||
bufferBuilder.end();
|
||||
buffer.upload(bufferBuilder);
|
||||
|
@ -242,7 +255,8 @@ public class WorldRendererMixin {
|
|||
buffer.close();
|
||||
}
|
||||
|
||||
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
buffer = new VertexBuffer();
|
||||
be_makeCylinder(bufferBuilder, 16, 50, 100);
|
||||
bufferBuilder.end();
|
||||
buffer.upload(bufferBuilder);
|
||||
|
@ -255,7 +269,8 @@ public class WorldRendererMixin {
|
|||
buffer.close();
|
||||
}
|
||||
|
||||
buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
// buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX);
|
||||
buffer = new VertexBuffer();
|
||||
be_makeCylinder(bufferBuilder, 16, 50, 70);
|
||||
bufferBuilder.end();
|
||||
buffer.upload(bufferBuilder);
|
||||
|
@ -265,7 +280,7 @@ public class WorldRendererMixin {
|
|||
|
||||
private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
|
||||
Random random = new Random(seed);
|
||||
buffer.begin(7, DefaultVertexFormat.POSITION);
|
||||
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
double posX = random.nextDouble() * 2.0 - 1.0;
|
||||
|
@ -308,7 +323,7 @@ public class WorldRendererMixin {
|
|||
|
||||
private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
|
||||
Random random = new Random(seed);
|
||||
buffer.begin(7, DefaultVertexFormat.POSITION_TEX);
|
||||
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
double posX = random.nextDouble() * 2.0 - 1.0;
|
||||
|
@ -356,7 +371,7 @@ public class WorldRendererMixin {
|
|||
|
||||
private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
|
||||
Random random = new Random(seed);
|
||||
buffer.begin(7, DefaultVertexFormat.POSITION_TEX);
|
||||
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
double posX = random.nextDouble() * 2.0 - 1.0;
|
||||
|
@ -406,7 +421,7 @@ public class WorldRendererMixin {
|
|||
}
|
||||
|
||||
private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) {
|
||||
buffer.begin(7, DefaultVertexFormat.POSITION_TEX);
|
||||
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
|
||||
for (int i = 0; i < segments; i ++) {
|
||||
double a1 = (double) i * Math.PI * 2.0 / (double) segments;
|
||||
double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue