VERY TALL AND SHORT AND BIG

also made rainbow ant rare in elythia
sniffer died
fyling squireal anim overhual
This commit is contained in:
craisinlord committed 2026-07-07 01:21:44 -05:00
1 parent 2c9fc4f11f
commit 3e25149618
34 files changed
+3043 -563

No files matched your search

@@ -0,0 +1,170 @@
package com.craisinlord.antarchy.content.block;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.BonemealableBlock;
import net.minecraft.world.level.block.BushBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.Nullable;
public class VeryTallGrassBlock extends BushBlock implements BonemealableBlock {
public static final MapCodec<VeryTallGrassBlock> CODEC = Block.simpleCodec(VeryTallGrassBlock::new);
public static final EnumProperty<Part> PART = EnumProperty.create("part", Part.class);
public VeryTallGrassBlock(BlockBehaviour.Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(PART, Part.LOWER));
}
@Override
public MapCodec<VeryTallGrassBlock> codec() {
return CODEC;
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(PART);
}
@Override
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
return switch (state.getValue(PART)) {
case LOWER -> super.canSurvive(state, level, pos);
case MIDDLE -> level.getBlockState(pos.below()).is(this)
&& level.getBlockState(pos.below()).getValue(PART) == Part.LOWER
&& level.getBlockState(pos.above()).is(this)
&& level.getBlockState(pos.above()).getValue(PART) == Part.UPPER;
case UPPER -> level.getBlockState(pos.below()).is(this)
&& level.getBlockState(pos.below()).getValue(PART) == Part.MIDDLE;
};
}
@Override
protected BlockState updateShape(
BlockState state,
Direction direction,
BlockState neighborState,
LevelAccessor level,
BlockPos pos,
BlockPos neighborPos
) {
Part part = state.getValue(PART);
if (part == Part.LOWER && direction == Direction.UP && (!neighborState.is(this) || neighborState.getValue(PART) != Part.MIDDLE)) {
return Blocks.AIR.defaultBlockState();
}
if (part == Part.MIDDLE) {
if (direction == Direction.DOWN && (!neighborState.is(this) || neighborState.getValue(PART) != Part.LOWER)) {
return Blocks.AIR.defaultBlockState();
}
if (direction == Direction.UP && (!neighborState.is(this) || neighborState.getValue(PART) != Part.UPPER)) {
return Blocks.AIR.defaultBlockState();
}
}
if (part == Part.UPPER && direction == Direction.DOWN && (!neighborState.is(this) || neighborState.getValue(PART) != Part.MIDDLE)) {
return Blocks.AIR.defaultBlockState();
}
return state.canSurvive(level, pos) ? super.updateShape(state, direction, neighborState, level, pos, neighborPos) : Blocks.AIR.defaultBlockState();
}
@Override
protected ItemInteractionResult useItemOn(
ItemStack stack,
BlockState state,
Level level,
BlockPos pos,
Player player,
InteractionHand hand,
BlockHitResult hitResult
) {
if (player.getItemInHand(hand).is(Items.BONE_MEAL)) {
popResource(level, pos, new ItemStack(state.getBlock().asItem(), 1));
return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION;
}
return super.useItemOn(stack, state, level, pos, player, hand, hitResult);
}
@Override
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
return false;
}
@Override
public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
return false;
}
@Override
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
}
@Override
protected boolean canBeReplaced(BlockState state, BlockPlaceContext context) {
return false;
}
@Nullable
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
BlockPos pos = context.getClickedPos();
Level level = context.getLevel();
if (!level.getBlockState(pos.above()).canBeReplaced(context) || !level.getBlockState(pos.above(2)).canBeReplaced(context)) {
return null;
}
return super.getStateForPlacement(context);
}
@Override
public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable net.minecraft.world.entity.LivingEntity placer, ItemStack stack) {
placeAt(level, pos, Block.UPDATE_ALL);
}
public static void placeAt(LevelAccessor level, BlockPos pos, int flags) {
level.setBlock(pos, defaultState(Part.LOWER), flags);
level.setBlock(pos.above(), defaultState(Part.MIDDLE), flags);
level.setBlock(pos.above(2), defaultState(Part.UPPER), flags);
}
private static BlockState defaultState(Part part) {
return net.minecraft.core.registries.BuiltInRegistries.BLOCK
.get(net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("antarchy", "very_tall_grass"))
.defaultBlockState()
.setValue(PART, part);
}
public enum Part implements StringRepresentable {
LOWER("lower"),
MIDDLE("middle"),
UPPER("upper");
private final String name;
Part(String name) {
this.name = name;
}
@Override
public String getSerializedName() {
return this.name;
}
}
}
@@ -0,0 +1,39 @@
package com.craisinlord.antarchy.content.client;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.mojang.blaze3d.vertex.VertexConsumer;
public final class AlphaVertexConsumerProxy {
private AlphaVertexConsumerProxy() {
}
public static VertexConsumer wrap(VertexConsumer delegate, float alphaScale) {
if (alphaScale >= 0.999F) {
return delegate;
}
final VertexConsumer[] proxyHolder = new VertexConsumer[1];
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object[] forwardedArgs = args;
if ("setColor".equals(method.getName()) && args != null && args.length == 4 && args[3] instanceof Integer alpha) {
forwardedArgs = args.clone();
forwardedArgs[3] = Math.max(0, Math.min(255, Math.round(alpha * alphaScale)));
}
Object result = method.invoke(delegate, forwardedArgs);
return result == delegate ? proxyHolder[0] : result;
}
};
proxyHolder[0] = (VertexConsumer) Proxy.newProxyInstance(
VertexConsumer.class.getClassLoader(),
new Class<?>[] { VertexConsumer.class },
handler
);
return proxyHolder[0];
}
}
@@ -8,8 +8,6 @@ import software.bernie.geckolib.model.GeoModel;
public class RollyPollyModel extends GeoModel<RollyPollyEntity> {
private static final ResourceLocation TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/rolly_polly/rolly_polly.png");
private static final ResourceLocation TEXTURE_SADDLED =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/rolly_polly/rolly_polly_saddled.png");
@Override
public ResourceLocation getModelResource(RollyPollyEntity animatable) {
@@ -18,7 +16,7 @@ public class RollyPollyModel extends GeoModel<RollyPollyEntity> {
@Override
public ResourceLocation getTextureResource(RollyPollyEntity animatable) {
return animatable.hasSaddle() ? TEXTURE_SADDLED : TEXTURE;
return TEXTURE;
}
@Override
@@ -2,11 +2,14 @@ package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchyTags;
import java.util.EnumSet;
import net.minecraft.core.BlockPos;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.BlockTags;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.InteractionHand;
@@ -18,11 +21,11 @@ import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.TamableAnimal;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.goal.FloatGoal;
import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
import net.minecraft.world.entity.ai.goal.PanicGoal;
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
@@ -30,9 +33,10 @@ import net.minecraft.world.entity.ai.goal.TemptGoal;
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BedBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.animatable.GeoEntity;
@@ -47,14 +51,13 @@ import software.bernie.geckolib.util.GeckoLibUtil;
public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
private static final RawAnimation ROLL_UP_ANIM = RawAnimation.begin().thenPlay("wheel_mode");
private static final RawAnimation ROLL_UP_ANIM = RawAnimation.begin().thenPlayAndHold("wheel_mode");
private static final RawAnimation ROLLING_ANIM = RawAnimation.begin().thenLoop("roll");
private static final RawAnimation UNROLL_ANIM = RawAnimation.begin().thenPlay("normal_mode");
private static final int ANIM_IDLE = 0;
private static final int ANIM_WALK = 1;
// ANIMATION_STATE only syncs the roll transitions; idle/walk/rolling are derived client-side
private static final int ANIM_NONE = 0;
private static final int ANIM_ROLL_UP = 2;
private static final int ANIM_ROLLING = 3;
private static final int ANIM_UNROLL = 4;
// wheel_mode is 0.75s, normal_mode is ~0.42s
@@ -65,8 +68,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
private static final EntityDataAccessor<Integer> ANIMATION_STATE =
SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Boolean> SADDLED =
SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.BOOLEAN);
private static final EntityDataAccessor<Boolean> ROLLED =
SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.BOOLEAN);
@@ -91,8 +92,7 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
@Override
protected void defineSynchedData(SynchedEntityData.Builder builder) {
super.defineSynchedData(builder);
builder.define(ANIMATION_STATE, ANIM_IDLE);
builder.define(SADDLED, false);
builder.define(ANIMATION_STATE, ANIM_NONE);
builder.define(ROLLED, false);
}
@@ -106,20 +106,21 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isTame() && super.canUse();
}
});
this.goalSelector.addGoal(2, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.ROLLY_POLLY_FOOD), false) {
this.goalSelector.addGoal(2, new SnuggleOnBedGoal());
this.goalSelector.addGoal(3, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.ROLLY_POLLY_FOOD), false) {
@Override
public boolean canUse() {
return !RollyPollyEntity.this.isRolled() && super.canUse();
}
});
this.goalSelector.addGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.0D) {
this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0D) {
@Override
public boolean canUse() {
return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isVehicle() && super.canUse();
}
});
this.goalSelector.addGoal(4, new LookAtPlayerGoal(this, Player.class, 8.0F));
this.goalSelector.addGoal(5, new RandomLookAroundGoal(this));
this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 8.0F));
this.goalSelector.addGoal(6, new RandomLookAroundGoal(this));
}
@Override
@@ -154,33 +155,11 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (this.isTame()) {
if (!this.hasSaddle() && stack.is(Items.SADDLE) && this.isOwnedBy(player)) {
if (!this.level().isClientSide) {
this.setSaddled(true);
if (!player.getAbilities().instabuild) {
stack.shrink(1);
}
this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 1.2F);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (this.hasSaddle() && stack.isEmpty() && player.isShiftKeyDown() && this.isOwnedBy(player) && !player.isPassengerOfSameVehicle(this)) {
if (!this.level().isClientSide) {
this.setSaddled(false);
this.spawnAtLocation(new ItemStack(Items.SADDLE));
this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 0.9F);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (this.hasSaddle() && stack.isEmpty() && !player.isPassengerOfSameVehicle(this)) {
if (!this.level().isClientSide) {
player.startRiding(this);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
if (this.isTame() && stack.isEmpty() && !player.isShiftKeyDown() && !player.isPassengerOfSameVehicle(this)) {
if (!this.level().isClientSide) {
player.startRiding(this);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
return super.mobInteract(player, hand);
@@ -192,14 +171,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
return null;
}
public boolean hasSaddle() {
return this.entityData.get(SADDLED);
}
public void setSaddled(boolean saddled) {
this.entityData.set(SADDLED, saddled);
}
public boolean isRolled() {
return this.entityData.get(ROLLED);
}
@@ -210,7 +181,7 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
/** Toggles wheel mode; called from the ridden-roll keybind payload. */
public void handleRollToggle(ServerPlayer player) {
if (!this.isTame() || !this.hasSaddle() || this.getControllingPassenger() != player) {
if (!this.isTame() || this.getControllingPassenger() != player) {
return;
}
if (this.rollTransitionTicks > 0) {
@@ -273,10 +244,8 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
if (this.unrolling) {
this.setRolled(false);
this.unrolling = false;
this.setAnimationState(ANIM_IDLE);
} else {
this.setAnimationState(ANIM_ROLLING);
}
this.setAnimationState(ANIM_NONE);
}
}
@@ -289,7 +258,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
}
this.tickTumbleDamage();
this.updateAnimationState();
}
private void tickTumbleDamage() {
@@ -309,16 +277,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
}
}
private void updateAnimationState() {
// Roll states are driven by the transition/tick logic above
int state = this.getAnimationState();
if (state == ANIM_ROLL_UP || state == ANIM_ROLLING || state == ANIM_UNROLL) {
return;
}
boolean moving = this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-4D;
this.setAnimationState(moving ? ANIM_WALK : ANIM_IDLE);
}
private int getAnimationState() {
return this.entityData.get(ANIMATION_STATE);
}
@@ -330,7 +288,7 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
@Override
@Nullable
public LivingEntity getControllingPassenger() {
if (!this.isTame() || !this.hasSaddle()) {
if (!this.isTame()) {
return null;
}
Entity passenger = this.getFirstPassenger();
@@ -353,27 +311,28 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
@Override
public void travel(Vec3 travelVector) {
if (!(this.getControllingPassenger() instanceof Player rider) || !this.isVehicle()) {
if (this.defensiveCurlTicks > 0) {
super.travel(Vec3.ZERO);
return;
}
super.travel(travelVector);
return;
}
if (this.rollTransitionTicks > 0) {
// Hold still while rolling up / unrolling
if (this.defensiveCurlTicks > 0 && !this.isVehicle()) {
super.travel(Vec3.ZERO);
return;
}
super.travel(travelVector);
}
this.setYRot(rider.getYHeadRot());
this.yBodyRot = this.getYRot();
this.yHeadRot = this.getYRot();
@Override
protected void tickRidden(Player player, Vec3 travelVector) {
super.tickRidden(player, travelVector);
this.setRot(player.getYHeadRot(), player.getXRot() * 0.5F);
this.yRotO = this.yBodyRot = this.yHeadRot = this.getYRot();
}
float forward = rider.zza;
float strafe = rider.xxa * 0.5F;
@Override
protected Vec3 getRiddenInput(Player player, Vec3 travelVector) {
if (this.rollTransitionTicks > 0) {
// Hold still while rolling up / unrolling
return Vec3.ZERO;
}
float forward = player.zza;
float strafe = player.xxa * 0.5F;
if (forward < 0.0F) {
forward *= 0.4F;
}
@@ -381,16 +340,13 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
// Rolling is fast but drifty
strafe *= 0.35F;
}
return new Vec3(strafe, 0.0D, forward);
}
double speed = this.getAttributeValue(Attributes.MOVEMENT_SPEED)
* (this.isRolled() ? AntarchySettings.rollyPollyRollSpeedMultiplier() : 1.0D);
this.setSpeed((float) speed);
Vec3 input = new Vec3(strafe, 0.0D, forward);
Vec3 motion = new Vec3(0.0D, this.getDeltaMovement().y, 0.0D);
this.moveRelative(this.getSpeed(), input);
this.setDeltaMovement(motion.add(this.getDeltaMovement().x, 0.0D, this.getDeltaMovement().z));
this.move(MoverType.SELF, this.getDeltaMovement());
@Override
protected float getRiddenSpeed(Player player) {
return (float) (this.getAttributeValue(Attributes.MOVEMENT_SPEED)
* (this.isRolled() ? AntarchySettings.rollyPollyRollSpeedMultiplier() : 1.0D));
}
@Override
@@ -401,44 +357,128 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
return super.causeFallDamage(fallDistance, multiplier, damageSource);
}
@Override
protected void dropEquipment() {
super.dropEquipment();
if (this.hasSaddle()) {
this.spawnAtLocation(new ItemStack(Items.SADDLE));
this.setSaddled(false);
}
}
@Override
public void addAdditionalSaveData(CompoundTag tag) {
super.addAdditionalSaveData(tag);
tag.putBoolean("Saddled", this.hasSaddle());
}
@Override
public void readAdditionalSaveData(CompoundTag tag) {
super.readAdditionalSaveData(tag);
this.setSaddled(tag.getBoolean("Saddled"));
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
controllers.add(new AnimationController<>(this, "main_controller", 2, this::mainAnimController));
}
private PlayState mainAnimController(AnimationState<RollyPollyEntity> state) {
return switch (this.getAnimationState()) {
case ANIM_WALK -> state.setAndContinue(WALK_ANIM);
case ANIM_ROLL_UP -> state.setAndContinue(ROLL_UP_ANIM);
case ANIM_ROLLING -> state.setAndContinue(ROLLING_ANIM);
case ANIM_UNROLL -> state.setAndContinue(UNROLL_ANIM);
default -> state.setAndContinue(IDLE_ANIM);
};
AnimationController<RollyPollyEntity> controller = state.getController();
int transition = this.getAnimationState();
if (transition == ANIM_ROLL_UP) {
controller.setAnimationSpeed(1.0D);
return state.setAndContinue(ROLL_UP_ANIM);
}
if (transition == ANIM_UNROLL) {
controller.setAnimationSpeed(1.0D);
return state.setAndContinue(UNROLL_ANIM);
}
if (this.isRolled()) {
if (state.isMoving()) {
controller.setAnimationSpeed(1.0D);
return state.setAndContinue(ROLLING_ANIM);
}
if (controller.getCurrentAnimation() == null) {
// Just loaded in while rolled — snap into the held ball pose
controller.setAnimationSpeed(1.0D);
return state.setAndContinue(ROLL_UP_ANIM);
}
// Stationary while rolled: freeze on the current ball frame instead of spinning in place
controller.setAnimationSpeed(0.0D);
return PlayState.CONTINUE;
}
controller.setAnimationSpeed(1.0D);
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM);
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.geoCache;
}
/** Like a cat, a tamed rolly polly wanders over and curls up on the bed while its owner sleeps. */
private class SnuggleOnBedGoal extends Goal {
@Nullable
private Player ownerPlayer;
@Nullable
private BlockPos bedPos;
private int onBedTicks;
SnuggleOnBedGoal() {
this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK, Goal.Flag.JUMP));
}
@Override
public boolean canUse() {
if (!RollyPollyEntity.this.isTame() || RollyPollyEntity.this.isVehicle()) {
return false;
}
if (!(RollyPollyEntity.this.getOwner() instanceof Player player) || !player.isSleeping()) {
return false;
}
if (RollyPollyEntity.this.distanceToSqr(player) > 100.0D) {
return false;
}
BlockPos pos = player.blockPosition();
BlockState stateAt = RollyPollyEntity.this.level().getBlockState(pos);
if (!stateAt.is(BlockTags.BEDS)) {
return false;
}
this.ownerPlayer = player;
// Aim for the pillow end of the bed, next to the sleeper's head
this.bedPos = stateAt.getOptionalValue(BedBlock.FACING)
.map(direction -> pos.relative(direction.getOpposite()))
.orElse(pos);
return true;
}
@Override
public boolean canContinueToUse() {
return RollyPollyEntity.this.isTame()
&& !RollyPollyEntity.this.isVehicle()
&& this.ownerPlayer != null
&& this.ownerPlayer.isSleeping()
&& this.bedPos != null;
}
@Override
public void start() {
this.onBedTicks = 0;
}
@Override
public void stop() {
this.ownerPlayer = null;
this.bedPos = null;
this.onBedTicks = 0;
RollyPollyEntity.this.getNavigation().stop();
if (RollyPollyEntity.this.isRolled() && RollyPollyEntity.this.rollTransitionTicks <= 0) {
RollyPollyEntity.this.startUnroll();
}
}
@Override
public void tick() {
if (this.ownerPlayer == null || this.bedPos == null) {
return;
}
if (RollyPollyEntity.this.distanceToSqr(this.ownerPlayer) > 2.5D) {
this.onBedTicks = 0;
if (!RollyPollyEntity.this.isRolled()) {
RollyPollyEntity.this.getNavigation().moveTo(
this.bedPos.getX() + 0.5D, this.bedPos.getY() + 1.0D, this.bedPos.getZ() + 0.5D, 1.1D);
}
return;
}
RollyPollyEntity.this.getNavigation().stop();
if (++this.onBedTicks > this.adjustedTickDelay(16)
&& !RollyPollyEntity.this.isRolled()
&& RollyPollyEntity.this.rollTransitionTicks <= 0) {
RollyPollyEntity.this.startRollUp();
}
}
}
}
@@ -1,10 +1,17 @@
package com.craisinlord.antarchy.content.worldgen.elythia;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.AntarchyObjects;
import com.craisinlord.antarchy.content.block.BigBushBlock;
import com.craisinlord.antarchy.content.block.VeryTallGrassBlock;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
@@ -29,8 +36,8 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
RandomSource random = context.random();
BlockPos origin = context.origin();
int attempts = switch (this.variant) {
case FOREST -> 32;
case MEADOW -> 80;
case FOREST -> 240;
case MEADOW -> 110;
case TORCHFLOWER_FIELDS -> 60;
case BUTTERFLY_FIELDS -> 150;
case FLOWER_FOREST_MILKWEED -> 14;
@@ -90,6 +97,10 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
placedAny |= this.placeMilkweedPatch(level, origin, random, AntarchyObjects.PINK_MILKWEED.get());
}
if (this.variant == Variant.FOREST) {
placedAny |= this.placeBigBushes(level, origin, random, radius);
}
for (int i = 0; i < attempts; i++) {
int x = origin.getX() + random.nextInt(radius * 2 + 1) - radius;
int z = origin.getZ() + random.nextInt(radius * 2 + 1) - radius;
@@ -121,13 +132,10 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
if (roll < 0.58F) {
return placeSingle(level, plantPos, Blocks.TORCHFLOWER);
}
if (roll < 0.82F) {
if (roll < 0.94F) {
return placeSingle(level, plantPos, Blocks.SHORT_GRASS);
}
if (roll < 0.94F) {
return placeSingle(level, plantPos, Blocks.FERN);
}
return placeDouble(level, plantPos, Blocks.LARGE_FERN.defaultBlockState());
return placeDouble(level, plantPos, Blocks.TALL_GRASS.defaultBlockState());
}
if (this.variant == Variant.BUTTERFLY_FIELDS) {
@@ -138,14 +146,8 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
if (roll < 0.36F) {
return placeDouble(level, plantPos, AntarchyObjects.PINK_MILKWEED.get().defaultBlockState());
}
if (roll < 0.62F) {
return placeSingle(level, plantPos, Blocks.SHORT_GRASS);
}
if (roll < 0.84F) {
return placeSingle(level, plantPos, Blocks.FERN);
}
if (roll < 0.94F) {
return placeDouble(level, plantPos, Blocks.LARGE_FERN.defaultBlockState());
return placeSingle(level, plantPos, Blocks.SHORT_GRASS);
}
return placeDouble(level, plantPos, Blocks.TALL_GRASS.defaultBlockState());
}
@@ -168,16 +170,118 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
}
float roll = random.nextFloat();
if (roll < 0.46F) {
if (this.variant == Variant.MEADOW) {
if (roll < 0.40F) {
return placeSingle(level, plantPos, Blocks.SHORT_GRASS);
}
if (roll < 0.80F) {
return placeSingle(level, plantPos, veryShortGrass());
}
if (roll < 0.88F) {
return placeVeryTall(level, plantPos, veryTallGrass());
}
if (roll < 0.98F) {
return placeDouble(level, plantPos, Blocks.TALL_GRASS.defaultBlockState());
}
return placeSingle(level, plantPos, Blocks.SHORT_GRASS);
}
if (roll < 0.84F) {
if (roll < 0.24F) {
return placeSingle(level, plantPos, Blocks.SHORT_GRASS);
}
if (roll < 0.60F) {
return placeSingle(level, plantPos, veryShortGrass());
}
if (roll < 0.74F) {
return placeSingle(level, plantPos, Blocks.FERN);
}
if (roll < 0.94F) {
return placeDouble(level, plantPos, Blocks.LARGE_FERN.defaultBlockState());
if (roll < 0.84F) {
return placeDouble(level, plantPos, Blocks.TALL_GRASS.defaultBlockState());
}
return this.variant != Variant.FOREST && random.nextFloat() < 0.4F && isValidGround(level, groundPos) && placeSingle(level, plantPos, Blocks.SHORT_GRASS);
if (roll < 0.96F) {
return placeVeryTall(level, plantPos, veryTallGrass());
}
return placeDouble(level, plantPos, Blocks.LARGE_FERN.defaultBlockState());
}
private static Block veryShortGrass() {
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "very_short_grass"));
return block == Blocks.AIR ? Blocks.SHORT_GRASS : block;
}
private static Block veryTallGrass() {
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "very_tall_grass"));
return block == Blocks.AIR ? Blocks.TALL_GRASS : block;
}
private boolean placeBigBushes(WorldGenLevel level, BlockPos origin, RandomSource random, int radius) {
Block bushBlock = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "big_bush"));
if (!(bushBlock instanceof BigBushBlock)) {
return false;
}
boolean placed = false;
int bushAttempts = 10 + random.nextInt(6);
for (int i = 0; i < bushAttempts; i++) {
int x = origin.getX() + random.nextInt(radius * 2 + 1) - radius;
int z = origin.getZ() + random.nextInt(radius * 2 + 1) - radius;
int y = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z);
BlockPos plantPos = new BlockPos(x, y, z);
if (!isValidPlantSpot(level, plantPos, plantPos.below())) {
continue;
}
float roll = random.nextFloat();
int age = roll < 0.4F ? 0 : roll < 0.75F ? 1 : 2;
BlockState bushState = bushBlock.defaultBlockState().setValue(BigBushBlock.AGE, age);
if (age > 0) {
bushState = bushState.setValue(BigBushBlock.FACING, Direction.Plane.HORIZONTAL.getRandomDirection(random));
}
if (!isFootprintInsideChunk(origin, plantPos, bushState) || !canPlaceBigBush(level, plantPos, bushState)) {
continue;
}
BigBushBlock.placeBushBlocks(level, plantPos, bushState, 2);
placed = true;
}
return placed;
}
private static boolean isFootprintInsideChunk(BlockPos featureOrigin, BlockPos bushOrigin, BlockState bushState) {
ChunkPos chunk = new ChunkPos(featureOrigin);
int minX = chunk.getMinBlockX() + 1;
int maxX = chunk.getMaxBlockX() - 1;
int minZ = chunk.getMinBlockZ() + 1;
int maxZ = chunk.getMaxBlockZ() - 1;
if (!isWithin(bushOrigin, minX, maxX, minZ, maxZ)) {
return false;
}
for (BlockPos partPos : BigBushBlock.partPositions(bushState, bushOrigin)) {
if (!isWithin(partPos, minX, maxX, minZ, maxZ)) {
return false;
}
}
return true;
}
private static boolean isWithin(BlockPos pos, int minX, int maxX, int minZ, int maxZ) {
return pos.getX() >= minX && pos.getX() <= maxX && pos.getZ() >= minZ && pos.getZ() <= maxZ;
}
private static boolean canPlaceBigBush(WorldGenLevel level, BlockPos originPos, BlockState bushState) {
if (bushState.getValue(BigBushBlock.AGE) == 0) {
return bushState.canSurvive(level, originPos);
}
if (!BigBushBlock.hasFullSupport(bushState, level, originPos)) {
return false;
}
for (BlockPos partPos : BigBushBlock.partPositions(bushState, originPos)) {
if (!isOpenPlantSpot(level, partPos)) {
return false;
}
}
return true;
}
private static boolean placeSingle(WorldGenLevel level, BlockPos pos, Block block) {
@@ -197,6 +301,21 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
return true;
}
private static boolean placeVeryTall(WorldGenLevel level, BlockPos pos, Block block) {
if (!(block instanceof VeryTallGrassBlock)) {
return placeDouble(level, pos, Blocks.TALL_GRASS.defaultBlockState());
}
BlockState state = block.defaultBlockState();
if (!isOpenPlantSpot(level, pos)
|| !isOpenPlantSpot(level, pos.above())
|| !isOpenPlantSpot(level, pos.above(2))
|| !state.canSurvive(level, pos)) {
return false;
}
VeryTallGrassBlock.placeAt(level, pos, 2);
return true;
}
private boolean placeTorchflowerPatch(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos patchCenter = sampleSurface(level, origin, random, this.variant == Variant.FOREST ? 8 : 12);
if (patchCenter == null) {
@@ -0,0 +1,65 @@
package com.craisinlord.antarchy.mixins;
import com.craisinlord.antarchy.content.block.VeryTallGrassBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.BoneMealItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
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.DoublePlantBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
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(BoneMealItem.class)
public abstract class BoneMealItemVeryTallGrassMixin {
@Inject(method = "useOn", at = @At("HEAD"), cancellable = true)
private void antarchy$growVeryTallGrass(UseOnContext context, CallbackInfoReturnable<InteractionResult> cir) {
Level level = context.getLevel();
BlockPos pos = context.getClickedPos();
BlockState clickedState = level.getBlockState(pos);
if (!clickedState.is(Blocks.TALL_GRASS)) {
return;
}
BlockPos basePos = clickedState.getValue(DoublePlantBlock.HALF) == DoubleBlockHalf.LOWER ? pos : pos.below();
BlockState baseState = level.getBlockState(basePos);
BlockState middleState = level.getBlockState(basePos.above());
if (!baseState.is(Blocks.TALL_GRASS)
|| baseState.getValue(DoublePlantBlock.HALF) != DoubleBlockHalf.LOWER
|| !middleState.is(Blocks.TALL_GRASS)
|| middleState.getValue(DoublePlantBlock.HALF) != DoubleBlockHalf.UPPER) {
return;
}
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath("antarchy", "very_tall_grass"));
if (!(block instanceof VeryTallGrassBlock)) {
return;
}
BlockState veryTallState = block.defaultBlockState();
if (!level.getBlockState(basePos.above(2)).canBeReplaced()
|| !veryTallState.canSurvive(level, basePos)) {
return;
}
if (!level.isClientSide) {
VeryTallGrassBlock.placeAt(level, basePos, Block.UPDATE_ALL);
if (context.getPlayer() == null || !context.getPlayer().getAbilities().instabuild) {
ItemStack stack = context.getItemInHand();
stack.shrink(1);
}
level.levelEvent(1505, basePos, 15);
}
cir.setReturnValue(InteractionResult.sidedSuccess(level.isClientSide));
}
}
@@ -5,6 +5,7 @@
"compatibilityLevel": "JAVA_21",
"mixins": [
"AccessorRangedAttribute",
"BoneMealItemVeryTallGrassMixin",
"BlockEntityTypeSignMixin",
"BloodglassMixin",
"DreamFireBlockMixin",
@@ -48,10 +49,12 @@
"multipart.EntityMultipartLifecycleMixin"
],
"client": [
"client.BlockRenderDispatcherBigBushMixin",
"client.CavarynSkyMixin",
"client.ElythiaSkyMixin",
"client.ElytraModelAccessor",
"client.LightningBoltRendererMixin",
"client.LivingEntityRendererBigBushMixin",
"client.MountedVehicleCameraMixin",
"client.ParalyzedMouseTurnMixin",
"client.ScreenEffectRendererFireVisualMixin",
@@ -2,7 +2,7 @@
"format_version": "1.8.0",
"animations": {
"lay": {
"loop": true,
"loop": false,
"animation_length": 2,
"bones": {
"head": {
@@ -1192,4 +1192,4 @@
}
}
}
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,7 @@
{
"variants": {
"part=lower": { "model": "antarchy:block/very_tall_grass_bottom" },
"part=middle": { "model": "antarchy:block/very_tall_grass_middle" },
"part=upper": { "model": "antarchy:block/very_tall_grass_top" }
}
}
@@ -22,6 +22,10 @@
"block.antarchy.orange_milkweed": "Orange Milkweed",
"block.antarchy.pink_milkweed": "Pink Milkweed",
"block.antarchy.hushweed": "Hushweed",
"block.antarchy.big_bush": "Big Bush",
"block.antarchy.big_bush_part": "Big Bush",
"block.antarchy.very_short_grass": "Very Short Grass",
"block.antarchy.very_tall_grass": "Very Tall Grass",
"block.antarchy.umbral_moss_block": "Umbral Moss Block",
"block.antarchy.umbral_moss_carpet": "Umbral Moss Carpet",
"block.antarchy.amber_moss_block": "Amber Moss Block",
@@ -270,6 +274,10 @@
"item.antarchy.ouranwood_acorn": "Ouranwood Acorn",
"item.antarchy.ouranwood_boat": "Ouranwood Boat",
"item.antarchy.ouranwood_chest_boat": "Ouranwood Chest Boat",
"item.antarchy.big_bush": "Big Bush",
"item.antarchy.big_bush.tooltip": "Can be bonemealed",
"item.antarchy.very_short_grass": "Very Short Grass",
"item.antarchy.very_tall_grass": "Very Tall Grass",
"item.antarchy.orange_milkweed": "Orange Milkweed",
"item.antarchy.pink_milkweed": "Pink Milkweed",
"item.antarchy.hushweed": "Hushweed",
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/tinted_cross",
"textures": {
"cross": "antarchy:block/very_tall_grass/very_tall_grass_bottom"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/tinted_cross",
"textures": {
"cross": "antarchy:block/very_tall_grass/very_tall_grass_middle"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/tinted_cross",
"textures": {
"cross": "antarchy:block/very_tall_grass/very_tall_grass_top"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "antarchy:block/very_tall_grass/very_tall_grass_bottom"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -0,0 +1,65 @@
{
"type": "minecraft:block",
"pools": [
{
"conditions": [
{
"condition": "minecraft:match_tool",
"predicate": {
"items": "minecraft:shears"
}
}
],
"entries": [
{
"type": "minecraft:item",
"conditions": [
{
"block": "antarchy:very_tall_grass",
"condition": "minecraft:block_state_property",
"properties": {
"part": "lower"
}
}
],
"name": "antarchy:very_tall_grass"
}
],
"rolls": 1.0
},
{
"entries": [
{
"type": "minecraft:item",
"conditions": [
{
"block": "antarchy:very_tall_grass",
"condition": "minecraft:block_state_property",
"properties": {
"part": "lower"
}
},
{
"condition": "minecraft:table_bonus",
"enchantment": "minecraft:fortune",
"chances": [
0.125,
0.14285715,
0.16666667,
0.2
]
}
],
"name": "minecraft:wheat_seeds",
"functions": [
{
"function": "minecraft:explosion_decay"
}
]
}
],
"rolls": 1.0
}
],
"random_sequence": "antarchy:blocks/very_tall_grass"
}
@@ -0,0 +1,336 @@
{
"type": "minecraft:chest",
"pools": [
{
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:iron_sword",
"weight": 18,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 5.0,
"max": 18.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:bow",
"weight": 16,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 6.0,
"max": 20.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:crossbow",
"weight": 15,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 6.0,
"max": 20.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "antarchy:battle_axe",
"weight": 10
},
{
"type": "minecraft:item",
"name": "antarchy:scorpion_whip",
"weight": 8
},
{
"type": "minecraft:item",
"name": "minecraft:shield",
"weight": 10
},
{
"type": "minecraft:item",
"name": "minecraft:arrow",
"weight": 18,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 12.0,
"max": 32.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:spectral_arrow",
"weight": 8,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 6.0,
"max": 14.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:bread",
"weight": 10,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 2.0,
"max": 6.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:emerald",
"weight": 9,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 4.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:lapis_lazuli",
"weight": 8,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 4.0,
"max": 10.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:amethyst_shard",
"weight": 8,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 2.0,
"max": 6.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:experience_bottle",
"weight": 6,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 2.0,
"max": 5.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 7,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:swiftness"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 7,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:strength"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 6,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:regeneration"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:enchanted_book",
"weight": 5,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 10.0,
"max": 24.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:golden_apple",
"weight": 5
},
{
"type": "minecraft:item",
"name": "minecraft:diamond",
"weight": 3,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 2.0
}
}
]
}
],
"rolls": {
"type": "minecraft:uniform",
"min": 4.0,
"max": 7.0
}
},
{
"entries": [
{
"type": "minecraft:item",
"name": "antarchy:ultimate_sword",
"weight": 2
},
{
"type": "minecraft:item",
"name": "antarchy:ultimate_bow",
"weight": 2
},
{
"type": "minecraft:item",
"name": "antarchy:ultimate_crossbow",
"weight": 2
},
{
"type": "minecraft:item",
"name": "minecraft:diamond_sword",
"weight": 4,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 18.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:crossbow",
"weight": 4,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 18.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:enchanted_book",
"weight": 6,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 20.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
}
],
"rolls": {
"type": "minecraft:uniform",
"min": 0.0,
"max": 1.0
}
}
],
"random_sequence": "antarchy:chests/ruined_arena/generic"
}
@@ -0,0 +1,306 @@
{
"type": "minecraft:chest",
"pools": [
{
"entries": [
{
"type": "minecraft:item",
"name": "antarchy:ultimate_sword",
"weight": 8
},
{
"type": "minecraft:item",
"name": "antarchy:ultimate_bow",
"weight": 8
},
{
"type": "minecraft:item",
"name": "antarchy:ultimate_crossbow",
"weight": 8
},
{
"type": "minecraft:item",
"name": "antarchy:battle_axe",
"weight": 14
},
{
"type": "minecraft:item",
"name": "antarchy:scorpion_whip",
"weight": 12
},
{
"type": "minecraft:item",
"name": "minecraft:diamond_sword",
"weight": 10,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:crossbow",
"weight": 10,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:bow",
"weight": 8,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:shield",
"weight": 8
},
{
"type": "minecraft:item",
"name": "minecraft:arrow",
"weight": 18,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 48.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:spectral_arrow",
"weight": 12,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 12.0,
"max": 24.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:experience_bottle",
"weight": 12,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 5.0,
"max": 10.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 8,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:strength"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 8,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:swiftness"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 6,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:regeneration"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:enchanted_book",
"weight": 10,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:golden_apple",
"weight": 10
},
{
"type": "minecraft:item",
"name": "minecraft:diamond",
"weight": 6,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 2.0,
"max": 4.0
}
}
]
}
],
"rolls": {
"type": "minecraft:uniform",
"min": 5.0,
"max": 8.0
}
},
{
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:diamond_sword",
"weight": 8,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:crossbow",
"weight": 8,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 24.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:enchanted_book",
"weight": 10,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 25.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:netherite_scrap",
"weight": 4,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 2.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:diamond",
"weight": 6,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 3.0
}
}
]
}
],
"rolls": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 2.0
}
}
],
"random_sequence": "antarchy:spawners/ruined_arena/hard"
}
@@ -0,0 +1,269 @@
{
"type": "minecraft:chest",
"pools": [
{
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:iron_sword",
"weight": 18,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 8.0,
"max": 20.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:crossbow",
"weight": 16,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 10.0,
"max": 22.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:bow",
"weight": 14,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 10.0,
"max": 22.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "antarchy:battle_axe",
"weight": 12
},
{
"type": "minecraft:item",
"name": "minecraft:shield",
"weight": 10
},
{
"type": "minecraft:item",
"name": "minecraft:arrow",
"weight": 20,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 16.0,
"max": 36.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:spectral_arrow",
"weight": 10,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 8.0,
"max": 20.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:experience_bottle",
"weight": 10,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 3.0,
"max": 7.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 8,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:swiftness"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 8,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:strength"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:potion",
"weight": 6,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:healing"
}
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:emerald",
"weight": 10,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 2.0,
"max": 6.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:gold_ingot",
"weight": 8,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 2.0,
"max": 7.0
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:lapis_lazuli",
"weight": 8,
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 5.0,
"max": 12.0
}
}
]
}
],
"rolls": {
"type": "minecraft:uniform",
"min": 4.0,
"max": 7.0
}
},
{
"entries": [
{
"type": "minecraft:item",
"name": "antarchy:ultimate_sword",
"weight": 2
},
{
"type": "minecraft:item",
"name": "antarchy:ultimate_bow",
"weight": 2
},
{
"type": "minecraft:item",
"name": "antarchy:ultimate_crossbow",
"weight": 2
},
{
"type": "minecraft:item",
"name": "minecraft:diamond_sword",
"weight": 4,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 20.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:enchanted_book",
"weight": 6,
"functions": [
{
"function": "minecraft:enchant_with_levels",
"levels": {
"type": "minecraft:uniform",
"min": 20.0,
"max": 30.0
},
"options": "#minecraft:on_random_loot"
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:golden_apple",
"weight": 6
}
],
"rolls": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 1.0
}
}
],
"random_sequence": "antarchy:spawners/ruined_arena/medium"
}
@@ -59,6 +59,7 @@
"antarchy:elythia_tuff_boulders",
"antarchy:butterfly_fields_flora",
"antarchy:elythia_brown_ant_nests",
"antarchy:elythia_rainbow_ant_nests",
"antarchy:ouranwood_cocoon_trees"
],
[]
@@ -63,6 +63,7 @@
"antarchy:elythia_tuff_boulders",
"antarchy:elythia_meadow_flora",
"antarchy:elythia_brown_ant_nests",
"antarchy:elythia_rainbow_ant_nests",
"minecraft:patch_sugar_cane"
],
[]
@@ -94,12 +95,6 @@
"minCount": 1,
"maxCount": 1
},
{
"type": "minecraft:sniffer",
"weight": 18,
"minCount": 1,
"maxCount": 2
},
{
"type": "minecraft:rabbit",
"weight": 16,
@@ -63,6 +63,7 @@
"antarchy:ouranwood_trees_sparse",
"antarchy:elythia_forest_flora",
"antarchy:elythia_brown_ant_nests",
"antarchy:elythia_rainbow_ant_nests",
"antarchy:fallen_ouranwood_tree",
"antarchy:fungal_mushroom"
],
@@ -67,7 +67,8 @@
[
"antarchy:ouranwood_trees",
"antarchy:elythia_forest_flora",
"antarchy:elythia_brown_ant_nests"
"antarchy:elythia_brown_ant_nests",
"antarchy:elythia_rainbow_ant_nests"
],
[
"antarchy:triffid_patch"
@@ -63,6 +63,7 @@
"antarchy:ouranwood_trees_sparse",
"antarchy:elythia_forest_flora",
"antarchy:elythia_brown_ant_nests",
"antarchy:elythia_rainbow_ant_nests",
"antarchy:termite_nest"
],
[]
@@ -55,7 +55,8 @@
[],
[
"antarchy:elythia_torchflower_fields_flora",
"antarchy:elythia_brown_ant_nests"
"antarchy:elythia_brown_ant_nests",
"antarchy:elythia_rainbow_ant_nests"
],
[]
],
@@ -3,7 +3,7 @@
"placement": [
{
"type": "minecraft:rarity_filter",
"chance": 24
"chance": 20
},
{
"type": "minecraft:in_square"
@@ -0,0 +1,19 @@
{
"feature": "antarchy:rainbow_ant_nest",
"placement": [
{
"type": "minecraft:rarity_filter",
"chance": 512
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:heightmap",
"heightmap": "WORLD_SURFACE_WG"
},
{
"type": "minecraft:biome"
}
]
}