resolve fabric todos

This commit is contained in:
yrsegal@gmail.com 2022-06-07 14:57:16 -04:00
parent 59378e8031
commit 4e6d47de41
6 changed files with 106 additions and 17 deletions

View file

@ -1,15 +1,14 @@
package at.petrak.hexcasting.common.blocks;
import at.petrak.hexcasting.annotations.SoftImplement;
import at.petrak.hexcasting.api.misc.FrozenColorizer;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityConjured;
import at.petrak.hexcasting.xplat.IForgeLikeBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
@ -20,14 +19,13 @@ 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.phys.HitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class BlockConjured extends Block implements EntityBlock {
public class BlockConjured extends Block implements EntityBlock, IForgeLikeBlock {
public BlockConjured(Properties properties) {
super(properties);
@ -112,9 +110,7 @@ public class BlockConjured extends Block implements EntityBlock {
// NO-OP
}
// TODO figure out how to impl these in fabric
@SoftImplement("forge")
@Override
public boolean addLandingEffects(BlockState state1, ServerLevel worldserver, BlockPos pos, BlockState state2,
LivingEntity entity, int numberOfParticles) {
BlockEntity tile = worldserver.getBlockEntity(pos);
@ -123,11 +119,5 @@ public class BlockConjured extends Block implements EntityBlock {
}
return true;
}
@SoftImplement("forge")
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter level, BlockPos pos,
Player player) {
return ItemStack.EMPTY;
}
}

View file

@ -1,11 +1,11 @@
package at.petrak.hexcasting.common.blocks.akashic;
import at.petrak.hexcasting.annotations.SoftImplement;
import at.petrak.hexcasting.api.spell.DatumType;
import at.petrak.hexcasting.api.spell.SpellDatum;
import at.petrak.hexcasting.common.items.ItemScroll;
import at.petrak.hexcasting.common.lib.HexBlocks;
import at.petrak.hexcasting.common.lib.HexSounds;
import at.petrak.hexcasting.xplat.IForgeLikeBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.sounds.SoundSource;
@ -28,7 +28,7 @@ import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.Nullable;
public class BlockAkashicBookshelf extends BlockAkashicFloodfiller implements EntityBlock {
public class BlockAkashicBookshelf extends BlockAkashicFloodfiller implements EntityBlock, IForgeLikeBlock {
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public static final EnumProperty<DatumType> DATUM_TYPE = EnumProperty.create("datum_type", DatumType.class);
@ -115,8 +115,7 @@ public class BlockAkashicBookshelf extends BlockAkashicFloodfiller implements En
return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite());
}
// TODO: fabric
@SoftImplement("Forge")
@Override
public float getEnchantPowerBonus(BlockState state, LevelReader level, BlockPos pos) {
return 1;
}

View file

@ -0,0 +1,28 @@
package at.petrak.hexcasting.xplat;
import at.petrak.hexcasting.annotations.SoftImplement;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.state.BlockState;
/**
* An interface that mimics some methods of IForgeBlock.
* Fabric implementation will use mixins to achieve the same effect.
*/
public interface IForgeLikeBlock {
@SoftImplement("forge")
default boolean addLandingEffects(BlockState state1, ServerLevel level, BlockPos pos, BlockState state2, LivingEntity entity, int numberOfParticles) {
return false;
}
/**
* On Fabric, this method's return value doesn't matter - it's only checked for whether it's greater than 0.
* Implementing boosts the way Forge does would... not be worth the effort.
*/
@SoftImplement("forge")
default float getEnchantPowerBonus(BlockState state, LevelReader level, BlockPos pos) {
return 0;
}
}

View file

@ -0,0 +1,23 @@
package at.petrak.hexcasting.fabric.mixin;
import at.petrak.hexcasting.xplat.IForgeLikeBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.EnchantmentTableBlock;
import net.minecraft.world.level.block.state.BlockState;
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.CallbackInfoReturnable;
@Mixin(EnchantmentTableBlock.class)
public class FabricEnchantmentTableBlockMixin {
@Inject(method = "isValidBookShelf", at = @At("HEAD"), cancellable = true)
private static void treatAsBookshelf(Level level, BlockPos blockPos, BlockPos blockPos2, CallbackInfoReturnable<Boolean> cir) {
BlockState state = level.getBlockState(blockPos.offset(blockPos2));
if (state.getBlock() instanceof IForgeLikeBlock forgeLike) {
boolean emptyBetween = level.isEmptyBlock(blockPos.offset(blockPos2.getX() / 2, blockPos2.getY(), blockPos2.getZ() / 2));
cir.setReturnValue(emptyBetween && forgeLike.getEnchantPowerBonus(state, level, blockPos) > 0);
}
}
}

View file

@ -0,0 +1,47 @@
package at.petrak.hexcasting.fabric.mixin;
import at.petrak.hexcasting.xplat.IForgeLikeBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
@Mixin(LivingEntity.class)
public class FabricLivingEntityMixin {
@Unique
private BlockState hex$cachedParticleState;
@ModifyVariable(method = "checkFallDamage", at = @At(value = "LOAD", ordinal = 0), argsOnly = true)
private BlockState overwrite(BlockState state, double d, boolean bl, BlockState _ignored, BlockPos pos) {
LivingEntity entity = (LivingEntity) (Object) this;
if (state.getBlock() instanceof IForgeLikeBlock forgeLike) {
float dist = (float) Mth.ceil(entity.fallDistance - 3.0F);
double e = Math.min(0.2F + dist / 15.0F, 2.5D);
int i = (int)(150.0D * e);
if (forgeLike.addLandingEffects(state, (ServerLevel) entity.level, pos, state, entity, i)) {
hex$cachedParticleState = state;
return Blocks.AIR.defaultBlockState();
}
}
return state;
}
@ModifyArg(method = "checkFallDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;checkFallDamage(DZLnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;)V"))
private BlockState restore(BlockState state) {
if (hex$cachedParticleState != null) {
BlockState cached = hex$cachedParticleState;
hex$cachedParticleState = null;
return cached;
}
return state;
}
}

View file

@ -7,7 +7,9 @@
"mixins": [
"FabricAxeItemMixin",
"FabricBlockBehaviorMixin",
"FabricEnchantmentTableBlockMixin",
"FabricItemEntityMixin",
"FabricLivingEntityMixin",
"FabricVillagerTurnIntoWitchMixin"
],
"client": [