a bit more work

This commit is contained in:
Ell 2021-12-05 23:32:31 +01:00
parent 1880bf785d
commit ba47a8823e
13 changed files with 347 additions and 357 deletions

View file

@ -4,61 +4,61 @@ import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAuraBloom;
import de.ellpeck.naturesaura.data.BlockStateGenerator; import de.ellpeck.naturesaura.data.BlockStateGenerator;
import de.ellpeck.naturesaura.data.ItemModelGenerator; import de.ellpeck.naturesaura.data.ItemModelGenerator;
import de.ellpeck.naturesaura.reg.*; import de.ellpeck.naturesaura.reg.*;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.BushBlock;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.entity.Entity; import net.minecraft.core.BlockPos;
import net.minecraft.tileentity.BlockEntity; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.util.DamageSource; import net.minecraft.world.entity.Entity;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.level.BlockGetter;
import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.world.level.Level;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.level.LevelReader;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.level.block.Block;
import net.minecraft.level.IBlockReader; import net.minecraft.world.level.block.BushBlock;
import net.minecraft.level.ILevelReader; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.level.Level; import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import javax.annotation.Nullable;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.Supplier; import java.util.function.Supplier;
public class BlockAuraBloom extends BushBlock implements IModItem, ICustomBlockState, ICustomItemModel, ICustomRenderType { public class BlockAuraBloom extends BushBlock implements IModItem, ICustomBlockState, ICustomItemModel, ICustomRenderType, EntityBlock {
protected static final VoxelShape SHAPE = Block.makeCuboidShape(5.0D, 0.0D, 5.0D, 11.0D, 10.0D, 11.0D); protected static final VoxelShape SHAPE = Block.box(5.0D, 0.0D, 5.0D, 11.0D, 10.0D, 11.0D);
private final String baseName; private final String baseName;
private final Block[] allowedGround; private final Block[] allowedGround;
public BlockAuraBloom(String baseName, Block... allowedGround) { public BlockAuraBloom(String baseName, Block... allowedGround) {
super(Properties.create(Material.PLANTS).doesNotBlockMovement().hardnessAndResistance(0).sound(SoundType.PLANT)); super(Properties.of(Material.PLANT).noCollission().strength(0).sound(SoundType.GRASS));
this.baseName = baseName; this.baseName = baseName;
this.allowedGround = allowedGround; this.allowedGround = allowedGround;
ModRegistry.add(this); ModRegistry.add(this);
} }
@Override @Override
public boolean isValidPosition(BlockState state, ILevelReader levelIn, BlockPos pos) { public boolean canSurvive(BlockState state, LevelReader levelIn, BlockPos pos) {
BlockPos down = pos.down(); BlockPos down = pos.below();
return this.isValidGround(levelIn.getBlockState(down), levelIn, down); return this.mayPlaceOn(levelIn.getBlockState(down), levelIn, down);
} }
@Override @Override
protected boolean isValidGround(BlockState state, IBlockReader levelIn, BlockPos pos) { protected boolean mayPlaceOn(BlockState state, BlockGetter levelIn, BlockPos pos) {
return Arrays.stream(this.allowedGround).anyMatch(state::isIn); return Arrays.stream(this.allowedGround).anyMatch(state::is);
} }
@Override @Override
public void onEntityCollision(BlockState state, Level levelIn, BlockPos pos, Entity entityIn) { public void entityInside(BlockState state, Level levelIn, BlockPos pos, Entity entityIn) {
if (this == ModBlocks.AURA_CACTUS) if (this == ModBlocks.AURA_CACTUS)
entityIn.attackEntityFrom(DamageSource.CACTUS, 1); entityIn.hurt(DamageSource.CACTUS, 1);
} }
@Override @Override
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) { public VoxelShape getShape(BlockState state, BlockGetter levelIn, BlockPos pos, CollisionContext context) {
Vector3d vec3d = state.getOffset(levelIn, pos); Vec3 vec3d = state.getOffset(levelIn, pos);
return SHAPE.withOffset(vec3d.x, vec3d.y, vec3d.z); return SHAPE.move(vec3d.x, vec3d.y, vec3d.z);
} }
@Override @Override
@ -73,7 +73,7 @@ public class BlockAuraBloom extends BushBlock implements IModItem, ICustomBlockS
@Override @Override
public Supplier<RenderType> getRenderType() { public Supplier<RenderType> getRenderType() {
return RenderType::getCutout; return RenderType::cutout;
} }
@Override @Override
@ -81,14 +81,9 @@ public class BlockAuraBloom extends BushBlock implements IModItem, ICustomBlockS
return this.baseName; return this.baseName;
} }
@Nullable @org.jetbrains.annotations.Nullable
@Override @Override
public BlockEntity createBlockEntity(BlockState state, IBlockReader level) { public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new BlockEntityAuraBloom(); return new BlockEntityAuraBloom();
} }
@Override
public boolean hasBlockEntity(BlockState state) {
return true;
}
} }

View file

@ -8,45 +8,47 @@ import de.ellpeck.naturesaura.packet.PacketClient;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.packet.PacketParticles;
import de.ellpeck.naturesaura.reg.*; import de.ellpeck.naturesaura.reg.*;
import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.entity.Entity; import net.minecraft.core.BlockPos;
import net.minecraft.entity.item.minecart.AbstractMinecartEntity;
import net.minecraft.entity.player.Player;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.MinecraftServer; import net.minecraft.resources.ResourceKey;
import net.minecraft.state.EnumProperty; import net.minecraft.server.level.ServerLevel;
import net.minecraft.state.Property; import net.minecraft.sounds.SoundEvents;
import net.minecraft.state.StateContainer; import net.minecraft.sounds.SoundSource;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.world.InteractionHand;
import net.minecraft.state.properties.RailShape; import net.minecraft.world.InteractionResult;
import net.minecraft.util.*; import net.minecraft.world.entity.Entity;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.entity.player.Player;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.level.BlockGetter;
import net.minecraft.level.IBlockReader; import net.minecraft.world.level.Level;
import net.minecraft.level.Level; import net.minecraft.world.level.block.BaseRailBlock;
import net.minecraft.level.gen.Heightmap; import net.minecraft.world.level.block.Block;
import net.minecraft.level.server.ServerLevel; import net.minecraft.world.level.block.Blocks;
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;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.block.state.properties.RailShape;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.common.util.ITeleporter; import net.minecraftforge.common.util.ITeleporter;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
public class BlockDimensionRail extends AbstractRailBlock implements IModItem, ICustomRenderType, ICustomBlockState, ICustomItemModel { public class BlockDimensionRail extends BaseRailBlock implements IModItem, ICustomRenderType, ICustomBlockState, ICustomItemModel {
public static final EnumProperty<RailShape> SHAPE = BlockStateProperties.RAIL_SHAPE; public static final EnumProperty<RailShape> SHAPE = BlockStateProperties.RAIL_SHAPE;
private final String name; private final String name;
private final RegistryKey<Level> goalDim; private final ResourceKey<Level> goalDim;
private final RegistryKey<Level>[] canUseDims; private final ResourceKey<Level>[] canUseDims;
public BlockDimensionRail(String name, RegistryKey<Level> goalDim, RegistryKey<Level>... canUseDims) { @SafeVarargs
super(false, Properties.from(Blocks.RAIL)); public BlockDimensionRail(String name, ResourceKey<Level> goalDim, ResourceKey<Level>... canUseDims) {
super(false, Properties.copy(Blocks.RAIL));
this.name = name; this.name = name;
this.goalDim = goalDim; this.goalDim = goalDim;
this.canUseDims = canUseDims; this.canUseDims = canUseDims;
@ -54,22 +56,22 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
ModRegistry.add(this); ModRegistry.add(this);
} }
private boolean canUseHere(RegistryKey<Level> dimension) { private boolean canUseHere(ResourceKey<Level> dimension) {
for (RegistryKey<Level> dim : this.canUseDims) for (var dim : this.canUseDims)
if (dim == dimension) if (dim == dimension)
return true; return true;
return false; return false;
} }
@Override @Override
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand hand, BlockRayTraceResult hit) { public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
ItemStack stack = player.getHeldItem(hand); var stack = player.getItemInHand(hand);
if (stack.getItem() == ModItems.RANGE_VISUALIZER) { if (stack.getItem() == ModItems.RANGE_VISUALIZER) {
if (!levelIn.isClientSide) { if (!levelIn.isClientSide) {
BlockPos goalPos = this.getGoalCoords(levelIn, pos); var goalPos = this.getGoalCoords(levelIn, pos);
CompoundTag data = new CompoundTag(); var data = new CompoundTag();
data.putString("dim", this.goalDim.func_240901_a_().toString()); data.putString("dim", this.goalDim.location().toString());
data.putLong("pos", goalPos.toLong()); data.putLong("pos", goalPos.asLong());
PacketHandler.sendTo(player, new PacketClient(0, data)); PacketHandler.sendTo(player, new PacketClient(0, data));
} }
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
@ -78,56 +80,56 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
} }
@Override @Override
public void onMinecartPass(BlockState state, Level level, BlockPos pos, AbstractMinecartEntity cart) { public void onMinecartPass(BlockState state, Level level, BlockPos pos, AbstractMinecart cart) {
if (level.isClientSide) if (level.isClientSide)
return; return;
if (cart.isBeingRidden()) if (!cart.getPassengers().isEmpty())
return; return;
if (!this.canUseHere(level.func_234923_W_())) if (!this.canUseHere(level.dimension()))
return; return;
AxisAlignedBB box = cart.getBoundingBox(); var box = cart.getBoundingBox();
PacketHandler.sendToAllAround(level, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, PacketParticles.Type.DIMENSION_RAIL, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F))); PacketHandler.sendToAllAround(level, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, PacketParticles.Type.DIMENSION_RAIL, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F)));
level.playSound(null, pos, SoundEvents.ENTITY_ENDERMAN_TELEPORT, SoundCategory.BLOCKS, 1F, 1F); level.playSound(null, pos, SoundEvents.ENDERMAN_TELEPORT, SoundSource.BLOCKS, 1F, 1F);
BlockPos goalCoords = this.getGoalCoords(level, pos); var goalCoords = this.getGoalCoords(level, pos);
cart.changeDimension(level.getServer().getLevel(this.goalDim), new ITeleporter() { cart.changeDimension(level.getServer().getLevel(this.goalDim), new ITeleporter() {
@Override @Override
public Entity placeEntity(Entity entity, ServerLevel currentLevel, ServerLevel destLevel, float yaw, Function<Boolean, Entity> repositionEntity) { public Entity placeEntity(Entity entity, ServerLevel currentLevel, ServerLevel destLevel, float yaw, Function<Boolean, Entity> repositionEntity) {
// repositionEntity always causes a NPE because why wouldn't it, so this is a fixed copy // repositionEntity always causes a NPE because why wouldn't it, so this is a fixed copy
entity.level.getProfiler().endStartSection("reloading"); entity.level.getProfiler().popPush("reloading");
Entity result = entity.getType().create(destLevel); var result = entity.getType().create(destLevel);
if (result != null) { if (result != null) {
result.copyDataFromOld(entity); result.restoreFrom(entity);
destLevel.addFromAnotherDimension(result); destLevel.addDuringTeleport(result);
result.moveToBlockPosAndAngles(goalCoords, yaw, result.rotationPitch); result.moveTo(goalCoords, yaw, result.getXRot());
} }
return result; return result;
} }
}); });
BlockPos spot = IAuraChunk.getHighestSpot(level, pos, 35, pos); var spot = IAuraChunk.getHighestSpot(level, pos, 35, pos);
IAuraChunk.getAuraChunk(level, spot).drainAura(spot, 50000); IAuraChunk.getAuraChunk(level, spot).drainAura(spot, 50000);
} }
private BlockPos getGoalCoords(Level level, BlockPos pos) { private BlockPos getGoalCoords(Level level, BlockPos pos) {
MinecraftServer server = level.getServer(); var server = level.getServer();
if (this == ModBlocks.DIMENSION_RAIL_NETHER) { if (this == ModBlocks.DIMENSION_RAIL_NETHER) {
// travel to the nether from the overworld // travel to the nether from the overworld
return new BlockPos(pos.getX() / 8, pos.getY() / 2, pos.getZ() / 8); return new BlockPos(pos.getX() / 8, pos.getY() / 2, pos.getZ() / 8);
} else if (this == ModBlocks.DIMENSION_RAIL_END) { } else if (this == ModBlocks.DIMENSION_RAIL_END) {
// travel to the end from the overworld // travel to the end from the overworld
return ServerLevel.field_241108_a_.up(8); return ServerLevel.END_SPAWN_POINT.above(8);
} else { } else {
if (level.func_234923_W_() == Level.field_234919_h_) { if (level.dimension() == Level.OVERWORLD) {
// travel to the overworld from the nether // travel to the overworld from the nether
return new BlockPos(pos.getX() * 8, pos.getY() * 2, pos.getZ() * 8); return new BlockPos(pos.getX() * 8, pos.getY() * 2, pos.getZ() * 8);
} else { } else {
// travel to the overworld from the end // travel to the overworld from the end
ServerLevel overworld = server.getLevel(this.goalDim); var overworld = server.getLevel(this.goalDim);
BlockPos spawn = overworld.func_241135_u_(); var spawn = overworld.getSharedSpawnPos();
BlockPos ret = new BlockPos(spawn.getX(), 0, spawn.getZ()); var ret = new BlockPos(spawn.getX(), 0, spawn.getZ());
return ret.up(overworld.getHeight(Heightmap.Type.WORLD_SURFACE, spawn.getX(), spawn.getZ())); return ret.above(overworld.getHeight(Heightmap.Types.WORLD_SURFACE, spawn.getX(), spawn.getZ()));
} }
} }
} }
@ -138,17 +140,17 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
} }
@Override @Override
public boolean isFlexibleRail(BlockState state, IBlockReader level, BlockPos pos) { public boolean isFlexibleRail(BlockState state, BlockGetter level, BlockPos pos) {
return false; return false;
} }
@Override @Override
public boolean canMakeSlopes(BlockState state, IBlockReader level, BlockPos pos) { public boolean canMakeSlopes(BlockState state, BlockGetter level, BlockPos pos) {
return false; return false;
} }
@Override @Override
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) { protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(SHAPE); builder.add(SHAPE);
} }
@ -159,7 +161,7 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
@Override @Override
public Supplier<RenderType> getRenderType() { public Supplier<RenderType> getRenderType() {
return RenderType::getCutoutMipped; return RenderType::cutoutMipped;
} }
@Override @Override

View file

@ -4,15 +4,15 @@ import de.ellpeck.naturesaura.data.BlockStateGenerator;
import de.ellpeck.naturesaura.reg.ICustomBlockState; import de.ellpeck.naturesaura.reg.ICustomBlockState;
import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.block.SlabBlock; import net.minecraft.world.level.block.Block;
import net.minecraft.util.ResourceLocation; import net.minecraft.world.level.block.SlabBlock;
public class Slab extends SlabBlock implements IModItem, ICustomBlockState { public class Slab extends SlabBlock implements IModItem, ICustomBlockState {
public final String textureName; public final String textureName;
private final String baseName; private final String baseName;
public Slab(String baseName, String textureName, Properties properties) { public Slab(String baseName, String textureName, Block.Properties properties) {
super(properties); super(properties);
this.baseName = baseName; this.baseName = baseName;
this.textureName = textureName; this.textureName = textureName;
@ -26,7 +26,7 @@ public class Slab extends SlabBlock implements IModItem, ICustomBlockState {
@Override @Override
public void generateCustomBlockState(BlockStateGenerator generator) { public void generateCustomBlockState(BlockStateGenerator generator) {
ResourceLocation texture = generator.modLoc("block/" + this.textureName); var texture = generator.modLoc("block/" + this.textureName);
generator.models().cubeAll(this.getBaseName() + "_double", texture); generator.models().cubeAll(this.getBaseName() + "_double", texture);
generator.slabBlock(this, generator.modLoc(this.getBaseName() + "_double"), texture); generator.slabBlock(this, generator.modLoc(this.getBaseName() + "_double"), texture);
} }

View file

@ -1,20 +1,20 @@
package de.ellpeck.naturesaura.blocks.tiles; package de.ellpeck.naturesaura.blocks.tiles;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.tileentity.ITickableBlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.tileentity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState;
public class BlockEntityAuraBloom extends BlockEntityImpl implements ITickableBlockEntity { public class BlockEntityAuraBloom extends BlockEntityImpl implements ITickableBlockEntity {
public boolean justGenerated; public boolean justGenerated;
public BlockEntityAuraBloom() { public BlockEntityAuraBloom(BlockPos pos, BlockState state) {
this(ModTileEntities.AURA_BLOOM); this(ModTileEntities.AURA_BLOOM, pos, state);
} }
protected BlockEntityAuraBloom(BlockEntityType<BlockEntityAuraBloom> type) { protected BlockEntityAuraBloom(BlockEntityType<BlockEntityAuraBloom> type, BlockPos pos, BlockState state) {
super(type); super(type, pos, state);
} }
// Doing this in validate() creates a loading deadlock for some reason... // Doing this in validate() creates a loading deadlock for some reason...

View file

@ -1,5 +1,6 @@
package de.ellpeck.naturesaura.blocks.tiles; package de.ellpeck.naturesaura.blocks.tiles;
// TODO actually call this from the base entity block thing, and possibly others if not all use the base one!
public interface ITickableBlockEntity { public interface ITickableBlockEntity {
void tick(); void tick();

View file

@ -2,64 +2,60 @@ package de.ellpeck.naturesaura.entities;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.blocks.ModBlocks; import de.ellpeck.naturesaura.blocks.ModBlocks;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.entity.Entity; import net.minecraft.util.Mth;
import net.minecraft.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.entity.projectile.ThrowableEntity; import net.minecraft.world.entity.projectile.ThrowableProjectile;
import net.minecraft.network.IPacket; import net.minecraft.world.level.Level;
import net.minecraft.util.math.*; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.level.Level; import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
public class EntityLightProjectile extends ThrowableEntity { public class EntityLightProjectile extends ThrowableProjectile {
public EntityLightProjectile(EntityType<? extends ThrowableEntity> type, Level levelIn) {
public EntityLightProjectile(EntityType<? extends ThrowableProjectile> type, Level levelIn) {
super(type, levelIn); super(type, levelIn);
} }
public EntityLightProjectile(EntityType<? extends ThrowableEntity> type, LivingEntity livingEntityIn, Level levelIn) { public EntityLightProjectile(EntityType<? extends ThrowableProjectile> type, LivingEntity livingEntityIn, Level levelIn) {
super(type, livingEntityIn, levelIn); super(type, livingEntityIn, levelIn);
} }
@Override
protected void defineSynchedData() {
}
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
if (this.level.isClientSide && this.ticksExisted > 1) { if (this.level.isClientSide && this.tickCount > 1) {
for (float i = 0; i <= 1; i += 0.2F) { for (float i = 0; i <= 1; i += 0.2F) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
Mth.lerp(i, this.prevPosX, this.getPosX()), Mth.lerp(i, this.xOld, this.getX()),
Mth.lerp(i, this.prevPosY, this.getPosY()), Mth.lerp(i, this.yOld, this.getY()),
Mth.lerp(i, this.prevPosZ, this.getPosZ()), Mth.lerp(i, this.zOld, this.getZ()),
this.rand.nextGaussian() * 0.01F, this.rand.nextGaussian() * 0.01F, this.rand.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F,
0xffcb5c, this.rand.nextFloat() * 0.5F + 1, 20, 0, false, true); 0xffcb5c, this.random.nextFloat() * 0.5F + 1, 20, 0, false, true);
} }
} }
} }
@Override @Override
protected void onImpact(RayTraceResult result) { protected void onHit(HitResult result) {
if (!this.level.isClientSide) { if (!this.level.isClientSide) {
if (result instanceof BlockRayTraceResult) { if (result instanceof BlockHitResult res) {
BlockRayTraceResult res = (BlockRayTraceResult) result; BlockPos pos = res.getBlockPos().relative(res.getDirection());
BlockPos pos = res.getPos().offset(res.getFace());
BlockState state = this.level.getBlockState(pos); BlockState state = this.level.getBlockState(pos);
if (state.getMaterial().isReplaceable()) if (state.getMaterial().isReplaceable())
this.level.setBlockState(pos, ModBlocks.LIGHT.getDefaultState()); this.level.setBlockAndUpdate(pos, ModBlocks.LIGHT.defaultBlockState());
} else if (result instanceof EntityRayTraceResult) { } else if (result instanceof EntityHitResult entity) {
Entity entity = ((EntityRayTraceResult) result).getEntity(); entity.getEntity().setRemainingFireTicks(5);
entity.setFire(5);
} }
} }
this.remove(); this.discard();
} }
@Override
protected void registerData() {
}
@Override
public IPacket<?> createSpawnPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
} }

View file

@ -3,25 +3,23 @@ package de.ellpeck.naturesaura.entities;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.packet.PacketParticles;
import net.minecraft.entity.EntityType; import net.minecraft.core.BlockPos;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.entity.projectile.EyeOfEnderEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.IPacket; import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.sounds.SoundEvents;
import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Mth;
import net.minecraft.util.SoundEvents; import net.minecraft.world.entity.EntityType;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.util.math.Mth; import net.minecraft.world.entity.projectile.EyeOfEnder;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.level.Level;
import net.minecraft.level.Level; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fml.network.NetworkHooks;
public class EntityStructureFinder extends EyeOfEnderEntity { public class EntityStructureFinder extends EyeOfEnder {
public static final DataParameter<Integer> COLOR = EntityDataManager.createKey(EntityStructureFinder.class, DataSerializers.VARINT); public static final EntityDataAccessor<Integer> COLOR = SynchedEntityData.defineId(EntityStructureFinder.class, EntityDataSerializers.INT);
private double targetX; private double targetX;
private double targetY; private double targetY;
@ -29,40 +27,40 @@ public class EntityStructureFinder extends EyeOfEnderEntity {
private int despawnTimer; private int despawnTimer;
private boolean shatterOrDrop; private boolean shatterOrDrop;
public EntityStructureFinder(EntityType<? extends EyeOfEnderEntity> type, Level level) { public EntityStructureFinder(EntityType<? extends EyeOfEnder> type, Level level) {
super(type, level); super(type, level);
} }
@Override @Override
protected void registerData() { protected void defineSynchedData() {
super.registerData(); super.defineSynchedData();
this.dataManager.register(COLOR, 0); this.entityData.define(COLOR, 0);
} }
@Override @Override
public void writeAdditional(CompoundTag compound) { public void addAdditionalSaveData(CompoundTag compound) {
super.writeAdditional(compound); super.addAdditionalSaveData(compound);
compound.putInt("color", this.dataManager.get(COLOR)); compound.putInt("color", this.entityData.get(COLOR));
} }
@Override @Override
public void readAdditional(CompoundTag compound) { public void readAdditionalSaveData(CompoundTag compound) {
super.readAdditional(compound); super.readAdditionalSaveData(compound);
this.dataManager.set(COLOR, compound.getInt("color")); this.entityData.set(COLOR, compound.getInt("color"));
} }
@Override @Override
public void moveTowards(BlockPos pos) { public void signalTo(BlockPos pos) {
double d0 = pos.getX(); double d0 = pos.getX();
int i = pos.getY(); int i = pos.getY();
double d1 = pos.getZ(); double d1 = pos.getZ();
double d2 = d0 - this.getPosX(); double d2 = d0 - this.getX();
double d3 = d1 - this.getPosZ(); double d3 = d1 - this.getZ();
float f = Mth.sqrt(d2 * d2 + d3 * d3); var f = Math.sqrt(d2 * d2 + d3 * d3);
if (f > 12.0F) { if (f > 12.0F) {
this.targetX = this.getPosX() + d2 / (double) f * 12.0D; this.targetX = this.getX() + d2 / (double) f * 12.0D;
this.targetZ = this.getPosZ() + d3 / (double) f * 12.0D; this.targetZ = this.getZ() + d3 / (double) f * 12.0D;
this.targetY = this.getPosY() + 8.0D; this.targetY = this.getY() + 8.0D;
} else { } else {
this.targetX = d0; this.targetX = d0;
this.targetY = i; this.targetY = i;
@ -70,30 +68,30 @@ public class EntityStructureFinder extends EyeOfEnderEntity {
} }
this.despawnTimer = 0; this.despawnTimer = 0;
this.shatterOrDrop = this.rand.nextInt(4) > 0; this.shatterOrDrop = this.random.nextInt(4) > 0;
} }
@Override @Override
public void tick() { public void tick() {
this.baseTick(); this.baseTick();
Vector3d vec3d = this.getMotion(); Vec3 vec3d = this.getDeltaMovement();
double d0 = this.getPosX() + vec3d.x; double d0 = this.getX() + vec3d.x;
double d1 = this.getPosY() + vec3d.y; double d1 = this.getY() + vec3d.y;
double d2 = this.getPosZ() + vec3d.z; double d2 = this.getZ() + vec3d.z;
float f = Mth.sqrt(horizontalMag(vec3d)); var f = Math.sqrt(vec3d.horizontalDistance());
this.rotationYaw = (float) (Mth.atan2(vec3d.x, vec3d.z) * (double) (180F / (float) Math.PI)); this.setYRot((float) (Mth.atan2(vec3d.x, vec3d.z) * (double) (180F / (float) Math.PI)));
this.rotationPitch = (float) (Mth.atan2(vec3d.y, f) * (double) (180F / (float) Math.PI)); this.setXRot((float) (Mth.atan2(vec3d.y, f) * (double) (180F / (float) Math.PI)));
while (this.rotationPitch - this.prevRotationPitch < -180.0F) while (this.getXRot() - this.xRotO < -180.0F)
this.prevRotationPitch -= 360.0F; this.xRotO -= 360.0F;
while (this.rotationPitch - this.prevRotationPitch >= 180.0F) while (this.getXRot() - this.xRotO >= 180.0F)
this.prevRotationPitch += 360.0F; this.xRotO += 360.0F;
while (this.rotationYaw - this.prevRotationYaw < -180.0F) while (this.getYRot() - this.yRotO < -180.0F)
this.prevRotationYaw -= 360.0F; this.yRotO -= 360.0F;
while (this.rotationYaw - this.prevRotationYaw >= 180.0F) while (this.getYRot() - this.yRotO >= 180.0F)
this.prevRotationYaw += 360.0F; this.yRotO += 360.0F;
this.rotationPitch = Mth.lerp(0.2F, this.prevRotationPitch, this.rotationPitch); this.setXRot(Mth.lerp(0.2F, this.xRotO, this.getXRot()));
this.rotationYaw = Mth.lerp(0.2F, this.prevRotationYaw, this.rotationYaw); this.setYRot(Mth.lerp(0.2F, this.yRotO, this.getYRot()));
if (!this.level.isClientSide) { if (!this.level.isClientSide) {
double d3 = this.targetX - d0; double d3 = this.targetX - d0;
double d4 = this.targetZ - d2; double d4 = this.targetZ - d2;
@ -106,38 +104,34 @@ public class EntityStructureFinder extends EyeOfEnderEntity {
d6 *= 0.8D; d6 *= 0.8D;
} }
int j = this.getPosY() < this.targetY ? 1 : -1; int j = this.getY() < this.targetY ? 1 : -1;
vec3d = new Vector3d(Math.cos(f2) * d5, d6 + ((double) j - d6) * (double) 0.015F, Math.sin(f2) * d5); vec3d = new Vec3(Math.cos(f2) * d5, d6 + ((double) j - d6) * (double) 0.015F, Math.sin(f2) * d5);
this.setMotion(vec3d); this.setDeltaMovement(vec3d);
} }
if (this.isInWater()) { if (this.isInWater()) {
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
this.level.addParticle(ParticleTypes.BUBBLE, d0 - vec3d.x * 0.25D, d1 - vec3d.y * 0.25D, d2 - vec3d.z * 0.25D, vec3d.x, vec3d.y, vec3d.z); this.level.addParticle(ParticleTypes.BUBBLE, d0 - vec3d.x * 0.25D, d1 - vec3d.y * 0.25D, d2 - vec3d.z * 0.25D, vec3d.x, vec3d.y, vec3d.z);
} else if (this.level.isClientSide) { } else if (this.level.isClientSide) {
NaturesAuraAPI.instance().spawnMagicParticle(d0 - vec3d.x * 0.25D + this.rand.nextDouble() * 0.6D - 0.3D, d1 - vec3d.y * 0.25D - 0.5D, d2 - vec3d.z * 0.25D + this.rand.nextDouble() * 0.6D - 0.3D, vec3d.x * 0.25F, vec3d.y * 0.25F, vec3d.z * 0.25F, this.dataManager.get(COLOR), 1, 50, 0, false, true); NaturesAuraAPI.instance().spawnMagicParticle(d0 - vec3d.x * 0.25D + this.random.nextDouble() * 0.6D - 0.3D, d1 - vec3d.y * 0.25D - 0.5D, d2 - vec3d.z * 0.25D + this.random.nextDouble() * 0.6D - 0.3D, vec3d.x * 0.25F, vec3d.y * 0.25F, vec3d.z * 0.25F, this.entityData.get(COLOR), 1, 50, 0, false, true);
} }
if (!this.level.isClientSide) { if (!this.level.isClientSide) {
this.setPosition(d0, d1, d2); this.setPos(d0, d1, d2);
++this.despawnTimer; ++this.despawnTimer;
if (this.despawnTimer > 80 && !this.level.isClientSide) { if (this.despawnTimer > 80 && !this.level.isClientSide) {
this.playSound(SoundEvents.ENTITY_ENDER_EYE_DEATH, 1.0F, 1.0F); this.playSound(SoundEvents.ENDER_EYE_DEATH, 1.0F, 1.0F);
this.remove(); this.remove(RemovalReason.DISCARDED);
if (this.shatterOrDrop) { if (this.shatterOrDrop) {
this.level.addEntity(new ItemEntity(this.level, this.getPosX(), this.getPosY(), this.getPosZ(), this.getItem())); this.level.addFreshEntity(new ItemEntity(this.level, this.getX(), this.getY(), this.getZ(), this.getItem()));
} else { } else {
PacketHandler.sendToAllAround(this.level, this.getPosition(), 32, new PacketParticles((float) this.getPosX(), (float) this.getPosY(), (float) this.getPosZ(), PacketParticles.Type.STRUCTURE_FINDER, this.getEntityId())); PacketHandler.sendToAllAround(this.level, this.getOnPos(), 32, new PacketParticles((float) this.getX(), (float) this.getY(), (float) this.getZ(), PacketParticles.Type.STRUCTURE_FINDER, this.getId()));
} }
} }
} else { } else {
this.setRawPosition(d0, d1, d2); this.setPosRaw(d0, d1, d2);
} }
} }
@Override
public IPacket<?> createSpawnPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
} }

View file

@ -2,22 +2,24 @@ package de.ellpeck.naturesaura.items;
import de.ellpeck.naturesaura.entities.EntityStructureFinder; import de.ellpeck.naturesaura.entities.EntityStructureFinder;
import de.ellpeck.naturesaura.entities.ModEntities; import de.ellpeck.naturesaura.entities.ModEntities;
import net.minecraft.entity.player.Player; import net.minecraft.core.BlockPos;
import net.minecraft.item.ItemStack; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.InteractionResult; import net.minecraft.util.InteractionResult;
import net.minecraft.util.Hand; import net.minecraft.world.InteractionHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.InteractionResultHolder;
import net.minecraft.level.Level; import net.minecraft.world.entity.player.Player;
import net.minecraft.level.gen.feature.structure.Structure; import net.minecraft.world.item.ItemStack;
import net.minecraft.level.server.ServerLevel; import net.minecraft.world.level.Level;
import net.minecraft.world.level.levelgen.feature.StructureFeature;
public class ItemStructureFinder extends ItemImpl { public class ItemStructureFinder extends ItemImpl {
private final Structure structureName;
private final StructureFeature<?> structureName;
private final int color; private final int color;
private final int radius; private final int radius;
public ItemStructureFinder(String baseName, Structure structureName, int color, int radius) { public ItemStructureFinder(String baseName, StructureFeature<?> structureName, int color, int radius) {
super(baseName); super(baseName);
this.structureName = structureName; this.structureName = structureName;
this.color = color; this.color = color;
@ -25,11 +27,10 @@ public class ItemStructureFinder extends ItemImpl {
} }
@Override @Override
public ActionResult<ItemStack> onItemRightClick(Level levelIn, Player playerIn, Hand handIn) { public InteractionResultHolder<ItemStack> use(Level levelIn, Player playerIn, InteractionHand handIn) {
ItemStack stack = playerIn.getHeldItem(handIn); ItemStack stack = playerIn.getItemInHand(handIn);
// ServerLevel.getStructureManager().doesGenerateFeatures() if (!levelIn.isClientSide && ((ServerLevel) levelIn).structureFeatureManager().shouldGenerateFeatures()) {
if (!levelIn.isClientSide && ((ServerLevel) levelIn).func_241112_a_().func_235005_a_()) { BlockPos pos = ((ServerLevel) levelIn).getChunkSource().getGenerator().findNearestMapFeature((ServerLevel) levelIn, this.structureName, playerIn.getPosition(), this.radius, false);
BlockPos pos = ((ServerLevel) levelIn).getChunkProvider().getChunkGenerator().func_235956_a_((ServerLevel) levelIn, this.structureName, playerIn.getPosition(), this.radius, false);
if (pos != null) { if (pos != null) {
EntityStructureFinder entity = new EntityStructureFinder(ModEntities.STRUCTURE_FINDER, levelIn); EntityStructureFinder entity = new EntityStructureFinder(ModEntities.STRUCTURE_FINDER, levelIn);
entity.setPosition(playerIn.getPosX(), playerIn.getPosYHeight(0.5D), playerIn.getPosZ()); entity.setPosition(playerIn.getPosX(), playerIn.getPosYHeight(0.5D), playerIn.getPosZ());

View file

@ -5,17 +5,14 @@ import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModArmorMaterial; import de.ellpeck.naturesaura.reg.ModArmorMaterial;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.ai.attributes.Attributes;
import net.minecraft.entity.ai.attributes.ModifiableAttributeInstance;
import net.minecraft.entity.player.Player;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.*;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.potion.EffectInstance; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.potion.Effects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.*;
import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent;
@ -32,24 +29,24 @@ import java.util.UUID;
public class ItemArmor extends ArmorItem implements IModItem { public class ItemArmor extends ArmorItem implements IModItem {
private static final AttributeModifier SKY_MOVEMENT_MODIFIER = new AttributeModifier(UUID.fromString("c1f96acc-e117-4dc1-a351-e196a4de6071"), NaturesAura.MOD_ID + ":sky_movement_speed", 0.15F, AttributeModifier.Operation.MULTIPLY_TOTAL); private static final AttributeModifier SKY_MOVEMENT_MODIFIER = new AttributeModifier(UUID.fromString("c1f96acc-e117-4dc1-a351-e196a4de6071"), NaturesAura.MOD_ID + ":sky_movement_speed", 0.15F, AttributeModifier.Operation.MULTIPLY_TOTAL);
private static final Map<IArmorMaterial, Item[]> SETS = new HashMap<>(); private static final Map<ArmorMaterial, Item[]> SETS = new HashMap<>();
private final String baseName; private final String baseName;
public ItemArmor(String baseName, IArmorMaterial materialIn, EquipmentSlotType equipmentSlotIn) { public ItemArmor(String baseName, ArmorMaterial materialIn, EquipmentSlot equipmentSlotIn) {
super(materialIn, equipmentSlotIn, new Properties().group(NaturesAura.CREATIVE_TAB)); super(materialIn, equipmentSlotIn, new Properties().tab(NaturesAura.CREATIVE_TAB));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.add(this); ModRegistry.add(this);
} }
public static boolean isFullSetEquipped(LivingEntity entity, IArmorMaterial material) { public static boolean isFullSetEquipped(LivingEntity entity, ArmorMaterial material) {
Item[] set = SETS.computeIfAbsent(material, m -> ForgeRegistries.ITEMS.getValues().stream() var set = SETS.computeIfAbsent(material, m -> ForgeRegistries.ITEMS.getValues().stream()
.filter(i -> i instanceof ItemArmor && ((ItemArmor) i).getArmorMaterial() == material) .filter(i -> i instanceof ItemArmor && ((ItemArmor) i).getMaterial() == material)
.sorted(Comparator.comparingInt(i -> ((ItemArmor) i).getEquipmentSlot().ordinal())) .sorted(Comparator.comparingInt(i -> ((ItemArmor) i).getSlot().ordinal()))
.toArray(Item[]::new)); .toArray(Item[]::new));
for (int i = 0; i < 4; i++) { for (var i = 0; i < 4; i++) {
EquipmentSlotType slot = EquipmentSlotType.values()[i + 2]; var slot = EquipmentSlot.values()[i + 2];
ItemStack stack = entity.getItemStackFromSlot(slot); var stack = entity.getItemBySlot(slot);
if (stack.getItem() != set[i] && (slot != EquipmentSlotType.CHEST || stack.getItem() != Items.ELYTRA)) if (stack.getItem() != set[i] && (slot != EquipmentSlot.CHEST || stack.getItem() != Items.ELYTRA))
return false; return false;
} }
return true; return true;
@ -71,33 +68,33 @@ public class ItemArmor extends ArmorItem implements IModItem {
@SubscribeEvent @SubscribeEvent
public static void onAttack(LivingAttackEvent event) { public static void onAttack(LivingAttackEvent event) {
LivingEntity entity = event.getEntityLiving(); var entity = event.getEntityLiving();
if (!entity.level.isClientSide) { if (!entity.level.isClientSide) {
if (!isFullSetEquipped(entity, ModArmorMaterial.INFUSED)) if (!isFullSetEquipped(entity, ModArmorMaterial.INFUSED))
return; return;
Entity source = event.getSource().getTrueSource(); var source = event.getSource().getEntity();
if (source instanceof LivingEntity) if (source instanceof LivingEntity)
((LivingEntity) source).addPotionEffect(new EffectInstance(Effects.WITHER, 40)); ((LivingEntity) source).addEffect(new MobEffectInstance(MobEffects.WITHER, 40));
} }
} }
@SubscribeEvent @SubscribeEvent
public static void update(TickEvent.PlayerTickEvent event) { public static void update(TickEvent.PlayerTickEvent event) {
Player player = event.player; var player = event.player;
ModifiableAttributeInstance speed = player.getAttribute(Attributes.MOVEMENT_SPEED); var speed = player.getAttribute(Attributes.MOVEMENT_SPEED);
String key = NaturesAura.MOD_ID + ":sky_equipped"; var key = NaturesAura.MOD_ID + ":sky_equipped";
CompoundTag nbt = player.getPersistentData(); var nbt = player.getPersistentData();
boolean equipped = isFullSetEquipped(player, ModArmorMaterial.SKY); var equipped = isFullSetEquipped(player, ModArmorMaterial.SKY);
if (equipped && !nbt.getBoolean(key)) { if (equipped && !nbt.getBoolean(key)) {
// we just equipped it // we just equipped it
nbt.putBoolean(key, true); nbt.putBoolean(key, true);
player.stepHeight = 1.1F; player.maxUpStep = 1.1F;
if (!speed.hasModifier(SKY_MOVEMENT_MODIFIER)) if (!speed.hasModifier(SKY_MOVEMENT_MODIFIER))
speed.applyNonPersistentModifier(SKY_MOVEMENT_MODIFIER); speed.addPermanentModifier(SKY_MOVEMENT_MODIFIER);
} else if (!equipped && nbt.getBoolean(key)) { } else if (!equipped && nbt.getBoolean(key)) {
// we just unequipped it // we just unequipped it
nbt.putBoolean(key, false); nbt.putBoolean(key, false);
player.stepHeight = 0.6F; player.maxUpStep = 0.6F;
speed.removeModifier(SKY_MOVEMENT_MODIFIER); speed.removeModifier(SKY_MOVEMENT_MODIFIER);
} }
} }

View file

@ -7,16 +7,20 @@ import de.ellpeck.naturesaura.items.ModItems;
import de.ellpeck.naturesaura.reg.ICustomItemModel; import de.ellpeck.naturesaura.reg.ICustomItemModel;
import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.block.BlockState; import net.minecraft.core.BlockPos;
import net.minecraft.block.BushBlock;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.Player;
import net.minecraft.item.*;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.entity.player.Player;
import net.minecraft.level.Level; import net.minecraft.world.item.HoeItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.Tier;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BushBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -26,21 +30,21 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
private final String baseName; private final String baseName;
public ItemHoe(String baseName, IItemTier material, int speed) { public ItemHoe(String baseName, Tier material, int speed) {
super(material, speed, 0, new Properties().group(NaturesAura.CREATIVE_TAB)); super(material, speed, 0, new Properties().tab(NaturesAura.CREATIVE_TAB));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.add(this); ModRegistry.add(this);
} }
@Override @Override
public InteractionResult onItemUse(ItemUseContext context) { public InteractionResult useOn(UseOnContext context) {
if (this == ModItems.INFUSED_IRON_HOE) { if (this == ModItems.INFUSED_IRON_HOE) {
Level level = context.getLevel(); Level level = context.getLevel();
InteractionResult result = super.onItemUse(context); InteractionResult result = super.useOn(context);
if (!level.isClientSide && result.isSuccessOrConsume()) { if (!level.isClientSide && result.consumesAction()) {
ItemStack seed = ItemStack.EMPTY; ItemStack seed = ItemStack.EMPTY;
Random random = level.getRandom(); Random random = level.getRandom();
BlockPos pos = context.getPos(); BlockPos pos = context.getClickedPos();
if (random.nextInt(5) == 0) { if (random.nextInt(5) == 0) {
seed = new ItemStack(Items.WHEAT_SEEDS); seed = new ItemStack(Items.WHEAT_SEEDS);
} else if (random.nextInt(10) == 0) { } else if (random.nextInt(10) == 0) {
@ -56,7 +60,7 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
if (!seed.isEmpty()) { if (!seed.isEmpty()) {
ItemEntity item = new ItemEntity(level, pos.getX() + random.nextFloat(), pos.getY() + 1F, pos.getZ() + random.nextFloat(), seed); ItemEntity item = new ItemEntity(level, pos.getX() + random.nextFloat(), pos.getY() + 1F, pos.getZ() + random.nextFloat(), seed);
level.addEntity(item); level.addFreshEntity(item);
} }
} }
return result; return result;
@ -64,15 +68,15 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
boolean success = false; boolean success = false;
for (int x = -1; x <= 1; x++) { for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) { for (int z = -1; z <= 1; z++) {
BlockPos offset = context.getPos().add(x, 0, z); BlockPos offset = context.getClickedPos().offset(x, 0, z);
BlockRayTraceResult newResult = new BlockRayTraceResult(context.getHitVec(), context.getFace(), offset, context.isInside()); BlockHitResult newResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), offset, context.isInside());
ItemUseContext newContext = new ItemUseContext(context.getPlayer(), context.getHand(), newResult); UseOnContext newContext = new UseOnContext(context.getPlayer(), context.getHand(), newResult);
success |= super.onItemUse(newContext) == InteractionResult.SUCCESS; success |= super.useOn(newContext) == InteractionResult.SUCCESS;
} }
} }
return success ? InteractionResult.SUCCESS : InteractionResult.PASS; return success ? InteractionResult.SUCCESS : InteractionResult.PASS;
} }
return super.onItemUse(context); return super.useOn(context);
} }
@Override @Override
@ -87,7 +91,7 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
for (int z = -range; z <= range; z++) { for (int z = -range; z <= range; z++) {
if (x == 0 && y == 0 && z == 0) if (x == 0 && y == 0 && z == 0)
continue; continue;
BlockPos offset = pos.add(x, y, z); BlockPos offset = pos.offset(x, y, z);
BlockState otherState = player.level.getBlockState(offset); BlockState otherState = player.level.getBlockState(offset);
if (otherState.getBlock() instanceof BushBlock) if (otherState.getBlock() instanceof BushBlock)
player.level.destroyBlock(offset, true); player.level.destroyBlock(offset, true);

View file

@ -7,22 +7,23 @@ import de.ellpeck.naturesaura.items.ModItems;
import de.ellpeck.naturesaura.reg.ICustomItemModel; import de.ellpeck.naturesaura.reg.ICustomItemModel;
import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.IItemTier;
import net.minecraft.item.ItemStack;
import net.minecraft.item.SwordItem;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.potion.EffectInstance; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.potion.Effects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.item.Tier;
import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class ItemSword extends SwordItem implements IModItem, ICustomItemModel { public class ItemSword extends SwordItem implements IModItem, ICustomItemModel {
private final String baseName; private final String baseName;
public ItemSword(String baseName, IItemTier material, int damage, float speed) { public ItemSword(String baseName, Tier material, int damage, float speed) {
super(material, damage, speed, new Properties().group(NaturesAura.CREATIVE_TAB)); super(material, damage, speed, new Properties().tab(NaturesAura.CREATIVE_TAB));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.add(this); ModRegistry.add(this);
} }
@ -33,13 +34,13 @@ public class ItemSword extends SwordItem implements IModItem, ICustomItemModel {
} }
@Override @Override
public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
if (this == ModItems.INFUSED_IRON_SWORD) { if (this == ModItems.INFUSED_IRON_SWORD) {
target.addPotionEffect(new EffectInstance(Effects.SLOWNESS, 60, 2)); target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 2));
} else if (this == ModItems.SKY_SWORD) { } else if (this == ModItems.SKY_SWORD) {
target.addPotionEffect(new EffectInstance(Effects.LEVITATION, 60, 2)); target.addEffect(new MobEffectInstance(MobEffects.LEVITATION, 60, 2));
} }
return super.hitEntity(stack, target, attacker); return super.hurtEnemy(stack, target, attacker);
} }
@Nullable @Nullable

View file

@ -2,21 +2,21 @@ package de.ellpeck.naturesaura.reg;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.items.ModItems;
import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.sounds.SoundEvent;
import net.minecraft.item.IArmorMaterial; import net.minecraft.sounds.SoundEvents;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.util.LazyValue; import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.util.SoundEvent; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.util.SoundEvents;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.util.Lazy;
import java.util.function.Supplier; import java.util.function.Supplier;
public enum ModArmorMaterial implements IArmorMaterial { public enum ModArmorMaterial implements ArmorMaterial {
INFUSED(NaturesAura.MOD_ID + ":infused_iron", 19, new int[]{2, 5, 6, 2}, 16, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 0, () -> Ingredient.fromItems(ModItems.INFUSED_IRON)), INFUSED(NaturesAura.MOD_ID + ":infused_iron", 19, new int[]{2, 5, 6, 2}, 16, SoundEvents.ARMOR_EQUIP_GENERIC, 0, () -> Ingredient.of(ModItems.INFUSED_IRON)),
SKY(NaturesAura.MOD_ID + ":sky", 33, new int[]{3, 6, 8, 3}, 12, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 2, () -> Ingredient.fromItems(ModItems.SKY_INGOT)); SKY(NaturesAura.MOD_ID + ":sky", 33, new int[]{3, 6, 8, 3}, 12, SoundEvents.ARMOR_EQUIP_GENERIC, 2, () -> Ingredient.of(ModItems.SKY_INGOT));
private static final int[] MAX_DAMAGE_ARRAY = new int[]{13, 15, 16, 11}; private static final int[] MAX_DAMAGE_ARRAY = new int[]{13, 15, 16, 11};
private final String name; private final String name;
@ -25,7 +25,7 @@ public enum ModArmorMaterial implements IArmorMaterial {
private final int enchantability; private final int enchantability;
private final SoundEvent soundEvent; private final SoundEvent soundEvent;
private final float toughness; private final float toughness;
private final LazyValue<Ingredient> repairMaterial; private final Lazy<Ingredient> repairMaterial;
ModArmorMaterial(String nameIn, int maxDamageFactorIn, int[] damageReductionAmountsIn, int enchantabilityIn, SoundEvent equipSoundIn, float toughness, Supplier<Ingredient> repairMaterialSupplier) { ModArmorMaterial(String nameIn, int maxDamageFactorIn, int[] damageReductionAmountsIn, int enchantabilityIn, SoundEvent equipSoundIn, float toughness, Supplier<Ingredient> repairMaterialSupplier) {
this.name = nameIn; this.name = nameIn;
@ -34,32 +34,32 @@ public enum ModArmorMaterial implements IArmorMaterial {
this.enchantability = enchantabilityIn; this.enchantability = enchantabilityIn;
this.soundEvent = equipSoundIn; this.soundEvent = equipSoundIn;
this.toughness = toughness; this.toughness = toughness;
this.repairMaterial = new LazyValue<>(repairMaterialSupplier); this.repairMaterial = Lazy.of(repairMaterialSupplier);
} }
@Override @Override
public int getDurability(EquipmentSlotType slotIn) { public int getDurabilityForSlot(EquipmentSlot slotIn) {
return MAX_DAMAGE_ARRAY[slotIn.getIndex()] * this.maxDamageFactor; return MAX_DAMAGE_ARRAY[slotIn.getIndex()] * this.maxDamageFactor;
} }
@Override @Override
public int getDamageReductionAmount(EquipmentSlotType slotIn) { public int getDefenseForSlot(EquipmentSlot slotIn) {
return this.damageReductionAmountArray[slotIn.getIndex()]; return this.damageReductionAmountArray[slotIn.getIndex()];
} }
@Override @Override
public int getEnchantability() { public int getEnchantmentValue() {
return this.enchantability; return this.enchantability;
} }
@Override @Override
public SoundEvent getSoundEvent() { public SoundEvent getEquipSound() {
return this.soundEvent; return this.soundEvent;
} }
@Override @Override
public Ingredient getRepairMaterial() { public Ingredient getRepairIngredient() {
return this.repairMaterial.getValue(); return this.repairMaterial.get();
} }
@Override @Override

View file

@ -25,35 +25,34 @@ import de.ellpeck.naturesaura.potion.ModPotions;
import de.ellpeck.naturesaura.potion.PotionBreathless; import de.ellpeck.naturesaura.potion.PotionBreathless;
import de.ellpeck.naturesaura.recipes.EnabledCondition; import de.ellpeck.naturesaura.recipes.EnabledCondition;
import de.ellpeck.naturesaura.recipes.ModRecipes; import de.ellpeck.naturesaura.recipes.ModRecipes;
import net.minecraft.block.Blocks;
import net.minecraft.block.FlowerPotBlock; import net.minecraft.block.FlowerPotBlock;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.entity.SpriteRenderer; import net.minecraft.client.renderer.entity.SpriteRenderer;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.EntityClassification; import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.level.Level;
import net.minecraft.level.gen.feature.Feature; import net.minecraft.level.gen.feature.Feature;
import net.minecraft.level.gen.feature.structure.Structure;
import net.minecraft.tileentity.BlockEntityType;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.LevelGenRegistries; import net.minecraft.util.registry.LevelGenRegistries;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.levelgen.feature.StructureFeature;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.common.extensions.IForgeContainerType;
import net.minecraftforge.common.extensions.IForgeMenuType; import net.minecraftforge.common.extensions.IForgeMenuType;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@ -80,9 +79,9 @@ public final class ModRegistry {
event.getRegistry().registerAll( event.getRegistry().registerAll(
new BlockAncientLog("ancient_log"), new BlockAncientLog("ancient_log"),
new BlockAncientLog("ancient_bark"), new BlockAncientLog("ancient_bark"),
temp = new BlockImpl("ancient_planks", Block.Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(2F)), temp = new BlockImpl("ancient_planks", Block.Properties.of(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(2F)),
new BlockStairsNA("ancient_stairs", "ancient_planks", temp::getDefaultState, Block.Properties.from(temp)), new BlockStairsNA("ancient_stairs", "ancient_planks", temp::defaultBlockState, Block.Properties.from(temp)),
new Slab("ancient_slab", "ancient_planks", Block.Properties.from(temp)), new Slab("ancient_slab", "ancient_planks", Block.Properties.copy(temp)),
new BlockAncientLeaves(), new BlockAncientLeaves(),
new BlockAncientSapling(), new BlockAncientSapling(),
new BlockNatureAltar(), new BlockNatureAltar(),
@ -90,23 +89,23 @@ public final class ModRegistry {
new BlockGoldenLeaves(), new BlockGoldenLeaves(),
new BlockGoldPowder(), new BlockGoldPowder(),
new BlockWoodStand(), new BlockWoodStand(),
temp = new BlockImpl("infused_stone", Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1.75F)), temp = new BlockImpl("infused_stone", Block.Properties.of(Material.STONE).sound(SoundType.STONE).hardnessAndResistance(1.75F)),
new BlockStairsNA("infused_stairs", "infused_stone", temp::getDefaultState, Block.Properties.from(temp)), new BlockStairsNA("infused_stairs", "infused_stone", temp::defaultBlockState, Block.Properties.from(temp)),
new Slab("infused_slab", "infused_stone", Block.Properties.from(temp)), new Slab("infused_slab", "infused_stone", Block.Properties.from(temp)),
temp = new BlockImpl("infused_brick", Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1.5F)), temp = new BlockImpl("infused_brick", Block.Properties.of(Material.STONE).sound(SoundType.STONE).hardnessAndResistance(1.5F)),
new BlockStairsNA("infused_brick_stairs", "infused_brick", temp::getDefaultState, Block.Properties.from(temp)), new BlockStairsNA("infused_brick_stairs", "infused_brick", temp::defaultBlockState, Block.Properties.from(temp)),
new Slab("infused_brick_slab", "infused_brick", Block.Properties.from(temp)), new Slab("infused_brick_slab", "infused_brick", Block.Properties.from(temp)),
new BlockFurnaceHeater(), new BlockFurnaceHeater(),
new BlockPotionGenerator(), new BlockPotionGenerator(),
new BlockAuraDetector(), new BlockAuraDetector(),
new BlockCatalyst("conversion_catalyst", Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(2.5F)), new BlockCatalyst("conversion_catalyst", Block.Properties.of(Material.STONE).sound(SoundType.STONE).hardnessAndResistance(2.5F)),
new BlockCatalyst("crushing_catalyst", Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(2.5F)), new BlockCatalyst("crushing_catalyst", Block.Properties.of(Material.STONE).sound(SoundType.STONE).hardnessAndResistance(2.5F)),
new BlockFlowerGenerator(), new BlockFlowerGenerator(),
new BlockPlacer(), new BlockPlacer(),
new BlockHopperUpgrade(), new BlockHopperUpgrade(),
new BlockFieldCreator(), new BlockFieldCreator(),
new BlockOakGenerator(), new BlockOakGenerator(),
new BlockImpl("infused_iron_block", Block.Properties.create(Material.IRON).sound(SoundType.METAL).hardnessAndResistance(3F)), new BlockImpl("infused_iron_block", Block.Properties.of(Material.IRON).sound(SoundType.METAL).hardnessAndResistance(3F)),
new BlockOfferingTable(), new BlockOfferingTable(),
new BlockPickupStopper(), new BlockPickupStopper(),
new BlockSpawnLamp(), new BlockSpawnLamp(),
@ -115,8 +114,8 @@ public final class ModRegistry {
new BlockGratedChute(), new BlockGratedChute(),
new BlockAnimalSpawner(), new BlockAnimalSpawner(),
new BlockAutoCrafter(), new BlockAutoCrafter(),
new BlockImpl("gold_brick", Block.Properties.from(Blocks.STONE_BRICKS)), new BlockImpl("gold_brick", Block.Properties.copy(Blocks.STONE_BRICKS)),
new BlockImpl("gold_nether_brick", Block.Properties.from(Blocks.NETHER_BRICKS)), new BlockImpl("gold_nether_brick", Block.Properties.copy(Blocks.NETHER_BRICKS)),
new BlockMossGenerator(), new BlockMossGenerator(),
new BlockTimeChanger(), new BlockTimeChanger(),
new BlockGeneratorLimitRemover(), new BlockGeneratorLimitRemover(),
@ -124,11 +123,11 @@ public final class ModRegistry {
new BlockPowderPlacer(), new BlockPowderPlacer(),
new BlockFireworkGenerator(), new BlockFireworkGenerator(),
new BlockProjectileGenerator(), new BlockProjectileGenerator(),
new BlockDimensionRail("overworld", Level.field_234918_g_, Level.field_234919_h_, Level.field_234920_i_), new BlockDimensionRail("overworld", Level.OVERWORLD, Level.NETHER, Level.END),
new BlockDimensionRail("nether", Level.field_234919_h_, Level.field_234918_g_), new BlockDimensionRail("nether", Level.NETHER, Level.OVERWORLD),
new BlockDimensionRail("end", Level.field_234920_i_, Level.field_234918_g_), new BlockDimensionRail("end", Level.END, Level.OVERWORLD),
new BlockBlastFurnaceBooster(), new BlockBlastFurnaceBooster(),
new BlockImpl("nether_wart_mushroom", Block.Properties.from(Blocks.RED_MUSHROOM_BLOCK)), new BlockImpl("nether_wart_mushroom", Block.Properties.copy(Blocks.RED_MUSHROOM_BLOCK)),
new BlockAnimalContainer(), new BlockAnimalContainer(),
new BlockSnowCreator(), new BlockSnowCreator(),
new BlockItemDistributor(), new BlockItemDistributor(),
@ -142,7 +141,7 @@ public final class ModRegistry {
createFlowerPot(temp), createFlowerPot(temp),
temp = new BlockAuraBloom("aura_mushroom", Blocks.MYCELIUM), temp = new BlockAuraBloom("aura_mushroom", Blocks.MYCELIUM),
createFlowerPot(temp), createFlowerPot(temp),
new BlockImpl("tainted_gold_block", Block.Properties.create(Material.IRON).sound(SoundType.METAL).hardnessAndResistance(3F)), new BlockImpl("tainted_gold_block", Block.Properties.of(Material.METAL).sound(SoundType.METAL).strength(3F)),
new BlockNetherGrass(), new BlockNetherGrass(),
new BlockLight(), new BlockLight(),
new BlockChorusGenerator(), new BlockChorusGenerator(),
@ -173,10 +172,10 @@ public final class ModRegistry {
new ItemShovel("infused_iron_shovel", ModItemTier.INFUSED, 1.5F, -3.0F), new ItemShovel("infused_iron_shovel", ModItemTier.INFUSED, 1.5F, -3.0F),
new ItemHoe("infused_iron_hoe", ModItemTier.INFUSED, -1), new ItemHoe("infused_iron_hoe", ModItemTier.INFUSED, -1),
new ItemSword("infused_iron_sword", ModItemTier.INFUSED, 3, -2.4F), new ItemSword("infused_iron_sword", ModItemTier.INFUSED, 3, -2.4F),
new ItemArmor("infused_iron_helmet", ModArmorMaterial.INFUSED, EquipmentSlotType.HEAD), new ItemArmor("infused_iron_helmet", ModArmorMaterial.INFUSED, EquipmentSlot.HEAD),
new ItemArmor("infused_iron_chest", ModArmorMaterial.INFUSED, EquipmentSlotType.CHEST), new ItemArmor("infused_iron_chest", ModArmorMaterial.INFUSED, EquipmentSlot.CHEST),
new ItemArmor("infused_iron_pants", ModArmorMaterial.INFUSED, EquipmentSlotType.LEGS), new ItemArmor("infused_iron_pants", ModArmorMaterial.INFUSED, EquipmentSlot.LEGS),
new ItemArmor("infused_iron_shoes", ModArmorMaterial.INFUSED, EquipmentSlotType.FEET), new ItemArmor("infused_iron_shoes", ModArmorMaterial.INFUSED, EquipmentSlot.FEET),
new ItemEye("eye"), new ItemEye("eye"),
new ItemEye("eye_improved"), new ItemEye("eye_improved"),
new ItemGoldFiber(), new ItemGoldFiber(),
@ -218,13 +217,13 @@ public final class ModRegistry {
new ItemShovel("sky_shovel", ModItemTier.SKY, 1.5F, -3.0F), new ItemShovel("sky_shovel", ModItemTier.SKY, 1.5F, -3.0F),
new ItemHoe("sky_hoe", ModItemTier.SKY, -1), new ItemHoe("sky_hoe", ModItemTier.SKY, -1),
new ItemSword("sky_sword", ModItemTier.SKY, 3, -2.4F), new ItemSword("sky_sword", ModItemTier.SKY, 3, -2.4F),
new ItemArmor("sky_helmet", ModArmorMaterial.SKY, EquipmentSlotType.HEAD), new ItemArmor("sky_helmet", ModArmorMaterial.SKY, EquipmentSlot.HEAD),
new ItemArmor("sky_chest", ModArmorMaterial.SKY, EquipmentSlotType.CHEST), new ItemArmor("sky_chest", ModArmorMaterial.SKY, EquipmentSlot.CHEST),
new ItemArmor("sky_pants", ModArmorMaterial.SKY, EquipmentSlotType.LEGS), new ItemArmor("sky_pants", ModArmorMaterial.SKY, EquipmentSlot.LEGS),
new ItemArmor("sky_shoes", ModArmorMaterial.SKY, EquipmentSlotType.FEET), new ItemArmor("sky_shoes", ModArmorMaterial.SKY, EquipmentSlot.FEET),
new ItemStructureFinder("fortress_finder", Structure.field_236378_n_, 0xba2800, 1024), new ItemStructureFinder("fortress_finder", StructureFeature.NETHER_BRIDGE, 0xba2800, 1024),
new ItemStructureFinder("end_city_finder", Structure.field_236379_o_, 0xca5cd6, 1024), new ItemStructureFinder("end_city_finder", StructureFeature.END_CITY, 0xca5cd6, 1024),
new ItemStructureFinder("outpost_finder", Structure.field_236366_b_, 0xab9f98, 2048), new ItemStructureFinder("outpost_finder", StructureFeature.PILLAGER_OUTPOST, 0xab9f98, 2048),
new ItemBreakPrevention(), new ItemBreakPrevention(),
new ItemPetReviver(), new ItemPetReviver(),
new ItemNetheriteFinder() new ItemNetheriteFinder()
@ -238,8 +237,8 @@ public final class ModRegistry {
add(new ModTileType<>(BlockEntityAuraBloom::new, "aura_bloom", ALL_ITEMS.stream().filter(i -> i instanceof BlockAuraBloom).toArray(IModItem[]::new))); add(new ModTileType<>(BlockEntityAuraBloom::new, "aura_bloom", ALL_ITEMS.stream().filter(i -> i instanceof BlockAuraBloom).toArray(IModItem[]::new)));
for (IModItem item : ALL_ITEMS) { for (IModItem item : ALL_ITEMS) {
if (item instanceof ModTileType) if (item instanceof ModTileType type)
event.getRegistry().register(((ModTileType) item).type); event.getRegistry().register(type.type);
} }
Helper.populateObjectHolders(ModTileEntities.class, event.getRegistry()); Helper.populateObjectHolders(ModTileEntities.class, event.getRegistry());
} }
@ -281,21 +280,21 @@ public final class ModRegistry {
@SubscribeEvent @SubscribeEvent
public static void registerEntities(RegistryEvent.Register<EntityType<?>> event) { public static void registerEntities(RegistryEvent.Register<EntityType<?>> event) {
event.getRegistry().registerAll( event.getRegistry().registerAll(
EntityType.Builder.create(EntityMoverMinecart::new, EntityClassification.MISC) EntityType.Builder.of(EntityMoverMinecart::new, MobCategory.MISC)
.size(1, 1).setShouldReceiveVelocityUpdates(true) .sized(1, 1).setShouldReceiveVelocityUpdates(true)
.setTrackingRange(64).setUpdateInterval(3).immuneToFire().build(NaturesAura.MOD_ID + ":mover_minecart") .setTrackingRange(64).setUpdateInterval(3).fireImmune().build(NaturesAura.MOD_ID + ":mover_minecart")
.setRegistryName("mover_cart"), .setRegistryName("mover_cart"),
EntityType.Builder.create(EntityEffectInhibitor::new, EntityClassification.MISC) EntityType.Builder.of(EntityEffectInhibitor::new, MobCategory.MISC)
.size(1, 1).setShouldReceiveVelocityUpdates(true) .sized(1, 1).setShouldReceiveVelocityUpdates(true)
.setTrackingRange(64).setUpdateInterval(20).immuneToFire().build(NaturesAura.MOD_ID + ":effect_inhibitor") .setTrackingRange(64).setUpdateInterval(20).fireImmune().build(NaturesAura.MOD_ID + ":effect_inhibitor")
.setRegistryName("effect_inhibitor"), .setRegistryName("effect_inhibitor"),
EntityType.Builder.<EntityLightProjectile>create(EntityLightProjectile::new, EntityClassification.MISC) EntityType.Builder.<EntityLightProjectile>of(EntityLightProjectile::new, MobCategory.MISC)
.size(0.5F, 0.5F).setShouldReceiveVelocityUpdates(true) .sized(0.5F, 0.5F).setShouldReceiveVelocityUpdates(true)
.setTrackingRange(64).setUpdateInterval(3).immuneToFire().build(NaturesAura.MOD_ID + ":light_projectile") .setTrackingRange(64).setUpdateInterval(3).fireImmune().build(NaturesAura.MOD_ID + ":light_projectile")
.setRegistryName("light_projectile"), .setRegistryName("light_projectile"),
EntityType.Builder.create(EntityStructureFinder::new, EntityClassification.MISC) EntityType.Builder.of(EntityStructureFinder::new, MobCategory.MISC)
.size(0.5F, 0.5F).setShouldReceiveVelocityUpdates(true) .sized(0.5F, 0.5F).setShouldReceiveVelocityUpdates(true)
.setTrackingRange(64).setUpdateInterval(2).immuneToFire().build(NaturesAura.MOD_ID + ":structure_finder") .setTrackingRange(64).setUpdateInterval(2).fireImmune().build(NaturesAura.MOD_ID + ":structure_finder")
.setRegistryName("structure_finder") .setRegistryName("structure_finder")
); );
Helper.populateObjectHolders(ModEntities.class, event.getRegistry()); Helper.populateObjectHolders(ModEntities.class, event.getRegistry());
@ -351,7 +350,7 @@ public final class ModRegistry {
} }
public static Block createFlowerPot(Block block) { public static Block createFlowerPot(Block block) {
Block.Properties props = Block.Properties.create(Material.MISCELLANEOUS).hardnessAndResistance(0F); Block.Properties props = Block.Properties.of(Material.MISCELLANEOUS).hardnessAndResistance(0F);
Block potted = new BlockFlowerPot(() -> (FlowerPotBlock) Blocks.FLOWER_POT, block::getBlock, props); Block potted = new BlockFlowerPot(() -> (FlowerPotBlock) Blocks.FLOWER_POT, block::getBlock, props);
((FlowerPotBlock) Blocks.FLOWER_POT).addPlant(block.getRegistryName(), () -> potted); ((FlowerPotBlock) Blocks.FLOWER_POT).addPlant(block.getRegistryName(), () -> potted);
return potted; return potted;